为了账号安全,请及时绑定邮箱和手机立即绑定

Base64 解码 Typescript 中嵌入的 PDF

Base64 解码 Typescript 中嵌入的 PDF

子衿沉夜 2023-04-01 15:37:19
在 XML 文件中,我们有一个表示 PDF 文件的 base64 编码字符串,其中包含一些表格表示,即类似于此示例。当解码该 PDF 文档(例如 this )的 base64 字符串时,我们最终得到一个 66 kB 大小的 PDF 文档,可以在任何 PDF 查看器中正确打开它。在尝试使用 TypeScript(在 VSCode 扩展中)解码相同的 base64 编码字符串时Buffer,即使用以下函数:function decodeBase64(base64String: string): string {    const buf: Buffer = Buffer.from(base64String, "base64");    return buf.toString();}// the base64 encoded string is usually extracted from an XML file directly// for testing purposes we load that base64 encoded string from a local fileconst base64Enc: string = fs.readFileSync(".../base64Enc.txt", "ascii");const base64Decoded: string = decodeBase64(base64Enc);fs.writeFileSync(".../table.pdf", base64Decoded);我们最终得到一个 109 kB 大小的 PDF 和一个无法使用 PDF 查看器打开的文档。对于一个简单的 PDF,比如这个,具有像这样的base64 编码字符串表示,上面的代码可以工作,并且可以在任何 PDF 查看器中阅读 PDF。我还尝试使用 直接读取本地存储的 PDF 文件的 base64 编码表示const buffer: string | Buffer = fs.readFileSync(".../base64Enc.txt", "base64");虽然也没有产生有用的东西。即使对这个建议稍作调整,由于atob(...)不存在(建议用 Buffer替换atob),最终代码如下:const buffer: string = fs.readFileSync(".../base64Enc.txt", "ascii");// atob(...) is not present, other answers suggest to use Buffer for conversionconst binary: string = Buffer.from(buffer, 'base64').toString();const arrayBuffer: ArrayBuffer = new ArrayBuffer(binary.length);const uintArray: Uint8Array = new Uint8Array(arrayBuffer);for (let i: number = 0; i < binary.length; i++) {    uintArray[i] = binary.charCodeAt(i);}const decoded: string = Buffer.from(uintArray.buffer).toString();fs.writeFileSync(".../table.pdf", decoded);我不会以可读的 PDF 结尾。“解码”table.pdf样本最终大小为 109 kB。我在这里做错了什么?如何解码 table.pdf 示例等 PDF 以获得可读的 PDF 文档,类似于 Notepad++ 提供的功能?
查看完整描述

1 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

如果您Uint8ArrayBuffer使用Uint8Array构造函数中获得权利:

const buffer: string = fs.readFileSync(".../base64Enc.txt", "ascii");const uintArray: Uint8Array = new Uint8Array(Buffer.from(buffer, 'base64'));
fs.writeFileSync(".../table.pdf", uintArray);

Uint8Array直接写入文件可确保不会因进出字符串的编码更改而损坏。

请注意:Uint8Array指向与Buffer. 在这种情况下并不重要,因为这段代码不引用Buffer构造函数的外部,但万一有人决定为 的输出创建一个新变量Buffer.from(buffer, 'base64')


查看完整回答
反对 回复 2023-04-01
  • 1 回答
  • 0 关注
  • 193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信