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 2017/01/28 14:19:57 UTC

svn commit: r1780693 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java

Author: tilman
Date: Sat Jan 28 14:19:57 2017
New Revision: 1780693

URL: http://svn.apache.org/viewvc?rev=1780693&view=rev
Log:
PDFBOX-3664: use iterator so that non root level fields get checked too

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java?rev=1780693&r1=1780692&r2=1780693&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java Sat Jan 28 14:19:57 2017
@@ -25,6 +25,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import org.apache.commons.logging.Log;
@@ -65,6 +66,7 @@ import org.apache.pdfbox.pdmodel.interac
 import org.apache.pdfbox.pdmodel.interactive.digitalsignature.SigningSupport;
 import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
 import org.apache.pdfbox.pdmodel.interactive.form.PDField;
+import org.apache.pdfbox.pdmodel.interactive.form.PDNonTerminalField;
 import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField;
 
 /**
@@ -292,7 +294,7 @@ public class PDDocument implements Close
         {
             COSArray fieldArray = (COSArray) acroForm.getCOSObject().getDictionaryObject(COSName.FIELDS);
             fieldArray.setNeedToBeUpdated(true);
-            signatureField = findSignatureField(acroForm.getFields(), sigObject);
+            signatureField = findSignatureField(acroForm.getFieldIterator(), sigObject);
         }
         if (signatureField == null)
         {
@@ -321,7 +323,7 @@ public class PDDocument implements Close
         acroForm.setSignaturesExist(true);
         acroForm.setAppendOnly(true);
 
-        boolean checkFields = checkSignatureField(acroFormFields, signatureField);
+        boolean checkFields = checkSignatureField(acroForm.getFieldIterator(), signatureField);
         if (checkFields)
         {
             signatureField.getCOSObject().setNeedToBeUpdated(true);
@@ -372,12 +374,19 @@ public class PDDocument implements Close
         page.getCOSObject().setNeedToBeUpdated(true);
     }
 
-    // search acroform field list for signature field with specific signature dictionary
-    private PDSignatureField findSignatureField(List<PDField> fields, PDSignature sigObject)
+    /**
+     * Search acroform fields for signature field with specific signature dictionary.
+     * 
+     * @param fieldIterator iterator on all fields.
+     * @param sigObject signature object (the /V part).
+     * @return a signature field if found, or null if none was found.
+     */
+    private PDSignatureField findSignatureField(Iterator<PDField> fieldIterator, PDSignature sigObject)
     {
         PDSignatureField signatureField = null;
-        for (PDField pdField : fields)
+        while (fieldIterator.hasNext())
         {
+            PDField pdField = fieldIterator.next();
             if (pdField instanceof PDSignatureField)
             {
                 PDSignature signature = ((PDSignatureField) pdField).getSignature();
@@ -393,20 +402,20 @@ public class PDDocument implements Close
     /**
      * Check if the field already exists in the field list.
      *
-     * @param acroFormFields the list of AcroForm fields.
+     * @param fieldIterator iterator on all fields.
      * @param signatureField the signature field.
      * @return true if the field already existed in the field list, false if not.
      */
-    private boolean checkSignatureField(List<PDField> acroFormFields, PDSignatureField signatureField)
+    private boolean checkSignatureField(Iterator<PDField> fieldIterator, PDSignatureField signatureField)
     {
-        for (PDField field : acroFormFields)
+        while (fieldIterator.hasNext())
         {
+            PDField field = fieldIterator.next();
             if (field instanceof PDSignatureField
                     && field.getCOSObject().equals(signatureField.getCOSObject()))
             {
                 return true;
             }
-            // fixme: this code does not check non-terminal fields, there could be a descendant signature
         }
         return false;
     }
@@ -554,7 +563,7 @@ public class PDDocument implements Close
             sigField.getCOSObject().setNeedToBeUpdated(true);
             
             // Check if the field already exists
-            boolean checkSignatureField = checkSignatureField(acroformFields, sigField);
+            boolean checkSignatureField = checkSignatureField(acroForm.getFieldIterator(), sigField);
             if (checkSignatureField)
             {
                 sigField.getCOSObject().setNeedToBeUpdated(true);