在认证墙后面生成 PDF
Posted
技术标签:
【中文标题】在认证墙后面生成 PDF【英文标题】:Generate PDF Behind Authentication Wall 【发布时间】:2012-05-04 11:14:36 【问题描述】:我正在尝试使用 WKhtmlTOPDF 生成 PDF,需要我先登录。互联网上已经有一些,但我似乎无法正常工作。我在航站楼 - 没什么特别的。
我已经尝试过(在很多其他的东西中):
/usr/bin/wkhtmltopdf --post username=myusername --post password=mypassword "URL to Generate" test.pdf
/usr/bin/wkhtmltopdf --username myusername --password mypassword "URL to Generate" test.pdf
/usr/bin/wkhtmltopdf --cookie-jar my.jar --post username=myusername --post password=mypassword "URL to Generate Cookie For"
用户名和密码都是表单上输入字段的id
和name
。我正在显示 my.jar 文件,但没有写入任何内容。
具体问题:
-
我应该在任何地方指定登录页面和/或表单操作吗?
--cookie-jar 参数已在多个地方(无论是需要还是其他地方)都提到过。如果有必要,它是如何工作的?我已经创建了 my.jar 文件,但如何再次使用它?参考:
http://code.google.com/p/wkhtmltopdf/issues/detail?id=356
编辑:
肯定有人成功地做到了这一点?如果有人愿意让它在一些需要登录凭据以消除潜在变量的流行网站上运行,那么展示示例的好方法可能是。
【问题讨论】:
【参考方案1】:我认为我尝试登录的表单过于复杂。它是安全的,设置三个 cookie,重定向两次,并在用户名和密码之外发布许多其他变量,其中一个需要 cookie 值(我什至尝试将值连接到 post 变量中,但没有运气)。这可能是一个非常罕见的问题 - 绝不是 WKHTMLTOPDF 的错。
我最终使用 CURL 登录并将页面写入本地文件,然后针对该文件运行 WKHTMLTOPDF。对于遇到类似问题的其他人来说,这绝对是一个可靠的解决方法。
编辑:CURL,如果有兴趣:
curl_setopt($ch, CURLOPT_HEADER, 1); # Change to 1 to see WTF
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_URL, $loginUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
【讨论】:
概述这个 cURL 语法对你有用。 嗨 Ifedi,不确定我的具体实现是否对您的用例有帮助(它是针对我的需求的帖子字符串,并通过 php 实现),但我添加了它,所以希望它有所帮助。 【参考方案2】:您可能有兴趣尝试使用phantomjs 呈现为 PDF。
phantomjs rasterize.js http://blah.com/ webgl.pdf
您可以找到 rasterize.js here。基本上,您编写一些 javascript 在登录页面上登录,然后创建 PDF。
但是,输出与 wkhtmltopdf 不一样。如果 phantomjs PDF 输出太糟糕,您可以将 HTML 保存到文件中,然后使用 wkhtmltopdf 进行渲染。
【讨论】:
【参考方案3】:每个站点的每个登录表单都不同。您要做的是通过阅读页面上的 HTML(您可能已经知道)来确定您需要传递给该登录表单目标的所有内容。在用户名/密码字段之上可能需要一个额外的隐藏字段来防止跨站点请求伪造。
cookie jar 参数是一个文件,它存储从 web 服务器返回的 cookie。您需要在对登录表单的第一个请求中指定它,并在后续请求中继续使用 cookie/会话信息登录后网络服务器将返回给您。
总结一下:
-
看看页面上是否需要额外的参数。
确保您提交到的 URL 与该页面上表单元素的 ACTION 属性相同。
在登录请求和第二个内容请求中都使用 --cookie-jar 参数。
--post 参数的语法是--post username user_name_value --post password password_value
【讨论】:
谢谢,hsanders。即使我最终选择了另一条路线,您的答案看起来也很可靠。感谢您抽出宝贵时间回复! @Chords 没问题。我之前使用过 wkhtmltopdf 几次。我认为对于一个更复杂的情况,就像你描述的那样,使用它有点痛苦......我不确定它会如何处理你在后续行动中提到的重定向,从来没有处理过。以上是关于在认证墙后面生成 PDF的主要内容,如果未能解决你的问题,请参考以下文章
XMLWriterTraceListener生成文本墙而不是格式化的XML