addField method

void addField(
  1. PdfAcroField field,
  2. PdfObject<PdfDataType>? page
)

Adds a new field to the AcroForm and optionally to a specific page (as a Widget).

Implementation

void addField(PdfAcroField field, PdfObject? page) {
  final root = document.catalog.params;
  PdfDict acroForm;
  if (root.containsKey(PdfNameTokens.acroForm)) {
    final val = root[PdfNameTokens.acroForm];
    acroForm = _resolveDict(val) ?? PdfDict();
  } else {
    acroForm = PdfDict();
    root[PdfNameTokens.acroForm] = acroForm;
  }

  PdfArray fieldsArray;
  if (acroForm.containsKey(PdfNameTokens.fields)) {
    fieldsArray = _resolveArray(acroForm[PdfNameTokens.fields]) ?? PdfArray();
  } else {
    fieldsArray = PdfArray();
    acroForm[PdfNameTokens.fields] = fieldsArray;
  }

  // Ensure field is an indirect object so it can be referenced
  PdfIndirect fieldRef;
  if (field.indirectReference != null) {
    fieldRef = field.indirectReference!;
  } else {
    final obj = PdfObject(document, params: field.dictionary);
    fieldRef = obj.ref();
  }

  fieldsArray.add(fieldRef);
  _fields[field.name] = field;
  _fieldsLoaded = true;

  if (page != null) {
    if (page.params is PdfDict) {
      final pageDict = page.params as PdfDict;
      PdfArray annots;
      if (pageDict.containsKey(PdfNameTokens.annots)) {
        annots = _resolveArray(pageDict[PdfNameTokens.annots]) ?? PdfArray();
      } else {
        annots = PdfArray();
        pageDict[PdfNameTokens.annots] = annots;
      }
      annots.add(fieldRef);
    }
  }
}