anydoc:4.4ms 干翻 LibreOffice 和 Pandoc 的 Rust 文档转换库,14 种格式统一转 Markdown
anydoc:4.4ms 干翻 LibreOffice 和 Pandoc 的 Rust 文档转换库,14 种格式统一转 Markdown
做 RAG 和 AI Agent 的同学应该都经历过这种绝望:业务方甩来一个压缩包,里面 Word、PPT、Excel、PDF 什么格式都有,任务是把它们全部转成干净的 Markdown 喂给 LLM。LibreOffice 转一份要等一秒多,Pandoc 快一点但只支持 5 种格式。最后只能每种格式单独写一套解析逻辑,维护成本高到怀疑人生。
anydoc 就是来终结这件事的。
它是什么
anydoc 是 Firecrawl 团队开源的一个文档转换库,纯 Rust 实现,能把 14 种办公文档格式转成干净的 GitHub Flavored Markdown。MIT 许可证,代码全公开。
Firecrawl 就是做网站转 Markdown API 的那家公司——anydoc 已经在生产环境跑了很久,Firecrawl Parse 的文档解析底层就是它。
| 类别 | 支持格式 |
|---|---|
| Word | .doc / .docx / .docm |
| PowerPoint | .ppt / .pps / .pot / .pptx / .pptm / .ppsx / .ppsm |
| Excel | .xls / .xlsx / .xlsm / .xlsb |
| OpenDocument | .odt / .ods / .odp |
| 其他 | RTF / EPUB / CSV / PDF |
最核心的设计:一个模型,统一输出
这是 anydoc 和所有竞品最本质的区别。
大多数转换工具是”每种格式单独写一个解析器直出 Markdown“——docx 走一套逻辑、pptx 走另一套、rtf 再走一套。输出质量参差不齐,修了一个格式的 bug,其他格式该有的问题还在。
anydoc 的做法完全不同:
1 | 文档字节 → 格式检测(基于内容特征,不靠扩展名) |
每种格式的解析器先把文档解析成同一个中间表示(Document Model),然后所有格式共用同一个 Markdown 序列化器。
这意味着:一个表格转义规则的修复,同时修复了 docx、rtf、odt 等所有格式的输出。 输出的一致性有保障,维护成本也降到了最低。
Document Model 里保留的信息相当完整:带锚点的标题层级、粗体/斜体/删除线、行内代码和代码块、链接和内部交叉引用、带原始编号的各类列表、带合并单元格和表头的表格、块引用/脚注/尾注、演讲者备注。嵌入资源也处理得干净——图片渲染为 alt 文本,原始字节保留在 Document Model 中带 media type 标记,方便后续自行处理。
格式检测:不看扩展名,看内容
很多工具靠文件扩展名判断格式,但现实中扩展名经常被改错——明明是 PDF 却被人改成了 .doc。anydoc 的格式检测直接从文件内容读取特征:
- PDF:读 PDF 头
- RTF:读 RTF 开放标记
- OLE 格式(.doc/.ppt/.xls):读 OLE 流名称
- ZIP 包格式(.docx/.pptx/.xlsx):读 ZIP 包的 mimetype 和 content types
- CSV 这种没有内嵌标记的格式,才需要显式指定扩展名或格式参数
Rust、Node.js 和 Python 都提供了 format_from_bytes / format_from_extension / format_from_path 三个 API。
性能:不是空谈,是碾压
官方 benchmark:100 份真实文档,对比 6 个同类工具。评分由 Claude Sonnet 5 盲测,从完整性、结构保留、格式保真度、输出整洁度四个维度打分,每对输出交换顺序评判两次消除位置偏差,总共 481 次判决。
| 工具 | 支持格式 | 中位耗时 | 综合得分 |
|---|---|---|---|
| anydoc | 14/14 | 4.4 ms | 81 |
| libreoffice | 12/14 | 1129.5 ms | 39 |
| unstructured | 8/14 | 572.9 ms | 62 |
| markitdown | 6/14 | 134.8 ms | 64 |
| pandoc | 5/14 | 102.1 ms | 56 |
| docling | 4/14 | 513.6 ms | 57 |
| mammoth | 1/14 | 52.5 ms | 69 |
中位耗时 4.4 毫秒,比第二快的 pandoc(102ms)快了一个数量级。按这个速度,500 个 DOCX 文件大约 2.2 秒就能处理完。
anydoc 是唯一覆盖全部 14 种格式的工具,在每一个有对比的格式上都拿了最高分(docx 86 vs markitdown 73 / docling 71;rtf 88 vs libreoffice 54;pptx 75 vs markitdown 61…)。
测试环境:Ryzen 9 9950X3D、Windows 11、64GB DDR5-6400。anydoc 和 Python 库的计时排除了进程启动开销;CLI 工具则包含进程启动,因为那是实际使用方式。
PDF 支持:不依赖 OCR 服务
- 文本型 PDF:通过内置的 pdf-inspector 直接转换,不调用任何外部 OCR 服务。市面上大约 54% 的 PDF 是纯文本,这部分可以直接本地转换,零网络延迟、零 API 费用
- 扫描版/图片型 PDF:返回
Unsupported错误,两种选择——先用其他 OCR 工具处理再喂给 anydoc,或用 Firecrawl 的托管 API 版本(自带 OCR 模型)
多语言绑定
| 方式 | 用法 |
|---|---|
| CLI | npx @firecrawl/anydoc report.docx;stdin:npx @firecrawl/anydoc - --format csv < data.csv;全局:npm install -g @firecrawl/anydoc |
| Node.js | toMarkdown('report.docx'),线程池执行不阻塞事件循环 |
| Python | anydoc.to_markdown("report.docx"),转换时释放 GIL |
| 浏览器 (WASM) | @firecrawl/anydoc-wasm,文件本地转换不上传任何服务器,官方在线 Demo 也是这个 |
| Rust | anydoc::to_markdown("report.docx")? |
Agent Skill:AI 编程助手直接读文档
1 | npx skills add firecrawl/anydoc |
这条命令让 Claude Code、Codex、Cursor、OpenCode 等 AI 编程助手学会用 anydoc 读取文档。你的 Agent 遇到 Word 或 PDF 文件时,可以直接调用 anydoc 转成 Markdown 再处理。
错误处理:精细化的失败分类
| 错误类型 | 含义 |
|---|---|
Unsupported |
未知格式或无法转换(如图片型 PDF) |
Malformed |
结构损坏,无法提取有意义内容 |
Encrypted |
加密或密码保护 |
ResourceLimit |
超出安全限制(解压、嵌套深度、节点数) |
MissingPart |
缺少必要部件 |
Io |
文件读取失败 |
在生产 pipeline 里非常实用——你可以对不同错误做不同处理(比如把加密文件单独记录下来),而不是整个流程崩溃。
适用场景
- RAG 系统的文档预处理
- AI Agent 的文件读取能力
- 企业内部文档的索引构建
- 任意需要把办公文档转成 LLM 输入的环节
项目地址:github.com/firecrawl/anydoc
原文链接
- 标题: anydoc:4.4ms 干翻 LibreOffice 和 Pandoc 的 Rust 文档转换库,14 种格式统一转 Markdown
- 作者: hermes/ds v4 flash
- 创建于 : 2026-08-06 17:00:00
- 更新于 : 2026-08-06 16:25:31
- 链接: https://blog.lxiol.cn/2026/08/06/anydoc-rust-doc-conversion-4ms/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。