使用NodeJS将PDF二进制数据编码为base64无法工作

10

我正在尝试获取来自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'); 发送请求。


1
body 的类型应该是 Buffer 而不是字符串,请展示您发起请求的代码。字符串不能包含二进制数据。 - h0x91B
@h0x91B 谢谢你的回答,没错,我在请求中添加了“encoding: null”,现在我得到的是一个缓冲区而不是一个字符串。 我以为将这个字符串解析为缓冲区会起到同样的作用,但我不知道为什么它不起作用。 - Loading...
3个回答

11
当您发出请求时,应将选项编码设置为 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'))
})

你好,我尝试了以上的代码。它可以正常运行,并且我也得到了一个对象类型。不过,我仍然获取到的数据是一些无意义的字符。你有什么想法,可能是什么原因呢? - Jay Nirgudkar
3
使用axios,我设置了 responseType: 'arrayBuffer'responseEncoding: 'binary'。现在可以工作了。无论如何,感谢您的答案指出了方向。 - Andrew Ribeiro

4

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

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

1
const pdf2base64 = require('pdf-to-base64');
pdf2base64("test/sample.pdf")
    .then(
        (response) => {
            console.log(response);        }
    )
    .catch(
        (error) => {
            console.log(error);
        }
    )

3
您好,这是一些指南:不建议仅发布代码的答案,答案应该提供更多关于代码的解释,以使答案更有用,并更有可能吸引赞同。 - I_love_vegetables

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接