Accessible PDF from LaTeX
2026-02-24 → 2026-02-24
How to make LaTeX CVs produce tagged, screen-reader-friendly PDFs – relevant for ADA Title II compliance (deadline April 2026).
Most LaTeX CVs (pdflatex + article class) produce untagged PDFs with no structure metadata, which are invisible to screen readers. The fix is minimal – a few lines added to your preamble, switch to LuaLaTeX, and your existing layout is preserved.
Validated with PDFix PDF/UA validator.
The fix (5 changes)#
1. Add \DocumentMetadata before \documentclass#
This must be the very first thing in your .tex file, before \documentclass.
\DocumentMetadata{
lang = en,
pdfstandard = a-2b,
pdfstandard = ua-1,
pdfversion = 2.0,
testphase = {phase-II},
}
\documentclass[10pt]{article} % your existing documentclass
pdfstandard = a-2b– PDF/A-2b archival compliancepdfstandard = ua-1– PDF/UA-1 universal accessibility compliancetestphase = {phase-II}– activates automatic tagging of headings, lists, and other structures
2. Swap font packages (LuaLaTeX requires OpenType fonts)#
LuaLaTeX uses OpenType fonts via fontspec instead of the old Type1 font system.
% REMOVE these:
% \usepackage[utf8]{inputenc}
% \usepackage[T1]{fontenc}
% \usepackage[sc]{mathpazo}
% ADD these:
\usepackage{fontspec}
\setmainfont{TeX Gyre Pagella} % Palatino equivalent
\setmonofont{Inconsolatazi4-Regular.otf}[BoldFont=Inconsolatazi4-Bold.otf] % optional, for \texttt
Common font substitutions:
- mathpazo / Palatino -> TeX Gyre Pagella
- Times / mathptmx -> TeX Gyre Termes
- Computer Modern -> Latin Modern (already default in LuaLaTeX)
- Helvetica / helvet -> TeX Gyre Heros
3. Add metadata to \hypersetup#
\hypersetup{
pdftitle={Curriculum Vitae - Your Name},
pdfauthor={Your Name},
pdfsubject={Academic CV},
pdflang={en},
pdfdisplaydoctitle=true, % required for PDF/UA
% ... your existing options (colorlinks, etc.)
}
pdfdisplaydoctitle=true is required by PDF/UA – it tells PDF viewers to show the document title in the title bar instead of the filename.
4. Replace symbol fonts that lack Unicode mappings#
Packages like marvosym produce glyphs that can’t be mapped to Unicode, which fails PDF/UA validation. Use fontawesome5 instead:
% REMOVE:
% \usepackage{marvosym} % \Letter, \Mundus lack Unicode mapping
% ADD:
\usepackage{fontawesome5} % \faEnvelope, \faGlobe, \faOrcid, etc.
Icon examples:
- \faEnvelope – envelope (email)
- \faGlobe – globe (website)
- \faOrcid – ORCID logo
- \faGithub – GitHub logo
- \faPhone – phone
5. Build with LuaLaTeX#
latexmk -lualatex cv
Or in a Makefile:
cv.pdf: cv.tex
latexmk -lualatex cv
How to verify#
- PDFix Validate PDF/UA – web-based, upload and get a report. Passes with the recipe above.
- PAC (PDF Accessibility Checker) – desktop tool, considered the gold standard. Not yet tested with this recipe.
- axesCheck – web-based PDF/UA and WCAG checker. Does not pass yet with this recipe; may require additional fixes.
- macOS VoiceOver (Cmd+F5) – open PDF in Preview, navigate with VoiceOver
pdfinfo cv.pdf– quick check that Tagged says “yes” (requirespoppler:brew install poppler)
What this produces#
- PDF/A-2b + PDF/UA-1 compliant
- Structure tags (H1, P, L, LI) for screen reader navigation
- Document language set to English
- Title and author metadata embedded
- DisplayDocTitle enabled
What it doesn’t fix#
- Images still need alt text (most CVs are text-only so this is fine)
- Complex table layouts may not tag perfectly
- Custom environments using low-level TeX may need adjustment
phase-IIItagging (full paragraph tagging) may conflict with some packages –phase-IIis the safe choice
Requirements#
- TeX Live 2025 (or later) – the tagging framework is relatively new
- LuaLaTeX (included in standard TeX Live)
popplerforpdfinfoCLI verification (brew install poppleron macOS)
Tested with#
- Custom
\marginparsidebar section layouts – works, layout preserved biblatexwithbiber– worksfancyhdr– worksparalist(compactitem) – worksorcidlink– worksfontawesome5– works- Standard and custom list environments – works