mirror of
https://github.com/Tencent/WeKnora.git
synced 2026-08-30 16:53:21 +08:00
7f0e1a91e9
* build(anydoc): 构建脚本从 Cargo.toml 读取待打补丁的 crate 版本 原先 0.1.8 硬编码在脚本的 6 处,升级要同时改动它们;现在统一从 `anydoc = "=X.Y.Z"` 这一处 pin 推导。 另外补两道拦截:patched-anydoc/ 的复用标记记录已打补丁的版本,避免 版本变更后沿用上一版的副本、最终在 cargo 的 patch 解析里报出难以定位 的错误;构建前校验 version.go 与该 pin 一致,因为这个常量会作为 anydoc_version 写进每一篇已解析文档的元数据。 * fix(anydoc): 升级到 0.1.9,为恶意 PDF 的解析开销加上上界 anydoc 0.1.9 只把 pdf-inspector 从 0.1.8 提到 1.14.2,但那一版含 9 个 修复,其中 7 个是给此前完全无上界的解析工作加限额:每页 Form XObject 展开、CID /W 区间、Encoding cidrange 与 ToUnicode bfrange 展开、 分配操作符前的内容流解码、detector 的 Tj/TJ 操作数回溯、以及不相交 矩形的表格聚类。它们全都落在 process_pdf_mem 这条路径上,而这是 anydoc 转换 PDF 的唯一入口,且只由上传文件的字节驱动。 这正是 guarded() 拦不住的那一类问题:耗尽 CPU 不会 panic,分配失败直接 abort。以 detector 回溯为例,缺少操作数的 TJ 会重扫整个内容流,因此 一串裸 `] TJ` 的开销是长度的平方:977 KB 的 PDF 要 26.7 秒,1.9 MB 要 111.9 秒;升级后分别是 5.8 毫秒和 11.0 毫秒。 TestDetectorLookbackStaysLinear 用 15 秒预算把这个上界钉住——它在 0.1.8 上会超时失败,在 0.1.9 上 0.01 秒通过。 另外 2 个修复改善提取质量,直接影响入库内容:Form XObject 内的文字 现在跟踪 text line matrix 并处理 T*/TL/'/"/Tc/Tw,嵌套表单文字不再 丢换行和字间距;小型大写字母(small-caps)的文字段会合并,不再被当成 额外的表格列而产出错位的 markdown 表格。 升级本身不需要改绑定代码:anydoc 0.1.8 与 0.1.9 的 src/ 字节级一致, C ABI、文档模型和 GFM 序列化器都没变,6 项本地修改原样保留。依赖树也 只动了 3 行版本和 1 个 checksum,lopdf 仍是 0.42,cargo audit 结果与 升级前相同(仅 ttf-parser 未维护这一条已允许的警告)。 * docs(anydoc): 文档与注释中的耗时数字对齐到实测记录 表格与注释里的数字改为与随 PR 附上的实测日志同一次运行的结果,便于核对。