2

私は phantomjs を使用して、いくつかの特殊な html ページを PDF にレンダリングしています。これはスケーリングが必要なサービスであるため、可能な限りオーバーヘッドを削減しようとしています。すべてのページは同じ構造で、同じ CSS を使用しており、ほとんどの点で類似しているため、同じ HTML ページを再利用し、javascript を呼び出してコンテンツを置き換えることにしました。これにより、CSS や Web フォントなどを再読み込みする必要がなくなります。

少し複雑にするために、phantom.js の Web サーバー インターフェイスを使用して作成した 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"});
});

私が抱えている問題は、 p.render が終了する前に sendJSON が呼び出されることです。ブロックされていません。正直なところ、これが JavaScript であることを考えると、ブロックされるとは思いませんが、終了時に通知するコールバック関数を受け入れないようです。

この種の問題の解決策を見つけた人はいますか?

4

1 に答える 1

1

したがって、実際にはレンダリング時にブロックされていたことがわかりましたが、render が呼び出されたときにページ自体がまだロードされていたため、そうではなかったようです。$(window).load だけでは、応答する前に css とフォントとすべてが読み込まれたことを確認するのに十分ではありません。

このようなことを試してみたい他の人にとっては、毎回新しいページを作成するよりもかなり速いように思えますが、タイミングをすべて正しくするのは少し難しいかもしれません.

于 2013-07-30T20:10:23.670 に答える