乐于分享
好东西不私藏

比 LibreOffice 快 256 倍!这款 1.7 万 Star 的 Rust 神器,把 14 种文档一键转成 Markdown

比 LibreOffice 快 256 倍!这款 1.7 万 Star 的 Rust 神器,把 14 种文档一键转成 Markdown

老板丢给你一堆杂七杂八的文档:三份 .docx、两个 .pptx、一个老掉牙的 .doc、还有份 .pdf 报告。让你"把这些整理成结构化文本,喂给大模型做问答"。你先装了 LibreOffice,转一份要等一秒多,表格还全崩了;换成 markitdown,格式只支持一半;想用 pandoc,EPUB 和 PPT 又不支持。折腾一下午,转出来的 Markdown 风格各异。更要命的是,有些工具遇到损坏文件不报错,而是"尽力而为"地吐出乱码,静悄悄污染了你整个 RAG 知识库。

如果你也经历过这些,那你一定要认识一下今天的主角——anydoc

01anydoc 是什么?

anydoc 是由 Firecrawl 团队开发的快速 Rust 文档转换库,GitHub 上 1.7 万 Star、790+ Fork,以 MIT 许可证开源。它的核心使命只有一句话:把 Word、PowerPoint、Excel、OpenDocument、RTF、EPUB、CSV、PDF 统一转成干净的 GitHub-Flavored Markdown,专为 LLM 数据预处理而生。

💡 用一句话概括:扔进去任何办公文档,毫秒级拿回结构一致的 Markdown——格式转义、表格、标题锚点、脚注的行为在所有格式中完全一致。

背后的 Firecrawl 是谁?

Firecrawl 是 Y Combinator 投资的网页数据基础设施公司,主打"把网页变成 AI 能用的干净数据"——搜索、抓取、爬取、交互,覆盖 96% 的网页,被 15 万+ 公司使用,通过了 SOC 2 Type 2 安全认证。Lovable、Gamma、Sierra、Cognism 等 AI 公司都在用它给 Agent 喂网页数据。

anydoc 不是 Firecrawl 拍脑袋做的副业,而是它文档解析能力的开源核心。Firecrawl 的托管 API 服务 /parse 和 /scrape 在遇到非 PDF 文档时,底层调用的就是 anydoc——换句话说,anydoc 是经过大规模生产验证的,不是玩具项目。

anydoc + pdf-inspector:一对姊妹项目

这里要提一下 anydoc 的"兄弟"——pdf-inspector。两者是同一个团队、同一套设计原则(纯 Rust、本地执行、无 API key、无系统依赖、Markdown 输出),但分工明确:pdf-inspector 专门处理 PDF,anydoc 处理其他 14 种办公格式并内嵌 pdf-inspector 来转换文本型 PDF。它们是刻意分成两个仓库、两个产品的——一条血脉,两个 Firecrawl 产品,合在一起覆盖了真实 AI 管道里会遇到的几乎所有文档格式。

六条设计哲学

1. 一次修复,全面生效——所有格式走同一文档模型 + 同一序列化器,输出问题只需修一次

2. 内容优先,而非扩展名——格式从文件字节内容检测,不靠可能错的扩展名

3. 安全优先——固定安全限制贯穿所有解析路径,防邮件炸弹、图片炸弹、深度嵌套

4. 正确转换,或大声失败——加密、纯图片、结构损坏的文件返回明确错误,而不是静默降级吐乱码

5. 不阻塞——Node.js 跑在 libuv 线程池,Python 释放 GIL

6. 固定的页面装饰策略——排除页眉/页脚/页码,始终保留演讲者备注

⚠️ 第 4 条值得展开:很多转换工具走"best-effort"路线——遇到困难也尽量给你"一些东西"。这在探索阶段方便,但在生产级 RAG 管道里是危险的:静默损坏的表格会污染下游检索质量,等你发现一万份文档里有十份出了问题,已经很难定位了。anydoc 的选择是"要么正确转换,要么明确报错"。

项目 2026 年 8 月 3 日创建,到 8 月 12 日已经 106 次提交、1.7 万 Star,增长势头非常猛。

02核心功能,每一个都解决真实痛点

⚡ 功能一:14 种格式全覆盖,业界唯一

支持 8 大类、14+ 种格式,是同类工具中唯一覆盖全部 14 种的。所有格式解析为同一个共享文档模型,再通过单一 Markdown 序列化器渲染。文档模型支持带锚点标题、粗体/斜体/删除线、代码块、链接、嵌套列表(保留源编号)、合并单元格表格、引用块、脚注尾注、演讲者备注。嵌入图片在 Markdown 中渲染为 alt 文本,原始字节保留在文档模型中——调用 toDocument() 可自行提取资源。

