Matterhorn 15-005 · PDF/UA-1 UA1:7.5-2

Complex tables: when Scope is not enough

Human decision Checkpoint 15: Tables WCAG 1.3.1 (A)

In a complex table — merged cells, stacked header rows, split spans — Scope alone cannot express the associations, so explicit /Headers references are required.

The condition, as the protocol states it. “A given cell's header cannot be unambiguously determined.”

Matterhorn Protocol 1.1, checkpoint 15, index 15-005, section UA1:7.5-2. The protocol marks this as requiring human judgement.

What a screen reader actually does

Cells are announced with the wrong headers, which is worse than no headers because it is confidently wrong.

The table that breaks Scope

2025202520262026
RegionQ1Q2Q1Q2
North1234
South5678

The cell containing 3 is governed by three headers: North, Q1, and 2026.

/Scope can express two of those. The 2026 cell spans columns four and five, and there is no /Scope value that means “columns four and five”. /Scope /Column on it would claim it heads its own column only, which is wrong, and a reader following that claim announces 3 under the wrong year.

What the file needs instead

Every header cell gets an /ID, and every data cell lists the headers that govern it:

% the 2026 header, spanning two columns
28 0 obj
<< /Type /StructElem /S /TH
   /A << /O /Table /ColSpan 2 >>
   /ID (y2026)
   /K [ 14 ] >>
endobj

% the cell containing 3
34 0 obj
<< /Type /StructElem /S /TD
   /A << /O /Table /Headers [ (north) (q1b) (y2026) ] >>
   /K [ 22 ] >>
endobj

The /ID values must be unique across the document, and the /Headers array references them by name. Order does not matter to conformance, but readers announce them in array order, so put the most specific first.

The two triggers

Taggart reports 15-005 when a table has either:

Spanning cells — any /ColSpan or /RowSpan greater than 1, and no /Headers anywhere in the table.

Stacked header rows — two or more consecutive rows whose cells are all TH, and no /Headers.

Both mean the same thing: the associations in this table cannot be expressed by /Scope, so whatever /Scope values are present are at best incomplete.

How to fix it free, in Acrobat Pro

Acrobat supports it, one cell at a time.

  1. Tags panel → right-click the <Table>Table Editor.
  2. Right-click a header cell → Table Cell Properties → set an ID. Give it something you can remember: y2026, q1b, north.
  3. Right-click a data cell → Table Cell PropertiesAssociated Header Cell IDs → add the IDs that govern it.
  4. Repeat step 3 for every data cell.

On the small table above that is eight dialogs. On a 5×20 table it is a hundred, and there is no multi-select for it. This is the single most tedious task in PDF remediation, and it is why the honest first question is whether the table can be simplified instead.

The alternative worth considering: split it. Two tables — one for 2025, one for 2026 — each with a single header row, need only /Scope. They are also easier to read on screen and in print. Restructuring in the source document is often ten minutes against an hour of Headers references, and produces a better document.

Upstream: neither Word nor InDesign generates /Headers references on export. This one genuinely has to be done in the PDF, which is another argument for avoiding the structure in the first place.

Where Taggart differs

Taggart reports it as a distinct condition with the reason, rather than folding it into a generic table warning:

This table uses spanning cells or stacked header rows but does not use /Headers ID references. /Scope alone cannot express the header associations unambiguously. spanningCells: true, stackedHeaderRows: 2

And crucially, when it detects this case it does not write /Scope values into the table as part of “Fix All Safe”. A /Scope on a spanning header would clear condition 15-003 and leave the reader announcing wrong associations — conformant-looking and worse than before.

Writing the /Headers arrays requires knowing which headers govern which cells, which is a reading of the table rather than a property of it, so it stays with you.

How Taggart handles it

This one is a judgement call. Taggart puts it in the guided review queue with the relevant page region highlighted, records the decision you make and who made it, and prints that decision in the remediation report.

The fix is Set table headers, Scope and Headers references. It changes what the document means, so Taggart proposes it and waits for your approval rather than applying it unattended.

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

When exactly does Scope stop working?

As soon as a header governs some columns but not all of them. /Scope /Column means 'this cell heads its column' — it has no way to say 'this cell heads columns four and five'. Any ColSpan or RowSpan greater than one, or more than one header row, puts you past it.

Can I mix Scope and Headers in one table?

You should not. The protocol's condition 15-003 is phrased as 'in a table not organised with Headers attributes and IDs' — the two are alternatives. Pick one per table, and for a complex table it has to be Headers.

Is there a way to avoid this?

Usually, yes, and it is worth considering before spending an hour on Headers references: split the complex table into two simple ones. A table with stacked year-then-quarter headers is often two tables, one per year, and both are easier to read for everybody.

What does a wrong header association sound like?

Confidently wrong. The reader announces a cell with headers that do not apply to it, and the user has no signal that anything is off. That is why Taggart reports this case separately rather than writing a /Scope that would look conformant.

Where this sits in the standards

Standards this condition maps to
StandardReference
Matterhorn Protocol 1.1 Checkpoint 15 (Tables), index 15-005
PDF/UA-1 (ISO 14289-1) Clause 7.5-2
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.

Other conditions in checkpoint 15

Checkpoint 15 covers tables. These are its other failure conditions; the ones without a link are in the rule set but do not have a written page yet.

Check your own file. Taggart’s validator is free and unlimited — every machine-checkable Matterhorn condition, no page cap, no watermark, no account needed.

Check a PDF free

Verified against a real document on . Last updated .