首页 > 解决方案 > 将 pdf 读取为 ArrayBuffer 以将其存储在包含详细信息的 json 文件中

问题描述

我想围绕 pdf 文档构建一个包装器来存储更多信息。我尝试了FileReaderwithreader.readAsBinaryString()但这破坏了 pdf 文件(图像等某些部分丢失了)。

所以我尝试reader.readAsArrayBuffer()了似乎没有任何损坏的内容。但我不知道将 ArrayBuffer 转换为字符串,因此我可以将它的值写入 json 文件以导出它。当我使用btoa(new TextDecoder("utf-8").decode(e.target.result))

我收到一个错误The string to be encoded contains characters outside of the Latin1 range.

标签: javascript

解决方案


总的来说,这听起来像是一个糟糕的主意,但无论如何,可能会帮助其他人......

将二进制文件编码为字符串的最简单和最可靠的方法是将其编码为base64

FileReader API 有一个readAsDataURL()方法,该方法将返回由 URI 标头和 base64 二进制数据组成的数据 URI 。
因此,如果您只想将数据作为字符串,您所需要的就是在返回的 dataURI 中获取“base64”之后的任何内容。

inp.onchange = e => {
  const reader = new FileReader();
  reader.onload = e => {
    var myObj = {
      name: inp.files[0].name,
      data: reader.result.split('base64,')[1]
    };
    console.log(JSON.stringify(myObj));
  };
  reader.readAsDataURL(inp.files[0]);
};
<input type="file" id="inp">

现在,我不能建议存储整个 pdf 文件,而且其中包含 JSON 文件中的图像。编码为 base64 的二进制数据将增长 34% (IIRC)。因此,您可能需要考虑将元数据和原始 pdf 文件保存在单个二进制压缩文件(例如 zip)中。


推荐阅读