Interactive forms (AcroForm) layer: root dict typing, field-tree walk, typing by /FT, and /AP appearance streams.
| Module | Returns | Deps | Description |
|---|---|---|---|
pdfAcroForm |
{ typeAcroForm } |
pdfErrors, pdfParser |
/AcroForm dict, §12.7.3. |
pdfFieldTree |
{ walkFieldTree, getInherited } |
pdfErrors, pdfParser |
Walk + inheritance, §12.7.4. |
pdfButtonField |
{ typeButtonField } |
pdfErrors, pdfParser |
/FT /Btn, §12.7.5.2. |
pdfTextField |
{ typeTextField } |
pdfErrors, pdfParser |
/FT /Tx, §12.7.5.3. |
pdfChoiceField |
{ typeChoiceField } |
pdfErrors, pdfParser |
/FT /Ch, §12.7.5.4. |
pdfSignatureField |
{ typeSignatureField } |
pdfErrors, pdfParser |
/FT /Sig, §12.7.5.5. |
pdfAppearance |
{ typeAppearanceStreams, listPopulatedSlots } |
pdfErrors, pdfParser |
/AP, §12.5.5. |
Common pattern
const af = runtime.resolve('pdfAcroForm').typeAcroForm(doc._raw.resolve(catalog.acroForm));
const records = runtime.resolve('pdfFieldTree').walkFieldTree(af.fields, doc._raw.resolve);
for (const r of records.filter(r => r.terminal)) {
const ft = r.node.entries.FT && r.node.entries.FT.value;
switch (ft) {
case 'Btn': runtime.resolve('pdfButtonField').typeButtonField(r.node); break;
case 'Tx': runtime.resolve('pdfTextField').typeTextField(r.node); break;
case 'Ch': runtime.resolve('pdfChoiceField').typeChoiceField(r.node); break;
case 'Sig': runtime.resolve('pdfSignatureField').typeSignatureField(r.node); break;
}
}
See also
- Document layer —
pdfCatalogcarries/AcroForm. - Content layer —
pdfContentStreamparses appearances. - Syntax layer — the underlying
pdfParser.