Skip to content

Long-Term Preservation (PDF/A)

Scenario

Leave behind a PDF that still opens, reads, and verifies ten years from now. In the Japanese e-bookkeeping-law context (bundling machine-readable data) or for public records, the producer puts the document onto the PDF/A vessel and has veraPDF score it; the recipient checks whether the document's structure can survive preservation (does LTV data really exist?).

Everything below is a real measurement from 2026-09-04 (pdf-verify-mcp v0.26.0 / veraPDF 1.30.0; demo invoice, the Japanese official gazette, and self-made specimens).

Cast

ActorRole
pdf-writerattach_file (bundle machine-readable data) → ensure_pdfa (the vessel — writes a label only)
pdf-verifyvalidate_conformance (veraPDF) / detect_pades_level (LTV structure observation)
pdf-trust / pdf-publishIntake / outbound orchestration

Sequence

Prompt examples

  • "Put this invoice, CSV included, into the e-bookkeeping-law preservation format" (→ attach_file + ensure_pdfa(pdfa-3b))
  • "Will this contract survive ten years? Can the signature still be verified after the certificate expires?" (→ detect_pades_level + DSS check)
  • "Use PDF/A-4" (→ with attachments it must be pdfa-4f — plain pdfa-4 requires every attachment to be PDF/A itself)

Measured examples

Producer side (publish-demo-invoice.pdf): catalog has Names / AF / OutputIntents. veraPDF 1.30.0 judged PDF/A-3b COMPLIANT (146/146). The same file is 106/106 under PDF/UA-1.

Recipient side (detect_pades_level, three specimens):

SpecimenStructural observationEvidence
Gazette, 2026-08-10 issueB-Bno signature TS, no DSS, DocTS present
selfmade-pades-lta.pdf (no CRL)B-TDSS present but revocationDataCoversSigner: false (dssCrlCount 0)
selfmade-pades-crl.pdf (CRL in DSS)B-LTArevocationDataCoversSigner: true (dssCrlCount 1)

detect_pades_level checks whether the DSS revocation data actually covers the signer certificate. Without that coverage the level stops at B-T. That is a T3 observation, not "conforms to PAdES".

Call — validate_conformance and detect_pades_level
  • Measured: pdf-verify-mcp v0.26.0, veraPDF 1.30.0
jsonc
{
  "file_path": "/absolute/path/to/docs/specimens/publish-demo-invoice.pdf",
  "flavour": "pdfa-3b",
  "response_format": "json"
}
jsonc
{
  "engine": "verapdf",
  "flavour": "PDF/A-3b",
  "compliant": true,
  "checkedRules": 146,
  "passedRules": 146,
  "failedRules": 0
}
jsonc
{
  "file_path": "/absolute/path/to/docs/specimens/selfmade-pades-crl.pdf",
  "response_format": "json"
}
jsonc
{
  "levels": [
    {
      "fieldName": "Sig1",
      "level": "B-LTA",
      "normativeBasis": "T3",
      "evidence": { "hasSignatureTimestamp": true, "hasDss": true, "hasDocumentTimestamp": true },
      "ltv": { "dssCrlCount": 1, "revocationDataCoversSigner": true }
    }
  ]
}

How to read the results

  • veraPDF is the judge for PDF/A (T2): write "veraPDF judged it COMPLIANT (146/146)", never "conforms to ISO 19005"
  • A PAdES level is a structural observation (T3): "the structure matches B-LTA", never "B-LTA-conformant"
  • ensure_pdfa writes a label; it does not make the file meet the standard. Unembedded fonts, encryption and JavaScript are not repaired — applied to a non-conforming file it produces a PDF that lies about itself
  • veraPDF may return no PDF/A result for an encrypted PDF (measured with the gazette). That check is recorded as "not performed" — never as passed

MIT Licensed