LuaLaTeXにて、hyperref + hyperxmpでmetadataを付加、PDF/A対応、PDFのバージョンを指定する
概要
LuaLaTeXでPDFドキュメントを生成する際、
- PDFにAuthor, Keyword等の情報を埋め込む
- PDF 1.7を吐かせる
- PDF/Aに準拠させる
ためにしたこと。とりあえず動いているだけ(最悪)なので、ベストプラクティスではないかも。
環境
- TeXLive 2022 (Arch Linux)
- LuaLaTeX (LuaHBTeX) v1.15.0
-
hyperref
,hyperxmp
,jlreq
パッケージ - VeraPDF v1.18.6(PDF/Aの検証用)
- pdfinfo v22.06.0(PDFバージョンの検証用)
パッケージ検討
pdfx
調べた感じでは一番人気。PDF/A化、バージョン指定、メタデータ埋め込みに対応。ただし……
どうも pdfTeX や古い LuaTeX のプリミティブでバージョンを指定しようとしていて、現在の LuaTeX ではうまくいかないようです。そこで、現在の LuaTeX でも古い LuaTeX のプリミティブをエミュレーションする luatex85 パッケージを使います。
なんかエレガントでないので保留。
bxpdfver
様々なエンジンをこえてPDFのバージョン指定を抽象化する(?)パッケージ。バージョン指定だけならこちらが便利そうだが、今回はいろいろしたいのでパス。
hyperxmp
今日の主題。比較的新しいパッケージで、そのせいか日本語情報が全然ない。(この記事を書いている理由でもある)
名前の通りhyperref
と同時に利用するパッケージで、metadataの埋め込み、PDF/A化、バージョン指定等が実現できる。機能が似ているpdfx
との違いを知るべく、CTANのドキュメントを読んでみると:
One can therefore summarize the difference between hyperxmp and pdfx as
follows: pdfx requires the author to be fully explicit about the document’s metadata
while hyperxmp allows some metadata to be specified implicitly, automatically
inferring it when possible. In general, hyperxmp tries to simplify the author’s task
as much as possible
手軽さではhyperxmpのほうに軍配が上がるらしい。せっかくなので試してみよう!
前述の通り、設定はhyperref
パッケージと一体で行うが、項目によって\hypersetup
に書くものと\usepackage{hyperref}
時のオプションに書くものがあるので注意。
試行錯誤の結果が以下。
\documentclass[
lualatex,
article,
paper=a4,
]{jlreq}
\usepackage[
pdfencoding=auto,
psdextra,
pdfusetitle,
hidelinks,
pdfversion=1.7,
pdfa,
]{hyperref}
\usepackage{hyperxmp}
\hypersetup{
pdfsubject={トピック},
pdfkeywords={キーワード, keyword},
pdfapart=3, % PDF/A のバージョン。最新は3だが、実際は2で問題ないかも
pdfaconformance=u, % PDF/A 内のLevel区分。b(basic), a(accesible), u(unicode)が存在
keeppdfinfo,
}
% カラープロファイルを埋め込んで、出力インテントの設定をしているっぽい(https://tex.stackexchange.com/a/534201)
\immediate\pdfobj stream attr{/N 3} file{sRGB.icc}
\pdfextension catalog{
/OutputIntents [
<<
/Type /OutputIntent
/S /GTS_PDFA1
/DestOutputProfile \the\pdflastobj\space 0 R
/OutputConditionIdentifier (sRGB)
/Info (sRGB)
>>
]
}
%% デフォルト以外のフォントを読み込む場合、以下の一行が必要になる場合がある
%\pdfvariable omitcidset=1
\title{タイトル}
\author{著者}
\begin{document}
\maketitle
中身
\end{document}
一部、オプションでは解決できないエラー[1]があったため、StackExchangeの投稿を参照した。
注目すべきは、あえて\hypersetup
内でタイトルや著者情報を指定しなくても\title
, \author
から自動で読み取ってメタデータに反映してくれる点(もちろんpdfauthor
と pdftitle
で指定も可能)。また余計な外部ファイルを生成しないため、情報の変更が即座に反映されるという利点もある。
生成PDFチェック
pdfinfoの出力:
VeraPDFの出力:
同xml出力:
<?xml version="1.0" encoding="utf-8"?>
<report>
<buildInformation>
<releaseDetails id="core" version="1.18.11" buildDate="2021-04-19T10:21:00+09:00"></releaseDetails>
<releaseDetails id="validation-model" version="1.18.8" buildDate="2021-04-19T10:35:00+09:00"></releaseDetails>
<releaseDetails id="gui" version="1.18.6" buildDate="2021-04-27T08:53:00+09:00"></releaseDetails>
</buildInformation>
<jobs>
<job>
<item size="37857">
<name>/home/haxibami/tmp/test/latexbuild/test.pdf</name>
</item>
<validationReport profileName="PDF/A-3U validation profile" statement="PDF file is compliant with Validation Profile requirements." isCompliant="true">
<details passedRules="126" failedRules="0" passedChecks="959" failedChecks="0"></details>
</validationReport>
<duration start="1654447278419" finish="1654447278654">00:00:00.235</duration>
</job>
</jobs>
<batchSummary totalJobs="1" failedToParse="0" encrypted="0">
<validationReports compliant="1" nonCompliant="0" failedJobs="0">1</validationReports>
<featureReports failedJobs="0">0</featureReports>
<repairReports failedJobs="0">0</repairReports>
<duration start="1654447278376" finish="1654447278665">00:00:00.289</duration>
</batchSummary>
</report>
問題なくPDF/A-3u、PDF v1.7で出力されている。
カラープロファイル設定のせいで手軽さが損なわれているが、hyperxmp
もそれなりに便利そう。