2013-05-14 54 views
1

在node.js webapp中使用Prawn PDF來動態生成PDF並將其發回給用戶。只要PDF文檔中沒有圖像,它就可以正常工作。當我在PDF中包含一個圖像(png或jpeg)時,生成的節點子進程永遠不會獲得'exit'消息。無法使用來自Prawn PDF的圖像在Node.js Web應用程序中獲取PDF

相同的ruby腳本在shell中運行時輸出一個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); 
    } 
}); 
+0

你能後,你使用它調用Ruby腳本的代碼? – robertklep 2013-05-14 11:19:12

+0

@robertklep:用代碼更新。謝謝 – 2013-05-14 11:38:44

回答

2

在一個簡單的測試,我做了,exit被稱爲data被稱爲甚至之前。這可能與此通知有關:"Note that the child process stdio streams might still be open."(這可能意味着內部緩衝區中仍有數據需要讀取)。

當您不使用圖像時,輸出可能足夠小以適應單個緩衝區,因此問題不會出現。而不是exit您應該趕上close事件。

在代碼中還存在隱式轉換爲字符串的問題(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); 
}); 
+0

你釘了它:-)即使在聽完'關閉'後,我得到了一個PDF,但沒有圖像。但使用Buffer.concat後,它按預期工作。萬分感謝。 – 2013-05-14 12:21:22

相關問題