Author: msahyoun Date: Sat Jan 24 07:44:00 2015 New Revision: 1654480 URL: http://svn.apache.org/r1654480 Log: PDFBOX-2617 correct creation of fields and termination of field tree
Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldFactory.java Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java?rev=1654480&r1=1654479&r2=1654480&view=diff ============================================================================== --- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java (original) +++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java Sat Jan 24 07:44:00 2015 @@ -527,32 +527,32 @@ public abstract class PDField implements for (int i = 0; i < kids.size(); i++) { COSDictionary kidDictionary = (COSDictionary) kids.getObject(i); + if (kidDictionary == null) { - continue; + continue; } - COSDictionary parent = (COSDictionary) kidDictionary.getDictionaryObject(COSName.PARENT, COSName.P); - if (kidDictionary.getDictionaryObject(COSName.FT) != null - || (parent != null && parent.getDictionaryObject(COSName.FT) != null)) + + // Decide if the kid is field or a widget annotation. + // A field dictionary that does not have a partial field name (T entry) + // of its own shall not be considered a field but simply a Widget annotation. + if (kidDictionary.getDictionaryObject(COSName.T) != null) { - PDField field = PDFieldFactory.createField(acroForm, kidDictionary); - if (field != null) + COSDictionary parent = (COSDictionary) kidDictionary.getDictionaryObject(COSName.PARENT, COSName.P); + if (kidDictionary.getDictionaryObject(COSName.FT) != null + || (parent != null && parent.getDictionaryObject(COSName.FT) != null)) { - kidsList.add(field); + PDField field = PDFieldFactory.createField(acroForm, kidDictionary); + if (field != null) + { + kidsList.add(field); + } } } else if ("Widget".equals(kidDictionary.getNameAsString(COSName.SUBTYPE))) { kidsList.add(new PDAnnotationWidget(kidDictionary)); } - else - { - PDField field = PDFieldFactory.createField(acroForm, kidDictionary); - if (field != null) - { - kidsList.add(field); - } - } } retval = new COSArrayList<COSObjectable>(kidsList, kids); } Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldFactory.java URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldFactory.java?rev=1654480&r1=1654479&r2=1654480&view=diff ============================================================================== --- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldFactory.java (original) +++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldFactory.java Sat Jan 24 07:44:00 2015 @@ -68,12 +68,7 @@ public class PDFieldFactory if( isButton(pdField) ) { int flags = pdField.getFieldFlags(); - //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. - COSArray kids = (COSArray)field.getDictionaryObject( COSName.getPDFName( "Kids" ) ); - if( kids != null || isRadio(flags) ) + if(isRadio(flags) ) { pdField = new PDRadioCollection( acroForm, field ); }