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/16 18:39:52 UTC

svn commit: r1618381 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: pdmodel/interactive/form/PDAcroForm.java pdmodel/interactive/form/PDFieldFactory.java pdmodel/interactive/form/PDFieldTreeNode.java util/PDFMergerUtility.java

Author: lehmi
Date: Sat Aug 16 16:39:52 2014
New Revision: 1618381

URL: http://svn.apache.org/r1618381
Log:
PDFBOX-2261: removed PDFieldFactory

Removed:
    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/PDAcroForm.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeNode.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFMergerUtility.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java?rev=1618381&r1=1618380&r2=1618381&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java Sat Aug 16 16:39:52 2014
@@ -196,7 +196,7 @@ public final class PDAcroForm implements
             COSDictionary element = (COSDictionary) cosFields.getObject(i);
             if (element != null)
             {
-                PDFieldTreeNode field = PDFieldFactory.createField( this, element, null );
+                PDFieldTreeNode field = PDFieldTreeNode.createField( this, element, null );
                 if( field != null )
                 {
                     pdFields.add(field);
@@ -285,7 +285,7 @@ public final class PDAcroForm implements
                     if( fieldName.getString().equals( name ) ||
                         fieldName.getString().equals( nameSubSection[0] ) )
                     {
-                        PDFieldTreeNode root = PDFieldFactory.createField( this, element, null );
+                        PDFieldTreeNode root = PDFieldTreeNode.createField( this, element, null );
 
                         if( nameSubSection.length > 1 )
                         {

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeNode.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeNode.java?rev=1618381&r1=1618380&r2=1618381&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeNode.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeNode.java Sat Aug 16 16:39:52 2014
@@ -107,21 +107,6 @@ public abstract class PDFieldTreeNode im
      */
     public abstract String getFieldType();
 
-    // used by factory class
-    static String findFieldType(COSDictionary dic)
-    {
-        String retval = dic.getNameAsString(COSName.FT);
-        if (retval == null)
-        {
-            COSDictionary parent = (COSDictionary) dic.getDictionaryObject(COSName.PARENT,
-                    COSName.P);
-            if (parent != null)
-            {
-                retval = findFieldType(parent);
-            }
-        }
-        return retval;
-    }
 
     /**
      * setValue sets the fields value to a given string.
@@ -417,7 +402,7 @@ public abstract class PDFieldTreeNode im
                 COSDictionary kidDictionary = (COSDictionary) kids.getObject(i);
                 if (name[nameIndex].equals(kidDictionary.getString(COSName.T)))
                 {
-                    retval = (PDFieldTreeNode) PDFieldFactory.createField(acroForm, kidDictionary, this);
+                    retval = (PDFieldTreeNode) PDFieldTreeNode.createField(acroForm, kidDictionary, this);
                     if (name.length > nameIndex + 1)
                     {
                         retval = retval.findKid(name, nameIndex + 1);
@@ -453,7 +438,7 @@ public abstract class PDFieldTreeNode im
                 if (kidDictionary.getDictionaryObject(COSName.FT) != null
                         || (parent != null && parent.getDictionaryObject(COSName.FT) != null))
                 {
-                    PDFieldTreeNode field = PDFieldFactory.createField(acroForm, kidDictionary, this);
+                    PDFieldTreeNode field = PDFieldTreeNode.createField(acroForm, kidDictionary, this);
                     if (field != null)
                     {
                         kidsList.add(field);
@@ -465,7 +450,7 @@ public abstract class PDFieldTreeNode im
                 }
                 else
                 {
-                    PDFieldTreeNode field = PDFieldFactory.createField(acroForm, kidDictionary, this);
+                    PDFieldTreeNode field = PDFieldTreeNode.createField(acroForm, kidDictionary, this);
                     if (field != null)
                     {
                         kidsList.add(field);
@@ -597,4 +582,73 @@ public abstract class PDFieldTreeNode im
         this.getDictionary().setString(COSName.TU, alternateFieldName);
     }
 
+    /**
+     * Creates a COSField subclass from the given field.
+     * @param form the form that the field is part of
+     * @param field the dictionary representing a field element
+     * @return the corresponding PDField instance
+     */
+    public static PDFieldTreeNode createField(PDAcroForm form, COSDictionary field, PDFieldTreeNode parentNode)
+    {
+        String fieldType = findFieldType(field);
+        if (FIELD_TYPE_CHOICE.equals(fieldType))
+        {
+            int flags = field.getInt(COSName.FF, 0);
+            if ((flags & PDVariableText.FLAG_COMB) != 0)
+            {
+                return new PDComboBox(form, field, parentNode);
+            }
+            else
+            {
+                return new PDListBox(form, field, parentNode);
+            }
+        }
+        else if (FIELD_TYPE_TEXT.equals(fieldType))
+        {
+            return new PDTextField(form, field, parentNode);
+        }
+        else if (FIELD_TYPE_SIGNATURE.equals(fieldType))
+        {
+            return new PDSignatureField(form, field, parentNode);
+        }
+        else if (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
+            // and that sometimes there is just a kids dictionary.
+            // so, if there is a kids dictionary then it must be a radio button group.
+            if ((flags & PDButton.FLAG_RADIO) != 0 || field.getDictionaryObject(COSName.KIDS) != null)
+            {
+                return new PDRadioButton(form, field, parentNode);
+            }
+            else if ((flags & PDButton.FLAG_PUSHBUTTON) != 0)
+            {
+                return new PDPushButton(form, field, parentNode);
+            }
+            else
+            {
+                return new PDCheckbox(form, field, parentNode);
+            }
+        }
+        else
+        {
+            return new PDNonTerminalField(form, field, parentNode); 
+        }
+    }
+
+    private static String findFieldType(COSDictionary dic)
+    {
+        String retval = dic.getNameAsString(COSName.FT);
+        if (retval == null)
+        {
+            COSDictionary parent = (COSDictionary) dic.getDictionaryObject(COSName.PARENT,
+                    COSName.P);
+            if (parent != null)
+            {
+                retval = findFieldType(parent);
+            }
+        }
+        return retval;
+    }
+
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFMergerUtility.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFMergerUtility.java?rev=1618381&r1=1618380&r2=1618381&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFMergerUtility.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFMergerUtility.java Sat Aug 16 16:39:52 2014
@@ -50,7 +50,6 @@ import org.apache.pdfbox.pdmodel.interac
 import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline;
 import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem;
 import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
-import org.apache.pdfbox.pdmodel.interactive.form.PDFieldFactory;
 import org.apache.pdfbox.pdmodel.interactive.form.PDFieldTreeNode;
 
 /**
@@ -557,7 +556,7 @@ public class PDFMergerUtility
             while (srcFieldsIterator.hasNext())
             {
                 PDFieldTreeNode srcField = srcFieldsIterator.next();
-                PDFieldTreeNode destFieldNode = PDFieldFactory.createField(destAcroForm,
+                PDFieldTreeNode destFieldNode = PDFieldTreeNode.createField(destAcroForm,
                         (COSDictionary) cloner.cloneForNewDocument(srcField.getDictionary()), null);
                 // if the form already has a field with this name then we need to rename this field
                 // to prevent merge conflicts.