/** * This method creates a COSField subclass from the given field. The field is a PDF Dictionary * object that must represent a field element. - othewise null is returned * * @param acroForm The form that the field will be part of. * @param field The dictionary representing a field element * @return a subclass to COSField according to the kind of field passed to createField * @throws IOException If there is an error determining the field type. */ public static PDField createField(PDAcroForm acroForm, COSDictionary field) throws IOException { PDField pdField = new PDUnknownField(acroForm, field); 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)) { pdField = new PDRadioCollection(acroForm, field); } else if (isPushButton(flags)) { pdField = new PDPushButton(acroForm, field); } else { pdField = new PDCheckbox(acroForm, field); } } else if (isChoiceField(pdField)) { pdField = new PDChoiceField(acroForm, field); } else if (isTextbox(pdField)) { pdField = new PDTextbox(acroForm, field); } else if (isSignature(pdField)) { pdField = new PDSignatureField(acroForm, field); } else { // do nothing and return an unknown field type. } return pdField; }