You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2015/05/15 21:16:12 UTC

svn commit: r1679631 - in /pdfbox/trunk/pdfbox/src: main/java/org/apache/pdfbox/pdmodel/ main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/visible/ main/java/org/apache/pdfbox/pdmodel/interactive/form/ test/java/org/apache/pdfbox/pdmodel...

Author: jahewson
Date: Fri May 15 19:16:12 2015
New Revision: 1679631

URL: http://svn.apache.org/r1679631
Log:
PDFBOX-2333: Make sure to call applyChange() at the end of setValue()

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/visible/PDVisibleSigBuilder.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDCheckbox.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDChoice.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDComboBox.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDListBox.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDPushButton.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDSignatureField.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestListBox.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=1679631&r1=1679630&r2=1679631&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 Fri May 15 19:16:12 2015
@@ -51,6 +51,7 @@ import org.apache.pdfbox.pdmodel.encrypt
 import org.apache.pdfbox.pdmodel.encryption.SecurityHandlerFactory;
 import org.apache.pdfbox.pdmodel.font.PDFont;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
+import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceDictionary;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream;
 import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature;
@@ -229,7 +230,16 @@ public class PDDocument implements Close
         PDSignatureField signatureField = findSignatureField(fields, sigObject);
         if (signatureField == null)
         {
-            signatureField = createSignatureField(acroForm, sigObject, page); 
+            signatureField = new PDSignatureField(acroForm);
+            // set visibility flags
+            if (options.getVisualSignature() == null)
+            {
+                signatureField.getWidget().setAnnotationFlags(PDAnnotationWidget.FLAG_NO_VIEW);
+            }
+            // append the signature object
+            signatureField.setValue(sigObject);
+            // backward linking
+            signatureField.getWidget().setPage(page);
         }
 
         // Set the AcroForm Fields
@@ -265,17 +275,6 @@ public class PDDocument implements Close
         page.getCOSObject().setNeedToBeUpdated(true);
     }
 
-    private PDSignatureField createSignatureField(PDAcroForm acroForm, PDSignature sigObject, PDPage page)
-            throws IOException
-    {
-        PDSignatureField signatureField = new PDSignatureField(acroForm);
-        // append the signature object
-        signatureField.setSignature(sigObject);
-        // backward linking
-        signatureField.getWidget().setPage(page);
-        return signatureField;
-    }
-
     // search acroform field list for signature field with specific signature dictionary
     private PDSignatureField findSignatureField(List<PDField> fields, PDSignature sigObject)
     {

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/visible/PDVisibleSigBuilder.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/visible/PDVisibleSigBuilder.java?rev=1679631&r1=1679630&r2=1679631&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/visible/PDVisibleSigBuilder.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/visible/PDVisibleSigBuilder.java Fri May 15 19:16:12 2015
@@ -103,7 +103,7 @@ public class PDVisibleSigBuilder impleme
                                 String signatureName) throws IOException
     {
         PDSignature pdSignature = new PDSignature();
-        pdSignatureField.setSignature(pdSignature);
+        pdSignatureField.setValue(pdSignature);
         pdSignatureField.getWidget().setPage(page);
         page.getAnnotations().add(pdSignatureField.getWidget());
         pdSignature.setName(signatureName);

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDCheckbox.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDCheckbox.java?rev=1679631&r1=1679630&r2=1679631&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDCheckbox.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDCheckbox.java Fri May 15 19:16:12 2015
@@ -87,7 +87,7 @@ public final class PDCheckbox extends PD
     /**
      * Checks the check box.
      */
-    public void check()
+    public void check() throws IOException
     {
         String onValue = getOnValue();
         setValue(onValue);
@@ -156,18 +156,20 @@ public final class PDCheckbox extends PD
     }
 
     @Override
-    public void setValue(String value)
+    public void setValue(String value) throws IOException
     {
+        dictionary.setName(COSName.V, value);
+        
+        // update the appearance state (AS)
         if (value == null)
         {
-            dictionary.removeItem(COSName.V);
             dictionary.setItem(COSName.AS, COSName.OFF);
         }
         else
         {
-            COSName nameValue = COSName.getPDFName(value);
-            dictionary.setItem(COSName.V, nameValue);
-            dictionary.setItem(COSName.AS, nameValue);
+            dictionary.setName(COSName.AS, value);
         }
+        
+        applyChange();
     }
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDChoice.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDChoice.java?rev=1679631&r1=1679630&r2=1679631&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDChoice.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDChoice.java Fri May 15 19:16:12 2015
@@ -269,7 +269,7 @@ public abstract class PDChoice extends P
     /**
      * This will set the indices of the selected options - the 'I' key.
      * <p>
-     * This method is preferred over {@link #setValue(List)} for choice fields which
+     * This method is preferred over {@link #setValues(List)} for choice fields which
      * <ul>
      *  <li>do support multiple selections</li>
      *  <li>have export values with the same value</li>
@@ -404,40 +404,13 @@ public abstract class PDChoice extends P
     {
         dictionary.setFlag(COSName.FF, FLAG_COMBO, combo);
     }
-
-    /**
-     * setValue sets the entry "V" to the given value.
-     * 
-     * @param value the value
-     */
-    public void setValue(String value)
-    {
-        if (value != null)
-        {
-            if (getOptions().indexOf(value) == -1)
-            {
-                throw new IllegalArgumentException("The list box does not contain the given value.");
-            }
-            else
-            {
-                dictionary.setString(COSName.V, value);
-                // remove I key for single valued choice field
-                setSelectedOptionsIndex(null);
-            }
-        }
-        else
-        {
-            dictionary.removeItem(COSName.V);
-        }
-        // TODO create/update appearance
-    }
     
     /**
-     * setValue sets the entry "V" to the given value.
+     * setValues sets the entry "V" to the given values.
      * 
      * @param values the list of values
      */    
-    public void setValue(List<String> values)
+    public void setValues(List<String> values) throws IOException
     {
         if (values != null && !values.isEmpty())
         {
@@ -456,8 +429,8 @@ public abstract class PDChoice extends P
         {
             dictionary.removeItem(COSName.V);
         }
-        // TODO create/update appearance
-    }    
+        applyChange();
+    }
     
     @Override
     public List<String> getValue()

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDComboBox.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDComboBox.java?rev=1679631&r1=1679630&r2=1679631&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDComboBox.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDComboBox.java Fri May 15 19:16:12 2015
@@ -16,6 +16,7 @@
  */
 package org.apache.pdfbox.pdmodel.interactive.form;
 
+import java.io.IOException;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
 
@@ -73,7 +74,7 @@ public final class PDComboBox extends PD
     }
     
     @Override
