extractSignatureFieldEditContext method

PdfSignatureFieldEditContext extractSignatureFieldEditContext()
override

Extrai informações completas para edição de campos de assinatura.

Retorna referências e dicionários para permitir operações como renomear e remover campos usando update incremental.

Implementation

PdfSignatureFieldEditContext extractSignatureFieldEditContext() {
  try {
    _ensureXrefParsed();
    final trailer = _trailerInfo ??
        PdfParserXref.readTrailerInfoFromReader(reader, xrefOffset);
    final rootObjId = trailer.rootObj;
    if (rootObjId == null) {
      return const PdfSignatureFieldEditContext(
          fields: <PdfSignatureFieldObjectInfo>[]);
    }

    final rootObj = _getObjectNoStream(rootObjId) ?? _getObject(rootObjId);
    if (rootObj == null || rootObj.value is! PdfDictToken) {
      return const PdfSignatureFieldEditContext(
          fields: <PdfSignatureFieldObjectInfo>[]);
    }
    final rootDict = rootObj.value as PdfDictToken;

    final acroFormVal = rootDict.values[PdfNameTokens.acroForm];
    final acroFormRefToken = PdfParserObjects.asRef(acroFormVal);
    final acroFormToken = _resolveDictFromValueNoStream(acroFormVal) ??
        _resolveDictFromValueFull(acroFormVal);
    if (acroFormToken == null) {
      return const PdfSignatureFieldEditContext(
          fields: <PdfSignatureFieldObjectInfo>[]);
    }

    final acroFormDict = PdfParserObjects.toPdfDict(acroFormToken);
    final acroFormRef = acroFormRefToken != null
        ? PdfIndirectRef(acroFormRefToken.obj, acroFormRefToken.gen)
        : null;

    final fieldsVal = acroFormToken.values[PdfNameTokens.fields];
    final fieldsRefToken = PdfParserObjects.asRef(fieldsVal);
    final fieldsToken = _resolveArrayFromValue(fieldsVal) ??
        _resolveArrayFromValueFull(fieldsVal);
    if (fieldsToken == null) {
      return PdfSignatureFieldEditContext(
        fields: const <PdfSignatureFieldObjectInfo>[],
        acroFormRef: acroFormRef,
        acroFormDict: acroFormDict,
        fieldsRef: fieldsRefToken != null
            ? PdfIndirectRef(fieldsRefToken.obj, fieldsRefToken.gen)
            : null,
        fieldsArray: null,
      );
    }

    final fieldsArray = PdfParserObjects.toPdfArray(fieldsToken);
    final out = <PdfSignatureFieldObjectInfo>[];
    final visited = <int>{};
    final pageIndexByObj = _buildPageIndexByObj(rootDict);
    for (int i = 0; i < fieldsToken.values.length; i++) {
      final item = fieldsToken.values[i];
      _collectSignatureFieldObjects(
        item,
        out,
        visited,
        fieldIndex: i,
        pageIndexByObj: pageIndexByObj,
      );
    }

    return PdfSignatureFieldEditContext(
      fields: out,
      acroFormRef: acroFormRef,
      acroFormDict: acroFormDict,
      fieldsRef: fieldsRefToken != null
          ? PdfIndirectRef(fieldsRefToken.obj, fieldsRefToken.gen)
          : null,
      fieldsArray: fieldsArray,
    );
  } catch (_) {
    return const PdfSignatureFieldEditContext(
        fields: <PdfSignatureFieldObjectInfo>[]);
  }
}