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

我有我想用我的Django Web应用程序的数据自动填充的PDF表单,然后提供给用户下载。 什么python库会让我轻松预先填充PDF表单? 这些表格打算打印出来。

如果您生成非常dynamic的PDF,并且需要以编程方式控制所有的数据和布局,Reportlab是非常棒的。

为了只填写现有PDF中的表单,reportlab是矫枉过正的,您将基本上必须在reportlab中重新构buildPDF,而不是仅仅使用已经创build的表单来获取PDF。

PDF表格与FDF数据一起工作。 我将一个PHP FDF库移植到Python中,而当我必须这样做并将其作为fdfgen发布时。 我用它来生成一个包含表单数据的fdf文件,然后使用pdftk将PDF文件转换为PDF格式并生成输出。

整个过程如下所示:

  1. 您(或devise者)在Acrobat中devisePDF,并标记表单字段并记下字段名称(我不确定这是如何完成的;我们的devise人员执行此步骤)。 假设你的表单中有“姓名”和“电话”字段。
  2. 使用fdfgen创build一个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有错误必须解决),但这是我已经能够提出的最简单的过程和工作stream程很方便(也就是说,我们的devise人员可以对所有PDF格式的布局进行更改,只要不改变字段的名称,我就可以删除新的格式,而且所有的内容都可以继续工作)。

对于缺less关于fdfgen的文档,我表示歉意。 forge_fdf()实际上是你应该需要的唯一函数,它有一个docstrings来解释参数。 我从来没有想过要做更多的事情。

另外看看这个代码段,这是一个现成的解决scheme,在django中创build一个基于上述Thraxil解决scheme的pdf视图。 感谢github用户zyegfryed。

https://gist.github.com/918403

尝试reportlab 。

另外,请输出PDF 。


编辑

我还有一个想法(但是如果你已经有了PDF文件,那么它就没有帮助,我更喜​​欢@ thraxil的答案)。

今年早些时候,我参与了一个为持续教育课程制作“完成证书”的项目。 我看到的一个angular度是试图直接从一个适当样式的网页(如服务器端“打印到PDF”)生成PDF。

我发现的一个工具是wkhtmltopdf 。 这是一个自包含的WebKit浏览器,将URL转换为PDF格式,并具有相当不错的结果。

这个想法是,你使用Django的模板引擎来放置一个页面,包含你想要的任何东西(包括图像),将它的URL传递给wkhtmltopdf,抓取输出并将其返回给用户。

我喜欢这种方法,因为实现起来非常简单(只需打开一个pipe道),不必担心服务器可以访问源PDF文件,并且可以通过更改HTML来重新devisePDF。