解码 Base64 pdf 给出损坏的文件

Decoding Base64 pdf giving broken file

有人可以解释一下为什么解码 Base64 会给出损坏的 pdf 吗? 我需要找到解码 Base64 并获取 pdf 的方法。 当我使用这项服务时

https://emn178.github.io/online-tools/base64_decode_file.html

我能够通过 Base64 并毫无问题地取出文件。

但是当我在 node.js 中执行相同操作时,我始终得到空(损坏)文件。 我尝试了不同的包,例如: js-base64, 阿托布

和 none 他们成功了,得到了与结果相同的空文件。

Link 到我的代码: https://repl.it/@afiliptsov/FaroffGloriousFormula

简单的就是最好的!只需使用 fs 包将 base64 字符串保存到文件中,请记住您必须为 encoding 选项设置 base64

fs.writeFile('result_document.pdf', stringToDecode, 'base64', (error) => {
  if (error) throw error;
  console.log("Doc saved!");
});

您得到一个损坏的 PDF,因为:

  1. 根据officially documentationBase64.decode() 函数将 Base64 值解码为 UTF-8 字符串。作为 你可以看到,这是错误的功能,因为你需要解码 作为二进制数据的值。
  2. Base64.atob() 函数完全可以满足您的需求,但是您 保存数据时出错,因为,根据 officially documentation,默认情况下 fs.writeFile() 函数将数据保存为UTF-8,而你想保存二进制数据。

要正确解码Base64值并将其存储为二进制数据,根据您的需要,您可以选择以下方法之一:

需要('js-base64').Base64.atob()

使用Base64.atob()解码Base64值并在保存文件时指定二进制编码。这仅在您需要处理二进制数据时才有用。与其他方法不同,您必须安装和加载 "js-base64" 模块。

var bin = Base64.atob(stringToDecode);
// Your code to handle binary data
fs.writeFile('result_binary.pdf', bin, 'binary', error => {
    if (error) {
        throw error;
    } else {
        console.log('binary saved!');
    }
});

Buffer.from

使用 Buffer.from() 将 Base64 值转换为缓冲区,并在不指定编码的情况下将其保存到文件中。这仅在您需要处理缓冲区时才有用。

var buf = Buffer.from(stringToDecode, 'base64');
// Your code to handle buffer
fs.writeFile('result_buffer.pdf', buf, error => {
    if (error) {
        throw error;
    } else {
        console.log('buffer saved!');
    }
});

编码选项

如果不需要read/modify二进制数据或缓冲区,只需在保存文件时指定编码选项即可。这种方法是最简单的一种,可能是最快和最节省内存的。

fs.writeFile('result_base64.pdf', stringToDecode, 'base64', error => {
    if (error) {
        throw error;
    } else {
        console.log('base64 saved!');
    }
});

通过阅读@victor 的回答解决了我的一个相关问题是 Express.js 应用程序从 API 获取 bas64 编码的 PDF 并想要 return 它作为 'proper' pdf:

发送给客户
res.set({
    'Content-Disposition' : 'attachment; filename='+ data.fileName,
    'Content-Type': 'application/pdf',
});
res.send(Buffer.from(data.content, 'base64'));