【问题标题】:How to output a PDF buffer to browser using NodeJS?如何使用 NodeJS 将 PDF 缓冲区输出到浏览器?
【发布时间】:2017-08-23 05:02:50
【问题描述】:

所以我使用html-pdf 来转换我的html,这是我的代码:

var pdf = require('html-pdf')
var html = 'somehtmlfile.html'

pdf.create(html).toBuffer(function (err, buffer) {
        if (err) {
          console.log(err)
        } else {
          console.log(buffer)
          var pdfBuffer = new Buffer(buffer)
          res.setHeader('Content-disposition', 'inline; filename="test.pdf"');
          res.setHeader('Content-type', 'application/pdf');
          res.send(pdfBuffer)
        }
}

我没有下载任何 PDF 文件,也没有在浏览器中输出任何 pdf 文件。 console.log(buffer) 是这样的:

<Buffer 25 50 44 46 2d 31 2e 34 0a 31 20 30 20 6f 62 6a 0a 3c 3c 0a 2f 54 69 74 6c 65 20 28 fe ff 29 0a 2f 43 72 65 61 74 6f 72 20 28 fe ff 29 0a 2f 50 72 6f ... >

有没有一种简单的方法可以做到这一点?还是我做错了?

我只想在浏览器中以pdf形式输出缓冲区。

【问题讨论】:

  • 您使用哪个库来创建 PDF (pdf.create)?
  • @DiegoZoracKy 嗯我刚刚在帖子里说过

标签: javascript node.js express pdf buffer


【解决方案1】:

改为:

pdf.create(html).toStream(function(err, stream) {
    if (err) {
        console.log(err)
    } else {
        res.set('Content-type', 'application/pdf');
        stream.pipe(res)
    }
});

【讨论】:

  • 成功,但没有任何反应
  • 什么地方没有发生?您正在使用哪个 http 框架,可以为您提供 res
  • 我正在使用快递
  • 告诉我“什么都没有发生”是什么意思。预期和发生了什么?并注意,如果您想向客户端发送要下载的文件,而不是显示为内容,请使用res.download (expressjs.com/en/api.html#res.download)
  • 如果你想在浏览器中下载文件试试这个:res.contentType('application/pdf') res.attachment() stream.pipe(res)
【解决方案2】:

您可以使用以下函数或html.create(somehtmlfile.html).toStream()

将缓冲区转换为流的函数

 function bufferToStream(buffer) {  
     let stream = new Duplex();
     stream.push(buffer);
     stream.push(null);
     return stream;
   }

如果是流媒体,请在浏览器中下载或查看 pdf

var pdf = require('html-pdf')
var html = 'somehtmlfile.html'
exports.generatePdf = (req, res) =>{
    pdf.create(html).toBuffer(function (err, buffer) {
            if (err) {
              console.log(err)
            } else {
              console.log(buffer)

           bufferToStream(buffer).pipe(res)
            }
    }
}

【讨论】:

    【解决方案3】:

    在客户端试试这个:

    var oReq = new XMLHttpRequest();
    oReq.open("GET", url, true);
    oReq.responseType = "arraybuffer";
    
    oReq.onload = function (oEvent) {
        console.log(oReq.response);
        var blob = new Blob([oReq.response], {type: "application/pdf"});
        var win = window.open('', '_blank');
        var URL = window.URL || window.webkitURL;
        var dataUrl = URL.createObjectURL(blob);
        win.location = dataUrl;
    };
    oReq.send();
    

    在服务器端:

    pdf.create(htmlContent).toStream(function(err, stream){
        console.log("in post method"+stream.length);
            res.header('Content-type', 'application/pdf');
    
            stream.pipe(res);
    });
    

    【讨论】:

      【解决方案4】:
      pdf.create(html).toBuffer(function (err, buffer) {
          if (err) {
              console.log(err)
          } else {
              console.log(buffer)
              res.header('Content-type', 'application/pdf')
              res.send(buffer)
          }
      }
      

      【讨论】:

      • 嗨,有没有办法使这个过程异步?我在回调中生成一个 S3 链接,但它不等待链接
      猜你喜欢
      • 1970-01-01
      • 2012-02-11
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      相关资源
      最近更新 更多