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