-    public void setValue(String value)
+    public void setValue(String value) throws IOException
     {
         if (value != null)
         {
@@ -95,6 +96,6 @@ public final class PDComboBox extends PD
         {
             dictionary.removeItem(COSName.V);
         }
-        // TODO create/update appearance
+        applyChange();
     }
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java?rev=1679631&r1=1679630&r2=1679631&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java Fri May 15 19:16:12 2015
@@ -180,10 +180,10 @@ public abstract class PDField implements
      * As a result it might be necessary to check the type of the value before
      * reusing it.
      * 
-     * @param fieldValue The new field value.
+     * @param value The new field value.
      * @throws IOException if there is an error setting the field value.
      */    
-    public abstract void setValue(String fieldValue) throws IOException;
+    public abstract void setValue(String value) throws IOException;
     
     /**
      * sets the field to be read-only.

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDListBox.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDListBox.java?rev=1679631&r1=1679630&r2=1679631&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDListBox.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDListBox.java Fri May 15 19:16:12 2015
@@ -16,6 +16,7 @@
  */
 package org.apache.pdfbox.pdmodel.interactive.form;
 
+import java.io.IOException;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
 
@@ -75,4 +76,27 @@ public final class PDListBox extends PDC
             dictionary.removeItem(COSName.TI);
         }
     }
+    
+    @Override
+    public void setValue(String value) throws IOException
+    {
+        if (value != null)
+        {
+            if (getOptions().indexOf(value) == -1)
+            {
+                throw new IllegalArgumentException("The list box does not contain the given value.");
+            }
+            else
+            {
+                dictionary.setString(COSName.V, value);
+                // remove I key for single valued choice field
+                setSelectedOptionsIndex(null);
+            }
+        }
+        else
+        {
+            dictionary.removeItem(COSName.V);
+        }
+        applyChange();
+    }
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java?rev=1679631&r1=1679630&r2=1679631&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java Fri May 15 19:16:12 2015
@@ -160,10 +160,10 @@ public class PDNonTerminalField extends
     }
     
     @Override
-    public void setValue(String fieldValue)
+    public void setValue(String value)
     {
         // There is no need to look up the parent hierarchy within a non terminal field
-        dictionary.setString(COSName.V, fieldValue);
+        dictionary.setString(COSName.V, value);
     }
     
     @Override

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDPushButton.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDPushButton.java?rev=1679631&r1=1679630&r2=1679631&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDPushButton.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDPushButton.java Fri May 15 19:16:12 2015
@@ -91,9 +91,9 @@ public class PDPushButton extends PDButt
     }
     
     @Override
