如何在Django/Python中自动填充PDF表单?

59 投票
3 回答
34618 浏览
提问于 2025-04-15 16:56

我有一些PDF表单,想要把我Django网页应用里的数据自动填充进去,然后提供给用户下载。这有什么Python库可以让我轻松地预先填充这些PDF表单吗?这些表单是打算打印出来的。

3 个回答

5

另外,看看这个代码片段,它是一个现成的解决方案,用于在Django中创建PDF视图,这个方案是基于上面Thraxil的解决办法的。感谢GitHub用户zyegfryed。

https://gist.github.com/918403

6

可以试试 reportlab

另外,可以看看 输出PDF文件的相关内容。


编辑

我又想到了一种方法(不过如果你已经有PDF文件了,这个方法就没用了,我更喜欢@thraxil的回答)。

今年早些时候,我参与了一个项目,生成“完成证书”用于继续教育课程。我考虑的一个方向是直接从一个样式合适的网页生成PDF(类似于服务器端的“打印为PDF”)。

我找到的一个工具是 wkhtmltopdf。它是一个独立的WebKit浏览器,可以把网址转换成PDF,效果还不错。

这个方法的思路是,你可以使用django的模板引擎来制作一个包含你想要的内容(包括图片)的页面,然后把这个页面的URL传给wkhtmltopdf,最后获取输出并返回给用户。

我喜欢这个方法,因为实现起来非常简单(只需打开一个管道),你不需要担心保持源PDF文件在服务器上可访问,而且你可以通过更改HTML来重新设计PDF。

80

Reportlab非常适合生成动态的PDF文件,并且需要程序化地控制所有内容:数据和布局。

但如果你只是想在已有的PDF表单上填写内容,使用Reportlab就有点过于复杂了。你基本上需要从头开始用Reportlab重建整个PDF,而不是直接使用已经制作好的表单PDF。

PDF表单是通过FDF数据来工作的。之前我把一个PHP的FDF库移植到了Python,因为我需要做这个,并且把它发布成了fdfgen。我用这个工具生成一个包含表单数据的FDF文件,然后用pdftk把FDF文件放进PDF表单中,生成最终的输出。

整个过程是这样的:

  1. 你(或者设计师)在Acrobat或其他工具中设计PDF,标记表单字段,并记下字段名称(我不太确定具体怎么做;这个步骤是我们设计师完成的)。假设你的表单有“姓名”和“电话”这两个字段。
  2. 使用fdfgen创建一个FDF文件:

    from fdfgen import forge_fdf
    fields = [('name','John Smith'),('telephone','555-1234')]
    fdf = forge_fdf("",fields,[],[],[])
    fdf_file = open("data.fdf","w")
    fdf_file.write(fdf)
    fdf_file.close()
    
  3. 然后运行pdftk来合并和压平:

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

    这样就会生成一个填好的、压平的PDF(也就是说,表单字段不再可编辑),输出文件名为output.pdf。

这个过程有点复杂,而且安装pdftk可能会有点麻烦(需要Java环境,并且在Ubuntu 9.10上有一些bug需要解决),但这是我能想到的最简单的流程,而且工作流程也很方便(也就是说,我们的设计师可以随意对PDF进行布局更改,只要他们不改字段的名称,我就可以直接替换成新的文件,一切都能正常工作)。

对于fdfgen缺乏文档我表示歉意。forge_fdf()是你唯一需要的函数,它有文档字符串来解释参数。我只是一直没能抽出时间来做更多的事情。

撰写回答