2

我正在使用 phantomjs 将几个专门的 html 页面呈现为 PDF;由于这是一项需要扩展的服务,因此我正在努力减少尽可能多的开销。所有页面都是相同的结构,使用相同的 CSS,并且在大多数方面都相似,所以我决定重用相同的 html 页面并调用 javascript 来替换内容。这样它就不必重新加载 CSS 和网络字体等。

为了让事情稍微复杂一些,我使用我使用 phantom.js 的 webserver 接口创建的 rest 接口来控制 node.js 的渲染。Web 服务器运行良好——如果我不重复使用该页面,一切都会完美运行。

我遇到的问题是我无法知道何时可以向节点(通过 http 连接)报告该文件已准备好使用。

if (filename.substr(-4) == ".pdf") {
    p.paperSize = {format: 'Letter', orientation: 'portrait', margin: '1cm'};
}
// loadPage evaluates javascript in the page to have it load the contents
// of the url into its body; the callback is triggered by a console.log
// inside the page that tells us when the ajax request has finished and
// the content is ready to be rendered.
loadPage(p, url, function() {
    console.log("Loaded", url);
    p.render(filename);
    console.log("Rendered?", url);
    // sendJSON returns the response to the node client
    sendJSON(response, {filename: filename, status: "success"});
});

我遇到的问题是 sendJSON 在 p.render 完成之前被调用——它没有阻塞。老实说,鉴于这是 javascript,我不希望它会阻塞,但它似乎也不接受回调函数来让我知道它何时完成。

有人找到解决此类问题的方法吗?

4

1 回答 1

1

所以事实证明它实际上是在渲染阻塞,但它似乎不是因为在调用渲染时页面本身仍在加载。$(window).load 本身并不足以确保在响应之前加载 css 和字体以及所有内容。

对于任何想要尝试这样的事情的其他人来说,它似乎确实比每次创建一个新页面要快一些,但要让时间全部正确可能有点棘手。

于 2013-07-30T20:10:23.670 回答