extractSignatureFields method
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());
}
}