Skip to content

PdfBroker.io is a cloud-based PDF generation REST API that supports generating compliant PDF/A and PDF/UA documents through its WeasyPrint service. This guide explains the difference between the two standards, when you need each one, and how to generate compliant documents using simple API calls. If you are preparing for the European Accessibility Act (EAA), which requires accessible digital documents from June 2025, PdfBroker.io's PDF/UA support provides a straightforward path to compliance.

Understanding PDF/A and PDF/UA

PDF/A — Archival Compliance

PDF/A is an ISO standard for long-term archival of electronic documents. A PDF/A file is self-contained: all fonts are embedded, no external dependencies exist, and the document will render identically decades from now. Common use cases include tax invoices, legal contracts, government filings, and medical records.

PdfBroker.io's WeasyPrint service supports these PDF/A variants:

Variant Standard Use Case
pdf/a-1b ISO 19005-1 Basic archival, widest compatibility
pdf/a-2b ISO 19005-2 Adds JPEG2000, transparency support
pdf/a-3b ISO 19005-3 Allows embedded attachments (e.g., XML data)
pdf/a-4b ISO 19005-4 Latest standard, based on PDF 2.0

PDF/UA — Accessibility Compliance

PDF/UA (Universal Accessibility) is an ISO standard (ISO 14289) that ensures PDF documents are accessible to people using assistive technologies such as screen readers. A PDF/UA document has a tagged structure, a logical reading order, and alternative text for non-text elements.

PdfBroker.io's WeasyPrint service supports:

Variant Standard Use Case
pdf/ua-1 ISO 14289-1 Accessible PDFs for screen readers and assistive technology

The European Accessibility Act

The European Accessibility Act (EAA, Directive 2019/882) requires businesses selling products and services in the EU to make their digital content accessible. This applies to PDFs published on websites, sent to customers, or provided as part of a digital service. The EAA took effect in June 2025, making PDF/UA compliance increasingly important for businesses operating in the EU.

Prerequisites

Step 1: Structure Your HTML for Compliance

Both PDF/A and PDF/UA benefit from well-structured HTML. For PDF/UA specifically, the tagged structure of the PDF is derived from your HTML semantics, so using proper elements is essential.

Key HTML practices for PDF/UA

<!DOCTYPE html>
<html lang="en">  <!-- Always set the document language -->
<head>
  <meta charset="UTF-8">
  <title>Quarterly Report Q1 2026</title>  <!-- Meaningful title -->
  <style>
    body { font-family: Arial, sans-serif; }
    h1 { color: #6462a8; }
    table { border-collapse: collapse; width: 100%; }
    th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
    th { background-color: #6462a8; color: white; }
  </style>
</head>
<body>
  <h1>Quarterly Report — Q1 2026</h1>

  <p>This report summarizes the financial performance of Acme Corp
     for the first quarter of 2026.</p>

  <!-- Use proper heading hierarchy: h1 > h2 > h3, no skipping -->
  <h2>Revenue Summary</h2>

  <!-- Tables must have headers for screen readers -->
  <table>
    <thead>
      <tr>
        <th>Month</th>
        <th>Revenue</th>
        <th>Expenses</th>
      </tr>
    </thead>
    <tbody>
      <tr><td>January</td><td>€45,000</td><td>€32,000</td></tr>
      <tr><td>February</td><td>€52,000</td><td>€34,000</td></tr>
      <tr><td>March</td><td>€48,000</td><td>€31,000</td></tr>
    </tbody>
  </table>

  <!-- All images need descriptive alt text -->
  <h2>Revenue Trend</h2>
  <img src="chart.png" alt="Bar chart showing monthly revenue increasing
       from €45,000 in January to €52,000 in February, then decreasing
       slightly to €48,000 in March." />

  <!-- Use lists for list-like content -->
  <h2>Key Highlights</h2>
  <ul>
    <li>Total Q1 revenue: €145,000</li>
    <li>Operating margin improved by 3 percentage points</li>
    <li>New customer acquisition up 15% compared to Q4 2025</li>
  </ul>
</body>
</html>

Key rules for PDF/UA compliance:

  • Set lang on the <html> element
  • Use a logical heading hierarchy (h1h2h3, never skip levels)
  • Include alt text on all <img> elements
  • Use <thead> and <th> for table headers
  • Avoid using images of text — use real text elements
  • Give the document a meaningful <title>

Step 2: Generate a PDF/A Document

To produce a PDF/A document, add the pdf-variant argument to your WeasyPrint API call.

C# with PdfBroker.Client

using PdfBroker.Client;
using PdfBroker.Common.RequestObjects;

var client = new PdfBrokerClientService("YOUR_CLIENT_ID", "YOUR_CLIENT_SECRET");

var html = await File.ReadAllTextAsync("report.html");

var request = new WeasyPrintRequestDto
{
    HtmlBase64String = Convert.ToBase64String(
        System.Text.Encoding.UTF8.GetBytes(html)),
    WeasyPrintToPdfArguments = new Dictionary<string, string>
    {
        { "pdf-variant", "pdf/a-3b" }
    }
};

byte[] pdfBytes = await client.WeasyPrintAsByteArrayAsync(request);
await File.WriteAllBytesAsync("report-pdfa.pdf", pdfBytes);

cURL

ACCESS_TOKEN=$(curl -s -X POST https://login.pdfbroker.io/connect/token \
  -d "grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET" \
  | jq -r '.access_token')

HTML_BASE64=$(base64 -w 0 report.html)

curl -X POST https://api.pdfbroker.io/api/pdf/weasyprint \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{
    \"htmlBase64String\": \"$HTML_BASE64\",
    \"weasyPrintToPdfArguments\": {
      \"pdf-variant\": \"pdf/a-3b\"
    }
  }" \
  --output report-pdfa.pdf

