/** * 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 PDSignature(acroForm, field); } else { // do nothing and return an unknown field type. } return pdField; }
/** * This method determines if the given field is a button. * * @param field the field to determine * @return the result of the determination * @throws IOException If there is an error determining the field type. */ private static boolean isButton(PDField field) throws IOException { String ft = field.findFieldType(); boolean retval = FIELD_TYPE_BTN.equals(ft); List kids = field.getKids(); if (ft == null && kids != null && kids.size() > 0) { // sometimes if it is a button the type is only defined by one // of the kids entries Object obj = kids.get(0); COSDictionary kidDict = null; if (obj instanceof PDField) { kidDict = ((PDField) obj).getDictionary(); } else if (obj instanceof PDAnnotationWidget) { kidDict = ((PDAnnotationWidget) obj).getDictionary(); } else { throw new IOException("Error:Unexpected type of kids field:" + obj); } retval = isButton(new PDUnknownField(field.getAcroForm(), kidDict)); } return retval; }
/** * This method determines if the given field is a Textbox. * * @param field the field to determine * @return the result of the determination */ private static boolean isTextbox(PDField field) throws IOException { return FIELD_TYPE_TX.equals(field.findFieldType()); }
/** * This method determines if the given field is a signature. * * @param field the field to determine * @return the result of the determination */ private static boolean isSignature(PDField field) throws IOException { return FIELD_TYPE_SIG.equals(field.findFieldType()); }
/** * This method determines if the given field is a choicefield Choicefields are either listboxes or * comboboxes. * * @param field the field to determine * @return the result of the determination */ private static boolean isChoiceField(PDField field) throws IOException { return FIELD_TYPE_CH.equals(field.findFieldType()); }