Accessible PDFs

Accessible PDFs are tagged PDFs — documents with a structure tree describing the logical reading order and semantics of the content, independent of its visual layout. A screen reader uses that tree to read the document to a blind or low-vision user. Without it, the user gets either nothing or a jumbled mess.

EuroPDF generates tagged PDFs when you enable the PDF/UA profile as an API option. But the PDF is only as accessible as the HTML you send us. Prince’s own documentation is honest about this:

“Prince helps in creating accessible documents. Note, however, that Prince does not create WCAG-compliant documents by itself.”PrinceXML docs

This page is about the HTML side: the semantic patterns that let Prince produce a tagged PDF that passes PDF/UA checkers. You write proper HTML, we handle the rest.

A complete example

▶ Open in Playground
<!DOCTYPE html>
<html lang="en">
<head>
  <title>Quarterly Report 2026</title>
</head>
<body>
  <header>
    <h1>Quarterly Report 2026</h1>
  </header>
  <main>
    <h2>Summary</h2>
    <p>Revenue increased 18% year-over-year...</p>

    <h2>Revenue by Region</h2>
    <table>
      <caption>Revenue in EUR, Q1 2026</caption>
      <thead>
        <tr><th scope="col">Region</th><th scope="col">Revenue</th></tr>
      </thead>
      <tbody>
        <tr><th scope="row">Germany</th><td>€480,000</td></tr>
      </tbody>
    </table>
  </main>
  <footer>
    <p>Confidential. Internal use only.</p>
  </footer>
</body>
</html>

Everything that matters for accessibility is in that markup: a lang attribute on <html>, a document <title>, semantic landmarks (<header>, <main>, <footer>), a proper heading hierarchy, and a table with <caption>, <th scope>, and explicit <thead>/<tbody>. No special classes, no ARIA attributes, no CSS tricks — just well-structured HTML.

What EuroPDF does for you

  • Tags the PDF automatically when you output with the PDF/UA profile, mapping your HTML elements to the correct PDF structure tags.
  • Preserves the reading order from the HTML DOM, which is what assistive tech follows.
  • Embeds the document language in the PDF metadata for screen readers.
  • Carries alt text from <img alt="..."> into the PDF image structure.
  • Emits a tagged structure tree that conforms to the PDF/UA (ISO 14289) and PDF/A-3a specifications.

Try it now

Test it instantly in the Playground — no sign-up required.

More examples

Language declaration

▶ Open in Playground
<html lang="de">
  <body>
    <p>Dieses Dokument ist auf Deutsch.</p>
    <p lang="en">This paragraph is in English.</p>
  </body>
</html>

Without lang, screen readers guess the language (usually wrong) and mispronounce the text. Mark the document language once on <html>, and override it with lang="..." on any element whose content is in a different language.

Images with alt text

▶ Open in Playground
<figure>
  <img src="chart.png" alt="Bar chart showing Q1 2026 revenue of 1.2M, up 18% YoY">
  <figcaption>Figure 1: Quarterly revenue</figcaption>
</figure>

alt describes what the image conveys, not what it looks like. For decorative images (spacers, dividers), use alt="" — not missing alt, which reads the filename.

Accessible tables

▶ Open in Playground
<table>
  <caption>Team headcount by department</caption>
  <thead>
    <tr><th scope="col">Department</th><th scope="col">Headcount</th></tr>
  </thead>
  <tbody>
    <tr><th scope="row">Engineering</th><td>42</td></tr>
    <tr><th scope="row">Product</th><td>12</td></tr>
  </tbody>
</table>

The scope attributes let assistive tech announce the right row and column headers as the user navigates between cells.

Correct heading hierarchy

▶ Open in Playground
<h1>Document title</h1>
<h2>Chapter One</h2>
<h3>A subsection</h3>
<h2>Chapter Two</h2>

One <h1> per document, no skipped levels. Use CSS to adjust visual size — never skip levels to get a smaller look.

Semantic landmarks

▶ Open in Playground
<header><h1>Employee Handbook</h1></header>
<nav>Contents: Introduction · Policies · Benefits</nav>
<main>
  <h2>Introduction</h2>
  <p>...</p>
</main>
<aside>Tip: Use only one main element per document.</aside>
<footer>© 2026 Internal document.</footer>

Landmark elements let screen reader users jump directly to the content area and skip repetitive navigation.

Semantic lists

▶ Open in Playground
<ul>
  <li>Unordered bullet list — order doesn't matter</li>
</ul>

<ol>
  <li>Ordered list — sequence is meaningful</li>
  <li>Steps, rankings, timelines</li>
</ol>

<dl>
  <dt>Tagged PDF</dt>
  <dd>A PDF with a structure tree for assistive tech.</dd>
</dl>

Never fake a list with paragraphs and bullet characters — assistive tech loses the list structure entirely and reads it as flowing prose.

Form labels

▶ Open in Playground
<label for="email">Email address</label>
<input type="email" id="email" name="email">

<label>
  Phone
  <input type="tel" name="phone">
</label>

Every form field needs an associated label — either via for/id or by nesting the input inside the <label>. Without this association, assistive tech has no way to announce what each field is for.


EuroPDF wraps PrinceXML — the full reference for PDF/UA output, tagged PDF, and PDF profiles lives in the Prince user guide.