在渲染为PDF之前,让PhantomJS等待整个页面加载

时间:2014-09-19 13:48:38

标签: pdf-generation phantomjs

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

我尝试在rasterize中将此超时更改为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);
});

1 个答案:

答案 0 :(得分:2)

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

EDIT 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'文件中并在浏览器中查看,请记住(offcourse)链接将被破坏)