我正在使用 Django 创建报告站点。报告是动态生成的,它们还包括一些 SVG 图表。我想创建一个基于用户正在查看的当前报告的 PDF 文件,但带有额外的页眉和页脚。我遇到了 Phantomjs,但有两个问题,首先是页面需要用户登录,所以如果我将 url 发送到服务器,phantomjs 会为日志页面创建 pdf;其次,报告是使用 ajax 生成的,因此即使是相同的 url 也会有不同的报告。有没有更好的方法来做到这一点?
4 回答
Wkhtmtopdf是将 html 转换为 pdf 及其 python Lib的好工具
通常的问题是如何使用您的网络服务器进行身份验证。对于 WKHTMLTOPDF 和 PHANTOMJS,我通过将身份验证令牌传递给它们并让它们在 cookie 中将其传递回服务器来做到这一点。
所以对于 WKHTMLTOPDF 这变成:
wkhtmltopdf --cookie=LtpaToken2=<sometoken>
这适用于传递身份验证令牌的 Java Web 服务器。我不太了解 django,但它必须使用类似的基于 cookie 的机制进行身份验证。您将需要:
- 获取token服务端(一般可以参考cookies或者request-header获取)
- 将其传递给工具 wkhtmltopdf 或 phantomjs
- 当该工具请求任何受保护的页面时,它需要将 cookie 传回。两者都有相同的命令行参数。
对于 AJAX,最好的方法是延迟。同样,两者都有配置延迟的机制。对于 WKHTMLTOPDF,您可以在命令行参数中指定它,phantomjs 您可以在 windows.setTimeOut 中指定。在呈现页面之前给 Ajax 足够的延迟以完成。
好的,经过大量谷歌搜索,我找不到任何东西。所以我想出了两个骇人听闻的解决方案。
在用户正在查看的页面上,创建一个带有隐藏文本区域的表单,提交按钮名为“生成 PDF”,渲染页面后,我使用 JavaScript 获取我想要的 div 中的所有 html 并将它们放入文本区域。当点击按钮时,会将html传递给服务器端,然后我使用python在本地创建一个html文件,并使用Phantomjs根据html文件创建一个PDF。
创建一个 url 呈现用户正在查看的完全相同的页面,但不需要用户登录。因此必须配置 Apache 或 Nginx,以便 url 只能由本地主机访问。所以 Phantomjs 可以毫无问题地访问 url 并生成 PDF。