2016-03-07 29 views
0

我使用GM,一個用於Node.js包的GraphicsMagick將圖像轉換爲服務器上的pdf,並將它們發送給通過緩衝區的Angular.js像這樣的流:無法發送更多緩衝的數據流從node.js到客戶端

var comm = gm().command('convert') 
for (page in pages) { 
    comm.in('./docs/' + data.nomefile + '[' + pages[page] + ']') 
} 
comm.density(150, 150).compress('jpeg').stream('pdf', function(err, stdout, stderr) { 
      if (!err) { 
       var bufs = []; 
       stdout.on('data', function(chunk) { 
        bufs.push(chunk) 
       }); 
       stdout.on('end', function() { 
        var buf = Buffer.concat(bufs).toString('base64'); 
        res.header("Access-Control-Allow-Origin", "*"); 
        res.header("Access-Control-Allow-Headers", "X-Requested-With"); 
        res.header('content-type', 'application/pdf'); 
        res.send(buf) 
       }) 

不幸的是,我不能發送給客戶更多的pdf頁面(取決於它們的大小)。

在角我解碼使用這項服務,這些圖片:

$http.get(baseUrl+imageUrl, {responseType: 'arraybuffer'}). 
      success(function(data) { 
       var pdfData=Base64Service.ConvertArrayBuffer(data); 
       cbk(pdfData); 
      }). 

      error(function(data, status) { 
       var err= 'Request failed with status: ' + status; 
       cbk(err); 
      }); 

在控制器:

window.open('data:application/pdf;base64,' + pdfData); 

當超出限制我只得到一個空白頁,而不是其他。

+1

建議:你應該能夠簡單地設置標題,然後在服務器端使用'stdout.pipe(res);'來避免緩衝。問題:爲什麼不直接在導航到遠程端點的客戶端上打開一個新窗口?這樣你就不會遇到數據uri長度問題。 – mscdex

回答

0

感謝mscdex的建議,這是我如何設法正確地呈現所有圖像:

服務器端:

var comm = gm().command('convert') 
for (page in pages) { 
comm.in('./docs/' + data.nomefile + '[' + pages[page] + ']') 
} 
comm.density(150, 150).compress('jpeg').stream('pdf', function(err, stdout, stderr) { 
     if (!err) { 
      res.header('content-type', 'application/pdf'); 
      stdout.pipe(res) 
     } 

客戶Angular.js服務:

createPdf: function(imageId, pagesArray) { 
$http({ 
     method: 'GET', 
     cache: false, 
     url: baseUrl + 'image/createPdf/', 
     params: { 
      id: imageId, 
      pages: JSON.stringify(pagesArray) 
     }, 
     responseType: "arraybuffer" 
    }).success(function(pdfData) { 
     var file = new Blob([pdfData], { type: 'application/pdf' }); 
     var fileURL = URL.createObjectURL(file); 
     window.open(fileURL); 
    }); 
} 
相關問題