You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2020/09/12 09:00:49 UTC

svn commit: r1881657 - /pdfbox/branches/issue45/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java

Author: tilman
Date: Sat Sep 12 09:00:49 2020
New Revision: 1881657

URL: http://svn.apache.org/viewvc?rev=1881657&view=rev
Log:
PDFBOX-4955: part content stream and ignore Form XObjects if they are not used

Modified:
    pdfbox/branches/issue45/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java

Modified: pdfbox/branches/issue45/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/issue45/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java?rev=1881657&r1=1881656&r2=1881657&view=diff
==============================================================================
--- pdfbox/branches/issue45/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java (original)
+++ pdfbox/branches/issue45/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java Sat Sep 12 09:00:49 2020
@@ -28,11 +28,13 @@ import java.util.Set;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.pdfbox.contentstream.operator.Operator;
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSNumber;
+import org.apache.pdfbox.pdfparser.PDFStreamParser;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDPageContentStream;
@@ -768,6 +770,18 @@ public final class PDAcroForm implements
             return true;
         }
         Iterator<COSName> xObjectNames = resources.getXObjectNames().iterator();
+        List<Object> tokens;
+        try
+        {
+            PDFStreamParser pdfStreamParser = new PDFStreamParser(appearanceStream);
+            pdfStreamParser.parse();
+            tokens = pdfStreamParser.getTokens();
+        }
+        catch (IOException ex)
+        {
+            LOG.debug("Couldn't not parse appearance content stream - content might be misplaced", ex);
+            return true;
+        }
         while (xObjectNames.hasNext())
         {
             try
@@ -783,7 +797,15 @@ public final class PDAcroForm implements
                     float llY = bbox.getLowerLeftY();
                     if (Float.compare(llX, 0) != 0 && Float.compare(llY, 0) != 0)
                     {
-                        return false;
+                        // PDFBOX-4955: only if used
+                        for (int i = 0; i < tokens.size(); ++i)
+                        {
+                            if (tokens.get(i).equals(name) && i < tokens.size() - 1 &&
+                                tokens.get(i + 1).equals(Operator.getOperator("Do")))
+                            {
+                                return false;
+                            }
+                        }
                     }
                 }
             }