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
| Level | Standard | Description |
|---|---|---|
PdfUA1 | ISO 14289-1:2014 | Original PDF/UA standard |
PdfUA2 | ISO 14289-2:2024 | Updated 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
| Category | Description |
|---|---|
Structure | Document structure tags |
Tags | Missing or incorrect tags |
AltText | Missing alternative text |
Language | Language specification |
ReadingOrder | Content reading order |
Metadata | Accessibility metadata |
Tables | Table structure |
Headings | Heading hierarchy |
Color | Color contrast issues |
Fonts | Font accessibility |
Navigation | Navigation 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).