大类
扩展名
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.rtf、.epub.csv.pdf
🚀 功能二:4.4ms 转换,比 LibreOffice 快 256 倍

纯 Rust 实现,无 ML 模型,无外部服务依赖。100 份真实文档 benchmark,中位转换时间 4.4ms——对比 LibreOffice 的 1129.5ms,快了 256 倍。十万份文档批量转换,anydoc 理论上几分钟跑完,LibreOffice 要跑几个小时。

工具
中位耗时
anydoc4.4ms
mammoth
52.5ms
pandoc
102.1ms
markitdown
134.8ms
docling
513.6ms
unstructured
572.9ms
libreoffice
1129.5ms

⚠️ 理性看待:4.4ms 是 Firecrawl 在自己的测试机(Ryzen 9 9950X3D, 64GB DDR5-6400)上测的供应商数据,没包含冷启动、上传、p95 延迟和容器体积。生产环境建议 pin 住版本、固定硬件和预热方式,自己测 p50/p95。

📊 功能三:综合评分 81 分,每个格式都拿第一

100 份真实文档、14 种格式 benchmark,由 Claude Sonnet 5 作为 LLM 裁判盲评(每对评判两次消除位置偏差,共 482 次评判)。anydoc 不仅格式覆盖最广,每一个被评判的格式中得分都是最高

工具
格式覆盖
综合评分
完整性
结构
整洁度
anydoc14/1481877981
mammoth
1/14
70
84
71
51
markitdown
6/14
65
78
66
52
unstructured
8/14
63
76
59
63
libreoffice
12/14
40
59
42
24

⚠️ 理性看待:语料库是 Firecrawl 私有的,外人无法检查其格式构成;评分用 LLM 裁判而非人工评审。每个工具的得分只平均它实际支持的格式,所以"逐格式对比"比"总分"更公平。建议在自己的文档上实测。

🔍 功能四:基于内容检测格式,不靠扩展名

文件扩展名可能错、可能丢、可能被篡改。anydoc 从文件字节内容读取格式标记(PDF 头部标记、RTF 开放组标记、OLE 流名称、ZIP 包 mimetype),即使没有扩展名也能正确识别。真实业务里用户上传文件扩展名丢失或错误是常事——这个能力不是锦上添花,而是生产必需。

Format::from_bytes(&bytes);              // Some(Format::Docx), or NoneFormat::from_extension("pptm");          // Some(Format::Pptx)Format::from_path(Path::new("report.odt")); // Some(Format::Odt)
📄 功能五:PDF 原生支持 + 智能 OCR 路由

通过内嵌 pdf-inspector,本地转换文本型 PDF,无需 OCR:

• 文本型 PDF → 直接提取文本转 Markdown

• 加密 PDF → 返回 Encrypted 错误

• 结构损坏 → 返回 Malformed 错误

• 纯图片/扫描 PDF → 返回 Unsupported(明确告诉你"搞不定")

需要扫描件 OCR?Firecrawl 托管 /parse API 提供智能 OCR 路由:每页先分类(约 20ms),文本型原生提取,只有扫描页才送 GPU——约一半 PDF 是文本型的,根本不碰 OCR,既省成本又快。

🤖 功能六:Agent 就绪 + 四种语言绑定

以 Agent Skill 形式发布,一条命令让 AI Agent 读取任何文档,兼容 Claude Code、Codex、Cursor、OpenCode。整个集成就是一行调用——无 API key、无外部服务、无单独二进制

npx skills add firecrawl/anydoc
绑定
包名
特点
Rustanydoc
(crate)
原生,cargo add
Node.js@firecrawl/anydoc
libuv 线程池,不阻塞事件循环
Pythonfirecrawl-anydoc
释放 GIL,其他线程继续跑
WASM@firecrawl/anydoc-wasm
浏览器端运行,文件不离设备

WASM 版本还有在线 Demo——文件在浏览器本地转换,永不离开你的设备,隐私零顾虑。

03为什么它能又快又准

设计精髓在于:所有格式通过同一文档模型同一序列化器汇聚。输出问题只需修复一次——比如 docx 的表格转义修复,自动适用于 rtf、odt 等所有格式。这是 anydoc 输出一致性的根本来源,也是它"每个格式都拿第一"的底层原因。

