一条命令,把 Word/PPT/Excel/PDF 全变成 Markdown:这个 1300+ Star 的 Rust 库,比 LibreOffice 快 200 倍
做 AI 应用的开发者,十有八九都栽过同一个坑:喂给大模型的文档,怎么都处理不干净。
Word 里的表格错位、PPT 的备注混进正文、PDF 复制出来全是乱码换行…… 你花半小时写解析脚本,结果换个格式又废了。RAG 管道的第一个瓶颈,从来不是模型,而是文档。
今天推荐一个刚火起来的开源库 anydoc(发布两天,1378 Star),它把 14 种办公文档格式统一转成干净的 GitHub 风格 Markdown,单份文档中位数耗时 4.7 毫秒——比 LibreOffice 快约 200 倍。
它是干什么的?
一句话:任何办公文档,进去,出来就是 Markdown。
支持格式全家桶:
| 类型 |
扩展名 |
| 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 |
包括 2003 年的老 .doc,也包括昨天的 .pptx。这是目前唯一一个全覆盖 14 种格式的开源转换器。
它来自 Firecrawl 团队(做网页抓取的知名开源项目),anydoc 同时也是他们托管版 API Firecrawl Parse 的底层引擎。
技术原理:为什么它又快又稳
anydoc 的核心设计是一个共享文档模型(shared document model):
文档字节
│
├─► 格式检测 → 看内容标记,不看扩展名
│
├─► 格式解析器 → 每种格式一个(doc、docx、ppt、pptx、
│ xls、xlsx、odt/ods/odp、rtf、epub、csv)
│ │
│ └─► Document 模型 → 统一的 blocks、inlines、tables、
│ footnotes、assets 结构
│ │
│ └─► GFM 序列化器 → Markdown
│
└─► PDF → pdf-inspector → 直接输出 Markdown
关键点在于:所有格式都汇入同一个文档模型,再由同一个序列化器输出。这意味着修好 docx 的表格转义 bug,rtf、odt、pptx 自动一起修好——修复一次,处处生效。
几个值得说的设计细节:
•基于内容的格式检测。不信任扩展名,而是读文件本身的标记:PDF 头、RTF 开放组、OLE 流名称、ZIP 包的 mimetype。文件后缀被改错了也能正确转换。•纯 Rust,无 ML 模型、无外部服务。不需要 OCR、不需要调云端,本地就能跑。文本型 PDF 直接本地解析(走自家的 pdf-inspector 库)。•完整的文档结构保真。标题锚点、加粗/斜体/删除线、代码块、内链交叉引用、嵌套列表(保留源文档自己的编号)、合并单元格的表格、块引用、脚注尾注、演讲者备注——全都保留。•内嵌资源不丢。图片在 Markdown 里渲染为 alt 文本,原始字节留在文档模型上并带 media type;外部 URL 图片变成普通 Markdown 图片。
使用演示:三行代码上手
方式一:CLI(最省事)
npx @firecrawl/anydoc report.docx # Markdown 直接输出到终端
npx @firecrawl/anydoc slides.pptx -o slides.md # 或者存到文件
npx @firecrawl/anydoc - --format csv < data.csv # 从 stdin 读
首次运行自动下载对应平台的预编译二进制,之后想要常驻命令就 npm install -g @firecrawl/anydoc。
方式二:Node.js
npm install @firecrawl/anydoc
import { toMarkdown, toMarkdownBytes } from '@firecrawl/anydoc';
// 从文件路径
const markdown = await toMarkdown('report.docx');
// 从字节,格式自动检测
const fromBytes = await toMarkdownBytes(bytes);
// 无签名的格式(CSV)需要显式指定
const fromCsv = await toMarkdownBytes(bytes, 'csv');
方式三:Python
pip install firecrawl-anydoc
import anydoc
markdown = anydoc.to_markdown("report.docx")
markdown = anydoc.to_markdown_bytes(data)
document = anydoc.to_document(data) # 还能拿到内嵌资源
方式四:直接给 AI Agent 用
anydoc 以 Agent Skill 的形式发布,AI 编程助手遇到文档直接自己调用:
npx skills add firecrawl/anydoc
支持 Claude Code、Codex、Cursor、OpenCode 等主流 Agent。
横向对比:和 Pandoc、MarkItDown 们比怎么样
作者在 100 份真实文档、14 种格式上,和 6 个主流转换器做了盲测对比(LLM 裁判评分,0-100):
| 工具 |
格式覆盖 |
中位耗时 |
综合得分 |
| anydoc |
14/14 |
4.7ms |
80 |
| libreoffice |
12/14 |
1129.5ms |
40 |
| unstructured |
8/14 |
572.9ms |
65 |
| markitdown(微软) |
6/14 |
134.8ms |
65 |
| pandoc |
5/14 |
102.1ms |
57 |
| docling |
4/14 |
513.6ms |
57 |
| mammoth |
1/14 |
52.5ms |
70 |
anydoc 是唯一覆盖全部 14 种格式的,在几乎所有单格式对比中都拿了最高分(只有 EPUB 略逊于 markitdown),速度比第二名快了一个数量级。
当然,这个对比是作者自己做的(裁判是 Claude Sonnet 5,每对结果交换顺序评两次消除位置偏差,共 479 次判定),方法论透明,但毕竟有自卖自夸的成分,参考即可。
局限性:诚实说几句
•扫描版 PDF 不行。anydoc 只处理文本型 PDF,扫描件需要搭配 OCR(托管版 API 提供,开源版没有)。•格式越老越难。.doc、.xls 这种老格式能转,但复杂宏、ActiveX 控件之类的东西不在支持范围。•项目很新。8 月 3 号才发布,生态和 issue 修复还在早期,生产环境大规模使用前建议先跑一遍自己的文档语料。•Benchmark 的语料不公开。测试用的 100 份文档因为版权没有放进仓库,你没法完全复现他们的评分。
个人观点
值得关注吗?值得,而且理由很实在:
它解决的是 AI 应用的真实瓶颈。 RAG、Agent、文档问答,第一公里永远是"把文档变成模型能读的东西"。目前市面上的方案要么慢(LibreOffice 转换要一秒多)、要么格式覆盖不全(MarkItDown 只有 6 种)、要么是 Python 重型依赖。anydoc 用 Rust 把这条路走通了:快、全、干净、零外部服务。
"共享文档模型"的架构思路尤其值得学。 大多数转换工具是"每种格式一个解析器 + 各自输出",维护成本随格式数量爆炸。anydoc 让所有格式汇入统一模型再统一输出,bug 修一处、处处生效——这是工程上很漂亮的取舍。
生态是最大变量。 它的成败取决于 Agent Skill 生态和 Firecrawl 的持续投入。目前看,Firecrawl 把它作为 Parse API 的底层引擎,有商业动力持续维护,这对开源版是好事。
如果你在做文档解析、RAG 管道或者 AI 办公工具,花五分钟 npx @firecrawl/anydoc 试试,大概率能省下你一个下午的解析脚本调试时间。
项目地址:https://github.com/firecrawl/anydoc (MIT 协议,1378 Star)
补充:anydoc 的托管版 Firecrawl Parse 额外提供扫描版 PDF 的 OCR 能力,需要处理扫描件的朋友可以关注。