Generated PDFs don't actually target PDF/UA-1, despite `ats_compatibility.md`'s compliance claim · Issue #769 · rendercv/rendercv · GitHub
Skip to content

Generated PDFs don't actually target PDF/UA-1, despite ats_compatibility.md's compliance claim #769

Description

@salelkar

Describe the bug

docs/ats_compatibility.md#L105 states:

Typst supports PDF/UA-1 (the universal accessibility standard) and all conformance levels of PDF/A (the archival standard). These standards require proper Unicode text, embedded fonts, and a complete structure tree. A PDF that meets these standards is, by definition, machine-readable.

But RenderCV's own PDF output never actually targets PDF/UA-1 (or any PDF standard) — it just relies on Typst's default tagged-PDF output, which gets close but isn't the same thing. Running veraPDF's PDF/UA-1 (ua1) validation profile against a RenderCV-generated PDF (engineeringresumes theme) fails 2 of ~20,600 checks:

  • ViewerPreferences.DisplayDocTitle not set on the document catalog (clause 7.1-10)
  • No PDF/UA Identification XMP schema — the file never declares itself as PDF/UA-1 targeted at all (clause 5-1)

Every content/structure check passes (reading order, tags, headings, etc.), since Typst has produced tagged PDFs by default since v0.14 — the PDF is structurally almost there, it's just never told to actually target the standard.

To Reproduce

  1. rendercv render <any-cv>.yaml (any theme)
  2. Validate the output PDF against PDF/UA-1, e.g. with veraPDF: verapdf -f ua1 <output>.pdf
  3. Observe FAIL, clauses 7.1-10 and 5-1

Root cause

src/rendercv/renderer/pdf_png.py#L42 (v2.8; unchanged on main, same call now at pdf_png.py#L43):

typst_compiler.compile(input=typst_path, format="pdf", output=pdf_path)

No pdf_standards argument is passed, even though the typst Python binding (and Typst's own --pdf-standard CLI flag) supports one directly.

Verified fix

Recompiling the same .typ output directly via typst.Compiler(...).compile(..., pdf_standards=["ua-1"]) (bypassing RenderCV) produces a PDF that passes veraPDF's ua1 profile with 0 failed checks — no template or CV content changes needed.

Suggested fix

Add an optional field to RenderCommand (schema/models/settings/render_command.py), e.g. pdf_standards: list[str] | None, threaded through to the compile() call in pdf_png.py.

Environment

RenderCV 2.8 (rendercv[full]), typst 0.15.0, Windows. Also reproduced on origin/main (1d4b87bc, 2026-03-25) — same call, unchanged.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions