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);