我有一个工作流程,使用 pdfpages 将多个 PDF 合并为一个 PDF。最近,我的一位用户开始提交包含可填写表单的 PDF。我们不需要保留表单,但我们需要保留其内容。我想执行以下操作:
- 检测嵌入的 PDF 是否包含已填写的可填写表格。
- 如果有,请将表单呈现为没有可填写表单的新 PDF,以便我可以将其包含在 pdfpages 中。
- 或者,用其他方式来包含文本。
我已经评论过当可填写字段包含在另一 PDF 中时,它们会从 PDF 表单中消失并且那个人的回答可以通过这个来解决,但我认为我要求的是更普遍的东西。
答案1
假设是 Linux,有几种方法可以从命令行展平 PDF,同时保留表单内容,例如使用cups-pdf
,pdf2ps
然后是ps2pdf
,或pdftocairo
。从这些方法中,pdftocairo
既易于使用又保留了表单标记,因此我将在下面的示例中使用它。
为了实现转换自动化,可以使用包\DeclareGraphicsRule
中的。包内部使用,因此 的设置和选项也适用于。宏定义了要为指定类型的文件运行的外部命令,其中输出应命名为。当从 pdf 转换为 pdf 时,这将是,例如,。graphicx
pdfpages
\includegraphics
\includegraphics
pdfpages
\DeclareGraphicsRule
filename-originalextension-converted-to.newextension
test-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}
在您的文档中。