Skip to content

Accessibility (PDF/UA)

Scenario

Produce a PDF a screen reader can read (tagged generation → scoring), or measure whether an incoming PDF has a readable structure. PDF/UA-1 (ISO 14289-1) is inside the spec corpus, so violations can be stated with the clause quoted (T1 — the big difference from PDF/A).

Everything below is a real measurement from 2026-09-04 (pdf-verify-mcp v0.26.0 / veraPDF 1.30.0; tagged demo invoice = the passing side / the Japanese official gazette = the failing side).

Cast

ActorRole
pdf-writerGeneration with tagged: true, tag_form_fields, ensure_tagged (claim only)
pdf-verifyvalidate_conformance(pdfua-1) — veraPDF delegation, violations with clause IDs
pdf-readerinspect_tags (structure tree), extract_structured_text (logical order)
pdf-publish SkillProducer-side orchestration (tagged implies the pdfua-1 gate)

Sequence

Prompt examples

  • "Make this report an accessible PDF, verification included"
  • "Can a screen reader read this PDF? What's missing?"
  • "Make this form PDF/UA conformant" (→ tag_form_fields)

Measured examples — both sides

Producer side (publish-demo-invoice.pdf): inspect_tags reports tagged, one H1, TH 5 / TD 15 / TR 4. veraPDF 1.30.0 judged PDF/UA-1 COMPLIANT (106/106). The same file is 146/146 under PDF/A-3b.

Auditor side (gazette, 2026-08-10 issue): NOT COMPLIANT — 10 of 106 rules failed (96 passed). The file is encrypted, so veraPDF scored a decrypted rewrite. Principal violations:

Clause (ISO 14289-1)Violation
7.1-3236 pieces of real content neither tagged nor marked as Artifact
7.1-11No StructTreeRoot
6.2-1No MarkInfo/Marked
7.21.7-19 fonts without ToUnicode
7.2-34Natural language for page content not determined (186 checks)
Call — validate_conformance (pdfua-1)
  • Measured: pdf-verify-mcp v0.26.0, veraPDF 1.30.0

Passing side:

jsonc
{
  "file_path": "/absolute/path/to/docs/specimens/publish-demo-invoice.pdf",
  "flavour": "pdfua-1",
  "response_format": "json"
}
jsonc
{
  "engine": "verapdf",
  "flavour": "PDF/UA-1",
  "compliant": true,
  "checkedRules": 106,
  "passedRules": 106,
  "failedRules": 0
}

The failing side uses the same arguments with the gazette path: compliant: false, failedRules: 10.

How to read the results

  • PDF/UA-1 is T1 — a violation can be stated as "ISO 14289-1 7.1-3 requires…", one step stronger than PDF/A's "veraPDF judged it so"
  • Native-engine violations carry a severity: only error proves non-conformance (warnings need human review)
  • With tagged: true, an embedded font and a title are mandatory even without CJK text (the standard 14 fonts always violate 7.21.4.1)
  • Machines validate structure only. Whether alt text is meaningful and the reading order is natural remains human review
  • ensure_tagged writes a label — once used, pdfua-1 must be measured

MIT Licensed