2

node-wkhtml モジュール (基本的には wkhtmltoimage/wkhtmltopdf コマンド ライン ユーティリティの単なるラッパー) を使用して生成された png 画像を提供するノード サーバーを作成しようとしています。これが私がこれまでに持っているものです:

var http = require('http');
var Image = require("node-wkhtml").image();

http.createServer(function (request, response) {
  new Image({ url: "www.google.com" }).convert (function (err, stdout) {
    //var theImage = new Buffer (stdout, 'binary');
    response.writeHead(200, {'Content-Type' : 'image/png',
                           'Content-Length' : stdout.length
    });
    response.write (stdout, 'binary');
    response.end ();
    //write out an error, if there is one
    if (err)
      console.log (err);
  });
}).listen(8124);

基本的に、モジュールは次のコマンドを呼び出します。

wkhtmltoimage www.google.com -

次に、png 画像を生成し、それを stdout に書き込みます。提供されるデータの量は正しいようですが、ブラウザで表示できません (ファイルとしてダウンロードしても機能しません)。次のコマンドを試しました:

wkhtmltoimage www.google.com - > download.png

案の定、download.png が作成され、Google ホームページのスナップショットが含まれていました。これは、wkhtmltoimage ユーティリティが正常に機能しており、コマンドが機能していることを意味します。私はノードの初心者なので、このようなバイナリ ファイルを提供する方法にあまり詳しくありません。明らかな問題が見られる人はいますか? 魔法のように機能するノード モジュール コードは次のとおりです。

Image.prototype.convert = function(callback) {    
  exec(util.buildCommand(this), {encoding: 'binary', maxBuffer: 10*1024*1024}, callback);
}

(buildCommand 関数は「wkhtmltoimage www.google.com -」コマンドを生成するだけで、ノード インスペクタを使用して、これが正しく行われることを確認しました。

更新: 誰かが後でこれを見つけて興味を持った場合に備えて、解決策を見つけました。私が使用していたプラグイン (node-wkhtml) は、代わりにchild-process.exec使用するようにプラグイン コードを変更したため、大きなバッファーを適切に処理していませんでした。child-process.spawn

4

0 に答える 0