2013-04-23 42 views
1

我在一個node.js項目中使用PDFKit和socket.io來在用戶單擊前端的按鈕時生成pdf。如何從這裏流式傳輸或以其他方式將最終的PDF發送給最終用戶?我寧願避免將文件保存到文件系統,然後如果我可以...稍後刪除它,希望以某種方式流式傳輸。使用socket.io從字符串發送文件到瀏覽器

socket.on('customerRequestPDF', function(){    
    doc = new PDFDocument;   

    doc.text('Some text goes here', 100, 100); 

    //I could do this but would rather avoid it 
    doc.write('output.pdf'); 

    doc.output(function(string) { 
     //ok I have the string.. now what? 

    }); 

}); 

回答

1

websocket並不是真正適合傳遞PDF的機制。只需使用常規的HTTP請求。

// assuming Express, but works similarly with the vanilla HTTP server 
app.get('/pdf/:token/filename.pdf', function(req, res) { 
    var doc = new PDFDocument(); 
    // ... 

    doc.output(function(buf) { // as of PDFKit v0.2.1 -- see edit history for older versions 
     res.writeHead(200, { 
      'Content-Type': 'application/pdf', 
      'Cache-Control': 'private', 
      'Content-Length': buf.length 
     }); 
     res.end(buf); 
    }); 
}); 

現在一個警告的話:這個PDF庫已損壞。從版本0.2.1開始,輸出是合適的Buffer,但它在內部使用不推薦使用的binary字符串編碼,而不是Buffer。 (以前版本給你的二進制編碼的串。)從docs

'binary' - 通過僅使用每個字符的前8位進行編碼的原始二進制數據轉換成字符串的方法。此編碼方法已棄用,應儘可能避免使用Buffer對象。此編碼將在未來版本的Node中刪除。

這意味着當節點刪除二進制字符串編碼時,庫將停止工作。

+0

從[this](https://github.com/devongovett/pdfkit/pull/166)拉取請求開始,'doc.output'現在返回緩衝區而不是二進制字符串。 – devongovett 2014-01-18 21:43:58

+0

@devongovett,感謝您的更新。然而,我注意到二進制字符串編碼仍然在內部使用。這意味着當節點最終刪除對編碼的支持時,庫會中斷。 – josh3736 2014-01-19 20:17:02

相關問題