【问题标题】:Encoding PDF binary data to base64 not working with NodeJS将 PDF 二进制数据编码为 base64 不适用于 NodeJS
【发布时间】:2017-10-13 13:30:02
【问题描述】:

我正在尝试获取来自 API 的 PDF 流返回并将其解析为 base64 以将其嵌入客户端,API 请求的主体返回如下内容:

    %PDF-1.5
%����
4 0 obj
<<
/Type/XObjcect
/Subtype/Image
/Width 799
/Height 70
/ColorSpace/DeviceGray
/BitsPerComponent 8
/Filter/FlateDecode
/Length 5181
>>
stream
x���=H#�������A�&�)���B���4iba�&O8H
.
.
. 
(The rest was omitted)

我正在尝试以这种方式解析为 base64:

console.log(typeof body); // STRING
const encoded = new Buffer.from(body).toString('base64'); //PDF NOT WORKING

但是当我得到这个 base64 并将其嵌入到 html 时,它说文件无法打开,当我尝试将其保存为 .PDF 文件时也会发生同样的事情。

当我尝试将相同的 pdf 解析为 base64 时,但这次是从下载的 pdf 中,嵌入 html 中的 base64 代码可以正常工作。

  fs.readFile('/home/user/downloaded.pdf', function (err, data) {
    if (err) throw err;

    console.log(typeof data); //OBJECT
    const pdf = data.toString('base64'); //PDF WORKS
  });

我正在使用const request = require('request'); 提出请求。

【问题讨论】:

  • Typeof body 应该是 Buffer 而不是字符串,请显示您提出请求的代码。字符串不能包含二进制数据。
  • @h0x91B 感谢您的回答,是的,您是对的,我在请求中添加了“encoding: null”,现在我得到的是缓冲区而不是字符串。我以为把这个字符串解析到缓冲区也可以,我不知道为什么它不起作用。

标签: javascript node.js pdf encode


【解决方案1】:

当您提出请求时,应将选项编码设置为 null 以获取 Buffer 而不是 String

request({
    method: 'GET',
    encoding: null,
    uri: 'http://youdomain.com/binary.data'
}, (err, resp, data)=>{
    console.log(typeof data) //should be an Object
    console.log(data.toString('base64'))
})

【讨论】:

  • 嗨,我试过上面的代码。它工作正常,我也将类型作为对象。虽然我仍然得到的数据是乱码。知道可能是什么原因吗?
  • 使用 axios,我设置了responseType: 'arrayBuffer',和responseEncoding: 'binary'。现在它起作用了。无论如何谢谢你,你的回答指出了方向。
【解决方案2】:
const pdf2base64 = require('pdf-to-base64');
pdf2base64("test/sample.pdf")
    .then(
        (response) => {
            console.log(response);        }
    )
    .catch(
        (error) => {
            console.log(error);
        }
    )

【讨论】:

  • 您好,这里有一些指导方针:不建议发布纯代码答案,答案应提供有关代码的更多解释,以使其答案更有用并且是更有可能吸引赞成票
【解决方案3】:

我在这个article 上找到了解决方案。 您需要在请求中添加一些配置。

axios.get({
    url: "https...",
    responseType: "arraybuffer",
    responseEncoding: "binary",
    headers: {
      "Content-Type": "application/pdf"
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2014-11-06
    • 2011-11-02
    • 2017-07-14
    • 1970-01-01
    • 2021-12-03
    • 2017-06-11
    相关资源
    最近更新 更多