You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2014/08/13 17:43:03 UTC

svn commit: r1617741 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form: PDField.java PDFieldFactory.java

Author: lehmi
Date: Wed Aug 13 15:43:03 2014
New Revision: 1617741

URL: http://svn.apache.org/r1617741
Log:
PDFBOX-2261: don't follow the kids hierarchy when looking for the field type

Modified:
    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/PDFieldFactory.java

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=1617741&r1=1617740&r2=1617741&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 Wed Aug 13 15:43:03 2014
@@ -53,6 +53,23 @@ public abstract class PDField implements
      */
     public static final int FLAG_NO_EXPORT = 1 << 2;
 
+    /**
+     * Field type Text.
+     */
+    public static final String FIELD_TYPE_TEXT = "Tx";
+    /**
+     * Field type Button.
+     */
+    public static final String FIELD_TYPE_BUTTON = "Btn";
+    /**
+     * Field type Button.
+     */
+    public static final String FIELD_TYPE_CHOICE = "Ch";
+    /**
+     * Field type Button.
+     */
+    public static final String FIELD_TYPE_SIGNATURE = "Sig";
+
     private PDAcroForm acroForm;
 
     private COSDictionary dictionary;
@@ -467,7 +484,7 @@ public abstract class PDField implements
      */
     public void setParent(PDField parent)
     {
-        getDictionary().setItem("Parent", parent);
+        getDictionary().setItem(COSName.PARENT, parent);
     }
 
     /**
@@ -489,7 +506,7 @@ public abstract class PDField implements
             for (int i = 0; retval == null && i < kids.size(); i++)
             {
                 COSDictionary kidDictionary = (COSDictionary) kids.getObject(i);
-                if (name[nameIndex].equals(kidDictionary.getString("T")))
+                if (name[nameIndex].equals(kidDictionary.getString(COSName.T)))
                 {
                     retval = PDFieldFactory.createField(acroForm, kidDictionary);
                     if (name.length > nameIndex + 1)

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldFactory.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldFactory.java?rev=1617741&r1=1617740&r2=1617741&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldFactory.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldFactory.java Wed Aug 13 15:43:03 2014
@@ -31,9 +31,9 @@ import java.util.List;
 public final class PDFieldFactory
 {
     // button flags
-    private static final int FLAG_RADIO = 0x8000,
-                             FLAG_PUSHBUTTON = 0x10000,
-                             FLAG_RADIOS_IN_UNISON = 0x2000000;
+    private static final int FLAG_RADIO = 0x8000;
+    private static final int FLAG_PUSHBUTTON = 0x10000;
+    private static final int FLAG_RADIOS_IN_UNISON = 0x2000000;
 
     // choice flags
     private static final int FLAG_COMBO = 0x20000;
@@ -52,7 +52,27 @@ public final class PDFieldFactory
     public static PDField createField(PDAcroForm form, COSDictionary field) throws IOException
     {
         String fieldType = PDField.findFieldType(field);
-        if (isButton(form, field))
+        if (PDField.FIELD_TYPE_CHOICE.equals(fieldType))
+        {
+            int flags = field.getInt(COSName.FF, 0);
+            if ((flags & FLAG_COMBO) != 0)
+            {
+                return new PDComboBox(form, field);
+            }
+            else
+            {
+                return new PDListBox(form, field);
+            }
+        }
+        else if (PDField.FIELD_TYPE_TEXT.equals(fieldType))
+        {
+            return new PDTextField(form, field);
+        }
+        else if (PDField.FIELD_TYPE_SIGNATURE.equals(fieldType))
+        {
+            return new PDSignatureField(form, field);
+        }
+        else if (PDField.FIELD_TYPE_BUTTON.equals(fieldType))
         {
             int flags = field.getInt(COSName.FF, 0);
             // BJL: I have found that the radio flag bit is not always set
@@ -73,26 +93,6 @@ public final class PDFieldFactory
                 return new PDCheckbox(form, field);
             }
         }
-        else if ("Ch".equals(fieldType))
-        {
-            int flags = field.getInt(COSName.FF, 0);
-            if ((flags & FLAG_COMBO) != 0)
-            {
-                return new PDComboBox(form, field);
-            }
-            else
-            {
-                return new PDListBox(form, field);
-            }
-        }
-        else if ("Tx".equals(fieldType))
-        {
-            return new PDTextField(form, field);
-        }
-        else if ("Sig".equals(fieldType))
-        {
-            return new PDSignatureField(form, field);
-        }
         else
         {
             // todo: inheritance and "non-terminal fields" are not supported yet
@@ -100,18 +100,4 @@ public final class PDFieldFactory
         }
     }
 
-    private static boolean isButton(PDAcroForm form, COSDictionary field) throws IOException
-    {
-        String fieldType = PDField.findFieldType(field);
-        List<COSObjectable> kids = PDField.getKids(form, field);
-        if (fieldType == null && kids != null && !kids.isEmpty())
-        {
-            // sometimes if it is a button the type is only defined by one of the kids entries
-            // TODO JH: this is due to inheritance, we need proper support for "non-terminal fields"
-
-            COSDictionary kid = (COSDictionary)kids.get(0).getCOSObject();
-            return isButton(form, kid);
-        }
-        return "Btn".equals(fieldType);
-    }
 }