【问题标题】:How can I auto-populate a PDF form in Django/Python? [closed]如何在 Django/Python 中自动填充 PDF 表单? [关闭]
【发布时间】:2010-12-25 19:45:15
【问题描述】:

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

【问题讨论】:

    标签: python django


    【解决方案1】:

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

    仅填写现有 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 上有一些错误需要解决)但这是我能想到的最简单的过程并且工作流程很方便(即,我们的设计人员可以对 PDF 进行所有他们想要的布局更改,只要他们不更改字段的名称,我就可以将新的放入其中并且一切正常)。

    对于 fdfgen 上缺少文档,我深表歉意。 forge_fdf() 确实是您应该需要的唯一函数,它有一个文档字符串来解释参数。我只是一直没有时间用它做更多的事情。

    【讨论】:

    • 在尝试此示例代码时出现此错误:UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-13: ordinal not in range(128)
    • 尝试使用 utf 编写文件:"fdf_file = codecs.open("data.fdf","w", "utf-8" )"。您必须首先“导入编解码器”。我还发现了特殊字符编码的问题,我会向作者报告。
    • 如果可以的话,+1 甚至更多。感谢您的 fdfgen。我设法让这项工作从 CSV 文件中批量填写大量表格。
    • 这太好了,非常感谢您的贡献,thraxil。对其他人的警告,我无法从 Apache2 WSGI 网站运行 pdftk,它会阻塞,因为 Apache2 会向子进程命令返回阻塞信号。我必须设置 Celery 才能在 Apache2 外部进行调用。然后从我的调用视图方法中,我必须让 task.delay().get() 等待响应 - 同步。有关详细信息,请参阅:stackoverflow.com/questions/7543452/…。再次感谢!
    • 你好@thraxil,这个贡献非常有帮助。我只是想知道我们如何从一组复选框中选择特定的复选框?例如,在图像:i.imgur.com/1ar7jyQ.png 中,我有一个名为 type_of_ownership 的字段,它有六个复选框,我想选择“有限责任”。如何将参数传递给 forge_fdf 函数(可能在 fdf_data_names 中)?当我被困在这里时,请恢复格式。谢谢你的期待!
    【解决方案2】:

    试试reportlab

    另外,请访问Outputting PDFs


    编辑

    我有另一个想法(但如果您已经拥有 PDF 文件,这将无济于事,而且我更喜欢 @thraxil 的回答)。

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

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

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

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

    【讨论】:

    • +1 用于提及伟大的实用程序 - wkhtmltopdf。它使程序员能够以html/css设计文档,并转换为非常质量好的PDF。
    • 我尝试使用 wkhtmltopdf,但它很难启动和运行。此外,我面临的主要问题是字体。我无法让它使用与 html 设计中相同的字体。它使用基本字体生成pdf。
    • 嗯,wkhtmltopdf 在 2009 年使用起来并不糟糕,但现在它可能不是一个好主意。它使用旧版本的 webkit,可能还有很多旧的依赖项,更不用说安全问题了。你应该使用reportlab:docs.djangoproject.com/en/3.2/howto/outputting-pdf
    【解决方案3】:

    还可以查看此代码段,它是在 django 中创建 pdf 视图的现成解决方案,它基于 Thraxil 的上述解决方案。感谢 github 用户 zyegfryed。

    https://gist.github.com/918403

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 2011-05-23
      • 2019-08-31
      相关资源
      最近更新 更多