PDF打打印受密码保护的页面(理想情况下使wkhtmltopdf使用cookie)

4 投票
1 回答
1982 浏览
提问于 2025-04-17 15:28

我想用 wkhtmltopdf 把一个需要密码的页面打印成PDF,但我无法加载一个(有效的)cookie,这导致我每次打印的都是“登录”页面。

登录后保存cookie

下面的代码运行得很好:如果我登录了,就可以查看正确的页面,无论是通过加载cookie,还是输入我的登录信息:

class PrintPages(object):
    def __init__(self):
        ...
        self.browser = mechanize.Browser()
        self.cj = mechanize.MozillaCookieJar()
        self.browser.set_cookiejar(self.cj)
        self.login("cookies.txt")

    def login(self, cookie_jar):
        """ Log in, save cookie if doesn't exist. Otherwise, load cookie. """
        if os.path.isfile(cookie_jar):
            self.cj.load(cookie_jar, ignore_discard=True, ignore_expires=True)
        else:
            self.browser.open(self.login_url)

            self.browser.select_form(name="loginform")
            self.browser["username"] = self.username
            self.browser["password"] = getpass.getpass()

            self.browser.submit()
            self.cj.save(cookie_jar, ignore_discard=True, ignore_expires=True)

(cookies.txt)

    # Netscape HTTP Cookie File
    # http://www.netscape.com/newsref/std/cookie_spec.html
    # This is a generated file!  Do not edit.

sub.example.com  FALSE   /   TRUE        JSESSIONID  B8307A77925DB287B0346C728BBF8F24

但是,无论是告诉 wget 还是 wkhtmltopdf 去加载这些cookie,我得到的都是登录页面。

$ wget -p --load-cookies cookies.txt sub.example.com/page.html
$ wkhtmltopdf --cookie-jar cookies.txt sub.example.com/page.html page.pdf

这是怎么回事呢?理想情况下,任何能让我打印成PDF的解决方案都是好的,但我很好奇这里发生了什么。


我使用的是:

  • wkhtmltopdf 版本 0.9.9
  • mechanize:版本 0.2.5

1 个回答

3

我没有你提到的关于cookies的具体问题解决方案,但我们在打印带权限的PDF时做了以下几步:

  1. 提供一个不需要登录的单独页面。
  2. 为要生成的PDF创建一个一次性使用的令牌。
  3. 在这个不需要认证的页面中,确保令牌是正确的,并且还没有被使用过。如果令牌有效,就返回HTML内容,方便转换成PDF。
  4. 如果你的页面需要知道哪个用户在请求PDF(为了以某种方式定制页面),你可以把用户ID和令牌一起存储在数据库里。

我们正在寻找更好的方法来做到这一点,但目前这个方法对我们来说还不错。

希望这对你有帮助。

撰写回答