Closed4

LuaLaTeXにて、hyperref + hyperxmpでmetadataを付加、PDF/A対応、PDFのバージョンを指定する

haxibamihaxibami

概要

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バージョンの検証用)
haxibamihaxibami

パッケージ検討

pdfx

https://qiita.com/trueroad/items/01483e54c76189c47c36

調べた感じでは一番人気。PDF/A化、バージョン指定、メタデータ埋め込みに対応。ただし……

どうも pdfTeX や古い LuaTeX のプリミティブでバージョンを指定しようとしていて、現在の LuaTeX ではうまくいかないようです。そこで、現在の LuaTeX でも古い LuaTeX のプリミティブをエミュレーションする luatex85 パッケージを使います。

なんかエレガントでないので保留。

bxpdfver

https://qiita.com/zr_tex8r/items/a590ee544e95c525bba0

様々なエンジンをこえて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のほうに軍配が上がるらしい。せっかくなので試してみよう!

haxibamihaxibami

前述の通り、設定は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から自動で読み取ってメタデータに反映してくれる点(もちろんpdfauthorpdftitleで指定も可能)。また余計な外部ファイルを生成しないため、情報の変更が即座に反映されるという利点もある。

脚注
  1. 具体的にはこのエラー。色関連っぽく、カラープロファイルの埋め込みで解決するが、よくわからない。 ↩︎

haxibamihaxibami

生成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もそれなりに便利そう。

このスクラップは2022/07/10にクローズされました