Structure element — ISO 32000-2 §14.7.3, the granularity of Tagged PDF §14.8.

Module pdfStructElement | Source packages/front/office/pdf/src/tagged/structElement.js | Deps pdfErrors, pdfParser | Worker-safe yes

Types a /Type /StructElem dict. Fields: /S (structure type — required), /P (parent), /ID, /Pg (owning page), /K (kids — int/ref/dict or array), /A//C (attributes/classes), /R (revision), /T//Lang//Alt//E//ActualText (accessibility), /AF (PDF 2.0 associated files), /NS (namespace), /PhoneticAlphabet//Phoneme. Kids are normalized to records { kind: 'mcid'|'elem'|'mcr'|'objr', … }.

Resolve

const se = runtime.resolve('pdfStructElement');
// Returns: { typeStructElement }

API

Method Signature Returns
typeStructElement (dict) => StructElement Typing (kids are not recursively typed — each kind: 'elem' kid still carries a raw ref, resolved and re-typed by the caller).

Shape of a kid

{ kind: 'mcid', mcid: number }
{ kind: 'elem', ref: { type:'ref', num, gen } }
{ kind: 'mcr',  pg?, stm?, stmOwn?, mcid: number|null, raw }   // /Type /MCR
{ kind: 'objr', pg?, obj?, raw }                                // /Type /OBJR

Examples

Recursive walk

function walk(elDict, resolveRef, depth = 0) {
    const e = runtime.resolve('pdfStructElement').typeStructElement(elDict);
    console.log(' '.repeat(depth) + e.s + (e.alt ? ` [${e.alt}]` : ''));
    for (const k of e.k) {
        if (k.kind === 'elem') walk(resolveRef(k.ref), resolveRef, depth + 1);
    }
}

Accessibility

const el = runtime.resolve('pdfStructElement').typeStructElement(dict);
el.s;          // 'Figure'
el.alt;        // alt-text (required for PDF/UA)
el.actualText;
el.lang;       // 'fr-FR'

Errors

Code Class When
pdf/tagged/struct-elem/not-dict ParseError Argument is not a dict.
pdf/tagged/struct-elem/bad-type ParseError /Type present and ≠ /StructElem.
pdf/tagged/struct-elem/missing-s ParseError /S missing or not a name.
pdf/tagged/struct-elem/bad-kid ParseError Kid of an unhandled shape.

See also