如何展平或呈现 PDF 表单,以便可以使用 pdfpages 将其包含到另一个 PDF 中?

如何展平或呈现 PDF 表单,以便可以使用 pdfpages 将其包含到另一个 PDF 中?

我有一个工作流程,使用 pdfpages 将多个 PDF 合并为一个 PDF。最近,我的一位用户开始提交包含可填写表单的 PDF。我们不需要保留表单,但我们需要保留其内容。我想执行以下操作:

  1. 检测嵌入的 PDF 是否包含已填写的可填写表格。
  2. 如果有,请将表单呈现为没有可填写表单的新 PDF,以便我可以将其包含在 pdfpages 中。
  3. 或者,用其他方式来包含文本。

我已经评论过当可填写字段包含在另一 PDF 中时,它们会从 PDF 表单中消失并且那个人的回答可以通过这个来解决,但我认为我要求的是更普遍的东西。

答案1

假设是 Linux,有几种方法可以从命令行展平 PDF,同时保留表单内容,例如使用cups-pdfpdf2ps然后是ps2pdf,或pdftocairo。从这些方法中,pdftocairo既易于使用又保留了表单标记,因此我将在下面的示例中使用它。

为了实现转换自动化,可以使用包\DeclareGraphicsRule中的。包内部使用,因此 的设置和选项也适用于。宏定义了要为指定类型的文件运行的外部命令,其中输出应命名为。当从 pdf 转换为 pdf 时,这将是,例如,。graphicxpdfpages\includegraphics\includegraphicspdfpages\DeclareGraphicsRulefilename-originalextension-converted-to.newextensiontest-pdf-converted-to.pdf

带有表单的示例文档:

\documentclass{article}
\usepackage{hyperref}
\begin{document}
\begin{Form}
\TextField[width=4cm]{First name:}

\vspace{1mm}
\TextField[width=4cm]{Last name:}
\end{Form}
\end{document}

Save as...例如,可以使用 Evince 打开该文档,在 Evince 菜单中填写并保存。

假设文件保存为filledform.pdf以下代码,则可用于将此 pdf 包含在新文档中。请注意,外部命令需要--shell-escape作为编译器标志(例如pdflatex --shell-escape myfile.tex)。

\documentclass{article}
\usepackage{pdfpages}
\begin{document}
\DeclareGraphicsRule{.pdf}{pdf}{.pdf}{`pdftocairo -pdf #1 `basename #1 .pdf`-pdf-converted-to.pdf}
\includepdf[frame,scale=0.65,pages=1,pagecommand={PDF form converted with \texttt{pdftocairo}:}]{filledform.pdf}
\end{document}

结果: 在此处输入图片描述

请注意,这种方法将转换每一个包含 pdf 文件pdftocairo。要执行问题中提到的实际检查(即,仅当存在 pdf 表单时才展平文件),您可以在小型 shell 脚本中使用测试,并在图形规则中将此脚本作为外部命令调用。测试本身可以通过pdfinfo(来自 Poppler)执行,它输出文件的多个属性。如果有表单,pdfinfo将输出Form: AcroForm或类似内容,否则输出将是Form: none。您可以grep针对此行并调用pdftocairo具有表单的文件,cp否则。

代码 (checkform.sh):

#!/usr/bin/env bash
if pdfinfo $1|grep -qE "Form: +none"; then
    cp $1 `basename $1 .pdf`-pdf-converted-to.pdf
else
    pdftocairo -pdf $1 `basename $1 .pdf`-pdf-converted-to.pdf
fi

结合

\DeclareGraphicsRule{.pdf}{pdf}{.pdf}{`./checkform.sh #1}

在您的文档中。

相关内容