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/A Archival

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

Create and validate PDF/A compliant documents for long-term archival.

PDF/A Levels

LevelStandardDescription
PdfA1bISO 19005-1Basic visual preservation
PdfA1aISO 19005-1Full accessibility (tagged)
PdfA2bISO 19005-2Modern features (JPEG2000, transparency)
PdfA2uISO 19005-2Unicode text mapping
PdfA2aISO 19005-2Full accessibility
PdfA3bISO 19005-3Embedded files allowed
PdfA3uISO 19005-3Unicode + embedded files
PdfA3aISO 19005-3Full accessibility + embedded

Validating PDF/A Compliance

#![allow(unused)]
fn main() {
use printwell::pdfa::{validate_pdfa, PdfALevel};

let result = validate_pdfa(&pdf_data, PdfALevel::PdfA2b)?;

println!("Compliant: {}", result.is_compliant);
println!("Errors: {}", result.error_count);
println!("Warnings: {}", result.warning_count);

for issue in &result.issues {
    println!(
        "[{:?}] {:?}: {}",
        issue.severity,
        issue.category,
        issue.message
    );
}
}

Issue Categories

CategoryDescription
FontsFont embedding issues
ColorColor space problems
MetadataXMP metadata issues
StructureDocument structure
ActionsJavaScript/actions
EncryptionSecurity restrictions
AnnotationsAnnotation problems
TransparencyTransparency issues
AttachmentsEmbedded file issues

Adding PDF/A Metadata

#![allow(unused)]
fn main() {
use printwell::pdfa::add_pdfa_metadata;

let pdfa_doc = add_pdfa_metadata(
    &pdf_data,
    PdfALevel::PdfA2b,
    Some("Document Title"),
    Some("Author Name"),
)?;
}

Node.js Example

import { validatePdfa, addPdfaMetadata } from 'printwell';

const result = validatePdfa(pdfData, 'PdfA2b');
console.log(`Compliant: ${result.isCompliant}`);

for (const issue of result.issues) {
    console.log(`${issue.severity}: ${issue.message}`);
}

const pdfaDoc = addPdfaMetadata(pdfData, 'PdfA2b', {
    title: 'Archived Document',
    author: 'Author Name'
});

Python Example

from printwell import validate_pdfa, add_pdfa_metadata, PdfALevel

result = validate_pdfa(pdf_data, PdfALevel.PdfA2b)
print(f"Compliant: {result.is_compliant}")

for issue in result.issues:
    print(f"{issue.severity}: {issue.message}")

pdfa_doc = add_pdfa_metadata(pdf_data, PdfALevel.PdfA2b,
    title="Archived Document", author="Author")

Best Practices for PDF/A

  1. Embed all fonts - Use embed_fonts: true in PdfOptions
  2. Use RGB or CMYK color spaces - Avoid device-dependent colors
  3. Avoid JavaScript - Not allowed in PDF/A
  4. Include document metadata - Title, author, etc.
  5. Use tagged PDFs - For PDF/A-1a, 2a, 3a levels