Node.js二进制到PDF

时间:2017-12-08 11:50:58

标签: javascript node.js express pdf

我有一台快速服务器,可以创建一个pdf文件。

我正在尝试将此文件发送给客户端:



const fs = require('fs');

function download(req, res) {
  var filePath = '/../../myPdf.pdf';

  fs.readFile(__dirname + filePath, function(err, data) {
    if (err) throw new Error(err);
    console.log('yeyy, no errors :)');

    if (!data) throw new Error('Expected data, but got', data);
    console.log('got data', data);

    res.contentType('application/pdf');
    res.send(data);
  });
}




在客户端我想下载它:



  _handleDownloadAll = async () => {
    console.log('handle download all');
    const response = await request.get(
      `http://localhost:3000/download?accessToken=${localStorage.getItem(
        'accessToken'
      )}`
    );

    console.log(response);
  };




我收到了一个像

这样的文字



%PDF-1.4↵1 0 obj↵<<↵/Title (��)↵/Creator (��)↵/Producer (��Qt 5.5.1)↵
&#13;
&#13;
&#13;

但我无法下载。

如何从数据创建PDF或直接从服务器下载?

我已经开始工作了 答案很简单。我只是让浏览器使用html锚标记处理下载: 服务器:

&#13;
&#13;
function download(req, res) {
  const { creditor } = req.query;
  const filePath =  `/../../${creditor}.pdf`;

  res.download(__dirname + filePath);
}
&#13;
&#13;
&#13;

客户端:

&#13;
&#13;
<a href{`${BASE_URL}?accessToken=${accessToken}&creditor=${creditorId}`} download>Download</a>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:0)

您可以通过设置正确的内容处置标题提示浏览器下载文件:

res.setHeader('Content-disposition', 'attachment; filename=myfile.pdf');

答案 1 :(得分:0)

readFile返回Buffer,这是一个围绕字节的包装器。您正在将Buffer发送回正在将其登录到控制台的客户端。

你看到的body.text是可以预料的。

您需要使用fs.writeFile或类似内容将这些字节写入文件。这是一个例子:

_handleDownloadAll = async () => {
  console.log('handle download all');
  const response = await request.get(
    `http://localhost:3000/download?accessToken=${localStorage.getItem(
      'accessToken'
    )}`
  );

  // load your response data into a Buffer
  let buffer = Buffer.from(response.body.text)

  // open the file in writing mode
  fs.open('/path/to/my/file.pdf', 'w', function(err, fd) {  
    if (err) {
        throw 'could not open file: ' + err;
    }

    // write the contents of the buffer
    fs.write(fd, buffer, 0, buffer.length, null, function(err) {
      if (err) {
        throw 'error writing file: ' + err;
      }
      fs.close(fd, function() {
          console.log('file written successfully');
      });
    });
  });
};

您可能需要尝试使用缓冲区编码,默认为utf8

阅读本文!

您可能需要考虑的另一个选项是在服务器上生成PDF,只需向客户端发送一个链接即可下载该文件。