From fed23853bbe6598936a9cb11b649ed3b460ab5fb Mon Sep 17 00:00:00 2001 From: Alberto Fernandez Date: Sun, 14 Jan 2018 20:43:41 +0100 Subject: [PATCH 1/3] Extract test from forms --- .../pdf/parser/PdfContentStreamHandler.java | 97 +++++++++++++++++-- .../text/pdf/parser/PdfTextExtractorTest.java | 67 +++++++++++++ 2 files changed, 156 insertions(+), 8 deletions(-) create mode 100644 openpdf/src/test/java/com/lowagie/text/pdf/parser/PdfTextExtractorTest.java diff --git a/openpdf/src/main/java/com/lowagie/text/pdf/parser/PdfContentStreamHandler.java b/openpdf/src/main/java/com/lowagie/text/pdf/parser/PdfContentStreamHandler.java index 2c443c501..1979f28c4 100644 --- a/openpdf/src/main/java/com/lowagie/text/pdf/parser/PdfContentStreamHandler.java +++ b/openpdf/src/main/java/com/lowagie/text/pdf/parser/PdfContentStreamHandler.java @@ -41,25 +41,35 @@ */ package com.lowagie.text.pdf.parser; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; +import java.util.Stack; + +import com.lowagie.text.ExceptionConverter; import com.lowagie.text.error_messages.MessageLocalization; import com.lowagie.text.pdf.CMapAwareDocumentFont; import com.lowagie.text.pdf.PRIndirectReference; +import com.lowagie.text.pdf.PRStream; +import com.lowagie.text.pdf.PRTokeniser; import com.lowagie.text.pdf.PdfArray; +import com.lowagie.text.pdf.PdfContentParser; import com.lowagie.text.pdf.PdfDictionary; import com.lowagie.text.pdf.PdfIndirectReference; import com.lowagie.text.pdf.PdfLiteral; import com.lowagie.text.pdf.PdfName; import com.lowagie.text.pdf.PdfNumber; import com.lowagie.text.pdf.PdfObject; +import com.lowagie.text.pdf.PdfReader; +import com.lowagie.text.pdf.PdfStream; import com.lowagie.text.pdf.PdfString; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Stack; - /** * @author dgd */ @@ -631,7 +641,7 @@ public void invoke(ArrayList operands, public Matrix textLineMatrix; boolean useContainerMarkup; - + /** * detail parser for text within a marked section. used by TextAssembler */ @@ -780,6 +790,75 @@ public void invoke(ArrayList operands, handler.popContext(); } } + + private class Do implements ContentOperator { + /** + * @see com.lowagie.text.pdf.parser.ContentOperator#getOperatorName() + */ + @Override + public String getOperatorName() { + return "Do"; + } + + @Override + public void invoke(ArrayList operands, PdfContentStreamHandler handler, PdfDictionary resources) { + PdfObject firstOperand = operands.get(0); + if (firstOperand instanceof PdfName) { + PdfName name = (PdfName) firstOperand; + PdfDictionary dictionary = resources.getAsDict(PdfName.XOBJECT); + if (dictionary == null) { + return; + } + PdfStream stream = (PdfStream) dictionary.getDirectObject(name); + PdfName subType = stream.getAsName(PdfName.SUBTYPE); + if (PdfName.FORM.equals(subType)) { + PdfDictionary resources2 = stream.getAsDict(PdfName.RESOURCES); + byte[] data = null; + try { + data = getContentBytesFromPdfObject(stream); + } catch (IOException ex) { + throw new ExceptionConverter(ex); + } + new PushGraphicsState().invoke(operands, handler, resources); + processContent(data, resources2); + new PopGraphicsState().invoke(operands, handler, resources); + } + } + + } + private void processContent(byte[] contentBytes, PdfDictionary resources) { + try { + PdfContentParser ps = new PdfContentParser(new PRTokeniser(contentBytes)); + ArrayList operands = new ArrayList(); + while (ps.parse(operands).size() > 0) { + PdfLiteral operator = (PdfLiteral) operands.get(operands.size() - 1); + invokeOperator(operator, operands, resources); + } + } catch (Exception e) { + throw new ExceptionConverter(e); + } + } + + + private byte[] getContentBytesFromPdfObject(PdfObject object) throws IOException { + switch (object.type()) { + case PdfObject.INDIRECT: + return getContentBytesFromPdfObject(PdfReader.getPdfObject(object)); + case PdfObject.STREAM: + return PdfReader.getStreamBytes((PRStream) PdfReader.getPdfObject(object)); + case PdfObject.ARRAY: + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ListIterator iter = ((PdfArray) object).listIterator(); + while (iter.hasNext()) { + PdfObject element = iter.next(); + baos.write(getContentBytesFromPdfObject(element)); + } + return baos.toByteArray(); + default: + throw new IllegalStateException("Unsupported type: " + object.getClass().getCanonicalName()); + } + } + } /** * Loads all the supported graphics and text state operators in a map. @@ -827,6 +906,8 @@ protected void installDefaultOperators() { registerContentOperator(new BeginMarked()); registerContentOperator(new BeginMarkedDict()); registerContentOperator(new EndMarked()); + + registerContentOperator(new Do()); } /** diff --git a/openpdf/src/test/java/com/lowagie/text/pdf/parser/PdfTextExtractorTest.java b/openpdf/src/test/java/com/lowagie/text/pdf/parser/PdfTextExtractorTest.java new file mode 100644 index 000000000..26a159598 --- /dev/null +++ b/openpdf/src/test/java/com/lowagie/text/pdf/parser/PdfTextExtractorTest.java @@ -0,0 +1,67 @@ +package com.lowagie.text.pdf.parser; + + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.junit.Assert; +import org.junit.Test; + +import com.lowagie.text.pdf.PdfReader; + + +public class PdfTextExtractorTest { + + + @Test(expected=IOException.class) + public void testPageExceeded() throws Exception { + getString("HelloWorldMeta.pdf", 5); + } + @Test(expected=IOException.class) + public void testInvalidPageNumber() throws Exception { + getString("HelloWorldMeta.pdf", 0); + } + + + @Test + public void testConcatenateWatermark() throws Exception { + String result = getString("merge-acroforms.pdf", 5); + Assert.assertNotNull(result); + // html?? + result = result.replaceAll("\\<.*?>",""); + // Multiple spaces betwen words?? + Assert.assertTrue(result.contains("2. This is chapter 2")); + Assert.assertTrue(result.contains("watermark-concatenate")); + } + + + private String getString(String fileName, int pageNumber) throws Exception { + return getString(new File("src/test/resources", fileName), pageNumber); + } + private String getString(File file, int pageNumber) throws Exception { + byte[] pdfBytes = readDocument(file); + final PdfReader pdfReader = new PdfReader(pdfBytes); + + return new PdfTextExtractor(pdfReader).getTextFromPage( pageNumber); + } + + protected static byte[] readDocument(final File file) throws IOException { + + try (ByteArrayOutputStream fileBytes = new ByteArrayOutputStream(); + InputStream inputStream = new FileInputStream(file)) { + final byte[] buffer = new byte[8192]; + while (true) { + final int bytesRead = inputStream.read(buffer); + if (bytesRead == -1) { + break; + } + fileBytes.write(buffer, 0, bytesRead); + } + return fileBytes.toByteArray(); + } + + } +} From 70f392bfa682e12240c725111fd74bb51b574265 Mon Sep 17 00:00:00 2001 From: Alberto Fernandez Date: Sun, 14 Jan 2018 20:47:31 +0100 Subject: [PATCH 2/3] sample file --- openpdf/src/test/resources/merge-acroforms.pdf | Bin 0 -> 20377 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 openpdf/src/test/resources/merge-acroforms.pdf diff --git a/openpdf/src/test/resources/merge-acroforms.pdf b/openpdf/src/test/resources/merge-acroforms.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4d3d09814c68a85a33fc0eee2fad29bdc309135e GIT binary patch literal 20377 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 Date: Sun, 14 Jan 2018 20:48:26 +0100 Subject: [PATCH 3/3] remove unused imports --- .../com/lowagie/text/pdf/parser/PdfContentStreamHandler.java | 1 - 1 file changed, 1 deletion(-) diff --git a/openpdf/src/main/java/com/lowagie/text/pdf/parser/PdfContentStreamHandler.java b/openpdf/src/main/java/com/lowagie/text/pdf/parser/PdfContentStreamHandler.java index 1979f28c4..bdd57e2c9 100644 --- a/openpdf/src/main/java/com/lowagie/text/pdf/parser/PdfContentStreamHandler.java +++ b/openpdf/src/main/java/com/lowagie/text/pdf/parser/PdfContentStreamHandler.java @@ -47,7 +47,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.Iterator; -import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Stack;