extractSignatureFields method

List<PdfSignatureFieldInfo> extractSignatureFields()

Extrai informações de campos de assinatura (/FT /Sig).

Implementation

List<PdfSignatureFieldInfo> extractSignatureFields() {
  final editContext = extractSignatureFieldEditContext();
  if (editContext.fields.isNotEmpty) {
    return editContext.fields
        .map((field) => field.info)
        .toList(growable: false);
  }
  try {
    _ensureXrefParsed();
    final trailer = _trailerInfo ??
        PdfParserXref.readTrailerInfoFromReader(reader, xrefOffset);
    final rootObjId = trailer.rootObj;
    if (rootObjId == null) return const <PdfSignatureFieldInfo>[];

    final rootObj = _getObjectNoStream(rootObjId) ?? _getObject(rootObjId);
    if (rootObj == null || rootObj.value is! PdfDictToken) {
      return const <PdfSignatureFieldInfo>[];
    }
    final rootDict = rootObj.value as PdfDictToken;
    final acroForm = _resolveDictFromValueNoStream(
            rootDict.values[PdfNameTokens.acroForm]) ??
        _resolveDictFromValueFull(rootDict.values[PdfNameTokens.acroForm]);
    if (acroForm == null) return const <PdfSignatureFieldInfo>[];

    final fieldsVal = acroForm.values[PdfNameTokens.fields];
    final fields = _resolveArrayFromValue(fieldsVal) ??
        _resolveArrayFromValueFull(fieldsVal);
    if (fields == null) return const <PdfSignatureFieldInfo>[];

    final out = <PdfSignatureFieldInfo>[];
    final visited = <int>{};
    final pageIndexByObj = _buildPageIndexByObj(rootDict);
    for (int i = 0; i < fields.values.length; i++) {
      final item = fields.values[i];
      _collectSignatureFields(
        item,
        out,
        visited,
        pageIndexByObj: pageIndexByObj,
      );
    }
    return out;
  } catch (_) {
    return PdfParserFields.extractSignatureFieldsFromBytes(reader.readAll());
  }
}