LuaLaTeX で PDF/A を構成する

no extension

今回は $\mathrm{Lua\LaTeX}$ で PDF/A を構成してみる。

PDF/A とは

PDF/A とは自己完結性と永続性を考慮した PDF 構成で, ISO 19005 シリーズとして定義されている。 PDF/A の種別は大まかに

  • PDF/A-1 : ISO 19005-1 (PDF 1.4 相当)
    • PDF/A-1a : PDF/A-1 レベルA
    • PDF/A-1b : PDF/A-1 レベルB
  • PDF/A-2 : ISO 19005-2 (PDF 1.7 相当)
    • PDF/A-2a : PDF/A-2 レベルA
    • PDF/A-2b : PDF/A-2 レベルB
    • PDF/A-2u : PDF/A-2 レベルU
  • PDF/A-3 : ISO 19005-3 (PDF/A-2 拡張)
    • PDF/A-3a : PDF/A-3 レベルA
    • PDF/A-3b : PDF/A-3 レベルB
    • PDF/A-3u : PDF/A-3 レベルU

といった感じに分かれている。

まず PDF/A-1 については

  • カラーの再現性の保証
  • フォント埋め込み
  • XMPメタデータの埋め込み

が要求され,逆に暗号化によるアクセス制限やコードの埋め込み等は禁止されている。

PDF/A-2 では PDF/A 文書の添付や圧縮機能の一部などが許容されている。 更に PDF/A-3 では任意のドキュメント・データの埋め込みが許容されているが,さすがにこれは自己完結性の観点からは要らない機能と言えるだろう。

これらの条件に加えてレベルUでは ToUnicode CMap による Unicode 対応が要求され(テキスト抽出等に必要),最高レベルのAではタグによる論理構造の埋め込みも要求される。

論理構造の埋め込みはちょっと辛いし(論理構造をきちんと設計するのは大変)そもそも今回使用する pdfx パッケージではレベルAの要求を完全には満たせないらしいので,レベルBまたはUの PDF/A を構成することを考える。

最初の LuaLaTeX テキスト

手始めに以下の $\mathrm{Lua\LaTeX}$ テキストを用意してみる。

