当我从 Node.js 中的 PDF 数据字符串保存 PDF 文件时,为什么它打开时显示为空白

问题描述 投票:0回答:2

我正在尝试从 Node.js 应用程序将 PDF 文件写入光盘。我可以创建该文件,但当我打开它时,它是空白的。它的大小不是 0,所以显然数据正在写入其中,但我需要弄清楚如何在打开它时查看我期望看到的数据。

PDF 的数据来自第三方 HTML 到 PDF 转换 API。在它返回的响应中,我在数据属性中看到了这一点:

response.data = '%PDF-1.4\n' +
    '1 0 obj\n' +
    '<<\n' +
    '/Title (��)\n' +
    '/Creator (��)\n' +
    '/Producer (��\x00Q\x00t\x00 \x004\x00.\x008\x00.\x006)\n' +
    '/CreationDate (D:20201109233748Z)\n' +
    '>>\n' +
    'endobj\n' +
    '3 0 obj\n' +
    '<<\n' +
    '/Type /ExtGState\n' +
    ...
    ...
    ...
    'startxref\n' +
    '16917\n' +
    '%%EOF\n'

然后我将其写入光盘,如下所示:

            fs.writeFile('./letter.pdf', res.data, (err) => {
                if (err) {
                    console.log('Failed to save file; err=', err);
                    return null;
                }
                console.log('successfully saved file');
            });

但是当我打开它时,它是一个空白文档。

到目前为止,我已从两个提供商处获取了此数据:

...我也遇到过同样的问题。我认为这意味着我取回的数据非常标准并且没有损坏,由我来格式化它并以某种方式处理它,然后再将其保存到光盘。

有谁知道在将数据保存到文件之前我需要对数据做什么?

node.js pdf file-writing
2个回答
0
投票

确保将其视为二进制文件。

fs.writeFile('result.pdf', binary_file, "binary", function () {})

如果您更愿意使用 Base64 字符串或 URL,请查看 https://docamatic.com


0
投票

我遇到了一个非常相似的问题,响应数据几乎完全相同,经过大量研究后我终于解决了这个问题。如果您可以看到 PDF-1.4 等字样,则它不是二进制文件。从response.data 格式来看,也许您正在使用 axios (或 angular.js http)来发出请求。最重要的部分是告诉 axios 期待“流”响应,然后将该流写入文件。 试试这个:

axios({
  method: 'get',
  url: 'http://api.url...', //change obviously
  responseType: 'stream'  //important
})
  .then(function (response) {
    response.data.pipe(fs.createWriteStream('letter.pdf'))
  });

为了回答您的问题,我认为 PDF 文件很大并且是分成块的,因此您必须以不同于从 API 获取的典型 JSON 文本的方式对待它。 希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.