在Linux上使用Python填写和扁平化PDF表单的最佳方法

1 投票
2 回答
2623 浏览
提问于 2025-04-20 23:55

我有一个PDF模板文件,里面有一个表单字段。我想把这个表单填写完整,然后把它变成一个固定的文件,最后保存为一个新文件。

我正在寻找一个可以用来完成这个任务的Python库,不过如果有Linux命令行程序的解决方案我也可以接受。

2 个回答

2

根据Adobe的文档,有一个更好的方法来实现这个功能。你可以把可编辑表单字段的位位置(Bit Position)改为1,这样它们就变成只读了。我在这里提供了一个完整的解决方案:

https://stackoverflow.com/a/55301804/8382028

总的来说,你可以使用PyPDF2来填写这些字段,然后遍历注释,进行如下操作:

for j in range(0, len(page['/Annots'])):
    writer_annot = page['/Annots'][j].getObject()
    for field in data_dict: 
        if writer_annot.get('/T') == field:
            writer_annot.update({
                NameObject("/Ff"): NumberObject(1)   # make ReadOnly
            })
3

我自己回答自己的问题,我找到的最佳解决方案是结合使用一个Python库和程序pdftk

这个过程可以在这个库的GitHub页面上找到详细说明。

我不想先把.fdf文件保存到硬盘上,所以我采取了这个方法。

from fdfgen import forge_fdf
from subprocess import Popen, PIPE

fields = [("field1", "foo"),
          ("field2", "bar")]
fdf = forge_fdf("", fields, [], [], [])
pdftk = ["pdftk", "template.pdf", "fill_form", "-", 
          "output", "out.pdf", "flatten"]
proc = Popen(pdftk, stdin=PIPE)
output = proc.communicate(input=fdf)
if output[1]: 
    raise IOError(output[1])

撰写回答