【问题标题】:Make PhantomJS wait for entire page to load before rendering as PDF让 PhantomJS 在呈现为 PDF 之前等待整个页面加载
【发布时间】:2014-09-19 13:48:37
【问题描述】:

我们 cron 一个 phantomjs rasterize.js http://website.com filename.pdf 当网站变得更加“花哨”时停止工作(空白 PDF)。如果我将其更改为 filename.png 它可以工作。

我尝试在光栅化中将此超时更改为 9999,但我仍然得到一个空白 PDF。默认的 rasterize.js 在网站切换之前工作。

有什么想法可以更改/添加到光栅化以使其再次工作吗?

page.open(address, function (status) {
    if (status !== 'success') {
        console.log('Unable to load the address!');
        phantom.exit();
    } else {
        window.setTimeout(function () {
            page.render(output);
            phantom.exit();
        }, 9999);
});

【问题讨论】:

    标签: pdf-generation phantomjs


    【解决方案1】:

    大约一年前我遇到了一些问题。对我来说(如果我没记错的话),它与@media 标签有关。 (再次,如果我没记错的话)PDF 是用媒体打印 css 生成的,而 png 不是。尝试删除所有 @media print css 后会发生什么。

    编辑 23/9/2014

    我不知道这对你来说有多大问题(你想付出多少努力),但如果是我,我会先尝试这样的事情:

    var page = require('webpage').create();
    var args = require('system').args;
    
    var output_file = args[1], url =args[2];
    
    page.viewportSize = { width: 1440, height: 900 };
    page.paperSize = {
       format: "A4",
       orientation: "landscape",
       margin: { left: "1cm", right: "1cm", top: "1cm", bottom: "1cm" }
    };
    
    console.log(url);
    
    page.onLoadFinished = function (status) {
        window.setTimeout(function () {
            try {
                page.evaluate(function () {
                    jQuery("link").each(function (i, v) {
                        jQuery(v).attr("media", "all");
                    });
                });
                page.render(output_file);
            }
            catch (e) {
                status = e.message;
            }
            console.log(status + ';;' + output_file);
            phantom.exit();
        }, 1000);
    }
    
    try {
        page.open(url);
        console.log('loading');
    }
    catch (ex) {
        console.log(ex.message);
        phantom.exit();
    }
    

    你想在评估函数中做什么取决于 html 的内容是什么。

    判断哪里出了问题的一种更具决定性的方法是使用console.log(page.content); 记录加载的任何内容的来源,然后使用它来查看哪里出了问题。 (只需将该源代码复制到“test.html”文件中并在浏览器中查看,记住(离线)链接将被破坏)

    【讨论】:

    • 您的意思是从网站中删除它们或以某种方式从光栅化文件中删除它们?
    • 从站点中删除它们以进行测试。您也可以使用 javascript ofc。可以评估像 page.evaluate(function () { jQuery("link").each(function (i, v) { jQuery(v).attr("media", "all"); }); }); 这样的东西。在我的情况下,这有帮助,但您可能会 remove() 或其他东西。 (尽管如果您有访问权限,将要测试的内容注释掉是最快的)
    • 啊,好的。不幸的是,我无权修改网站。所以听起来我可能被卡住了。
    猜你喜欢
    • 2012-07-05
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多