是否有一个工具可以从 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 条目。