javascript - 将 pdf 读取为 ArrayBuffer 以将其存储在包含详细信息的 json 文件中
问题描述
我想围绕 pdf 文档构建一个包装器来存储更多信息。我尝试了FileReader
withreader.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.
解决方案
总的来说,这听起来像是一个糟糕的主意,但无论如何,可能会帮助其他人......
将二进制文件编码为字符串的最简单和最可靠的方法是将其编码为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)中。
推荐阅读
- eclipse - ExpressionLanguage 中的语法错误警告
- python - 从单行数据帧中减去数据帧的相应列
- jquery - ASP.Net将json传递给动作,但服务器端的数据为空
- ios - 调用中缺少参数“from”的参数 - SwiftUI
- python - 将十六进制转换为 uint16 little-endian
- docker - 如果构建发生在 docker hub 服务器上,如何在 bash 脚本或 docker 文件中检测?
- django - 如何计算 Django 中视图的执行时间?
- java - 使用 Block 时编译错误
使用 Java MongoDB 4.0.4 驱动程序打印集合 - node.js - 使用 Keycloak 保护 socket.io
- python - Windows powershell 上的烧瓶