超级菜鸟问题:是否可以显示元数据是否要使用 hyperref 插入生成的 PDF 本身?我并不是要在生成过程中设置它们,那样很容易。
我知道在创建 PDF 后搜索并替换文本字符串是不可能的,或者有点困难。我有一些不错的 LaTeX 发票模板,通常只有一些数据会发生变化。
我想在生成 PDF 后使用 C 或 Objective-C 更改这些数据。在我看来,元数据可能更易于通过编程访问,而且我不想丢失 PDF 中出色的 LaTeX 排版文本。
我想使用元数据作为某种内置数据库。
我疯了吗?
例如,“作者”字段可以设置为占位符值,如 XXX,然后我稍后只需以编程方式访问 PDF 元数据即可设置/更改它(换句话说,在后期制作中不使用 LaTeX)。
它就像一个可填写的 PDF,但使用元数据作为更新文本的手段。
编辑
我知道这可能是一个自动化扭曲的想法,但问题来自于使用场景。我想为 iOS(iPhone 和 iPad)制作一个简单的发票应用程序,我想使用我用 LaTeX 创建的排版精美的 pdf。我知道由于各种许可问题,我无法将 TEX 嵌入到应用程序中。同时,我不喜欢依赖像 scribtex 这样的外部、网络可达的 TEX 引擎。
答案1
如果我理解正确的话,您希望 PDF 文档中的字段显示文件元数据中所述的当前作者。像这样,您希望能够通过使用外部程序更改元数据来更新文档,这比直接操作文本更容易。
理论上,使用 PDF 表单和 Acrobat JavaScript 可以实现这一点:hyperref
包能够创建可填写的表格,并与insdljs
包中,您可以插入代码来使用文档信息更新字段。(insdljs
是AcroTeX 捆绑包,它位于 MiKTeX 中,但不位于 TeX Live 中,因此您可能需要手动安装它。)
概念证明:
\documentclass{article}
\usepackage{hyperref}
\usepackage[pdftex]{insdljs}
\OpenAction{/S /JavaScript /JS (this.getField("fullname").value = this.info.author;)}
\hypersetup{pdfauthor={diabonas}}
\begin{document}
\begin{Form}
\TextField[name=fullname]{Name: }
\end{Form}
\end{document}
(pdfauthor
设置为表单字段显示某些内容,您可以使用外部程序更改 PDF 作者以查看其是否有效。)
结果:
然而,这种方法有两个缺点:
- 插入的文本看起来与周围的文本有很大不同。
- 除了 Adobe(Reader)之外,JavaScript 在许多 PDF 阅读器中都不起作用,因此,除非您安装了此程序并激活了 JavaScript,否则您将得到一个空白字段。
问题 #1 可以通过使用各种格式选项来解决描述于hyperref
手册。
为了克服缺点#2,我建议采用与使用文档的元数据更新文本不同的方法:
创建一个包含可填写表单的 PDF 文档(这与我们已经做的几乎相同,但没有 JavaScript 部分):
\documentclass{article} \usepackage{hyperref} \begin{document} \begin{Form} \TextField[name=fullname]{Name: } \end{Form} \end{document}
创建一个所谓的 FDF(表单数据格式)文件,其中包含要插入 PDF 文档的信息。对于我们的最小示例,该文件将如下所示(替换
Firstname Lastname
为要插入的名称):%FDF-1.2 %âãÏÓ 1 0 obj << /FDF << /Fields [ << /V (Firstname Lastname) /T (fullname) >>] >> >> endobj trailer << /Root 1 0 R >> %%EOF
要创建可以自行填充的“模板”FDF 文件,可以使用 PDF 工具包
pdftk
:pdftk form.pdf generate_fdf output form.fdf
现在,您可以使用以下命令将准备好的 FDF 文件写入
form.fdf
原始 PDF 格式:form.pdf
pdftk
pdftk form.pdf fill_form form.fdf output form-filled.pdf flatten
这似乎比第一种方法工作量更大,但结果是,您得到一个可以被任何 PDF 阅读器查看的静态文档。
答案2
pdfinfo
从 poppler/xpdf使用。