Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

PDF/UA Accessibility

Commercial License Required - This feature requires a commercial license. See printwell.dev/pricing.

Create accessible PDFs compliant with PDF/UA (Universal Accessibility) standards.

PDF/UA Levels

LevelStandardDescription
PdfUA1ISO 14289-1:2014Original PDF/UA standard
PdfUA2ISO 14289-2:2024Updated standard

Validating PDF/UA Compliance

#![allow(unused)]
fn main() {
use printwell::pdfua::{validate_pdfua, PdfUALevel};

let result = validate_pdfua(&pdf_data, PdfUALevel::PdfUA1)?;

println!("Compliant: {}", result.is_compliant);
println!("Pages checked: {}", result.pages_checked);
println!("Tagged elements: {}", result.tagged_elements);

for issue in &result.issues {
    println!(
        "[{:?}] {:?}: {} (Page {})",
        issue.severity,
        issue.category,
        issue.description,
        issue.page
    );
    if let Some(suggestion) = &issue.suggestion {
        println!("  Suggestion: {}", suggestion);
    }
}
}

Issue Categories

CategoryDescription
StructureDocument structure tags
TagsMissing or incorrect tags
AltTextMissing alternative text
LanguageLanguage specification
ReadingOrderContent reading order
MetadataAccessibility metadata
TablesTable structure
HeadingsHeading hierarchy
ColorColor contrast issues
FontsFont accessibility
NavigationNavigation aids

Adding PDF/UA Metadata

#![allow(unused)]
fn main() {
use printwell::pdfua::{add_pdfua_metadata, AccessibilityOptions};

let options = AccessibilityOptions {
    language: "en".into(),
    title: "Accessible Document".into(),
    generate_placeholder_alt: false,
    include_reading_order: true,
    generate_outline: true,
};

let accessible = add_pdfua_metadata(&pdf_data, PdfUALevel::PdfUA1, Some(options))?;
}

Node.js Example

import { validatePdfua, addPdfuaMetadata } from 'printwell';

const result = validatePdfua(pdfData, 'PdfUA1');
console.log(`Accessible: ${result.isCompliant}`);

const accessible = addPdfuaMetadata(pdfData, 'PdfUA1', {
    language: 'en',
    title: 'Accessible Document',
    generateOutline: true
});

Python Example

from printwell import validate_pdfua, add_pdfua_metadata, PdfUALevel, AccessibilityOptions

result = validate_pdfua(pdf_data, PdfUALevel.PdfUA1)
print(f"Accessible: {result.is_compliant}")

options = AccessibilityOptions(
    language="en",
    title="Accessible Document",
    generate_outline=True
)
accessible = add_pdfua_metadata(pdf_data, PdfUALevel.PdfUA1, options)

Best Practices for Accessible PDFs

1. Document Structure

Use semantic HTML that maps to PDF tags:

<article>
    <h1>Main Title</h1>
    <section>
        <h2>Section Heading</h2>
        <p>Paragraph content...</p>
    </section>
</article>

2. Alternative Text

Always provide alt text for images:

<img src="chart.png" alt="Sales chart showing 20% growth in Q4">

3. Language Specification

Set the document language:

<html lang="en">

4. Reading Order

Ensure logical reading order in your HTML source.

5. Tables

Use proper table markup:

<table>
    <caption>Quarterly Sales</caption>
    <thead>
        <tr><th>Quarter</th><th>Sales</th></tr>
    </thead>
    <tbody>
        <tr><td>Q1</td><td>$100k</td></tr>
    </tbody>
</table>

6. Headings

Maintain proper heading hierarchy (h1 → h2 → h3).

7. Color Contrast

Ensure sufficient contrast ratios (WCAG 2.1 guidelines).