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

时间:2009-12-11 20:12:18

标签: python django

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

3 个答案:

答案 0 :(得分:76)

如果您正在生成非常动态的PDF并且需要以编程方式控制所有这些内容,那么Reportlab非常棒:数据和布局。

要仅填写现有PDF中的表单,reportlab是过度的,您基本上必须在reportlab中从头开始重建PDF,而不是仅仅使用已经制作的表格制作PDF。

PDF表单适用于FDF数据。当我不得不这样做并将其作为fdfgen发布时,我将PHP FDF库移植到Python。我使用它来生成包含表单数据的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中。

  4. 这有点复杂,而且pdftk可能很难安装(需要一个java堆栈,并且Ubuntu 9.10上存在必须解决的错误),但这是我能够提出的最简单的过程并且工作流程很方便(即,我们的设计师可以对他们想要的PDF进行所有布局更改,只要他们不更改字段的名称,我就可以删除新的,并且一切都在继续工作)。

    我为fdfgen缺乏文档道歉。 forge_fdf()实际上是你应该需要的唯一函数,它有一个docstrings来解释参数。我从来没有完全用它做更多的事情。

答案 1 :(得分:5)

试试reportlab

另外,请注意Outputting PDFs

<小时/> 的 修改

我有另一个想法(但是如果你已经拥有PDF文件,它将无济于事,我更喜欢@thraxil的答案)。

今年早些时候,我参与了一个项目,在那里我为继续教育课程制作了“完成证书”。我看到的一个角度是试图直接从适当风格的网页生成PDF(类似于服务器端“打印到PDF”)。

我找到的工具之一是wkhtmltopdf。它是一个独立的WebKit浏览器,可以将URL转换为PDF,并且效果非常好。

这个想法是你使用django的模板引擎将包含你想要的任何内容的页面(包括图像)放在一起,将它的url传递给wkhtmltopdf,获取输出并将其返回给用户。

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

答案 2 :(得分:5)

另请参阅此代码段,这是一个现成的解决方案,用于在django中创建pdf视图,该视图基于上面的Thraxil解决方案。感谢github用户zyegfryed。

https://gist.github.com/918403