我在node.js web应用程序中使用Prawn PDF来动态生成PDF并将其发送回用户。只要PDF文档中没有图像,它就可以正常工作。当我在pdf中包含图像(png或jpeg)时,生成的节点子进程永远不会得到'exit'消息。
在shell中运行时,相同的ruby脚本输出带有图像的pdf。不知何故,图像数据似乎搞砸了,当发送到标准输出!我一定要逃避吗?
谢谢,马诺
var spawn = require('child_process').spawn;
var child = spawn('ruby', ['print_scripts/print.rb', doc_id]);
var pdf = '';
child.stdout.on('data', function(data){
if(data.toString() != 'ERROR'){
pdf += data;
}
});
child.on('exit', function(code){
res.setHeader('Content-Type', 'application/pdf');
if(code == 0){
res.send(pdf);
}
});
在我做的一个简单测试中,exit
甚至在data
被调用之前被调用。这可能与这个通知有关:"注意,子进程工作室流可能仍然是打开的。"(这可能意味着内部缓冲区中仍有数据需要读取)。
当您不使用图像时,输出可能足够小以适合单个缓冲区,因此问题不会出现。你可能应该捕捉close
事件而不是exit
。
在您的代码(pdf += data
)中还有一个隐式转换为字符串的问题,这也可能导致问题。
我认为这将工作:
var chunks = [];
child.stdout.on('data', function(data) {
// insert error check here...
chunks.push(data);
});
child.on('close', function() {
var pdf = Buffer.concat(chunks);
res.send(pdf);
});