Exemplo n.º 1
0
  /**
   * 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;
  }
Exemplo n.º 2
0
 /**
  * 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;
 }
Exemplo n.º 3
0
 /**
  * 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());
 }
Exemplo n.º 4
0
 /**
  * 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());
 }
Exemplo n.º 5
0
 /**
  * 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());
 }