我的目标是生成一个包含元数据流的 pdf 文件(信件),以便以后进行索引。tex 文件由程序创建,编译应该可以通过三个主要引擎进行:pdfLaTeX、LuaLaTeX 和 XeTeX。
问题是,这种方法肯定需要 pdf 文件中的 xml 流对象,而不仅仅是 pdf 信息字典。这三个引擎都可以很好地创建 PDFINFO 字典,但是当应该出现元数据流时,使用 XeLaTeX 时什么也没有发生。
问题
我的问题是我做错了什么,或者这是 XeTeX 的限制?
我准备了一个 MWE 进行测试:
% testmeta.tex
\documentclass[10pt]{letter}
\usepackage{iftex}
\ifPDFTeX
\usepackage[T1]{fontenc}
\else
\usepackage{fontspec}
\fi
\ifLuaTeX
\usepackage{luatex85} % defines pdfinfo
\fi
\usepackage[bookmarks=false]{hyperref} % i don't want bookmarked letters
\usepackage{hyperxmp}
%%
%% the following creates the pdf DOCINFO dict fine in any case:
%%
\ifXeTeX
\special{pdf: docinfo <<
\else
\pdfinfo {
\fi
/Language (en-US)
/Title (This Is The Title)
/Author (Jane Doe)
/Creator (SmartProgram using LaTeX)
/Subject (Test for inclusion of a metadata stream)
/Identifier (uuid:43b6b493-42ea-489d-9a04-db20596c4fd7)
/CreationDate (D:20220420090513+02'00')
/Keywords (Metadata-Inclusion, Smart Program, TeX, Test)
\ifXeTeX
>>}
\else }
\fi
%% the following creates a pdf xml stream object when compiled with pdfTeX or LuaTeX
%% but not with XeTeX:
\hypersetup{
keeppdfinfo, % suggestion from hyperxmp doc to keep the pdf info dictionary above
pdflang={en-US},
pdfmetalang={en-US},
pdftitle={This Is The Title},
pdfauthor={Jane Doe},
pdfcreator={SmartProgram using LaTeX},
pdfsubject={Test for inclusion of a metadata stream},
pdfdocumentid={43b6b493-42ea-489d-9a04-db20596c4fd7},
pdfcreationdate={D:20220420090513+02'00'},
pdfkeywords={Metadata-Inclusion, Smart Program, TeX, Test},
}
\begin{document}
\begin{letter}{FirstName LastName\\ 123 Street\\ Town 54321-0123\\ WHEREVER}
\opening{Dear Mrs. LastName}
Text Text Text
\closing{With kind regards}
\end{letter}
\end{document}
为了提取 pdf 信息,我使用了“poppler”库提供的 cli 程序“pdfinfo”。为了检查 pdf 文件,我使用了 pdf 工具包程序 pdftk-java,当输出引擎是 XeTeX 时,我找不到 xml 数据流。
文件“testmeta.tex”是用 pdfLaTeX、LuaLaTeX 和 XeLaTeX 编译的,这是来自 pdfinfo 的输出:(全部:表示来自所有三个引擎的相同输出)
通用元数据:
pdfinfo testmeta.pdf(缩短输出)
全部: | |
---|---|
标题: | 这是标题 |
主题: | 测试是否包含元数据流 |
关键字: | 元数据包含、智能程序、TeX、测试 |
作者: | 无名氏 |
创建者: | 使用 LaTeX 的 SmartProgram |
使用 pdfLaTeX 和 LuaLaTeX:
制作人: | pdfTeX,版本 3.141592653-2.6-1.40.24(TeX Live 2022)kpathsea 版本 6.3.4 |
制作人: | LuaHBTeX,版本 1.15.0 (TeX Live 2022) |
创建日期: | 2022 年 4 月 20 日星期三 09:05:13 CEST |
修改日期: | 2022 年 4 月 24 日 星期日 10:29:55 CEST |
自定义元数据: | 是的 |
元数据流: | 是的<-- |
使用 XeTeX:
制作人: | XeTeX 版本 0.999994 |
创建日期: | 2022 年 4 月 20 日星期三 09:05:13 CEST |
自定义元数据: | 是的 |
元数据流: | 没有<-- |
我正在使用 macOS 12.3.1
xetex -version 的输出:
XeTeX 3.141592653-2.6-0.999994 (TeX Live 2022)
kpathsea version 6.3.4
Copyright 2022 SIL International, Jonathan Kew and Khaled Hosny.
There is NO warranty. Redistribution of this software is
covered by the terms of both the XeTeX copyright and
the Lesser GNU General Public License.
For more information about these matters, see the file
named COPYING and the XeTeX source.
Primary author of XeTeX: Jonathan Kew.
Compiled with ICU version 70.1; using 70.1
Compiled with zlib version 1.2.11; using 1.2.11
Compiled with FreeType2 version 2.11.1; using 2.11.1
Compiled with Graphite2 version 1.3.14; using 1.3.14
Compiled with HarfBuzz version 3.4.0; using 3.4.0
Compiled with libpng version 1.6.37; using 1.6.37
Compiled with pplib version v2.05 less toxic i hope
Using Mac OS X Core Text and Cocoa frameworks
预先感谢您的帮助
答案1
这是 hyperxmp 中的一个错误。它执行 \AtEndDocument 中的代码,但如果文档以 \pagebreak 结尾(就像字母一样),则该页面永远不会被发送出去,因此特殊代码会丢失。
基于 dvi 格式的正确钩子将是shipout/lastpage
:
\documentclass{article}
\usepackage{hyperxmp}
\usepackage{kantlipsum}
\usepackage[]{hyperref}
\hypersetup{
pdfauthor={Jane Doe},
pdftitle={A test of metadata},
}
\makeatletter
\AddToHook{shipout/lastpage}{\hyxmp@construct@packet\hyxmp@embed@packet@xetex}
\makeatother
\begin{document}
\showoutput
abc
\pagebreak
\end{document}
附注:不要用 \pdfinfo 手动填充信息字典。使用 pdflatex,您实际上是用代码生成以下内容:
/Language (en-US)
/Title (This Is The Title)
/Author (Jane Doe)
/Creator (SmartProgram using LaTeX)
/Subject (Test for inclusion of a metadata stream)
/Identifier (uuid:43b6b493-42ea-489d-9a04-db20596c4fd7)
/CreationDate (D:20220420090513+02'00')
/Keywords (Metadata-Inclusion, Smart Program, TeX, Test)
/Author(\376\377\000J\000a\000n\000e\000\040\000D\000o\000e)
/Title(\376\377\000T\000h\000i\000s\000\040\000I\000s\000\040\000T\000h\000e\000\040\000T\000i\000t\000l\000e)
/Subject(\376\377\000T\000e\000s\000t\000\040\000f\000o\000r\000\040\000i\000n\000c\000l\000u\000s\000i\000o\000n\000\040\000o\000f\000\040\000a\000\040\000m\000e\000t\000a\000d\000a\000t\000a\000\040\000s\000t\000r\000e\000a\000m)/Creator(\376\377\000S\000m\000a\000r\000t\000P\000r\000o\000g\000r\000a\000m\000\040\000u\000s\000i\000n\000g\000\040\000L\000a\000T\000e\000X)
/CreationDate(D:20220420090513+02'00')
/Producer(pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) kpathsea version 6.3.4)
/Keywords(\376\377\000M\000e\000t\000a\000d\000a\000t\000a\000-\000I\000n\000c\000l\000u\000s\000i\000o\000n\000,\000\040\000S\000m\000a\000r\000t\000\040\000P\000r\000o\000g\000r\000a\000m\000,\000\040\000T\000e\000X\000,\000\040\000T\000e\000s\000t)
如您所见,各种条目(例如/Title 和/Author)在字典中出现了两次,这是无效的。