You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ms...@apache.org on 2018/04/07 15:17:56 UTC
svn commit: r1828596 - in /pdfbox/trunk/pdfbox/src:
main/java/org/apache/pdfbox/pdmodel/interactive/form/FieldUtils.java
test/java/org/apache/pdfbox/pdmodel/interactive/form/PDChoiceTest.java
Author: msahyoun
Date: Sat Apr 7 15:17:56 2018
New Revision: 1828596
URL: http://svn.apache.org/viewvc?rev=1828596&view=rev
Log:
PDFBOX-4185: support COSString, COSArray mixed options entries
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/FieldUtils.java
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDChoiceTest.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/FieldUtils.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/FieldUtils.java?rev=1828596&r1=1828595&r2=1828596&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/FieldUtils.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/FieldUtils.java Sat Apr 7 15:17:56 2018
@@ -25,7 +25,6 @@ import java.util.List;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSString;
-import org.apache.pdfbox.pdmodel.common.COSArrayList;
/**
* A set of utility methods to help with common AcroForm form and field related functions.
@@ -175,37 +174,24 @@ public final class FieldUtils
}
else if (items instanceof COSArray)
{
- // test if there is a single text or a two-element array
- COSBase entry = ((COSArray) items).get(0);
- if (entry instanceof COSString)
+ List<String> entryList = new ArrayList<>();
+ for (COSBase entry : (COSArray) items)
{
- return COSArrayList.convertCOSStringCOSArrayToList((COSArray)items);
- }
- else
- {
- return getItemsFromPair(items, pairIdx);
- }
+ if (entry instanceof COSString)
+ {
+ entryList.add(((COSString) entry).getString());
+ }
+ else if (entry instanceof COSArray)
+ {
+ COSArray cosArray = (COSArray) entry;
+ if (cosArray.size() >= pairIdx +1 && cosArray.get(pairIdx) instanceof COSString)
+ {
+ entryList.add(((COSString) cosArray.get(pairIdx)).getString());
+ }
+ }
+ }
+ return entryList;
}
return Collections.emptyList();
- }
-
- /**
- * Return either one of a list of two-element arrays entries.
- *
- * @param items the array of elements or two-element arrays
- * @param pairIdx the index into the two-element array
- * @return a List of single elements
- */
- private static List<String> getItemsFromPair(COSBase items, int pairIdx)
- {
- List<String> exportValues = new ArrayList<>();
- int numItems = ((COSArray) items).size();
- for (int i=0;i<numItems;i++)
- {
- COSArray pair = (COSArray) ((COSArray) items).get(i);
- COSString displayValue = (COSString) pair.get(pairIdx);
- exportValues.add(displayValue.getString());
- }
- return exportValues;
}
}
Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDChoiceTest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDChoiceTest.java?rev=1828596&r1=1828595&r2=1828596&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDChoiceTest.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDChoiceTest.java Sat Apr 7 15:17:56 2018
@@ -20,7 +20,12 @@ import static org.junit.Assert.assertEqu
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.cos.COSString;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.junit.Before;
import org.junit.Test;
@@ -33,12 +38,17 @@ public class PDChoiceTest
{
private PDDocument document;
private PDAcroForm acroForm;
+ private List<String> options;
@Before
public void setUp()
{
document = new PDDocument();
acroForm = new PDAcroForm(document);
+ options = new ArrayList<>();
+ options.add(" ");
+ options.add("A");
+ options.add("B");
}
@Test
@@ -60,6 +70,78 @@ public class PDChoiceTest
assertEquals(choiceField.getFieldType(), "Ch");
assertTrue(choiceField.isCombo());
}
+
+ @Test
+ public void getOptionsFromStrings()
+ {
+ PDChoice choiceField = new PDComboBox(acroForm);
+ COSArray choiceFieldOptions = new COSArray();
+ choiceFieldOptions.add(new COSString(" "));
+ choiceFieldOptions.add(new COSString("A"));
+ choiceFieldOptions.add(new COSString("B"));
+
+ // add the options using the low level COS model as the PD model will
+ // abstract the COSArray
+ choiceField.getCOSObject().setItem(COSName.OPT, choiceFieldOptions);
+
+ assertEquals(options, choiceField.getOptions());
+ }
+
+ @Test
+ public void getOptionsFromCOSArray()
+ {
+ PDChoice choiceField = new PDComboBox(acroForm);
+ COSArray choiceFieldOptions = new COSArray();
+
+ // add entry to options
+ COSArray entry = new COSArray();
+ entry.add(new COSString(" "));
+ choiceFieldOptions.add(entry);
+
+ // add entry to options
+ entry = new COSArray();
+ entry.add(new COSString("A"));
+ choiceFieldOptions.add(entry);
+
+ // add entry to options
+ entry = new COSArray();
+ entry.add(new COSString("B"));
+ choiceFieldOptions.add(entry);
+
+ // add the options using the low level COS model as the PD model will
+ // abstract the COSArray
+ choiceField.getCOSObject().setItem(COSName.OPT, choiceFieldOptions);
+
+ assertEquals(options, choiceField.getOptions());
+ }
+
+ /*
+ * Get the entries form a moxed values array. See PDFBOX-4185
+ */
+ @Test
+ public void getOptionsFromMixed()
+ {
+ PDChoice choiceField = new PDComboBox(acroForm);
+ COSArray choiceFieldOptions = new COSArray();
+
+ // add string entry to options
+ choiceFieldOptions.add(new COSString(" "));
+ // add array entry to options
+ COSArray entry = new COSArray();
+ entry.add(new COSString("A"));
+ choiceFieldOptions.add(entry);
+
+ // add array entry to options
+ entry = new COSArray();
+ entry.add(new COSString("B"));
+ choiceFieldOptions.add(entry);
+
+ // add the options using the low level COS model as the PD model will
+ // abstract the COSArray
+ choiceField.getCOSObject().setItem(COSName.OPT, choiceFieldOptions);
+
+ assertEquals(options, choiceField.getOptions());
+ }
}