从 shell 填写 PDF 表单

从 shell 填写 PDF 表单

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

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

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

答案1

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

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

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

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

怎么做?

1. 提取字段名称

pdftk forms.pdf dump_data_fields

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

---
FieldType: Text
FieldName: Name_Last
FieldNameAlt: LAST
FieldFlags: 0
FieldJustification: Left
---

2. 创建fdf文件

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

<< /T(FIELD_NAME)/V(FIELD_VALUE) >>

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

%FDF-1.2
1 0 obj<</FDF<< /Fields[
<< /T (Name_Last) /V (Smith) >>
<< /T (Name_First) /V (John) >>
] >> >>
endobj
trailer
<</Root 1 0 R>>
%%EOF

要另存为input.fdf

3. 创建文档

pdftk forms.pdf fill_form input.fdf output filled.pdf

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

pdftk filled.pdf dump_data_fields

---
FieldType: Text
FieldName: Name_Last
FieldNameAlt: LAST
FieldFlags: 0
FieldValue: Smith
FieldJustification: Left
---

因此姓氏已写入文件中。

5. 额外处理

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


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

或者,您可能喜欢xfdf-格式(参见)更好的。它基于xml-style 条目。

相关内容