【问题标题】:How to convert a html page to pdf in Django如何在Django中将html页面转换为pdf
【发布时间】:2013-01-03 11:12:51
【问题描述】:

我正在使用 Django 创建报告站点。报告是动态生成的,它们还包括一些 SVG 图表。我想创建一个基于用户正在查看的当前报告的 PDF 文件,但带有额外的页眉和页脚。我遇到了 Phantomjs,但有两个问题,首先是页面需要用户登录,所以如果我将 url 发送到服务器,phantomjs 会为日志页面创建 pdf;其次,报告是使用 ajax 生成的,因此即使是相同的 url 也会有不同的报告。有没有更好的方法来做到这一点?

【问题讨论】:

  • 您是否考虑过使用Reportlab 生成PDF?
  • 我确实看过Django Doc,但我不确定如何处理整个页面,我需要手动绘制整个内容还是可以获取已经渲染的页面?是否支持 SVG?
  • 使用reportlab,您需要手动创建PDF。 AFAIK 无法将 SVG 内容直接嵌入 PDF。但看起来好像有解决方案:google.com/search?q=reportlab+embed+svg

标签: python html django pdf phantomjs


【解决方案1】:

Wkhtmtopdf 是将 html 转换为 pdf 的好工具及其 python Lib

【讨论】:

  • 感谢您的建议,但是如何处理用户登录和 ajax?
  • 使用 django-wkhtmltopdf 将 wkhtmltopdf 集成到您的应用程序中,这样您就不需要处理用户身份验证。另外,您不需要 ajax,因为它在服务器端工作(使用客户端技术)。看到这个答案:stackoverflow.com/a/27419707/2863603
【解决方案2】:

一般的问题是如何通过您的网络服务器进行身份验证。对于 WKHTMLTOPDF 和 PHANTOMJS,我通过将身份验证令牌传递给它们并让它们在 cookie 中将其传递回服务器来做到这一点。

所以对于 WKHTMLTOPDF 这变成:

wkhtmltopdf --cookie=LtpaToken2=<sometoken>  

这适用于传递身份验证令牌的 Java Web 服务器。我不太了解 django,但它必须使用类似的基于 cookie 的机制进行身份验证。你需要:

  1. 获取token服务端(一般可以参考cookies或者request-header获取)
  2. 将其传递给工具 wkhtmltopdf 或 phantomjs
  3. 当工具请求任何受保护的页面时,它需要将 cookie 传回。两者都有相同的命令行参数。

对于 AJAX,最好的方法是延迟。同样,两者都有配置延迟的机制。在 WKHTMLTOPDF 的情况下,您可以在命令行参数中指定它,phantomjs 您可以在 windows.setTimeOut 中指定。在呈现页面之前给 Ajax 足够的延迟以完成。

【讨论】:

  • 您好,感谢您的回答。其实我应该更新我自己的答案,我做了像你说的那样,我将 cookie 传递给了 phantomjs,所以它可能需要具有相同用户权限的相同 url。
【解决方案3】:

Prince 是一个不错的选择(它应该可以处理 SVG),并且它可以免费用于非商业用途。我在我的一个项目中使用了pisa,但它不处理 SVG。

【讨论】:

  • 我其实看过了,可惜这是商业用途。
【解决方案4】:

好的,经过大量谷歌搜索,我找不到任何东西。所以我想出了两个骇人听闻的解决方案。

  1. 在用户正在查看的页面上,创建一个带有隐藏文本区域的表单,提交按钮名为“生成 PDF”,渲染页面后,我使用 JavaScript 获取我的 div 中的所有 html想要并将它们放入文本区域。当点击按钮时,会将html传递给服务器端,然后我使用python在本地创建html文件,并使用Phantomjs根据html文件创建PDF。

  2. 创建一个 url 呈现与用户正在查看的页面完全相同的页面,但不需要用户登录。因此必须配置 Apache 或 Nginx,以便 url 只能由本地主机访问。所以Phantomjs可以毫无问题地访问url并生成PDF。

【讨论】:

    猜你喜欢
    • 2016-07-10
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2011-07-01
    • 2021-12-12
    • 1970-01-01
    相关资源
    最近更新 更多