在身份验证墙背后生成PDF

时间:2012-04-23 19:59:41

标签: shell command-line wkhtmltopdf

我正在尝试使用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"

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

具体问题:

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


    编辑:

    当然有人成功完成了这项工作?展示示例的好方法可能是有人愿意让它在一些需要登录凭据以消除潜在变量的热门网站上工作。

3 个答案:

答案 0 :(得分:12)

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

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

总结一下:

  1. 查看所需页面上是否还有其他参数。
  2. 确保您提交的网址与该网页上表单元素的ACTION属性相同。
  3. 在登录请求和第二个内容请求中使用--cookie-jar参数。
  4. --post参数的语法是--post username user_name_value --post password password_value

答案 1 :(得分:8)

我认为我尝试登录的表单过于复杂。它是安全的,设置三个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);

答案 2 :(得分:3)

您可能有兴趣尝试使用phantomjs呈现为PDF。

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

你可以找到rasterize.js here。基本上,你写一些javascript登录登录页面,然后你做PDF创建。

但是,输出与wkhtmltopdf不同。您可以将HTML保存到文件中,然后如果phantomjs PDF输出太糟糕,则使用wkhtmltopdf进行渲染。