PDF/A が厄介なのは、適合しているかどうかが見た目でまったく分からないことです。同じ LaTeX 文書から作った同じ見た目の PDF が、A-2b では合格し A-1b では不合格になる——実際に試すと、検証器はその理由を「ExtGState 辞書の ca キーが 1.0 ではなく 0.5 である」と一行で言い当てます。つまり PDF/A は「きれいな PDF」の話ではなく、中身の構造に対する ISO の要求仕様です。このページでは、その規格が何を要求しているのか、LaTeX から出す 2 つの経路(pdfx と \DocumentMetadata)、そして出したものが本当に適合しているかをどう確かめるかを、実際に測った結果とともに扱います。
PDF/A は何を要求する規格か
PDF/A(ISO 19005)は長期保存のための規格で、要求の核心は一つ——ファイルが完全に自己完結していることです。10 年後にその PDF を開く人が、あなたのフォントも、あなたの色管理設定も、外部のどんなファイルも持っていない前提で読めなければなりません。そこから具体的な条件が導かれます。フォントは完全に埋め込む(読み手の環境にあるフォントを当てにしない)、暗号化しない(鍵が失われれば読めなくなる)、XMP メタデータを持つ(タイトルや著者を PDF 内部の標準的な XML で持つ)、出力インテント(ICC プロファイル)を埋め込む(「この赤」が何色なのかを色空間の定義ごと同梱する)。外部リンクやフォームの送信先といった「外の世界に依存するもの」が嫌われるのも同じ理屈です。
pdfx で PDF/A を出す — ICC プロファイルは同梱されている
\usepackage[a-2b]{pdfx} の 1 行と、タイトルと著者を書いた \jobname.xmpdata の 2 ファイルで PDF/A は出ます。ICC プロファイルを自分で調達する必要はありません。 かつては sRGB のプロファイルを Adobe のサイトから取ってこいと言われる場面がありましたが、TeX Live 2024 では colorprofiles パッケージがプロファイルを同梱しており、ログには <<sRGB.icc>> と埋め込まれた記録が残ります。同じログの ** pdfx: Metadata file document.xmpdata read successfully. が、メタデータが読めた合図です。逆にこのファイルを置き忘れると ** pdfx: No file document.xmpdata . Metadata will be incomplete! と出ます——ただしこの警告を無視しても PDF/A の検証自体は通ってしまいます(後述)。a-1b・a-2b・a-3b のほか、アクセシビリティを含む a-1a・a-2a・a-3a、Unicode 対応の 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 は本文テキストが Unicode に写せることを求めます。この違いが実務でいちばん効くのが透過です。TikZ で opacity=0.5 の四角を 2 枚重ねた文書を [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] に変えるだけで PASS します。PDF 1.4 に透過が無いという 20 年前の事情が、いまも提出先の指定として生きているわけです。
| 適合レベル | 土台の PDF | 要点 |
|---|---|---|
A-1b | PDF 1.4 | 最も狭い。透過が使えない(opacity を含む図で落ちる)。オブジェクトストリームも不可 |
A-2b | PDF 1.7 | 透過が通る。LaTeX から出すなら既定の選択肢。JPEG2000 も可 |
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、clause 6.1.4)として弾かれ、A-4 では「File header %PDF-1.5 ... does not match the pattern %PDF-2.n」(clause 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 | 不合格 — clause 6.1.4「uses xref streams」 | pdfversion=1.4 を足すと 合格 |
pdfstandard=A-2b | 合格 — 何も足さなくてよい唯一の組み合わせ | pdfversion=2.0 を足すと 不合格(clause 6.1.2) |
pdfstandard=A-4 | 不合格 — clause 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 と、合格が意味しないこと
PDF/A に適合しているかどうかを 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 環境で作った入力欄が 1 個でもあると、PDF/A の検証は落ちます。 \TextField を 1 つだけ置いた文書を [a-2b]{pdfx} で組んで veraPDF にかけると、clause 6.3.3 の「An annotation does not contain an appearance dictionary」で不合格になります。hyperref は入力欄の見た目をビューアに描かせる方式(NeedAppearances)を採るのに対し、PDF/A は「見た目は必ずファイル内に焼き込め」と要求するからです。送信ボタンまで付けると失格はさらに増え、clause 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)で、その第 2 部が PDF/UA-2 です。LaTeX 側の実装は LaTeX Project の tagpdf パッケージ(Ulrike Fischer 氏)で、TeX Live 2024 同梱版は バージョン 0.98x(2024-02-29)——バージョン番号が 0 で始まることが、そのまま現状を語っています。タグを直接置く \tagstructbegin のような低レベル命令はこのパッケージが提供します。実際、\DocumentMetadata{tagging=on} と書くと TeX Live 2024 のカーネル(LaTeX2e 2023-11-01)では ! LaTeX Error: The key 'document/metadata/tagging' is unknown and is being ignored. というエラーになります。このリリースでのタグ付けの入口は testphase=phase-III で、これなら pdfinfo の Tagged: が yes になります。名前が示すとおり試験段階の機能なので、書き方は変わります。使う前に必ず現行のドキュメントを確認してください。
そして正直に書いておくべきことがあります。この 2 つを同時に満たすのは、まだ簡単ではありません。 pdfstandard=A-2b だけなら合格する同じ文書に testphase=phase-III を足したところ、veraPDF は clause 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を提出前に必ず 1 回。 TeX Live には入っていないので別途導入が必要です。落ちたら条項番号(6.4・6.1.2・6.3.3)を読みます。- フォームは諦める。 記入可能なフィールドがあると PDF/A には適合しません。