如何在Django中将html页面转换为pdf

时间:2013-01-03 11:12:51

标签: python html django pdf phantomjs

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

4 个答案:

答案 0 :(得分:1)

Wkhtmtopdf是将html转换为pdf及其python Lib

的好工具

答案 1 :(得分:1)

问题一般是如何通过Web服务器进行身份验证。对于WKHTMLTOPDF和PHANTOMJS,我通过将身份验证令牌传递给他们并将其传递回cookie中的服务器来完成此操作。

因此,对于WKHTMLTOPDF,这变为:

wkhtmltopdf --cookie=LtpaToken2=<sometoken>  

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

  1. 获取令牌服务方(通常可以通过引用cookie或请求标头来获取)
  2. 将其传递给工具wkhtmltopdf或phantomjs
  3. 当工具请求任何受保护的页面时,它需要将cookie传回。两者都有相同的命令行参数。
  4. 对于AJAX,最好的方法是延迟。同样,两者都有配置延迟的机制。在WKHTMLTOPDF的情况下,您可以在命令行参数中指定它,phantomjs可以在windows.setTimeOut中指定。在呈现页面之前,为Ajax提供足够的延迟。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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