Author: msahyoun Date: Sat Jan 24 07:20:52 2015 New Revision: 1654479 URL: http://svn.apache.org/r1654479 Log: PDFBOX-2617 correct creation of fields and termination of field tree
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeNode.java 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=1654479&r1=1654478&r2=1654479&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 Jan 24 07:20:52 2015 @@ -613,28 +613,28 @@ public abstract class PDFieldTreeNode im { continue; } - COSDictionary parentDictionary = (COSDictionary) kidDictionary.getDictionaryObject( - COSName.PARENT, COSName.P); - if (kidDictionary.getDictionaryObject(COSName.FT) != null - || (parentDictionary != null && parentDictionary.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) { - PDFieldTreeNode field = PDFieldTreeNode.createField(acroForm, kidDictionary, this); - if (field != null) + COSDictionary parentDictionary = (COSDictionary) kidDictionary.getDictionaryObject( + COSName.PARENT, COSName.P); + if (kidDictionary.getDictionaryObject(COSName.FT) != null + || (parentDictionary != null && parentDictionary.getDictionaryObject(COSName.FT) != null)) { - kidsList.add(field); + PDFieldTreeNode field = PDFieldTreeNode.createField(acroForm, kidDictionary, this); + if (field != null) + { + kidsList.add(field); + } } } - else if ("Widget".equals(kidDictionary.getNameAsString(COSName.SUBTYPE))) - { - kidsList.add(new PDAnnotationWidget(kidDictionary)); - } else { - PDFieldTreeNode field = PDFieldTreeNode.createField(acroForm, kidDictionary, this); - if (field != null) - { - kidsList.add(field); - } + kidsList.add(new PDAnnotationWidget(kidDictionary)); } } retval = new COSArrayList<COSObjectable>(kidsList, kids); @@ -831,7 +831,7 @@ public abstract class PDFieldTreeNode im // 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) + if ((flags & PDButton.FLAG_RADIO) != 0) { return new PDRadioButton(form, field, parentNode); }