我经常需要创建带有可填写表单字段的 PDF,然后可以使用 Adobe Reader 进行填写。然而,经过大量研究,似乎唯一能够真正向 PDF 添加可填写表单字段的工具是 Acrobat 和 Foxit 等 GUI 工具,这些工具通常也是专有的。请注意,我并不是要求以编程方式填写这些表单字段的工具,似乎有很多 - 我是要求相反。
如何通过命令行或其他方法以编程方式将可填写的表单字段添加到我的 PDF 文件中,以便更轻松地实现该过程的自动化?
答案1
pymypdf 可能是以编程方式生成 pdf 文档的一种选项。
https://github.com/pymupdf/PyMuPDF
https://github.com/pymupdf/PyMuPDF-Utilities/blob/master/fields/form-fields.py
然而,它似乎存在问题
答案2
如果它必须是“免费的”,你就必须看看常见的(又名 PDF 创建库);可能有一些可用的解决方案。
否则,最好的工具(因为它具有最广泛的 JavaScript 方法和属性)是 Acrobat Pro。就是这样。
对于非常简单的表格,您可能还会查看 LibreOffice 的表格设计模块(但您可能仍然需要 Acrobat,即使它只是用于调试表格)。
答案3
重点是批量填充 PDF字段只需要是文本,因此我们以 FDF 中提供的第一个示例为例添加数据。您不需要添加所有字段,只需添加您希望填充或更改的字段即可。
%FDF-1.4
%âãÏÓ
1 0 obj
<< /FDF << /F (OoPdfFormExample.pdf)
/Fields [<<
/T (Address 1 Text Box) /V (Hello World!)
>> <<
% ... other data fields if wanted
/T (Family Name Text Box) /V (Aziz)
>> <<
/T (Favourite Colour List Box) /V (Red)
>> <<
/T (Gender List Box) /V (Man)
>> <<
/T (Given Name Text Box) /V (Hashim)
>> <<
% ... other data fields if wanted
/T (Language 5 Check Box) /V /Off
>> <<
/T (Postcode Text Box) /V (AB12 3CD)
>>]
/ID [<5E0A553555622A0516E9877CA55217A6> <5E0A553555622A0516E9877CA55217A6>]
/UF (OoPdfFormExample.pdf)
>>
/Type /Catalog
>>
endobj
trailer
<<
/Root 1 0 R
>>
%%EOF
现在我们可以使用该文件(尝试一下http://foersom.com/net/HowTo/data/OoPdfFormExample.pdf但可能需要整理我的 % ... 注释到一个更干净的文件)它很简单双击 FDF然后它会打开包含该数据的 PDF。我们确实需要先确保表单是可信的。(只需设置为“始终”即可)
现在,无论何时我们打开包含不同字段数据的 FDF,它都会自动插入到模板中。我们只需在打开之前覆盖 FDF 数据,然后使用新名称保存 PDF。
回答
与命令行跨平台 PDFTK 相比,Acrobat 的该功能成本较高,而 PDFTK 的服务器许可证价格不到 30 美元。但它确实使用了基于 V-1.2 的旧语法?
另一种方法是使用现代低成本命令行 SDK,如 Tracker PDF-Xchange(免费版也可以),它也可以通过命令行打开 FDF 并保存为 PDF,价格约为 PDFTK 的两倍。
慢速高速公路
将数据路由到 HashimAziz.FDF 之类的文件中
使用空白文件打开 Acrobat Reader
加载 AcroRd32 HashimAziz.FDF
使用 VBA 或其发送键触发“另存为”并输入“HashimAziz”
{Shift+Ctrl+S}(取决于方法)等待 500 {Enter} 等待 500 HashimAziz {Enter}
然后“循环”下一个 FDF
结束循环发送 {Alt+F4}
潜在的障碍是,当模板中的字段大小不正确时,FDF 作为文本需要小心,因为对于潜在内容(尤其是 Unicode)来说太小的字段可能会出现不同的问题。
另一点是 PDF 不以传统方式使用 UTF-8。所以我们需要考虑十六进制编码或像这样使用 ANSI
>> <<
/T (Given Name Text Box)
/V (þÿG'4E)
>> <<
如果操作正确,将会填充像这样的扩大的区域(所以它应该更大)。