4.4 毫秒转一份文档,我把 LibreOffice 卸载了
做过 RAG 或 Agent 开发的人,应该都懂那种崩溃瞬间——不是模型不给力,是文档不给面子。
我上周就经历了一次。同事传了个文件,后缀名写着 .docx,我的解析程序读进去直接乱码崩溃。查了半天才发现,它根本不是 Word 文档,是个 PDF 换了层皮。
这种破事我遇到太多次了:LibreOffice 转一个文档要一秒多,批量 100 个文件得干等两分钟;Python 脚本遇到复杂表格,合并单元格直接丢;2003 年的老 .doc 一上来就罢工。
直到我在 GitHub 刷到 Firecrawl 开源的新项目 anydoc——上线 5 天,1.1 万 star。
一句话:把办公文档变成干净的 Markdown
anydoc 是一个纯 Rust 写的文档解析库,Word、PPT、Excel、PDF、RTF、EPUB、CSV,14 种格式全覆盖,输出 LLM-ready 的 GitHub 风格 Markdown。
它快得有点不讲道理:单文件转换中位数 4.4 毫秒,比 LibreOffice 快 256 倍;官方说 500 个 docx 只要 1.7 秒。我原来批量转 100 个文档要等两分钟,现在不到半秒。
而且不需要装任何环境。Node 和 Python 用户各一条命令:
npx @firecrawl/anydoc report.docx
pip install firecrawl-anydoc
Rust 用户 cargo add,浏览器里也有 WASM 版。四个语言的 API 完全一致:to_markdown、to_markdown_bytes、to_document。
它凭什么这么快
三个设计,层层拆解:
第一,所有格式共用一个文档模型。 每种格式有各自的解析器——Word 的、PPT 的、Excel 的——但拆完之后全部映射到同一个内部结构体:标题、段落、表格、列表、脚注、嵌入资源。最后只用一个 Markdown 序列化器输出。维护成本集中在模型和序列化层,不用给每种格式单独写输出逻辑。
第二,格式检测不看后缀名,只看字节签名。 这是最戳我的一点。PDF 头、RTF 开头标记、OLE 流名、ZIP 包的 mimetype——它是按文件原始字节来认格式的,根本不鸟扩展名。只有 CSV 没有签名,才需要靠扩展名兜底。
打个比方:后缀名是衣服,可以随便换;字节签名是身份证,换不了。用户上传的文件后缀名十有八九是乱的,anydoc 在乎的是身份证。我上周那种"假 .docx 真 PDF"的崩溃,它天然免疫。
第三,绑定层不阻塞主线程。 Node 端用 NAPI-RS,转换跑在 libuv 线程池,不影响事件循环;Python 端用 PyO3,转换时会释放 GIL,其他线程照常跑。TypeScript 类型和 Python stub 直接打包进包里,开发体验相当顺。
盲评 482 次,14 种格式全部第一
官方拉了 100 份真实文档、14 种格式,做了 482 次盲评,让 Claude 打分。对手是 LibreOffice、pandoc、unstructured、markitdown、docling、mammoth 这一票主流工具。
结果是 anydoc 唯一一个 14 种格式全在、且每种格式评分都最高的。考虑到对比对象里有 Docling(IBM 出品)和 MarkItDown(微软出品),这个成绩不算虚。
它没有用任何机器学习模型,没有 GPU,不调外部 API——4.4 毫秒还是只用 Ryzen 9 的 CPU 跑出来的。
但这些坑,你得先知道
首先,纯图片的 PDF 转不了——没有 OCR。文本型 PDF 走本地解析没问题,扫描件得用 Firecrawl 的云解析接口。加密文档直接报 Encrypted 错误。
其次,别被 benchmark 冲昏头。X 上有人当场质疑官方数据:"500 个 docx 用 1.7 秒,是什么硬件、什么文档?真实世界的 PDF 有内嵌图片、奇怪的编码、损坏的 XML——benchmark 永远很干净,生产环境是另一回事。"这话糙理不糙,4.4 毫秒是理想值,复杂文档会慢不少,但量级碾压 LibreOffice 没悬念。
最后说句实在话:这不是纯公益。Firecrawl 做网页抓取已经攒了 14.9 万 star,这次开源 anydoc 是因为它本来就是自家 Parse 商业产品的内核,造出来顺便开源——既给社区发福利,也给自己打广告。但这不影响它本身好用。
竞品怎么选
- MarkItDown(微软):简单文档够用,表格复杂一点就开始拉胯;
- Docling(IBM):质量不错,但依赖 ML 模型,环境重;
- Unstructured:复杂布局最稳,同样是个重量级选手;
- anydoc:快、轻、本地、无依赖,专为 RAG 和 Agent 场景而生。
如果你只是偶尔转个文件,MarkItDown 够用;如果文档场景复杂且能接受环境成本,Docling/Unstructured 有它的位置;但如果你要批量喂文档给 RAG,或者想把"读文档"能力直接装进 Agent——npx skills add firecrawl/anydoc 一行命令,Claude Code 和 Codex 就都能读文档了。
最打动我的还是省心。一个二进制、一条命令,不用 LibreOffice、不用 Python 环境、不用 GPU。
相关链接:
- anydoc GitHub:https://github.com/firecrawl/anydoc
- Firecrawl 官网:https://firecrawl.dev
- 竞品 Docling:https://github.com/docling-project/docling
- 竞品 MarkItDown:https://github.com/microsoft/markitdown
- 竞品 Unstructured:https://github.com/Unstructured-IO/unstructured
暂无评论。