Python

import requests
import base64

# Authenticate
token_resp = requests.post(
    "https://login.pdfbroker.io/connect/token",
    data={
        "grant_type": "client_credentials",
        "client_id": "YOUR_CLIENT_ID",
        "client_secret": "YOUR_CLIENT_SECRET",
    },
)
access_token = token_resp.json()["access_token"]

# Load HTML
with open("report.html", "r", encoding="utf-8") as f:
    html_b64 = base64.b64encode(f.read().encode("utf-8")).decode("ascii")

# Generate PDF/A-3b
response = requests.post(
    "https://api.pdfbroker.io/api/pdf/weasyprint",
    headers={"Authorization": f"Bearer {access_token}"},
    json={
        "htmlBase64String": html_b64,
        "weasyPrintToPdfArguments": {"pdf-variant": "pdf/a-3b"},
    },
)

with open("report-pdfa.pdf", "wb") as f:
    f.write(response.content)

Step 3: Generate a PDF/UA Document

The process is identical — just change the pdf-variant value to pdf/ua-1. The quality of the accessibility tagging depends on the semantic quality of your HTML input.

C# with PdfBroker.Client

using PdfBroker.Client;
using PdfBroker.Common.RequestObjects;

var client = new PdfBrokerClientService("YOUR_CLIENT_ID", "YOUR_CLIENT_SECRET");

var html = await File.ReadAllTextAsync("accessible-report.html");

var request = new WeasyPrintRequestDto
{
    HtmlBase64String = Convert.ToBase64String(
        System.Text.Encoding.UTF8.GetBytes(html)),
    WeasyPrintToPdfArguments = new Dictionary<string, string>
    {
        { "pdf-variant", "pdf/ua-1" }
    }
};

byte[] pdfBytes = await client.WeasyPrintAsByteArrayAsync(request);
await File.WriteAllBytesAsync("report-pdfua.pdf", pdfBytes);

cURL

curl -X POST https://api.pdfbroker.io/api/pdf/weasyprint \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{
    \"htmlBase64String\": \"$HTML_BASE64\",
    \"weasyPrintToPdfArguments\": {
      \"pdf-variant\": \"pdf/ua-1\"
    }
  }" \
  --output report-pdfua.pdf

Python

response = requests.post(
    "https://api.pdfbroker.io/api/pdf/weasyprint",
    headers={"Authorization": f"Bearer {access_token}"},
    json={
        "htmlBase64String": html_b64,
        "weasyPrintToPdfArguments": {"pdf-variant": "pdf/ua-1"},
    },
)

with open("report-pdfua.pdf", "wb") as f:
    f.write(response.content)

Choosing the Right Variant

Requirement Recommended Variant
Long-term archival (tax, legal, government) pdf/a-3b
Maximum compatibility with older systems pdf/a-1b
Archival with embedded attachments (XML invoices) pdf/a-3b
Screen reader and assistive technology support pdf/ua-1
European Accessibility Act compliance pdf/ua-1
Both archival and accessibility Generate two versions, or use pdf/ua-1 as a starting point

Common Pitfalls

Missing lang attribute. PDF/UA validators will flag documents without a language declaration. Always set lang on your <html> tag.

Images without alt text. Every <img> element in your HTML must have a descriptive alt attribute. Decorative images should use alt="" (empty string).

Skipped heading levels. Going from <h1> directly to <h3> breaks the document's logical structure. Screen readers use heading levels to navigate the document.

Using wkhtmltopdf instead of WeasyPrint. PDF/A and PDF/UA compliance is only available through PdfBroker.io's WeasyPrint service. The wkhtmltopdf service does not support these variants.

Summary

Generating compliant PDF/A and PDF/UA documents with PdfBroker.io is a single API parameter change. Write well-structured HTML, set the pdf-variant argument to your desired standard, and the WeasyPrint service handles the rest — embedding fonts, creating tagged structures, and producing ISO-compliant output. For European Accessibility Act compliance, combine semantic HTML practices with the pdf/ua-1 variant.