文档模型:所有格式最终解析成同一个 Document 结构,包含 blocks、inlines、tables、footnotes、assets。序列化器只认这个模型,不关心原始格式。嵌入资源(图片、对象)在 Markdown 输出时渲染为 alt 文本,但原始字节保留在文档模型里,调用 toDocument() 可自行提取。

安全限制——对恶意文档有完整防护,所有安全限制在所有上下文中都是硬错误:

防护类型
限制
解压缩预算
512 MiB 归档预算
XML 节点上限
2M 节点(约 750 MB 最坏情况)
表格展开预算
MAX_EXPANSION 限制
嵌套深度上限
防深度嵌套攻击
邮件/图片炸弹防护
恶意文档拦截测试用例

错误处理:正确转换,或大声失败——与 MarkItDown 的 best-effort 哲学形成鲜明对比。MarkItDown 会尽量给你"一些东西",在生产 RAG 里静默损坏的输出比明确报错危险得多——你不知道哪份文档转坏了,垃圾数据悄悄进了向量库。anydoc 选择"要么对,要么报错",把决策权交回给你。

Variant
含义
Unsupported
未知格式,或无法转换(如纯图片 PDF)
Malformed
结构不可用,无法提取有意义内容
Encrypted
加密或密码保护
ResourceLimit
超过安全限制(解压、嵌套、节点数)

🎯 工程深度:从提交历史可见多轮严格审查——Phase 16(R1-R23)修 OOXML Strict 命名空间、DOC 多代码页解码、RTF 样式链;Phase 17(S1-S20)修表格跨度预算、二进制 DOC 列表编号算法;Round 4 做跨格式基础设施、URI 分类。对每种格式规范(ECMA-376、MS-DOC、ISO 29500 Strict)都有深入处理。

04对比竞品:它到底强在哪

工具
格式覆盖
中位耗时
文档数
综合评分
anydoc14/144.4ms9481
libreoffice
12/14
1129.5ms
87
40
unstructured
8/14
572.9ms
58
63
markitdown
6/14
134.8ms
33
65
pandoc
5/14
102.1ms
34
56
docling
4/14
513.6ms
21
57
mammoth
1/14
52.5ms
8
70

anydoc vs MarkItDown:哲学差异比功能列表更重要

MarkItDown 是微软出品的纯 Python 库,88k+ Star,覆盖格式最广(含图片、音频转录、HTML)。两者都 MIT 开源,但哲学截然不同:

维度
anydoc
MarkItDown
语言/速度
Rust 核心,极快
Python,大文件较慢
失败模式
✅ 明确报错,无部分输出
⚠️ best-effort,尽量给"一些东西"
专业格式
办公文档 + PDF(文本型)
办公 + 图片/音频/HTML
绑定
Node.js/Python/Rust/WASM
Python
生产 RAG 适用性
✅ 强(错误可处理,不污染下游)
⚠️ 弱(静默损坏难发现)

💡 一句话:探索阶段用 MarkItDown 图方便,生产管道用 anydoc 图可靠。如果你曾调试过"一万份文档里有十份产出垃圾 chunk"的问题,anydoc 的"大声失败"就是特性,不是缺陷。

选型决策表

你的场景
推荐
标准 Office 文档,Node.js/Python 服务,要快和可预测
anydoc
需要最广格式覆盖(图片/音频/HTML),Python 生态
MarkItDown
扫描件/手写/复杂版面,需要版面理解
Docling
PDF 为主,要最佳结构化输出
pdf-inspector(anydoc 内嵌)
不想运维,要 OCR + 结构化 JSON
Firecrawl Parse 托管 API

核心优势总结:

1. 唯一覆盖全部 14 种格式——广度无人能及

2. 每个格式得分最高——质量全面领先

3. 速度快一个数量级——4.4ms vs 次快 52.5ms

4. 比 LibreOffice 快 256 倍——批处理场景碾压

5. 纯 Rust 无依赖——无 ML 模型、无外部服务、无运行时

6. 统一输出模型——一致性天然保证,一次修复全面生效

05诚实的边界:anydoc 不做什么

了解一个工具"不做什么",和了解它"能做什么"同样重要。anydoc 的定位非常克制——它只解决转换层,不越界:

❌ 不做 OCR——纯图片/扫描 PDF 直接返回 Unsupported,需要 OCR 请用 Firecrawl Parse 托管 API

❌ 不做语义字段提取——不会从发票里自动识别"金额""日期",它只转结构化 Markdown

❌ 不做 chunking——不帮你切分文本做 embedding,那是 RAG 管道下游的活

❌ 不做完整 RAG——它是 RAG 的"第零步",把文档变成文本,后面的事交给别的工具

