我找到了如何实现设置 PDF 元数据的 Lua 代码。但我失败了。
我的代码:
\directlua0{
pdf.setinfo ("Title", "Naked Cheerleaders on Crack")
pdf.setinfo ("Creator", "LuaTeX")
pdf.setinfo ("Subject", "Twentieth-Century European
philosophy")
pdf.setinfo ("Description", "myDescription")
pdf.setinfo ("Publisher", "myPublisher")
pdf.setinfo ("Contributor", "myContributor")
pdf.setinfo ("Date", "2020-01-17")
pdf.setinfo ("Type", "myType")
pdf.setinfo ("Format", "myFormat")
pdf.setinfo ("Identifier", "myIdentifier")
pdf.setinfo ("Source", "mypdfsetinfo.tex")
pdf.setinfo ("Language", "myLanguage")
pdf.setinfo ("Rights", "myRights")
pdf.setinfo ("Author", "Craig Parker-Feldmann")
pdf.setinfo ("Keywords", "nudity, cheerleading, drugs,
philosophy, seaweed")
}
The typeset output of this document is only
interesting because I have defined several metadata
fields in the PDF file.
请注意,我不想使用 LuaLaTeX,而是希望使用用 LuaTeX 编译的 Plain TeX。
在我看来,在“\directlua”级别解决这个问题对我来说没有任何好处。我已将代码更改为以下内容:
\pdfinfo {
/Title (Naked Cheerleaders on Crack)
%% /Title (Äther Ölpest Übelkeit bloß schräg blöd Tür)
/Author (Craig Parker-Feldmann)
/Subject (Twentieth-Century European philosophy)
/Keywords (nudity cheerleading drugs philosophy seaweed)
/JavaScript (no)
}
To profit from viewing this PDF document, you should view the “Properties” of the newly-created PDF file.
修订守则
\directlua0{
pdf.setinfo (
table.concat (
{
"/Title (Naked Cheerleaders on Crack)",
"/Author (William Faulkner)",
"/Subject (Twentieth-Century European philosophy)",
"/Keywords (nudity cheerleading drugs philosophy seaweed)"
}, " "
)
)
}% End of \directlua
To profit from viewing this PDF document, you should view the “Properties” of the newly-created PDF file.
现在,此代码可以按照我希望的方式运行。
答案1
LuaTeX 的操作级别要低得多:pdf.setinfo
不关心正确的格式,它只是将原始信息转储到 PDF 信息字典中的一种方式。此外,每次使用都会setinfo
覆盖所有以前的使用,因此在你编写的所有行中,除了
pdf.setinfo ("Keywords", "nudity, cheerleading, drugs,
philosophy, seaweed")
被忽略。这里setinfo
只接受一个参数,而 LuaTeX 出于某种奇怪的原因,如果传递的参数太多,通常会使用最后一个参数,所以这基本上与
\directlua0{
pdf.setinfo ("nudity, cheerleading, drugs,
philosophy, seaweed")
}
The typeset output of this document is only
interesting because I have defined several metadata
fields in the PDF file.
\bye
这将按原样写入 PDF 信息字典中:
<< nudity, cheerleading, drugs, philosophy, seaweed /Producer (LuaTeX-1.10.0) /Creator (TeX) /CreationDate (D:20200117203308+01'00') /ModDate (D:20200117203308+01'00') /Trapped /False /PTEX.FullBanner (This is LuaTeX, Version 1.10.0 (TeX Live 2019)) >>
当然,这不是有效的 PDF 语法。
相反,您必须正确转义您的值并将它们放入 PDF 词典语法中。例如
\directlua0{
pdf.setinfo ("/Title (Some nice title) "
.. "/Author (The fantastic author)")
}
Some text
\bye
这里,您可能需要额外的代码来转义 PDF 名称(以 开头的单词/
)和 PDF 字符串中的特殊字符。之后,您还需要注意使用正确的名称。例如,Date
不是标准字段,您可能想要CreationDate
and/or ModDate
(修改日期)。此外,例如,语言必须在文档目录中设置,而不是在信息字典中设置。
您可以在 PDF 规范中找到所有详细信息,无论是ISO 的最新版本(适用于 PDF 2.0)或者你可以找到“副本”Adobe 的旧版 PDF 1.7 规范(当然,旧规格仍然可从 ISO 获得)。
答案2
另一种策略是使用 XMP 将此信息注入文档。如果您使用的是 pdf(La)TeX,那么您可以使用包韓貨幣,但由于你使用的是 Lua(La)TeX,你可以使用文档中提到的魔法minim-xmp 包。
当然,这要求您事先生成 XMP 文件。这可能很容易,也可能很难,具体取决于您的上下文(xmpincl 包提供了一些样板)。PDF 中生成的元数据确实显示在 Acrobat 中,但不显示在 macOS Preview 等其他 PDF 阅读器中。
为了完整性,minim-xmp 提到的神奇功能是:
\immediate\pdfextension obj uncompressed
stream attr {/Type/Metadata /Subtype/XML}
file {your-file.xmp}
\pdfextension catalog
{/Metadata \pdffeedback lastobj 0 R}