-    public void setValue(String fieldValue)
+    public void setValue(String value)
     {
-        if (fieldValue != null && !fieldValue.isEmpty())
+        if (value != null && !value.isEmpty())
         {
             throw new IllegalArgumentException("A PDPushButton shall not use the V entry in the field dictionary");
         }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java?rev=1679631&r1=1679630&r2=1679631&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java Fri May 15 19:16:12 2015
@@ -150,22 +150,22 @@ public final class PDRadioButton extends
     }
     
     @Override
-    public void setValue(String fieldValue)
+    public void setValue(String value) throws IOException
     {
-        COSName nameForValue = COSName.getPDFName(fieldValue);
-        dictionary.setItem(COSName.V, nameForValue);
-        
+        dictionary.setName(COSName.V, value);
+        // update the appearance state (AS)
         for (PDAnnotationWidget widget : getWidgets())
         {
             PDAppearanceEntry appearanceEntry = widget.getAppearance().getNormalAppearance();
-            if (((COSDictionary)appearanceEntry.getCOSObject()).containsKey(nameForValue))
+            if (((COSDictionary)appearanceEntry.getCOSObject()).containsKey(value))
             {
-                widget.getCOSObject().setName(COSName.AS, fieldValue);
+                widget.getCOSObject().setName(COSName.AS, value);
             }
             else
             {
                 widget.getCOSObject().setItem(COSName.AS, COSName.OFF);
             }
         }
+        applyChange();
     }
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDSignatureField.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDSignatureField.java?rev=1679631&r1=1679630&r2=1679631&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDSignatureField.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDSignatureField.java Fri May 15 19:16:12 2015
@@ -22,6 +22,7 @@ import java.util.Set;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
 import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSeedValue;
 import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature;
 
@@ -90,8 +91,10 @@ public class PDSignatureField extends PD
      * Add a signature dictionary to the signature field.
      * 
      * @param value is the PDSignatureField
+     * @deprecated Use {@link #setValue(PDSignature)} instead.
      */
-    public void setSignature(PDSignature value)
+    @Deprecated
+    public void setSignature(PDSignature value) throws IOException
     {
         setValue(value);
     }
@@ -112,20 +115,14 @@ public class PDSignatureField extends PD
      * 
      * @param value is the PDSignatureField
      */
-    public void setValue(PDSignature value)
+    public void setValue(PDSignature value) throws IOException
     {
-        if (value == null)
-        {
-            dictionary.removeItem(COSName.V);
-        }
-        else
-        {
-            dictionary.setItem(COSName.V, (PDSignature)value);
-        }
+        dictionary.setItem(COSName.V, value);
+        applyChange();
     }
     
     @Override
-    public void setValue(String fieldValue)
+    public void setValue(String value)
     {
         // Signature fields don't support the strings for value
         throw new IllegalArgumentException("Signature fields don't support a string for the value entry.");     
@@ -198,7 +195,19 @@ public class PDSignatureField extends PD
     @Override
     void constructAppearances() throws IOException
     {
-        // TODO: implement appearance generation for signatures
-        throw new UnsupportedOperationException("not implemented");
+        PDAnnotationWidget widget = this.getWidgets().get(0);
+        if (widget != null)
+        {
+            // check if the signature is visible
+            if (widget.getRectangle() != null &&
+                widget.getRectangle().getHeight() == 0 && widget.getRectangle().getWidth() == 0 ||
+                widget.isNoView() ||  widget.isHidden())
+            {
+                return;
+            }
+
+            // TODO: implement appearance generation for signatures
+            throw new UnsupportedOperationException("not implemented");
+        }
     }
 }

Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestListBox.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestListBox.java?rev=1679631&r1=1679630&r2=1679631&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestListBox.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestListBox.java Fri May 15 19:16:12 2015
@@ -98,6 +98,9 @@ public class TestListBox extends TestCas
             PDAcroForm form = new PDAcroForm( doc );
             PDChoice choice = new PDListBox(form);
             
+            // appearance construction is not implemented, so turn on NeedAppearances
+            form.setNeedAppearances(true);
+            
             // test that there are no nulls returned for an empty field
             // only specific methods are tested here
             assertNotNull(choice.getOptions());
@@ -137,7 +140,7 @@ public class TestListBox extends TestCas
             // without multiselect setting multiple items shall fail
             try
             {
-                choice.setValue(exportValues);
+                choice.setValues(exportValues);
                 fail( "Missing IllegalArgumentException" );
             }
             catch( IllegalArgumentException e )
@@ -148,7 +151,7 @@ public class TestListBox extends TestCas
             // ensure that the choice field does allow multiple selections
             choice.setMultiSelect(true);
             // now this call must suceed
-            choice.setValue(exportValues);
+            choice.setValues(exportValues);
             
             // assert that the option values have been correctly set
             COSArray valueItems = (COSArray) choice.getCOSObject().getItem(COSName.V);