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