WCAG 2.2 AA checks for generated PDFs
WCAG is a property of the final document, not just the API. Fork PDF runs automated checks on generated PDFs and the source HTML used to produce them. The samples below cover headings, paragraphs, lists, tables, links, images with alt text, and a multi-page document.
HTML to PDF mapping
The PDF is generated from the source HTML. Alt text, reading order, and document structure come from that source.
| Source HTML | PDF output | Preserved |
|---|---|---|
h1–h6 | H1–H6 | Text, heading level, and page order. |
p and text nodes | P / Span tagged content | Text content and source order. |
ul, ol, li | L, LI, LBody | List item text and order. |
table, th, td | Table, TR, TH, TD | Row, header, and cell structure with header and cell text. |
a href | Link plus link annotation | Link text, URI, and annotation bounds. |
img alt and svg role="img" aria-label | Figure with Alt | Alt text is written verbatim from the source HTML. |
| Text runs | Embedded fonts with ToUnicode | Extractable words and copy/paste text. |
What we test
- Travel itinerary: four-page PDF and its rendered source HTML.
- Invoice: headings, line items, table cells, and totals.
- Link and image: a link annotation plus an image with alt text.
- Multi-link: three links across two pages.
Evidence version and provenance
Evidence version: 2026-10-31. Results apply to the exact source and PDF files listed below. The manifest records tool versions, file sizes, and hashes. hashes.txt verifies the evidence set with sha256sum -c hashes.txt.
| Sample | Source HTML | PDF SHA-256 | |
|---|---|---|---|
| Travel itinerary | itinerary.html | itinerary-wcag.pdf | bf89547e495b5cc608460d453f09503c85d00295496fb2555a5a55805fe4c589 |
| Invoice | invoice.html | invoice-wcag.pdf | eb5eaeb558eb279055c35365b450f75b64f6c7c6660db42fbc9c6f348d0a4a4e |
| Link + image | links.html | links-wcag.pdf | 05b4838c1b14402b7f7aca5dab5d5512d744bd148d521db7251dc3affd5cde84 |
| Multi-link | multilink.html | multilink-wcag.pdf | 24973e6fa1e08c72f5c32f55da313de63b3c4de2c87d9dfd25beeeef46959555 |
Automated results
| Sample | axe-core HTML | axes4 WCAG | Notes |
|---|---|---|---|
| Travel itinerary | 0 violations, 1 incomplete | 0 errors / 0 warnings | Incomplete is SVG color contrast; calculated contrast passes. PDF.js extracts whole words. |
| Invoice | 0 violations, 0 incomplete | 0 errors / 0 warnings | Headings, table, and totals pass |
| Link + image | 0 violations, 0 incomplete | 0 errors / 0 warnings | Link annotation and image alt pass |
| Multi-link | Not audited as HTML | 0 errors / 0 warnings | Three link annotations across two pages |
axe-core 4.10.2 and Chromium 151.0.7880.0 ran at 1280×900 and 320×900. The axes4 WCAG2CheckSet ran on the generated PDFs; job IDs and raw reports are included in the evidence bundle. PDF.js 4.10.38 produced the text-extraction evidence for the itinerary. PDF/UA evidence is published separately and is not used for this WCAG result.
Known limitations
- The travel itinerary is a fixed A4 layout. WCAG 1.4.10 reflow is not demonstrated at 320 CSS px.
- Avoid CSS
letter-spacingon text that must be extracted. Position-based PDF readers can insert spaces between glyphs even when the visual text is correct.
Download the evidence
| File | Details |
|---|---|
| wcag-2.2-aa-proof.zip | Complete evidence bundle: sample PDFs, source HTML, raw tool reports, manifest, and hashes. |
| itinerary-wcag.pdf | Four-page travel itinerary. |
| invoice-wcag.pdf | Invoice with headings and a table. |
| links-wcag.pdf | Link and image sample. |
| multilink-wcag.pdf | Three links across two pages. |
| manifest.json | Evidence version, tool versions, sample hashes, result counts, and file hashes. |
| axe-results.json | Full axe-core results, including incomplete-node details, at both widths. |
| axes4-summary.json | axes4 counts and job IDs for all four PDFs. |
| axes4 raw reports | itinerary, invoice, links, and multilink. |
| contrast-calculations.txt | Color pairs, ratios, and the calculation method for the SVG map. |
| pdfjs-text-extraction.txt | PDF.js text extraction from the fixed itinerary sample. |
| hashes.txt | SHA-256 values for the evidence files. Verify with sha256sum -c hashes.txt. |
| zip-hash.txt | SHA-256 of the evidence bundle. Verify with sha256sum -c zip-hash.txt. |
Reproduce
- Download the evidence bundle and run
sha256sum -c hashes.txt. - Open the source HTML from the provenance table and run axe-core 4.10.2 at 1280×900 and 320×900. Compare the violations and incomplete results with
axe-results.json. - Upload the four PDFs to axes4 WCAG2CheckSet. Compare the errors, warnings, and job IDs with
axes4-summary.jsonand the raw reports. axes4 access is required. - Run PDF.js 4.10.38 text extraction on
itinerary-wcag.pdfand compare it withpdfjs-text-extraction.txt.
Evidence history
2026-10-31 — Evidence bundle refreshed with source HTML, full axe results, raw axes4 reports, an evidence manifest, and hashes.
This page
Automated page check: axe-core 4.10.2 reported 0 violations and 0 incomplete results at 1280×900 and 320×900 on 2026-10-31. page-axe-results.json
Report an evidence error
If a file, hash, or result on this page is wrong, contact us with the page URL and evidence version 2026-10-31.
Need a full accessibility audit?
Use this page as a starting point, not as legal advice or a conformance certificate. This page reports automated checks only. Contact us if you need help scoping manual testing or remediation.