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

如何在Django/Python中自动填充PDF表单?,python,django,Python,Django,我有一些PDF表单,我想自动填充来自Django web应用程序的数据,然后提供给用户下载。什么python库可以让我轻松地预填充PDF表单?这些表格是要打印出来的。试试看 还有,看一看 编辑 我有另一个想法(但如果你已经有了PDF文件,那就没用了,我更喜欢@thraxil的答案) 今年早些时候,我参与了一个项目,为继续教育课程生成了“结业证书”。我考虑的一个角度是,试图直接从一个适当样式的网页(类似于服务器端的“打印到PDF”)生成PDF 我找到的其中一个工具是。它是一个独立的WebKit浏

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

试试看

还有,看一看


编辑

我有另一个想法(但如果你已经有了PDF文件,那就没用了,我更喜欢@thraxil的答案)

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

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

其思想是使用django的模板引擎将包含您想要的任何内容(包括图像)的页面组合在一起,将其url传递给wkhtmltopdf,获取输出并将其返回给用户


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

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

为了在现有的PDF中只填写表单,reportlab是一种过火的做法,您基本上必须在reportlab中从头开始重新构建PDF,而不是只使用已经制作好的表单来获取PDF

PDF表单处理数据。不久前,我将一个PHPFDF库移植到Python中,当时我不得不这样做,并将其发布为。我使用它生成一个包含表单数据的fdf文件,然后使用它将fdf推入PDF表单并生成输出

整个过程如下:

  • 您(或设计师)使用Acrobat或其他工具设计PDF,并标记表单字段并记下字段名称(我不确定具体是如何完成的;我们的设计师执行此步骤)。假设表单中有“name”和“phone”字段
  • 使用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
    
    output.pdf中会有一个填充的、扁平的(意味着不再有可编辑的表单字段)pdf

  • 这有点复杂,pdftk的安装可能会很麻烦(需要java堆栈,Ubuntu 9.10上也有需要解决的bug),但这是我能想到的最简单的过程,工作流程也很方便(也就是说,我们的设计师可以对他们想要的PDF进行所有布局更改,只要他们不更改字段的名称,我就可以插入新的字段,一切都可以正常工作)


    很抱歉没有关于fdfgen.forgeu fdf()的文档是您真正需要的唯一函数,它有一个docstrings来解释参数。我只是从来没有足够的时间来使用它来做更多的工作。

    还要看看这个代码段,它是一个现成的解决方案,用于在django中创建pdf视图,它建立在上述Thraxil解决方案的基础上。感谢github用户Zyefryed


    +1为了提及伟大的实用程序-
    wkhtmltopdf
    。它使程序员能够用html/css设计文档,并转换为质量非常好的PDF。在尝试此示例代码时,我遇到以下错误:UnicodeEncodeError:“ascii”编解码器无法在位置10-13编码字符:序号不在范围内(128)尝试使用utf编写文件:“fdf_file=codecs.open”(“data.fdf”、“w”、“utf-8”)。您必须“导入编解码器”"首先。我还发现了特殊字符编码的问题,我将向作者报告。+1,如果可以的话,还有更多。感谢你的fdfgen。我成功地从CSV文件中批量填充了大量表单。这太棒了,非常感谢你的贡献,thraxil。对其他人说一句警告的话,我无法从亚太地区运行pdftkhe2 WSGI网站,它将被阻止,因为Apache2将向子进程命令返回一个被阻止的信号。我必须设置芹菜以在Apache2外部进行调用。然后从调用视图方法中,我必须获取task.delay().get()等待响应-同步。有关更多详细信息,请参阅:。再次感谢!Hello@thraxil,此贡献非常有用。我只是想知道如何从一组复选框中选择特定复选框?例如,在图像中:,我有一个名为type_of_ownership的字段,其中有六个复选框,我想选择“Limited”“责任”。我如何将参数传递给forge_fdf函数(可能是fdf_数据_名称)?请使用格式返回,因为我被困在这里。提前感谢您!