如何在Django/Python中自动填充PDF表单?
我有一些PDF表单,想要把我Django网页应用里的数据自动填充进去,然后提供给用户下载。这有什么Python库可以让我轻松地预先填充这些PDF表单吗?这些表单是打算打印出来的。
3 个回答
另外,看看这个代码片段,它是一个现成的解决方案,用于在Django中创建PDF视图,这个方案是基于上面Thraxil的解决办法的。感谢GitHub用户zyegfryed。
可以试试 reportlab。
另外,可以看看 输出PDF文件的相关内容。
编辑
我又想到了一种方法(不过如果你已经有PDF文件了,这个方法就没用了,我更喜欢@thraxil的回答)。
今年早些时候,我参与了一个项目,生成“完成证书”用于继续教育课程。我考虑的一个方向是直接从一个样式合适的网页生成PDF(类似于服务器端的“打印为PDF”)。
我找到的一个工具是 wkhtmltopdf。它是一个独立的WebKit浏览器,可以把网址转换成PDF,效果还不错。
这个方法的思路是,你可以使用django的模板引擎来制作一个包含你想要的内容(包括图片)的页面,然后把这个页面的URL传给wkhtmltopdf,最后获取输出并返回给用户。
我喜欢这个方法,因为实现起来非常简单(只需打开一个管道),你不需要担心保持源PDF文件在服务器上可访问,而且你可以通过更改HTML来重新设计PDF。
Reportlab非常适合生成动态的PDF文件,并且需要程序化地控制所有内容:数据和布局。
但如果你只是想在已有的PDF表单上填写内容,使用Reportlab就有点过于复杂了。你基本上需要从头开始用Reportlab重建整个PDF,而不是直接使用已经制作好的表单PDF。
PDF表单是通过FDF数据来工作的。之前我把一个PHP的FDF库移植到了Python,因为我需要做这个,并且把它发布成了fdfgen。我用这个工具生成一个包含表单数据的FDF文件,然后用pdftk把FDF文件放进PDF表单中,生成最终的输出。
整个过程是这样的:
- 你(或者设计师)在Acrobat或其他工具中设计PDF,标记表单字段,并记下字段名称(我不太确定具体怎么做;这个步骤是我们设计师完成的)。假设你的表单有“姓名”和“电话”这两个字段。
使用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()
然后运行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()是你唯一需要的函数,它有文档字符串来解释参数。我只是一直没能抽出时间来做更多的事情。