PDF/A and PDF/UA capabilities

Fork PDF can generate archival PDF/A and tagged PDF/UA output, either standalone or in supported combinations. Font embedding is verified independently. PDF/A status is stable; PDF/UA status remains experimental until the human screen-reader audit.

Capability status

CapabilityStatusNotes
Font embedding verificationStableEvery used font must be embedded and Unicode-mapped.
Strict font policyStableRejects external stylesheets, non-inline fonts, and system fallback.
PDF/A-2b / 2u / 2aStablePDF 1.7, machine-validated with veraPDF.
PDF/A-3b / 3u / 3aStablePDF 1.7, machine-validated with veraPDF.
PDF/A-4StablePDF 2.0, machine-validated with veraPDF.
PDF/UA-1ExperimentalMachine-validated; human screen-reader audit pending.
PDF/UA-2ExperimentalMachine-validated; human screen-reader audit pending.

Compatibility matrix

RequestResult
pdfA: "2b" | "2u" | "2a"Standalone PDF/A-2, PDF 1.7.
pdfA: "3b" | "3u" | "3a"Standalone PDF/A-3, PDF 1.7.
pdfA: "4"Standalone PDF/A-4, PDF 2.0.
pdfUa: 1Standalone PDF/UA-1, PDF 1.7.
pdfUa: 2Standalone PDF/UA-2, PDF 2.0.
pdfUa: 1 + PDF/A-2/3Combined PDF 1.7 output.
pdfUa: 2 + pdfA: "4"Combined PDF 2.0 output.
pdfUa: 1 + pdfA: "4"Rejected with UNSUPPORTED_COMPLIANCE_COMBINATION.
pdfUa: 2 + PDF/A-2/3Rejected with UNSUPPORTED_COMPLIANCE_COMBINATION.

Standalone PDF/A

{
  "htmlContent": "<h1>Archived report</h1>",
  "compliance": { "pdfA": "3b" }
}

The response omits x-pdf-ua and pdfUa from complianceStatus.

Combined PDF/A + PDF/UA

{
  "htmlContent": "<h1>Accessible archive</h1>",
  "compliance": { "pdfUa": 1, "pdfA": "3b" },
  "fontPolicy": "strict"
}

Response status

{
  "compliance": { "pdfUa": 1, "pdfA": "3b" },
  "complianceStatus": {
    "fontPolicy": "strict",
    "fontEmbedding": "verified",
    "pdfA": "stable",
    "pdfAFlavor": "3b",
    "pdfUa": "experimental",
    "pdfUaVersion": 1
  }
}

JSON, webhook, and stream-only responses use the same status object. Stream-only clients read it from x-compliance-status (base64 JSON).

Response headers

x-pdf-a: 3b
x-pdf-ua: 1
x-font-embedding: verified
x-font-policy: strict
x-compliance-status: <base64 JSON>

Font policy

fontPolicy: "warn" is the default. It reports advisory warnings. fontPolicy: "strict" rejects external stylesheets, non-inline @font-face rules, and system/generic font fallback with FONT_POLICY_STRICT.

Capability discovery

curl https://api.forkpdf.com/v1/compliance/capabilities

The response lists supported PDF/A flavors, PDF/UA versions, valid combinations, font policies, and the current forms limitation.

Errors

CodeHTTPMeaning
EMPTY_COMPLIANCE400No pdfUa or pdfA was provided.
UNSUPPORTED_COMPLIANCE_STANDARD400Unsupported PDF/A version.
UNSUPPORTED_COMPLIANCE_COMBINATION400The PDF/UA and PDF/A versions cannot be combined.
UNSUPPORTED_PDF_UA_VERSION400Only PDF/UA-1 and PDF/UA-2 are supported.
COMPLIANCE_FORM_UNSUPPORTED400Compliance cannot be combined with pdfForm yet.
FONT_POLICY_STRICT422Strict font policy rejected the source.

Limitations

  • Only one PDF/A flavor and one PDF/UA version can be claimed per document.
  • PDF/A-2/3 require PDF 1.7; PDF/A-4 requires PDF 2.0.
  • PDF/UA-1/2 remain experimental until the human screen-reader audit.
  • Compliance and pdfForm cannot be combined until tagged form fields are implemented.
  • PDF/A does not imply PDF/UA, and PDF/UA does not imply PDF/A.

Related