@boxpdf/reader
用于流式、内存范围 PDF 读取器和结构化数据提取器 Java脚本.
合同的定义
阅读器从大型 PDF 中解析和提取内容而无需缓冲 完整的文件。 明确的字节和对象缓存预算规范了内存的使用.
peak parser-owned memory <= configured caches
+ active page window
+ compressed input and direct-read staging
+ largest permitted decoded object / selected-object buffers
+ measured parser and runtime overhead
正在递增扫描大型 Flate 对象流, 只扫描选中的
对象已实现. maxObjectStreamDecodedBytes 默认至少为 128 MiB
每次检查工作总预算,包括重放和重试;不
分配此大小的缓冲. maxDecodedStreamBytes 继续治理
普通的全缓冲解码 临时缓冲计数器不包括总数
解析值或运行时间内存。 见 边框对象流提取
用于回归固定、内存核算和工人检查.
每个输入执行随机访问源 :
interface PdfSource {
readonly size: number;
read(offset: number, length: number): Promise<Uint8Array>;
}
软件包边界
@boxpdf/reader
├── source random-access file, HTTP, Blob, and memory inputs
├── store bounded sparse byte cache
├── syntax PDF lexer, objects, xref, and page tree
├── content graphics state, fonts, CMaps, and text operations
└── structure optional reading order, paragraphs, lists, and tables
separate output packages
├── @boxpdf/html-writer streaming visual or semantic HTML output
└── render future Canvas, SVG, or bitmap rendering
核心结果保留了定位文本和出处. 语义结构 分别推断,包括信心和诊断理由。 A 类 未来的渲染器会消耗页面操作而不成为 文本或表格提取.
HTML 写入器
@boxpdf/html-writer 通过等待的写入将 PDF 页面流到 HTML
调用。 默认 visual 配置保存显示演示文稿
semantic profile 将页面几何转换为可再流的读取顺序, 嵌入
区域、段落、列表、牌、标签/值组和表格。 边框
文档窗口连接各页表格并删除重复的页面
家具而不缓冲完整的PDF. 见 packages/html-writer。 。 。 .
使用量
在节点读取本地文件 :
import { openPdf } from "@boxpdf/reader";
import { fileSource } from "@boxpdf/reader/node";
const source = await fileSource("large.pdf");
const pdf = await openPdf(source, {
chunkSize: 64 * 1024,
maxBytes: 16 * 1024 * 1024,
maxXrefCacheBytes: 16 * 1024 * 1024,
});
try {
for await (const page of pdf.pages()) {
console.log(page.number, page.spans);
}
console.log(pdf.stats);
} finally {
pdf.close();
await source.close();
}
HTTP来源更倾向于字节行距支持. 返回完整 HTTP 200 响应的服务器也是 支持: 读取器只将请求的切片保存在内存中并释放出一个传输效率 警告每个来源.
import { httpSource, openPdf } from "@boxpdf/reader";
const pdf = await openPdf(await httpSource("https://example.com/large.pdf"));
const firstPage = await pdf.getPage(0);
v1 支持
V1 解析器支持 :
- 经典交叉参考表格、交叉参考流和
/Prev链条 - 压缩对象流和线性PDF
- 懒惰的页面- 树检索, 带有继承的媒体框, 旋转, 和资源
- 未过滤的 Flate 和 ASCII- hex 有解码大小限制的流
- 字元和十六进制字符串,常见文本操作符,图形转换,
WinAnsi 文本、 UTF-16 字符串、 0 类型字体和常见
ToUnicode制图 - 标准14,明确,嵌入的TrueType,和PFA/PFB 第1型水平 计量
- 嵌入式 OpenType (
FontFile3与Subtype /OpenType),使用现有的 TrueType 修补或 CFF 转换路径而不附加依赖性 - 水平和垂直 CID 宽度,垂直源,
TJ流离失所,以及 从上到下的结构分组 - 以读取源码和居民字节遥测为界的稀有字节缓存
- 具有常住字节遥测功能的可配置的 xref 字节天花板
- 语义 HTML 有恒温读取顺序和基于重复文本对齐的表格推论
加密 PDF 、 损坏的文件修复、 内容流中的内置图像, 不寻常
流过滤器, Type1C/ CFF 宽度回收, 命名为 CMap 收藏而无
ToUnicode 映射或可用嵌入的 TrueType cmap, OCR, 渲染在外
v1支持面 。 不支持的过滤器和配置的资源限制失败
有明显的错误.
OpenType 字体资产保存其大纲表格并使用 PDF 字符映射
用于浏览器文本。 嵌入式编码 CMaps 支持 cidchar 财务报告和审定财务报表 cidrange 条目.
CID glyph再映射每条编码CMap最多接受65,536个有效记录,
包括跨区块的重复。 记录存储量按需增长至768 KiB.
较大的地图在不发布部分格氏映射的情况下倒回; 文本提取
继续使用 ToUnicode。 。 。 .
格式不当的 OpenType 目录、 CFF2 字体和字体收藏保留了现有的
字体倒置行为.
兼容性甲骨文
PDF.js 是页面几何、解码文本、文本的主要行为预言 方向,和定位。 测试比较了常态化的定位字符和 允许不同的文本宽边框。 波普勒是一个独立的中学 hTML 写入器的预告 。 它的外形门保留了精确的几何和 解码文本协议 每一个已知 同意在两个引擎. 报告记录了引擎之间的RTL和字体解码差异.
全方位门接受所有118个支持的非加密装置(100%).
其中115个与PDF.js相匹配,3个命名的固定装置有意在以下地点相去甚远:
视觉先知证实改进了 .notdef或UTF-16行为.
固定120文件分母中剩下的两个固定装置经过加密
故意无凭无据. 此分数覆盖了页数,
维度、 旋转、 已规范解码字符, 以及第一个文本来源
未旋转的页面。 重点几何测试 额外比较跨度宽度,
高度,字体大小,以及被改变的位置。 结构金色覆盖读取
顺序,推断出词条边界、表格行和语义HTML。 评分限制和
v.1.1 之后发现的布局缺口记录在 docs/PARITY_PLAN.md。 。 。 .
内存测试提取自 10 MB 和 1 GB 虚拟随机访问 PDF 相同的64 KiB字节-cache限制. 他们声称 缓存居住权,最大个人 源读取, 总字节取出, 处理 RSS, 和 ArrayBuffer 增长 .
内存比较
pnpm memory:compare 运行 @boxpdf/reader,原始 PDF.js 和 unpdf 在孤立中
进程与同一逻辑 PDF 相对应。 默认比较使用 10 MiB 和
100个米B输入. PDF.js 和 unpdf 完整接收 Uint8Array 投入;
@boxpdf/reader 获得随机访问源。 PDF.js URL 和范围加载
是单独的输入模式,不在此比较之列.
1个节点24跑产生了这些测量结果:
| 投入 | 发动机 | RSS峰顶 | RSS增长 | 阵列缓冲器增长 | 原始数据已读取 |
|---|---|---|---|---|---|
| 10个小米B | @boxpdf/reader | 49.26 米贝 | 3.64 米贝 | 77.06 基贝 | 140 基贝 |
| 10个小米B | PDF.js (英语) | 130.13 米贝 | 84.49 米贝 | 10.15 米贝 | 全部输入 |
| 10个小米B | 未定义 | 82.37 米贝 | 36.74 米贝 | 10.14 米贝 | 全部输入 |
| 100个米B | @boxpdf/reader | 49.32 米贝 | 3.64 米贝 | 77.06 基贝 | 140 基贝 |
| 100个米B | PDF.js (英语) | 220.09 米贝 | 174.44 米贝 | 100.15 米贝 | 全部输入 |
| 100个米B | 未定义 | 172.37 米贝 | 126.75 米贝 | 100.14 米贝 | 全部输入 |
峰值 RSS 包括节点进程基线,其中大约46米B 运行。 RSS和分配器的行为因操作系统和依赖而异 版本。 基准脚本是当前测量数据的来源.
仓库布局
src/source.ts:公共随机存取源合同和便携式源src/store/: 有限字节存储src/syntax/: PDF 词汇和对象解析src/content/: 页面内容和文本解释src/structure/: 阅读顺序和表格推论src/render/: 为可选的渲染器适配器保留边界test/unit/: 焦点解析器和 API 测试test/fixtures/: 固定完整性和黄金提取测试test/oracle/: 差分 PDF.js 测试test/memory/: 孤立处理内存的测试fixtures/: 经修订的开放源码软件清单和出处
发展
pnpm install
pnpm fixtures:fetch
pnpm test:quick
pnpm test:oracle
pnpm test:memory
pnpm quality