Matterhorn 14-003 · PDF/UA-1 UA1:7.4-1
Fix skipped heading levels in a PDF (H1 to H3)
The heading hierarchy jumps a level going down — H1 straight to H3. Going back up any number of levels is fine; going down must be one level at a time.
The condition, as the protocol states it. “Numbered heading levels in descending sequence are skipped (Example: <H3> follows directly after <H1>).”
Matterhorn Protocol 1.1, checkpoint 14, index 14-003, section UA1:7.4-1. Software can decide this one on its own.
What a screen reader actually does
The user hears a level-3 heading and infers a missing level-2 section, so the document's shape is misreported.
What the rule actually is
Two separate things, often confused.
14-002 says: if the document uses numbered headings at all, the first one must be <H1>. A document that opens with <H2> describes a section with no parent.
14-003 says: numbered heading levels must not skip in descending sequence. <H1> followed by <H3> is a failure — a level-2 section has been implied and never declared. Going back up is unrestricted: <H4> to <H1> closes three sections at once and is perfectly legal.
The reason is not tidiness. The heading list is how a screen reader user navigates a long document: in NVDA, H moves to the next heading and 1–6 move to the next heading of that level. A skipped level tells the user a section exists that they cannot reach, and it distorts their mental model of how the document is organised.
What is in the file
Nothing exotic. The level is the structure type:
14 0 obj
<< /Type /StructElem /S /H1 /P 9 0 R /Pg 3 0 R /K [ 0 ] >>
endobj
15 0 obj
<< /Type /StructElem /S /H3 /P 9 0 R /Pg 3 0 R /K [ 1 ] >> % skips H2
endobj
Two subtleties bite in real files.
Role mapping counts. A custom tag named Heading 1 that role-maps to /H1 is an H1 for this purpose. The check must resolve the role map before it looks at levels — a validator that reads /S naively will report nonsense on any Word export.
Document order, not page order. The sequence that matters is depth-first through the structure tree, which is not necessarily the order headings appear on the page. If your reading order is broken, your heading hierarchy may look broken as a consequence; fix 09-001 first.
How to fix it free, in Acrobat Pro
View → Show/Hide → Navigation Panes → Tags.- Walk the tree and write down the heading sequence: H1, H3, H3, H2, …
- Decide what it should be. The usual cause is a template whose “Subheading” style was mapped to H3 while nothing used H2. In that case every H3 at that level becomes an H2.
- Right-click the tag → Properties → change Type from Heading Level 3 to Heading Level 2.
- Repeat, then re-run the Accessibility Check.
Acrobat has no multi-select for this, so on a fifty-heading document it is fifty dialogs.
The much faster free route is upstream. In Word, the outline is the export: View → Navigation Pane shows exactly the hierarchy that will end up in the PDF. Fix the styles there — apply Heading 2 where Heading 3 was used — and re-export. Ten minutes of style work beats an hour of tag surgery, and it survives the next revision of the document. The same is true of InDesign paragraph styles mapped through Tagged PDF → Export Tags.
The trap in “just renumber everything”
The naive repair is to walk the headings and clamp each level to previous + 1. That produces a conformant document with a wrong outline: a sequence of H1, H3, H3, H2 becomes H1, H2, H2, H2 — and the section that was genuinely at a different depth is now a sibling of its own parent.
The repair has to preserve relative depth. Taggart maintains a stack: each heading pops entries at or below its own original level, and its new level is the resulting stack depth. H2, H4, H4, H2 becomes H1, H2, H2, H1 — the shape of the document is kept, only the numbering is normalised.
Where Taggart differs
Taggart reports the exact transition, with the page and the structure path:
<H3>follows<H1>, skipping<H2>. — page 1,StructTreeRoot[0]/Document[0]/H3[1]
The fix is mechanical and lands in “Fix All Safe”: it normalises the whole hierarchy in one pass using the stack rule above, and prints every change as a line in the remediation report — page 1 …/H3[1]: <H3> → <H2>. It also handles 14-007 at the same time, converting a stray unnumbered <H> to a numbered level derived from its nesting depth when the document has already committed to the numbered model.
How Taggart handles it
Taggart detects this condition automatically. It is reported as a blocker, with the page, the structure path and the object id of every occurrence.
The fix is Repair heading levels. It is mechanical, so “Fix All Safe” applies it in bulk with a diff and a single undo.
Whatever Taggart changes, the page still looks identical. Fixes edit the PDF object model, not the content streams, and every remediation is re-rendered and compared against the original at structural similarity ≥ 0.999 before you get the file back. A tool that quietly reflows your document is worse than no tool.
Frequently asked questions
Can heading levels jump back up? H3 straight to H1?
Yes. Going back up is how you close a section, and any jump is allowed: H4 to H1 is fine. Only going down must be one level at a time. H1 to H3 is a failure; H3 to H1 is not.
Does a document have to have exactly one H1?
PDF/UA-1 does not require it, and neither does WCAG. What it does require is that the first numbered heading is an H1 (condition 14-002) and that levels do not skip on the way down. One H1 is good practice for a single-subject document, but a report containing several independent papers legitimately has several.
The heading looks right on the page. Why does the checker complain?
Because heading level is a property of the tag, not of the type size. Text set in 18pt bold is not a heading unless it carries an H1..H6 tag, and an H3 tag on 24pt text is still an H3. The checker reads the tags. So does the screen reader.
What about levels deeper than H6?
ISO 32000-1 only defines H1 through H6. PDF/UA adds the nomenclature Hn for deeper levels, but H7 and beyond are not standard structure types, so they must be role-mapped. That is condition 14-005, and it is rare outside legal and standards documents.
Where this sits in the standards
| Standard | Reference |
|---|---|
| Matterhorn Protocol 1.1 | Checkpoint 14 (Headings), index 14-003 |
| PDF/UA-1 (ISO 14289-1) | Clause 7.4-1 |
| WCAG 2.1 | 1.3.1 Info and Relationships — Level A |
| EN 301 549 / Section 508 / ADA Title II | All three point at WCAG 2.1 Level AA for non-web documents, so a Level A or AA criterion here is in scope for each of them. |
Related conditions
- 14-002 First heading tag is not H1 The document uses numbered headings (H1–H6) but the first one encountered in the structure tree is not an H1.
- 14-001 Headings are not tagged Text that is visually a heading — larger, bolder, isolated — is tagged as a paragraph. The document has no navigable outline.
- 14-006 A node contains more than one H tag In the strong-structure model, an unnumbered H derives its level from nesting depth, so a single structural node may contain at most one H.
- 14-007 Document uses both H and H# tags A document must commit to one heading model: strong structure (H, levelled by nesting) or weak structure (H1–H6). Mixing them makes the level of any given heading ambiguous.
Other conditions in checkpoint 14
Checkpoint 14 covers headings. These are its other failure conditions; the ones without a link are in the rule set but do not have a written page yet.
- 14-001 Headings are not tagged Text that is visually a heading — larger, bolder, isolated — is tagged as a paragraph. The document has no navigable outline.
- 14-002 First heading tag is not H1 The document uses numbered headings (H1–H6) but the first one encountered in the structure tree is not an H1.
- 14-004 Numbered heading tags do not use Arabic numerals Custom heading tags like "Heading-One" or "HI" must role-map to H1–H6 or to Hn using Arabic numerals.
- 14-005 Content representing a 7th level (or higher) heading does not use an H7 (or higher) tag Documents deeper than six levels must use Hn tags (H7, H8 …), role-mapped because ISO 32000-1 defines only H1–H6.
- 14-006 A node contains more than one H tag In the strong-structure model, an unnumbered H derives its level from nesting depth, so a single structural node may contain at most one H.
- 14-007 Document uses both H and H# tags A document must commit to one heading model: strong structure (H, levelled by nesting) or weak structure (H1–H6). Mixing them makes the level of any given heading ambiguous.
Check your own file. Taggart’s validator is free and unlimited — every machine-checkable Matterhorn condition, no page cap, no watermark, no account needed.
Verified against a real document on . Last updated .