\documentclass{ltjsarticle}
\usepackage[deluxe,nfssonly]{luatexja-preset}
\renewcommand{\emph}[1]{\textsf{\textgt{#1}}} % 強調をゴシック体と Sans Serif に変更する

\title{\emph{はじめてのLua\TeX-ja}}
\author{Spiegel}
\date{2020-06-08}

\begin{document}

\maketitle

\section{はじめてのLua\TeX-ja}

ちゃんとLua\TeX-jaで日本語が出るかな?

\subsection{出たかな?}

長い文章を入力するとちゃんと右端のところで折り返されるかな?
大丈夫そうな気がするけど.ちょっと不安だけど何事も挑戦だよね.

\end{document}

これを処理した結果がこんな感じ。

ちなみに pdfinfo で中身を見ると,こんな感じになっている1

$ pdfinfo sample.pdf 
Creator:        TeX
Producer:       LuaTeX-1.12.0
CreationDate:   Mon Jun  8 20:36:09 2020 JST
ModDate:        Mon Jun  8 20:36:09 2020 JST
Tagged:         no
UserProperties: no
Suspects:       no
Form:           none
JavaScript:     no
Pages:          1
Encrypted:      no
Page size:      595.276 x 841.89 pts (A4)
Page rot:       0
File size:      26856 bytes
Optimized:      no
PDF version:    1.5

PDF version が 1.5 である点に注目。

pdfx パッケージとメタデータの追加

PDF/A を構成するために pdfx パッケージとメタデータを追加する。 こんな感じ。

% XMPメタデータ
\RequirePackage{filecontents}
\begin{filecontents*}{\jobname.xmpdata}
  \Title{はじめてのLuaTeX-ja}
  \Subject{ちゃんとLuaTeX-jaで日本語が出るかな?}
  \Author{Spiegel}
\end{filecontents*}

\documentclass{ltjsarticle}
\usepackage[deluxe,nfssonly]{luatexja-preset}
\renewcommand{\emph}[1]{\textsf{\textgt{#1}}} % 強調をゴシック体と Sans Serif に変更する

\usepackage[a-2u]{pdfx}   % PDF/A-2u を構成
\pdfvariable omitcidset=1 % LuaTeX で PDF/A-2 を作る際に必要

\title{\emph{はじめてのLua\TeX-ja}}
\author{Spiegel}
\date{2020-06-08}

\begin{document}
...

XMPメタデータの指定を \documentclass の前に記述するのがポイント。

これを処理して中身を見るとこんな感じになった。

$ pdfinfo sample.pdf 
Title:          はじめてのLuaTeX-ja
Subject:        ちゃんとLuaTeX-jaで日本語が出るかな?
Author:         Spiegel
Creator:        LaTeX with hyperref
Producer:       LuaTeX
CreationDate:   Mon Jun  8 20:36:09 2020 JST
ModDate:        Mon Jun  8 20:36:09 2020 JST
Tagged:         no
UserProperties: no
Suspects:       no
Form:           none
JavaScript:     no
Pages:          1
Encrypted:      no
Page size:      595.276 x 841.89 pts (A4)
Page rot:       0
File size:      40669 bytes
Optimized:      no
PDF version:    1.4
PDF subtype:    PDF/A-2u:2010
    Title:         ISO 19005 - Electronic document file format for long-term preservation (PDF/A)
    Abbreviation:  PDF/A-2
    Subtitle:      Part 2: Use of ISO 32000-1
    Standard:      ISO 19005-2
    Conformance:   Level U, Unicode support

Title, Subject, および Author のメタデータが追加され, PDF version が 1.4 の PDF/A-2u として構成されているのが分かる。

pdfx パッケージのオプション

pdfx パッケージでは PDF/E や PDF/X 等も構成できるが,ここでは PDF/A のオプションに限って紹介しておく。

オプション 構成
a-1a PDF/A-1a : ただし不完全
a-1b PDF/A-1b
a-2a PDF/A-2a : ただし不完全
a-2b PDF/A-2b
a-2u PDF/A-2u
a-3a PDF/A-3a : ただし不完全
a-3b PDF/A-3b
a-3u PDF/A-3u

レベルAは使わないほうがいいだろう(笑) 一般的には最小構成の PDF/A-1b で十分なようだ。 ただし pdfx パッケージはレベルB指定でも ToUnicode CMap を埋め込んだままにするらしいので,今回のように,敢えて PDF/A-2u にする手もある。

pdfx パッケージで設定可能な XMP メタデータ項目

filecontents 環境

\begin{filecontents*}{\jobname.xmpdata}
  ...
\end{filecontents*}

内に記述する XMP メタデータ項目のうち,主なものは以下の通り。

項目名 XMP 要素 備考
\Author dc:creator \sep で複数指定可能
\Title dc:title
\Language dc:language ja-JP など,\sep で複数指定可能
\Keywords dc:subject \sep で複数指定可能
\Publisher dc:publisher \sep で複数指定可能
\Subject dc:description

著作権情報を載せる場合には以下の項目も使える2

項目名 XMP 要素 備考
\Copyright dc:rights 利用規約等
\CopyrightURL xmpRights:WebStatement
\Copyrighted xmpRights:Marked 公有の場合は False をセットする
\Owner xmpRights:Owner 著作権者が別にいる場合,\sep で複数指定可能
\CertificateURL xmpRights:Certificate
\Date dc:date YYYY-MM-DD または YYYY-MM
\Relation dc:relation
\URLlink dc:identifier

その他,設定可能な項目については pdfx パッケージのドキュメントを参照のこと。

なお filecontents 環境の内容は *.xmpdata ファイルに吐き出されるが,既にファイルがある場合は上書き保存されないため,メタデータを変更したらこのファイルを削除してから再処理する必要がある。 もし .latexmkrc ファイルでビルドの制御を行っているなら

$clean_ext = "xmpdata";

の記述を追加することで

$ latexmk -c

コマンドで,他の一時ファイルと共に *.xmpdata ファイルも削除してくれる。

実際に PDF ファイルに埋め込まれる XMP メタデータの内容は pdfa.xmpi に出力されているので参考になると思う。 また,すでに生成済みの PDF に対しては

$ pdfinfo -meta sample.pdf

で XMP メタデータを抽出できる。

日本語の ToUnicode CMap はなくても大丈夫(らしい)

レベルUの要件として PDF に ToUnicode CMap が埋め込まれている必要があるが,原ノ味フォントのような Adobe-Japan1 フォントについては例外のようだ。

試しに pdf-rm-tuc コマンドで原ノ味フォントの ToUnicode CMap を削除してみる3

$ pdf-rm-tuc --newline-before-endstream sample.pdf sample-tuc.pdf

PDF/A ドキュメントを処理する場合は --newline-before-endstream オプションが必須になるらしいので注意。

これで

$ pdffonts sample-tuc.pdf 
name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
JKVWEI+LMRoman10-Regular             CID Type 0C       Identity-H       yes yes yes     22  0
IECCEF+HaranoAjiMincho-Regular       CID Type 0C       Identity-H       yes yes no      23  0
XKBUGM+LMSans17-Regular              CID Type 0C       Identity-H       yes yes yes     24  0
JYWTWW+HaranoAjiGothic-Regular       CID Type 0C       Identity-H       yes yes no      25  0
RHMEBC+LMRoman12-Regular             CID Type 0C       Identity-H       yes yes yes     26  0
RHDCZK+LMSans12-Regular              CID Type 0C       Identity-H       yes yes yes     27  0

$ pdfinfo sample-tuc.pdf 
Title:          はじめてのLuaTeX-ja
Subject:        ちゃんとLuaTeX-jaで日本語が出るかな?
Author:         Spiegel
Creator:        LaTeX with hyperref
Producer:       LuaTeX
CreationDate:   Mon Jun  8 20:36:09 2020 JST
ModDate:        Mon Jun  8 20:36:09 2020 JST
Tagged:         no
UserProperties: no
Suspects:       no
Form:           none
JavaScript:     no
Pages:          1
Encrypted:      no
Page size:      595.276 x 841.89 pts (A4)
Page rot:       0
File size:      39154 bytes
Optimized:      no
PDF version:    1.4
PDF subtype:    PDF/A-2u:2010
    Title:         ISO 19005 - Electronic document file format for long-term preservation (PDF/A)
    Abbreviation:  PDF/A-2
    Subtitle:      Part 2: Use of ISO 32000-1
    Standard:      ISO 19005-2
    Conformance:   Level U, Unicode support

のように PDF/A-2u を維持しつつ原ノ味フォントの ToUnicode CMap を削除することができた。 念のため,この PDF ファイルを veraPDF で検査してみたが “PDF/A-2U validation profile” でちゃんとパスしたので本当に問題ないのだろう。

さらに pdf-rm-tuc コマンドに --linearize および --object-streams=generate オプションを付けて実行すると

$ pdf-rm-tuc --newline-before-endstream --linearize --object-streams=generate sample.pdf sample-tuc.pdf

PDF version 1.5 のドキュメントとして出力される。

$ pdfinfo sample-tuc.pdf 
Title:          はじめてのLuaTeX-ja
Subject:        ちゃんとLuaTeX-jaで日本語が出るかな?
Author:         Spiegel
Creator:        LaTeX with hyperref
Producer:       LuaTeX
CreationDate:   Mon Jun  8 20:36:09 2020 JST
ModDate:        Mon Jun  8 20:36:09 2020 JST
Tagged:         no
UserProperties: no
Suspects:       no
Form:           none
JavaScript:     no
Pages:          1
Encrypted:      no
Page size:      595.276 x 841.89 pts (A4)
Page rot:       0
File size:      34742 bytes
Optimized:      yes
PDF version:    1.5
PDF subtype:    PDF/A-2u:2010
    Title:         ISO 19005 - Electronic document file format for long-term preservation (PDF/A)
    Abbreviation:  PDF/A-2
    Subtitle:      Part 2: Use of ISO 32000-1
    Standard:      ISO 19005-2
    Conformance:   Level U, Unicode support

よーし,うむうむ,よーし。

ブックマーク

参考図書

photo
[改訂第8版]LaTeX2ε美文書作成入門
奥村晴彦 (著), 黒木裕介 (著)
技術評論社 2020-11-14
大型本
4297117126 (ASIN), 9784297117122 (EAN), 4297117126 (ISBN)
評価     

2020年末に第8版が出てたのに気付かなかったよ。可能なら紙の本も買って常に側に置いておくのが吉。版元には PDF 版もある。

reviewed by Spiegel on 2021-09-05 (powered by PA-APIv5)


  1. pdfinfo および pdffontsPoppler のコマンド。 Windows 版 TeX Live には既定で同梱されているらしい。他のプラットフォームについては「Poppler - TeX Wiki」を参考に導入すればいいだろう。 ↩︎

  2. 基本的に © マークや “Copyright” の文言は不要。その代わり著作(権)者名と公開年と許諾条件を表記するとよい(他のメタデータで代替できるのであればそれも不要だが)。 CC Licenses のようなライセンス・ツールを使うのであれば \CopyrightURL 項目に(コモンズ証などの)許諾条件を記した Web ページの URL をセットすればよい。なお CC Licenses について詳しくは拙文「改訂3版: CC Licenses について」を参考にどうぞ。 PDF/A はアクセス制限を禁止するので CC Licenses と相性がいいよね♪ ↩︎

  3. pdf-rm-tuc コマンドの導入については拙文「LuaTeX で生成した PDF から ToUnicode CMap を除去する」を参考にどうぞ。 ↩︎