PDF/UA Accessibility & Section 508 Compliance
Every PDF validated against ISO 14289-1 (PDF/UA) at render time — automatically tagged, structured, and verified with a single template setting.
PDF/UA Validation at Render Time
When section508Accessibility is enabled, the Vault Engine doesn't just tag your PDF — it validates every document against ISO 14289-1 (PDF/UA) during the render pass. Accessibility is enforced structurally, not retrofitted. Documents that fail validation are flagged in the audit trace before they leave the rendering pipeline.
Section 508 is a U.S. law requiring digital documents to work with screen readers. VaultPDF generates PDF/UA (ISO 14289-1) compliant documents automatically — fully tagged, structured, and validated — with a single template setting.
What Problem Does It Solve?
Without accessibility tags:
- Blind users can't read your PDFs with screen readers (NVDA, JAWS)
- PDFs look like unstructured blobs to accessibility software
- Your organization isn't Section 508 compliant
With accessibility tags:
- Screen readers can read your PDFs naturally
- Headings, lists, and tables are properly structured
- Your organization becomes compliant
How to Enable It
Simplest: Enable with Defaults
{
"vpdf": {
"templateSettings": {
"section508Accessibility": true
}
}
}Full Control: Configure Sub-Settings
{
"templateSettings": {
"section508Accessibility": {
"enabled": true,
"level": "pdf-ua",
"mode": "full",
"appendSummary": true,
"generateCertificate": false,
"generateReport": false,
"marginAnnotations": false
}
}
}Settings Reference
| Setting | Type | Default | Description |
|---|---|---|---|
enabled | boolean | true | Master switch. When false, all sub-settings are ignored and no accessibility processing occurs. |
level | "basic" | "pdf-ua" | "basic" | Compliance tier. See detail below. |
mode | "optimized" | "full" | "optimized" | Processing depth. See detail below. |
appendSummary | boolean | true | Appends a compliance summary page to the rendered PDF. See detail below. |
generateCertificate | boolean | false | Generates a standalone certificate PDF saved to SharePoint Reports/accessibility/. See detail below. |
generateReport | boolean | false | Generates a detailed multi-page audit report saved to SharePoint Reports/accessibility/. |
marginAnnotations | boolean | false | Template development only. See detail below — do not enable in production. |
Note: section508Accessibility: true as a bare boolean is shorthand for enabled: true with all other settings at their defaults.
level — Compliance Tier
"basic" (default)
Adds PDF structure tags required for Section 508 and WCAG 2.1 compliance. The engine inserts /MarkInfo, tags headings/tables/lists/images, and injects a language declaration from templateSettings.locale. Screen readers (NVDA, JAWS, VoiceOver) can navigate the document structure. Sufficient for most enterprise document workflows.
"pdf-ua"
Full ISO 14289-1 (PDF/UA) compliance. Adds everything in "basic" plus runs the full validation pass at render time: heading hierarchy order, <TH> scope attributes on every table, alt text presence on every image, natural reading order enforcement, and font embedding verification. Documents that fail a validation rule are flagged in the audit trace. Required for government procurement, public sector, and documents subject to ADA litigation risk. This is the standard Adobe Acrobat's "Check for accessibility" tool tests against.
Use
"pdf-ua"for regulated documents. Use"basic"for internal reports or when a lighter footprint is preferred.
mode — Processing Depth
"optimized" (default)
Balanced processing: ~1–2% file size overhead, +2ms render time. Tags the document structure and validates critical rules. Recommended for all production document workflows.
"full"
Stricter processing: ~3–4% file size overhead, +4–6ms render time. Runs exhaustive element analysis including per-cell table scope resolution, deep image alt text inspection, and contrast ratio checks (when colour data is available). Use "full" when generating accessibility certificates or reports for auditors, or when level: "pdf-ua" is set.
appendSummary — Compliance Summary Page
When true, a single summary page is appended as the last page of the rendered PDF. It contains:
- Accessibility level (
basicorpdf-ua) and mode used - Pass / Warning / Fail counts from the validation pass
- Element coverage: headings tagged, tables with headers, images with alt text
- Render timestamp and correlation ID
This page is visible to anyone who opens the PDF — useful for compliance reviewers who need to confirm accessibility without running external tools, and for audit evidence where the document itself must carry proof of compliance. If you do not want the summary visible to end recipients, set appendSummary: false and use generateCertificate: true instead (stored separately in SharePoint).
generateCertificate — Standalone Accessibility Certificate
When true, generates a separate certificate PDF stored in SharePoint at Reports/accessibility/{documentName}.section508.certificate.pdf. It is not appended to the main document.
The certificate contains:
- Document ID, template name, and render timestamp
- Accessibility level and validation results
- A formal attestation that the document was rendered with accessibility processing enabled
Use this when you need to hand an auditor or procurement team a standalone accessibility attestation separate from the document content. The certificate can be regenerated on demand from the audit trace at any time — it does not need to be generated at every render.
marginAnnotations — Template Development Tool
Not for Production
marginAnnotations is a template authoring aid only. It adds visible PDF annotations in the margins of the rendered document. Enable it when building or validating a template; disable it before deploying to production users.
When true, the engine overlays colour-coded margin annotations on the rendered PDF showing per-element compliance status:
- Green — element passed all checks
- Amber — element has a warning (e.g. image present but no alt text supplied in payload)
- Red — element failed a rule (e.g. heading level skipped)
This lets template authors see exactly which elements need attention without reading audit trace JSON. It has no effect on compliance scoring — it only adds the visual overlay. The annotations add ~0.2–0.5MB to file size and should never be present in documents delivered to end users or archived for compliance.
Configuration Examples
Example 1: Simple Enable (Invoice)
{
"vpdf": {
"templateName": "Invoice",
"templateSettings": {
"section508Accessibility": true,
"locale": "en-US"
}
}
}Result: Accessibility tags + summary page appended
Example 2: Generate Certificate (For Auditors)
{
"vpdf": {
"templateName": "ComplianceReport",
"templateSettings": {
"section508Accessibility": {
"enabled": true,
"appendSummary": true,
"generateCertificate": true
}
}
}
}Result: Accessibility tags + summary page + professional certificate PDF (on-demand)
Example 3: Full Audit Mode (Legal/Enterprise)
{
"vpdf": {
"templateName": "LegalAgreement",
"templateSettings": {
"section508Accessibility": {
"enabled": true,
"mode": "full",
"appendSummary": true,
"generateCertificate": true,
"generateReport": true
}
}
}
}Result: Accessibility tags + summary + certificate + detailed report (all available on-demand)
Example 4: Template Validation (Designer Mode)
{
"vpdf": {
"templateName": "SalesOrder",
"templateSettings": {
"section508Accessibility": {
"enabled": true,
"mode": "optimized",
"marginAnnotations": true
}
}
}
}Result: Accessibility tags + visual margin annotations (shows pass/warn/fail status on PDF for template builders)
Override Per-Document (API)
Enable/disable for specific documents via Dispatcher API:
// Enable with default settings
const response = await fetch('/api/render', {
method: 'POST',
body: JSON.stringify({
templatePath: 'Invoice.vpdf',
payloadPath: 'invoice-001.json',
options: {
features: {
section508Accessibility: true
}
}
})
});
// Or disable for a specific document
const response = await fetch('/api/render', {
method: 'POST',
body: JSON.stringify({
templatePath: 'Invoice.vpdf',
payloadPath: 'invoice-001.json',
options: {
features: {
section508Accessibility: false
}
}
})
});What It Tags
Section 508 tagging recognizes and marks:
| Element | What It Does |
|---|---|
| Headings | Marks "Invoice Details" as a heading (screen readers say "heading level 2") |
| Lists | Marks bullet points as lists (screen readers say "list with 5 items") |
| Tables | Marks columns/rows/headers (screen readers say "row 2, column 3") |
| Images | Marks images (requires alt-text in your data) |
| Forms | Marks text boxes and buttons (requires labels in your data) |
| Document Structure | Marks entire PDF as tagged (tells screen readers: "this is accessible") |
PDF/UA: What Gets Validated
PDF/UA (ISO 14289-1) is the international standard for universally accessible PDFs. It extends basic accessibility tagging with structural rules that screen readers, assistive technology, and compliance auditors rely on.
When section508Accessibility is enabled, the Vault Engine runs the following validations on every rendered document before the PDF leaves the rendering pipeline:
| Validation | Rule | Impact if Failed |
|---|---|---|
| Document tagged | /MarkInfo dictionary present with Marked: true | Flagged as non-compliant |
| Heading hierarchy | H1 → H2 → H3 must not skip levels | Logged as a warning in audit trace |
| Table headers | Every <Table> must include <TH> scope attributes | Flagged in accessibility report |
| Alt text on images | Every <Figure> must carry an Alt attribute | Logged as a warning |
| Natural reading order | Tag tree must match visual reading order | Structural check enforced by engine |
| Language declaration | /Lang entry required in the document catalog | Auto-injected from templateSettings.locale |
| Accessible fonts | All fonts must be embedded (not referenced externally) | Render fails if a font cannot be embedded |
Failures and warnings are written to the accessibility trace in AuditLogs/accessibility/ and — if appendSummary: true — summarised on the appended summary page in the PDF itself.
Validation vs. Tagging
Tagging adds the structure. Validation checks it is correct. Both happen automatically at render time. You do not need to run a separate tool or post-process the PDF.
Test It Works
Quick Test
- Download your PDF
- Open in Adobe Acrobat Reader
- Go to Tools → Accessibility → Check Document
- Should see: "✓ Tagged PDF"
With a Real Screen Reader
Free options to test:
- Windows: NVDA (https://www.nvaccess.org/) - Free, open-source
- Mac: VoiceOver (built-in - press Cmd+F5)
- Online Reader: Browse the PDF with NVDA/VoiceOver enabled
The PDF should read naturally without you seeing garbled text.
When Customers Need It
Required By Law
- U.S. Government: All government documents must be Section 508 compliant
- Public Universities: Many state laws require it
- Publicly Traded Companies: SEC requires accessible investor documents
- Government Contractors: Pre-requisite for doing business
Required By Contract
- Enterprise Customers: Many require Section 508 compliance in procurement
- Healthcare: HIPAA documents need to be accessible
- Finance: SOX-compliant docs often require Section 508 too
Good Practice
- Any Public Document: If humans might read it, accessibility helps everyone
- Internal Policies: Sets organizational compliance standard
- Batch Processing: Ensures consistency across document library
Common Questions
Q: Will it make my PDFs bigger?
A: No, only adds ~500 bytes per document.
Q: Will it slow down rendering?
A: Adds about 2-3 milliseconds (imperceptible to users).
Q: Does it require me to add alt-text?
A: VaultPDF automatically tags structure. Alt-text comes from your template data (describe images in your JSON payload).
Q: Can I enable it just for some PDFs?
A: Yes - set in template, or override per-document via API.
Q: What if my PDF generation fails?
A: VaultPDF tries to tag and continues if it fails (non-blocking).
Next Steps
- ✅ Enable
section508Accessibility: truein your template - ✅ Download a test PDF from the template
- ✅ Verify with Adobe Acrobat Reader (Tools → Accessibility → Check)
- ✅ Test with NVDA screen reader (free download)
- ✅ Deploy to production
Done! Your PDFs are now accessible.
Performance
| Metric | Value |
|---|---|
| Tagging Overhead | +2-3ms per render |
| PDF Size Increase | +50-200 bytes |
| Screen Reader Impact | None (improves usability) |
| Batch Processing | Linearly scalable |
| License Verification | <100ms cache hit |
Understanding the Output Files
What Gets Generated
| Setting | Output | Where | Size | When |
|---|---|---|---|---|
enabled: true | Tagged PDF | Main document | +50-200 bytes | Always |
appendSummary: true | Summary page | Appended to PDF | +1-2 pages | Always |
generateCertificate: true | Certificate PDF | SharePoint Reports/ | ~75-100 KB | On-demand |
generateReport: true | Detailed report | SharePoint Reports/ | ~150-200 KB | On-demand |
marginAnnotations: true | Visual markers | As PDF annotations | +0.2-0.5 MB | At render time |
Where files are stored:
- Tagged PDF + Summary: Main document (immediate)
- Certificates & Reports: SharePoint Reports/ folder (generated on-demand)
- Trace data: SharePoint AuditLogs/ folder (internal compliance archive)
Output Examples
Default (summary appended to PDF):
Invoice.pdf (2.1 MB) + 1-page accessibility summaryWith certificate generation:
Invoice.pdf (2.1 MB) + summary appended
Invoice.section508.certificate.pdf (85 KB) — Generated on-demandWith full audit (certificate + detailed report):
Invoice.pdf (2.1 MB) + summary appended
Invoice.section508.certificate.pdf (85 KB) — Generated on-demand
Invoice.section508.report.pdf (175 KB) — Generated on-demandPremium Features in TemplateSettings
Three premium features can be configured in templateSettings:
| Feature | Setting | Purpose | License |
|---|---|---|---|
| Accessibility | section508Accessibility | Add PDF accessibility tags with optional certificate/report generation | Business+ |
| XMP Metadata | xmpMetadata | Embed searchable metadata in PDF | Business+ |
| Audit Trail | explainDocument | Generate render trace + audit reports | Business+ |
All three are license-gated — without the appropriate license tier, these settings are ignored with a console warning.
Enable multiple features together:
{
"vpdf": {
"templateSettings": {
"section508Accessibility": {
"enabled": true,
"generateCertificate": true
},
"xmpMetadata": true,
"explainDocument": true
}
}
}Storage & File Organization
When section508Accessibility is enabled, VaultPDF creates files in two locations:
User-Facing Outputs (Reports/ folder)
Downloadable by end-users in SharePoint:
Reports/
├── accessibility/
│ ├── Invoice_001.section508.certificate.pdf (if generateCertificate: true)
│ └── Invoice_001.section508.report.pdf (if generateReport: true)System Archive (AuditLogs/ folder)
Internal compliance records (typically 90-day retention):
AuditLogs/
└── accessibility/
└── Invoice_001.section508.trace.json (~30-50 KB)Trace files enable:
- ✅ On-demand certificate/report regeneration
- ✅ Verification that PDFs weren't modified
- ✅ Compliance audit trail
- ✅ Deterministic audits (same PDF = same results)
License Information
- Feature Name:
section508Accessibility - Available On: Business, Enterprise plans
- Trial Plan: Not included (contact sales)
- On-Demand: Cannot be enabled without license
- Verification: Check using
/api/license/features/categorized
curl -H "Authorization: Bearer $LICENSE_KEY" \
https://your-vaultpdf.azurewebsites.net/api/license/features/categorized | jq '.section508Accessibility'Troubleshooting
Tagging Not Applied
Problem: PDF doesn't contain /MarkInfo after render
Solutions:
- Verify
section508Accessibility: truein request - Check license includes feature:
GET /api/license/features/categorized - Confirm render returned HTTP 200 (not error PDF)
- Check audit logs for feature rejection reason
# Verify license
curl -X POST https://your-vaultpdf.azurewebsites.net/api/render \
-H "Content-Type: application/json" \
-d '{
"templatePath": "...",
"options": { "features": { "section508Accessibility": true } }
}' \
-w "HTTP %{http_code}\n"Screen Reader Not Detecting Structure
Problem: Screen reader reads PDF as unstructured content
Solutions:
- Verify tagging was applied (check for
/MarkInfo) - Check source data has proper semantic structure (headings, lists, tables)
- Ensure fonts are embedded and text is selectable (not scanned image)
- Test with latest screen reader version
Large PDF Size After Tagging
Problem: PDF file size increased significantly
Solutions:
- This is normal; tagging adds ~50-200 bytes for structure
- If increase is >1MB, likely causes: XMP metadata also enabled (use compression)
- Consider enabling automatic cleanup:
features.stripUnusedObjects: true
Related Features
- XMP Metadata Embedding - Add searchable metadata for ERP/SharePoint discovery
- Explain Document - Generate accessible summaries and detailed explanations
- Premium Features Overview - Complete guide to all enterprise features