我希望在 LuaTeX 中设置 PDF 元数据

我希望在 LuaTeX 中设置 PDF 元数据

我找到了如何实现设置 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不是标准字段,您可能想要CreationDateand/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}

相关内容