extractSignatureFieldEditContext method
Extracts complete information for editing signature fields.
Returns references and dictionaries so that operations such as renaming and removing fields can be done with an incremental update.
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>[]);
}
}