13

我正在尝试使用需要我首先登录的 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"

用户名和密码都是表单上输入字段的 theid和 the name。我正在显示 my.jar 文件,但没有写入任何内容。

具体问题:

  1. 我应该在任何地方指定登录页面和/或表单操作吗?
  2. --cookie-jar 参数已在各个地方(无论是需要还是其他地方)都提到过。如果有必要,它是如何工作的?我已经创建了 my.jar 文件,但如何再次使用它?参考:

http://code.google.com/p/wkhtmltopdf/issues/detail?id=356


编辑:

肯定有人成功地做到了这一点?如果有人愿意让它在一些需要登录凭据以消除潜在变量的流行网站上运行,那么展示示例的好方法可能是。

4

3 回答 3

11

每个站点的每个登录表单都不同。您要做的是通过阅读页面上的 HTML(您可能知道)来确定您需要传递给该登录表单目标的所有内容。在用户名/密码字段之上可能需要一个额外的隐藏字段来防止跨站点请求伪造。

cookie jar 参数是一个文件,它存储从 Web 服务器返回的 cookie。您需要在对登录表单的第一个请求中指定它,并在后续请求中继续使用 Web 服务器的 cookie/会话信息登录后会还给你。

所以总结一下:

  1. 查看页面上是否需要任何其他参数。
  2. 确保您提交的 URL 与该页面上表单元素的 ACTION 属性相同。
  3. 在登录请求和第二个内容请求中都使用 --cookie-jar 参数。
  4. --post 参数的语法是 --post username user_name_value --post password password_value
于 2012-05-01T15:49:48.670 回答
9

我认为我要登录的表格太复杂了。它是安全的,设置三个 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);
于 2012-05-02T19:15:13.870 回答
4

You might be interested in trying to render to PDF with phantomjs.

phantomjs rasterize.js http://blah.com/ webgl.pdf

You can find rasterize.js here. Basically, you write some javascript to log in on the login page, then you do the PDF creation.

However, the output is not the same as wkhtmltopdf. You could just save the HTML to a file, and then render with wkhtmltopdf if the phantomjs PDF output is too awful.

于 2012-05-03T03:36:12.983 回答