❌ 不解析图表语义——图表会作为资源保留,但不会"看懂"柱状图的数据

💡 这种克制恰恰是优点:一个工具把一件事做到极致,比一个工具试图做所有事但都做不精,在生产环境里靠谱得多。

06谁适合用

🤖 LLM 应用开发者

RAG 知识库构建,把杂乱文档统一转 Markdown 喂给大模型

🧠 AI Agent 开发者

Agent Skill 一键接入,让 Agent 自动读取任何文档

🔍 搜索引擎/全文检索

统一格式后建立文档索引

📦 内容迁移团队

从传统办公格式迁移到 Markdown 知识库

⚙️ 数据工程师

大规模文档批处理流水线,毫秒级转换

🔒 隐私敏感场景

WASM 浏览器端转换,文件不离设备

🦀 Rust 开发者

cargo add 即用,纯 Rust 生态友好

🏢 企业 IT

自部署替代托管 API,可控可审计

07价格:MIT 完全免费开源

anydoc 采用 MIT 许可证,没有功能阉割,没有商用限制。

• 自部署——完全免费,Rust/Node.js/Python/WASM 四种绑定任选

• 托管 API——Firecrawl Parse 提供相同能力 + 智能 OCR 路由 + 结构化 JSON 输出,按量付费

• Agent Skill——免费安装,npx skills add firecrawl/anydoc

💡 选择建议:追求隐私和成本 → 自部署 anydoc;需要 OCR 扫描 PDF、结构化 JSON 或不想运维 → Firecrawl Parse 托管 API。两者底层是同一个引擎,自部署和托管之间可以无缝切换。

08快速上手

CLI 工具(最快体验):

npx @firecrawl/anydoc report.docx               # Markdown 输出到 stdoutnpx @firecrawl/anydoc slides.pptx -o slides.md  # 输出到文件npx @firecrawl/anydoc - --format csv < data.csv # 从 stdin 读取

Node.js:

npm install @firecrawl/anydocimport { toDocument, toMarkdown, toMarkdownBytes } from '@firecrawl/anydoc';const markdown = await toMarkdown('report.docx');         // 从文件路径const fromBytes = await toMarkdownBytes(bytes);           // 从字节,自动检测格式const fromCsv = await toMarkdownBytes(bytes, 'csv');      // 显式指定格式const document = await toDocument(bytes);                 // 获取文档模型(含嵌入资源)

Python:

pip install firecrawl-anydocimport anydocmarkdown = anydoc.to_markdown("report.docx")markdown = anydoc.to_markdown_bytes(data)markdown = anydoc.to_markdown_bytes(data, "csv")document = anydoc.to_document(data)

浏览器(WASM,文件不离设备):

import init, { toMarkdownBytes, toDocument } from '@firecrawl/anydoc-wasm';await init();const markdown = toMarkdownBytes(bytes);const document = toDocument(bytes);

Rust:

cargo add anydoclet markdown = anydoc::to_markdown("report.docx")?;let markdown = anydoc::to_markdown_bytes(&bytes, None)?;let document = anydoc::to_document(&bytes, None)?;

Agent Skill(让 AI Agent 自动读文档):

npx skills add firecrawl/anydoc

兼容 Claude Code、Codex、Cursor、OpenCode。整个集成就是一行调用——无 API key、无外部服务、无单独二进制。

写在最后

文档转 Markdown 这件"小事",在大模型时代变成了基础设施级的需求。RAG 要喂文档、Agent 要读文档、知识库要建索引——都绕不开"把乱七八糟的格式变成干净文本"这一步。

anydoc 选了一条最难但最对的路:纯 Rust 重写、统一文档模型、14 格式全覆盖、毫秒级速度、严格安全限制、"正确转换或大声失败"。它不靠 ML 模型凑数,不靠外部服务兜底,也不试图做 OCR、做语义提取、做 chunking——而是用工程深度把"文档转文本"这一件事做到极致,把边界画得清清楚楚。

1.7 万 Star、比 LibreOffice 快 256 倍、每个格式都拿第一——数字不会说谎。

如果你也在做 RAG、做 Agent、做知识库,或者只是被"文档转 Markdown"折磨过——不妨试试 anydoc。又快又准又稳、还诚实的文档转换,值得拥有。

📎 资源链接

GitHub 仓库:https://github.com/firecrawl/anydoc

姊妹项目 pdf-inspector:https://github.com/firecrawl/pdf-inspector

在线 Demo:https://firecrawl.github.io/anydoc/

托管 API:https://firecrawl.dev/parse