extractSignatureFieldEditContext method
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>[]);
}
}