从 shell 填写 PDF 表单

eik*_*ike 9 command-line shell pdf poppler

是否有一个工具可以从 shell 以非交互方式填写 PDF 表单?

对于我的用例,只需为每个字段设置文本(以字段定义的任何顺序)并保存 PDF 文件就足够了,但为了使问题更笼统,可以通过 CLI 进行任何形式的交互(勾选框,选择单选按钮、填充文本、单击按钮等)。

我知道 poppler 有一些访问 PDF 表单的函数,但我还找不到使用这些函数的 CLI 实用程序。

Fel*_*xJN 16

是的,pdftk有这个选项。从man pdftk

\n
\n

fill_form <FDF data filename | XFDF data filename | - | PROMPT>

\n

使用 FDF 文件、XFDF 文件或标准输入中的数据填充单个输入 PDF 的表单字段。在 fill_form 中输入数据文件名 af\xe2\x80\x90\n,或使用 - 通过 stdin 传递数据,如下所示:

\n

pdftk form.pdf fill_form data.fdf output form.filled.pdf

\n
\n

怎么做?

\n

1. 提取字段名称

\n
pdftk forms.pdf dump_data_fields\n
Run Code Online (Sandbox Code Playgroud)\n

将删除一个列表,其中包含以下条目:

\n
---\nFieldType: Text\nFieldName: Name_Last\nFieldNameAlt: LAST\nFieldFlags: 0\nFieldJustification: Left\n---\n
Run Code Online (Sandbox Code Playgroud)\n

2. 创建fdf文件

\n

fdf- 文件是表单填写者。我们使用一般符号为

\n
<< /T(FIELD_NAME)/V(FIELD_VALUE) >>\n
Run Code Online (Sandbox Code Playgroud)\n

并且需要添加页眉和页脚。来源

\n
%FDF-1.2\n1 0 obj<</FDF<< /Fields[\n<< /T (Name_Last) /V (Smith) >>\n<< /T (Name_First) /V (John) >>\n] >> >>\nendobj\ntrailer\n<</Root 1 0 R>>\n%%EOF\n
Run Code Online (Sandbox Code Playgroud)\n

要另存为input.fdf

\n

3. 创建文档

\n
pdftk forms.pdf fill_form input.fdf output filled.pdf\n
Run Code Online (Sandbox Code Playgroud)\n

4. 也许您想再检查一下?

\n
pdftk filled.pdf dump_data_fields\n\n---\nFieldType: Text\nFieldName: Name_Last\nFieldNameAlt: LAST\nFieldFlags: 0\nFieldValue: Smith\nFieldJustification: Left\n---\n
Run Code Online (Sandbox Code Playgroud)\n

所以姓氏已被写入文件中。

\n

5. 额外处理

\n

对于单选按钮,该值是 -entries 之一FieldStateOption,对于复选框使用V(Yes)/V(Off)

\n
\n

如果您想让它更像是逐行查询类型的东西,您可能需要在其周围包装一个脚本,该脚本读取字段类型和名称并提示输入,然后自动创建文件fdf。但这本身就是一个小项目。

\n

或者,您可能更喜欢xfdf- 格式(可以看到)。它基于xml-style 条目。

\n