PDF/A가 까다로운 이유는 적합 여부가 눈으로는 전혀 보이지 않는다는 데 있습니다. 같은 LaTeX 문서에서 만든, 겉모습이 똑같은 PDF가 A-2b로는 통과하고 A-1b로는 떨어집니다. 실제로 검사를 돌려 보면 검증기는 그 이유를 한 줄로 짚어 줍니다. 어느 ExtGState 사전의 ca 키가 1.0이 아니라 0.5라는 것입니다. PDF/A는 “보기 좋은 PDF”에 관한 규격이 아니라 파일 내부 구조에 대한 ISO의 요구 사항입니다. 이 페이지에서는 이 표준이 실제로 무엇을 요구하는지, LaTeX에서 만들어 내는 두 경로(pdfx와 \DocumentMetadata), 그리고 대개 건너뛰는 단계인 만들어 낸 파일이 정말 적합한지 확인하는 방법을 실측과 함께 다룹니다.
PDF/A가 실제로 요구하는 것
PDF/A(ISO 19005)는 장기 보존 규격이며, 핵심 요구는 하나입니다. 파일이 완전히 자기완결적이어야 한다는 것입니다. 10년 뒤에 이 파일을 여는 사람은 여러분의 글꼴도, 색 관리 설정도, 다른 어떤 파일도 갖고 있지 않은데 그래도 제대로 읽혀야 합니다. 구체적인 조건은 모두 여기서 나옵니다. 글꼴을 완전히 임베드할 것(읽는 쪽에 무엇이 설치되어 있는지에 기대지 않습니다), 암호화하지 않을 것(열쇠를 잃으면 문서를 잃습니다), XMP 메타데이터를 가질 것(제목과 저자를 PDF 안에 표준 XML로 담습니다), 출력 인텐트, 곧 ICC 프로파일을 임베드할 것(“이 빨강”이 색 공간 정의를 스스로 지니도록 합니다). 폼의 전송 대상처럼 파일 바깥으로 손을 뻗는 것들이 꺼려지는 이유도 같은 논리입니다.
pdfx로 PDF/A 만들기 — ICC 프로파일은 이미 들어 있습니다
\usepackage[a-2b]{pdfx} 한 줄과 제목·저자를 적은 \jobname.xmpdata 파일이면 PDF/A가 나옵니다. ICC 프로파일을 직접 구해 올 필요는 없습니다. 예전에는 sRGB 프로파일을 어도비 사이트에서 받아 오라는 안내가 있었지만, TeX Live 2024에서는 colorprofiles 패키지가 프로파일을 함께 담고 있고 로그에 <<sRGB.icc>>라는 임베드 기록이 남습니다. 같은 로그의 ** pdfx: Metadata file document.xmpdata read successfully.가 메타데이터를 읽었다는 신호입니다. 이 파일을 빠뜨리면 대신 ** pdfx: No file document.xmpdata . Metadata will be incomplete!가 나오는데, 뒤에서 보듯 이 경고를 무시해도 검증 자체는 통과합니다. a-1b, a-2b, a-3b 외에 접근성을 포함한 a-1a, a-2a, a-3a와 유니코드 대응인 a-2u, a-3u도 고를 수 있습니다. 인쇄용 PDF/X 계열(x-1a 등)도 같은 패키지가 맡습니다.
% document.tex
\documentclass{article}
\usepackage[a-2b]{pdfx} % reads document.xmpdata, embeds sRGB.icc
\begin{document}
Hello PDF/A.
\end{document}
% document.xmpdata -- a separate file, same base name
\Title{A Test Document}
\Author{Test Author}
\Keywords{LaTeX\sep PDF/A}A-1b와 A-2b와 A-4의 차이 — 투명도가 통과하는가
숫자는 바탕이 되는 PDF 버전을, 끝의 글자는 엄격함의 정도를 나타냅니다. A-1은 PDF 1.4, A-2는 PDF 1.7, A-3은 A-2에 첨부 파일을 허용한 것, A-4는 PDF 2.0이 바탕입니다. 끝의 b는 basic으로 겉모습을 재현할 수 있으면 됩니다. a는 accessible이며 여기에 태그(논리 구조)가 더해집니다. u는 본문 텍스트를 유니코드로 옮길 수 있을 것을 요구합니다. 실무에서 가장 크게 부딪히는 차이는 투명도입니다. TikZ로 opacity=0.5인 사각형 둘을 겹친 문서를 [a-1b]{pdfx}로 조판해 veraPDF에 걸면 ISO 19005-1:2005의 6.4 조항에서 떨어지고, 이유는 “An ExtGState dictionary contains the ca key (fill alpha) with value 0.5 other than 1.0”입니다. 같은 원고에서 옵션만 [a-2b]로 바꾸면 통과합니다. PDF 1.4에 투명도가 없다는 20년 전의 사정이 지금도 제출처의 지정으로 살아 있는 셈입니다.
| 적합 수준 | 바탕 PDF | 요점 |
|---|---|---|
A-1b | PDF 1.4 | 가장 좁습니다. 투명도 사용 불가 — opacity를 쓴 그림은 떨어집니다. 객체 스트림도 금지 |
A-2b | PDF 1.7 | 투명도가 통과합니다. LaTeX에서 낼 때의 기본 선택지. JPEG 2000도 허용 |
A-3b | PDF 1.7 | A-2b에 임의 파일 첨부를 허용한 것. 원자료를 문서에 함께 담아야 할 때 지정됩니다 |
A-4 | PDF 2.0 | 가장 최신. 헤더가 %PDF-2.0이 아니면 떨어지므로 pdfversion=2.0 지정이 필요합니다. pdfx에는 없고 \DocumentMetadata로 냅니다 |
\DocumentMetadata로 내기 — pdfversion을 맞추지 않으면 떨어집니다
다른 경로는 \documentclass 앞에 두는 \DocumentMetadata{pdfstandard=A-2b}입니다. 패키지를 읽지 않아도 되고 A-1B부터 A-4까지 받아들입니다. 다만 그대로 쓰면 A-2b만 통과합니다. pdfTeX가 기본으로 쓰는 PDF는 1.5인데, A-1b에서는 상호 참조 표가 스트림이라는 이유로(The document uses xref streams, 6.1.4 조항), A-4에서는 “File header %PDF-1.5 ... does not match the pattern %PDF-2.n”(6.1.2 조항)라는 이유로 걸립니다. 해답은 같은 중괄호 안에 있습니다. pdfversion=1.4를 더하면 A-1b가 통과하고, pdfversion=2.0을 더하면 A-4가 통과합니다. 반대로 A-2b에 pdfversion=2.0을 더하면 이번에는 “%PDF-2.0 ... does not match the pattern %PDF-1.n”으로 떨어집니다. A-2의 바탕은 PDF 1.7까지이기 때문입니다. 규격마다 정답이 다르다는, 틀리기 딱 좋은 지점입니다.
| 적은 지정 | 기본값 그대로(PDF 1.5) | pdfversion을 더하면 |
|---|---|---|
pdfstandard=A-1b | 불합격 — 6.1.4 조항 “uses xref streams” | pdfversion=1.4를 더하면 합격 |
pdfstandard=A-2b | 합격 — 아무것도 더하지 않아도 되는 유일한 조합 | pdfversion=2.0을 더하면 불합격(6.1.2 조항) |
pdfstandard=A-4 | 불합격 — 6.1.2 조항 “header %PDF-1.5” | pdfversion=2.0을 더하면 합격 |
그렇다면 pdfx의 a-1b는 왜 PDF 1.5 헤더인 채로 통과할까요. 답은 패키지 소스에 있습니다. pdfx.sty 515행에 “PDF/A-1b doesn't allow object compression”이라는 주석이 있고, 바로 뒤에서 \pdfobjcompresslevel=0을 세웁니다. 헤더의 숫자를 다투는 대신, 규격이 금지한 기능 자체를 쓰지 않는 것입니다. 여기에 두 경로의 성격 차이가 있습니다. pdfx는 출력을 그 규격에 맞도록 구부리는 패키지이고, \DocumentMetadata는 어느 규격을 주장하는지 선언하는 커널 장치입니다. 후자는 그 선언에 걸맞은 내용을 스스로 갖춰야 합니다. 또 하나의 차이는 메타데이터입니다. pdfx는 .xmpdata를 자동으로 읽지만, \DocumentMetadata는 제목도 저자도 자동으로 채우지 않습니다. \hypersetup{pdftitle=...} 같은 방법으로 직접 넣습니다(책갈피와 메타데이터 페이지 참조).
% before \documentclass -- the version must match the standard
\DocumentMetadata{
pdfstandard = A-4,
pdfversion = 2.0, % A-4 needs a %PDF-2.0 header
lang = en
}
\documentclass{article}
% for A-1b it is pdfversion = 1.4 instead;
% for A-2b, leave pdfversion out entirely.만들어 낸 것을 검증하기 — veraPDF, 그리고 합격이 뜻하지 않는 것
적합한지 아닌지를 LaTeX 쪽에서 알아낼 방법은 없습니다. 로그에는 PDF/A로 출력했다는 사실만 적히고, 그 결과가 정말 규격을 만족하는지는 별개의 문제입니다. 판정은 PDF/A 검증기가 내리며, 사실상의 표준은 오픈 소스 공식 검사기인 veraPDF입니다. 이것은 TeX Live에 들어 있지 않으며 따로 설치해야 합니다. 쓰는 법은 단순합니다. verapdf file.pdf라고 치면 PDF 안의 XMP 식별자를 읽어 어느 수준으로 검사할지 스스로 정하고 PASS ... 2b 또는 FAIL ... 1b를 한 줄로 돌려줍니다. -f 1b처럼 수준을 강제할 수도 있습니다. 떨어졌을 때 읽어야 할 것은 조항 번호입니다. 6.4(투명도), 6.1.2(헤더 버전), 6.3.3(주석의 외관) 같은 번호가 고칠 자리를 그대로 가리킵니다.
# auto-detect the level from the file itself
verapdf document.pdf
# -> PASS /path/document.pdf 2b
# force a level (useful to see what a stricter one would say)
verapdf -f 1b --format text document.pdf
# -> FAIL /path/document.pdf 1b
# the XML report names the clause and the exact reason
verapdf -f 1b document.pdf > report.xml여기서 알아 두면 나중에 후회하지 않을 사실이 하나 있습니다. 검증에 합격했다고 메타데이터가 비어도 된다는 뜻은 아닙니다. .xmpdata를 빠뜨려 ** pdfx: No file ... Metadata will be incomplete! 경고가 그대로 남은 PDF를 veraPDF에 걸면 PASS ... 1b가 돌아옵니다. 제목도 저자도 없는데 말입니다. 적합 수준 b가 요구하는 것은 “XMP 메타데이터가 구조로서 올바르게 존재할 것”이지 “내용이 채워져 있을 것”이 아니기 때문입니다. 도서관이나 저장소 담당자를 곤란하게 하는 것은 바로 그 빈칸이므로, 검증기의 합격과 제출물로서의 완성은 별개라고 여기세요. 아울러 pdffonts로 글꼴 임베드를 확인하는 습관도 함께 가지면 안전합니다(PDF 생성 페이지에 자세히 있습니다).
입력 폼은 PDF/A와 양립하지 않습니다
hyperref의 Form 환경으로 만든 입력란이 하나만 있어도 PDF/A 검증은 떨어집니다. \TextField를 하나만 둔 문서를 [a-2b]{pdfx}로 조판해 veraPDF에 걸면 6.3.3 조항의 “An annotation does not contain an appearance dictionary”로 불합격이 됩니다. hyperref는 입력란의 겉모습을 뷰어가 그리게 맡기는 방식(NeedAppearances)을 쓰는 반면, PDF/A는 겉모습을 반드시 파일 안에 구워 넣으라고 요구하기 때문입니다. 전송 버튼까지 붙이면 실격이 더 늘어, 6.4.1 조항의 “A Widget annotation dictionary shall not contain the A or AA keys”, 곧 폼 부품에 액션을 붙이는 것 자체가 금지라는 항목이 더해집니다. 생각해 보면 당연한 귀결입니다. 장기 보존 규격이 바깥과 통신하는 부품을 인정할 수는 없습니다. 제출처가 PDF/A와 입력 가능한 폼을 동시에 요구한다면 그것은 요구 자체의 모순이니 만들기 전에 확인하세요.
태그가 있는 PDF와 PDF/UA — 접근성은 아직 발전 중입니다
PDF/A의 a 수준이 요구하는 태그란 제목, 단락, 목록, 읽기 순서, 대체 텍스트 같은 논리 구조를 PDF에 심는 일입니다. 그래야 스크린 리더가 문서를 따라갈 수 있습니다. 접근성만을 다루는 규격은 PDF/UA(ISO 14289)이고, 그 두 번째 부분이 PDF/UA-2입니다. LaTeX 쪽 구현은 LaTeX Project의 tagpdf 패키지(Ulrike Fischer)이며, TeX Live 2024에 담긴 것은 0.98x 판(2024-02-29)입니다. 버전 번호가 0으로 시작한다는 사실이 현 상황을 그대로 말해 줍니다. \tagstructbegin처럼 태그를 직접 놓는 저수준 명령은 이 패키지가 제공합니다. 실제로 TeX Live 2024의 커널(LaTeX2e 2023-11-01)에서 \DocumentMetadata{tagging=on}이라고 쓰면 ! LaTeX Error: The key 'document/metadata/tagging' is unknown and is being ignored.라는 오류가 납니다. 이 판에서 태그를 켜는 입구는 testphase=phase-III이며, 그래야 pdfinfo의 Tagged:가 yes가 됩니다. 이름이 말하듯 시험 단계 기능이므로 표기법은 바뀝니다. 쓰기 전에 반드시 최신 문서를 확인하세요.
그리고 정직하게 적어 둘 것이 하나 있습니다. 이 둘을 동시에 만족시키는 일은 아직 쉽지 않습니다. pdfstandard=A-2b만으로는 통과하는 같은 문서에 testphase=phase-III를 더했더니, veraPDF는 6.2.11.5 조항의 “Glyph width 333 in the embedded font program is not consistent with the Widths entry of the font dictionary (value 334.2)”로 불합격을 돌려주었습니다. 태그 구조 자체의 결함이 아니라 임베드된 글꼴의 글자 너비 불일치입니다. “태그가 있는 PDF/A”를 제출물로 요구받았다면 반드시 veraPDF를 통과시킨 뒤에 내세요. 될 것이라고 가정하고 진행하면 마감 전날 밤에 손이 멈춥니다.
제출 전에 할 일
- 먼저 수준을 물어봅니다. “PDF/A로”라고만 들었다면 A-1b인지 A-2b인지 확인하세요. 그림에 투명도가 들어 있다면 이 차이가 채택 여부를 가릅니다.
- 망설여지면
pdfx의a-2b.\usepackage[a-2b]{pdfx}와\jobname.xmpdata의 제목·저자. 추가 설정 없이 통과하는 가장 무난한 조합입니다. - A-4가 필요하면
\DocumentMetadata{pdfstandard=A-4,pdfversion=2.0}.pdfx는 A-3까지라 A-4를 낼 수 없습니다. .xmpdata를 잊지 마세요. 없어도 검증은 통과하므로,Metadata will be incomplete!경고를 직접 로그에서 찾아야 합니다.- 제출 전에 매번
verapdf document.pdf를 한 번. TeX Live에 없으므로 따로 설치해야 합니다. 떨어지면 조항 번호(6.4,6.1.2,6.3.3)를 읽습니다. - 폼은 포기합니다. 입력 가능한 필드가 있으면 PDF/A에 적합할 수 없습니다.