Accessible PDF generation
Accessible PDF Generation from HTML: Tagged PDF, ADA Compliant PDF and Section 508 Output
Generated documents are now inside the accessibility rules that used to apply only to web pages. This page covers what a tagged PDF actually gives you, which rendering engines emit one, and what US buyers are being asked to prove in 2026. Render any markup with the tool below while you read.
- Early access, launching soon
- No card required
- Your HTML stays yours
Live demo
Runs in your browser. Nothing is uploaded.
Your HTML
Live preview
Your PDF is downloading. Want this as one API call, with the page archived too?
Short answer
A PDF is accessible when it carries a tag structure that tells assistive technology what each piece of content is and in what order to read it. For documents generated from HTML, that structure comes from your markup: headless Chromium, Prince, PDFReactor and WeasyPrint all convert semantic HTML into PDF tags, so headings, lists, tables and alt text survive into the file. The gap buyers keep hitting is that tagged is not the same as conformant. Only some engines target PDF/UA-1 (ISO 14289-1), and even those that do decline to guarantee a valid file. Two US regimes drive the requirement: Section 508 for federal agencies and their contractors, and ADA Title II for state and local government, which adopts WCAG 2.1 Level AA. The Title II deadlines moved: an Interim Final Rule published on 20 April 2026 extended compliance to 26 April 2027 for entities of 50,000 or more people and 26 April 2028 for everyone else.
Last updated 20 August 2026. Written and fact checked by the Sitepdf team.
Which HTML to PDF engines actually produce accessible output
Every cell below was read off the project own documentation on 20 August 2026. The column that matters is the third one: tagging and PDF/UA conformance are different claims, and most comparison articles collapse them into one.
| Engine or service | Emits tagged PDF? | Targets PDF/UA? | What its own documentation says | Cost of the engine |
|---|---|---|---|---|
| Headless Chromium (Puppeteer, Playwright, Chromium based APIs including Sitepdf) | Yes, via the generateTaggedPDF flag on Page.printToPDF |
No conformance profile | The DevTools Protocol describes the parameter as "Whether or not to generate tagged (accessible) PDF. Defaults to embedder choice." It is still marked Experimental. There is no PDF/UA switch and no conformance claim anywhere in the protocol. | Free, open source |
| Prince (and DocRaptor, which runs Prince as a service) | Yes, via --tagged-pdf |
Yes, PDF/UA-1 (ISO 14289-1) | Prince documents PDF/UA-1 as a supported output profile and states that the PDF/A-1a, 2a, 3a and PDF/UA-1 profiles "require tagged PDF, and will automatically enable it". It also lists the PDF/UA obligations it expects your source to meet, including alternative text and logical order. | Commercial license, or per document through DocRaptor |
| PDFreactor | Yes, including WAI-ARIA roles | Yes | States that it "supports the creation of tagged PDF documents in line with accessibility guidelines, including Section 508, the Matterhorn protocol and PDF/UA", and publishes a VPAT. WAI-ARIA attributes in the source are used to improve the structure it emits. | Commercial license |
| WeasyPrint | Yes, via --pdf-tags |
Yes, pdf/ua-1 and pdf/ua-2 variants |
The most honest sentence published by anyone in this category: "The generation of PDF/A and PDF/UA documents is supported. However, the generated documents are not guaranteed to be valid, and users have the responsibility to check that they follow the rules listed by the related specifications." | Free, BSD licensed |
| wkhtmltopdf | No | No | Nothing, because the project is over. The GitHub repository carries the notice "This repository was archived by the owner on Jan 2, 2023." The last release, 0.12.6, shipped in June 2020. Anything built on it, including many older PHP and Python wrappers, inherits that. | Free, unmaintained |
| html2pdf.js and anything using html2canvas | No, and it cannot | No | By its own description it "renders all content into an image, then places that image into a PDF. This means text is not selectable or searchable". A picture of a document has no text layer at all, so there is nothing for a screen reader to read and no tagging is possible. | Free |
| Adobe PDF Services Accessibility Auto-Tag | Yes, but it is remediation, not rendering | Assists toward it | A separate operation that adds tags to a PDF you already have, rather than an HTML renderer. Priced at 10 Document Transactions per page, against a free allowance of 500 transactions a month, so a single 100 page report consumes twice the monthly free tier. | Quote only, no published rate card |
Two things this table is not saying. It is not saying Chromium output fails an audit: for a well built HTML source, tagged Chromium output is genuinely usable with a screen reader and satisfies a large share of WCAG. It is saying that if your contract names PDF/UA-1 specifically, an engine with a conformance profile is the safer starting point, and every route still needs validation. And it is not saying the free engines are worse. WeasyPrint targets PDF/UA and costs nothing; what it lacks is a JavaScript engine, so a template that draws a chart client side renders an empty box.
What makes a PDF accessible?
An accessible PDF is one that assistive technology can interpret rather than guess at. Six things carry almost all of the weight, and five of them are decided in your HTML before any rendering happens.
- A tag structure. Headings, paragraphs, lists, tables and figures marked as what they are, in a parallel tree alongside the visual content.
- A logical reading order. The sequence a screen reader announces content in. Untagged multi column layouts get read straight across the columns, which is why they come out as nonsense.
- Alternative text on meaningful images, and images that are purely decorative marked as artifacts so they are skipped rather than announced.
- Real table headers. A
thwith ascopebecomes a header association in the PDF, so each cell is read with its column and row header attached. This is the single difference between a usable and an unusable data table. - A document language, so the right pronunciation engine is selected, plus a document title.
- Text that is actually text. Selectable, searchable vector text rather than an image of a page.
Notice what is not on that list: how the document looks. Accessibility is about the structure underneath the appearance, which is exactly why generating from HTML has a structural advantage over scanning or over drawing a layout by hand. You already have a semantic document. The job is to not lose it on the way into the PDF.
What is a tagged PDF?
An untagged PDF is a set of drawing instructions. It knows that a run of glyphs sits at certain coordinates in a certain font. It has no idea that the run is a level two heading, that another block is a table cell, or in what order a human should consume any of it. Tagging adds a structure tree describing exactly that.
When you render from HTML, the mapping is direct, and it is worth knowing because it tells you where quality comes from:
h1toh6become H1 to H6 structure elements, which is what lets a screen reader user jump between sections instead of listening linearly.ul,olandlibecome L, LI and LBody, so list membership and position are announced.- A
tablewiththandscopebecomes Table, TR, TH and TD with header associations. - An
imgwithaltbecomes a Figure with alternate text. langon the html element becomes the document language.- DOM order becomes reading order.
The consequence is blunt. The renderer does not invent structure, it translates the structure you gave it. A document built out of styled div elements with visual sizing instead of headings will be tagged, and will still be useless, because there was nothing meaningful to carry across. Teams that treat accessibility as a rendering setting rather than a markup discipline discover this at audit, not before.
Section 508 and ADA Title II: what US buyers are actually asked in 2026
Two regimes drive nearly every accessibility clause a US software vendor sees, and they are routinely confused with each other.
Section 508 binds federal agencies, and reaches contractors and recipients of federal funds through procurement. The revised standards incorporate WCAG Level A and AA for electronic content, and it has been in force for years. If you sell to a federal agency, accessibility is a line item in the solicitation and often a VPAT request.
ADA Title II is the newer pressure. The Department of Justice published its web and mobile app rule in the Federal Register on 24 April 2024, adopting WCAG 2.1 Level AA for state and local government web content, and conventional electronic documents including PDFs are explicitly in scope.
The dates moved, and most published guidance has not caught up. On 20 April 2026 the Federal Register published an Interim Final Rule extending the compliance deadlines. The current dates are 26 April 2027 for public entities with a total population of 50,000 or more, and 26 April 2028 for entities under 50,000 and for special district governments. Plenty of articles written in 2024 and 2025 still print April 2026 as the first deadline. It is worth checking the current date before you plan a remediation budget around it, in either direction.
There is also an exception worth knowing: conventional electronic documents posted before a covered entity compliance date are generally exempt, unless they are currently being used to apply for, access or participate in a service. Documents created after the date are not exempt, which is precisely why generated documents matter. A statement, invoice, permit or report that your system produces every month is being created new every time.
If you are a software vendor rather than a covered entity, the obligation still lands on you indirectly. Your customer is covered, your product generates the PDFs they send to the public, and their duty becomes your contract clause. That is why this arrives as a procurement questionnaire rather than a lawsuit, and the document it asks for by name is almost always an Accessibility Conformance Report. Our page on the VPAT and Accessibility Conformance Report covers which edition to complete, what each conformance rating commits you to, and the Level A rows that untagged output makes impossible to claim honestly.
How to generate an accessible PDF from HTML
The work is mostly upstream. In rough order of how much difference each step makes:
- Fix the source markup first. Real heading levels in order with no skips, real lists, real tables with
thandscope,alton every meaningful image andalt=""on decorative ones, andlangon the html element. No step further down this list can compensate for skipping this one. - Set the reading order by DOM order. CSS that visually reorders content, particularly flexbox
orderand grid placement, does not reorder the tag tree. What looks like a sensible two column layout can be announced in an order nobody intended. Lay the document out in the order it should be read. - Turn tagging on at render time. With Chromium it is one parameter. It is off by default in many wrappers, which is the most common reason a team believes they are producing tagged output and is not.
- Give the document a title and language in metadata, not only in the visible header.
- Check what came out. Not what you intended, what the file contains. Free tools do this in seconds.
- Do not run the file through a tool that strips the tags. This is the failure nobody expects: merge, compress, watermark, flatten and some signing steps can silently discard the structure tree. Validate after the last step in the pipeline, not after the render.
Our guide on accessible PDF from HTML walks through the tagging behaviour in more detail, and how to test PDF accessibility covers the checkers, what they catch and what they cannot.
Where automated generation stops
Every vendor in this category has an incentive to imply that switching on a flag makes a document compliant. It does not, and pretending otherwise is how a team fails an audit it thought it had passed.
Tagged is not conformant. PDF/UA-1 is a formal ISO standard with specific requirements, and emitting tags is a necessary but not sufficient step toward it. Chromium has no PDF/UA mode at all. WeasyPrint, which does have PDF/UA variants, states plainly that generated documents are not guaranteed to be valid and that checking is the responsibility of the user. That is the honest position for the whole category.
Some requirements are not machine decidable. No renderer can tell whether your alternative text is a useful description or the string "image1.png". None can judge whether a heading level reflects the actual document hierarchy, whether colour alone is carrying meaning, or whether reading order makes sense to a human. The PDF Association Matterhorn Protocol organises PDF/UA conformance into 31 checkpoints and 136 failure conditions, and while most can be identified by software, a substantial set requires human judgment. That is a structural property of accessibility, not a gap in any product.
Complex content stays hard. Multi level nested tables, data visualisations, mathematical notation and interactive forms all need deliberate work beyond good markup. A chart rendered as an image needs a real text description of what it shows, not a label.
The realistic position for a team generating documents at volume: good semantic HTML plus tagged output gets you a genuinely usable document and most of the way to WCAG, and it scales to a million files at no extra cost per file. Formal PDF/UA conformance on a document that a regulator will scrutinise still deserves validation and, sometimes, remediation in a dedicated tool. Anyone who tells you their renderer removes that step is selling you a future audit finding. If you are choosing what to validate with, our PDF accessibility checker comparison prices six tools and shows which of them actually decide PDF/UA conformance rather than just listing issues.
curl https://api.sitepdf.com/v1/render \
-H "Authorization: Bearer $SITEPDF_KEY" \
-d url="https://app.example.com/statements/2026-08/1042" \
-d format=Letter \
-d tagged=true \
-d archive=true
{
"pdf_url": "https://api.sitepdf.com/v1/documents/doc_9k2rb.pdf",
"pages": 4,
"tagged": true,
"rendered_in_ms": 1420,
"archive": {
"id": "arc_f81ld",
"captured_at": "2026-08-20T09:12:44Z",
"retrieve_url": "https://api.sitepdf.com/v1/archives/arc_f81ld"
}
}
The API is in early access; this is the documented call shape it opens with. Full request and response walkthrough.
Questions about this job
What makes a PDF accessible?
What is a tagged PDF?
How do I know if a PDF is accessible?
Is a tagged PDF the same as a Section 508 compliant PDF?
When is the ADA Title II compliance deadline for PDFs?
Can headless Chromium produce an accessible PDF?
Which HTML to PDF engines support PDF/UA?
Can you make a PDF accessible automatically?
Index
More PDF and archiving tools
- Convert HTML to PDF
- Webpage to PDF
- Save webpage as PDF
- URL to PDF API
- Website archiving
- Monitor website changes
- Screenshot API
- React to PDF
- Java PDF library
- C# PDF library
- Python PDF generation
- HTML to PDF Node.js
- Laravel HTML to PDF
- Vue to PDF
- Next.js PDF generator
- Angular to PDF
- Markdown to PDF API
- Django HTML to PDF
- Blazor HTML to PDF
- Spring Boot HTML to PDF
- Airtable to PDF
- Rails HTML to PDF
- PDF generator API
- Website archiving software
- Document generation API
- Legal document automation software
- Document automation software
- Bulk HTML to PDF
- ADA compliance audit cost
- 508 compliance testing
- PDF remediation
- VPAT and ACR
- PDF accessibility checker
- Wayback Machine alternative
- Best HTML to PDF API
- DocRaptor alternative
- Puppeteer alternative
- Wkhtmltopdf alternative
- PDFShift alternative
- Urlbox alternative
- PDFCrowd alternative
- Api2Pdf alternative
- Browserless alternative
- APITemplate alternative
- CraftMyPDF alternative
- PDFMonkey alternative
- dompdf alternative
- Gotenberg alternative
- GrabzIt alternative
- Adobe PDF Services API
- PDF SDK pricing
- HTML to image API pricing
- CloudConvert alternative
- CloudConvert pricing
- Direct mail API pricing
- E-signature API pricing
- Sparticuz Chromium Lambda cost
- Browserbase pricing
- Aspose PDF pricing
- PDF API pricing
- How it works
- Features
- Pricing
Early access
Get on the early-access list
The API opens to the list first, in order. Early access locks the planned launch rates for 12 months. No card required, launching soon.