深度 · 开源工具解析
anydoc:把任意文档秒变 Markdown 的 Rust 神器
Firecrawl 出品 · 14 种格式全通吃 · 中位转换 4.4ms · 纯 Rust 无外部依赖
导读:在 LLM 与 RAG 的时代,文档就是知识库的血液。但现实里的文档格式千差万别 —— Word、PPT、Excel、PDF、RTF、EPUB…… 传统方案要么慢(LibreOffice headless 动辄上百毫秒),要么格式覆盖少(pandoc、markitdown),要么输出脏(残留各种格式噪音)。Firecrawl 开源的 anydoc 用纯 Rust 一次性解决了这些问题:在 100 个真实文档、14 种格式的基准测试中,它中位转换耗时仅 4.4ms,质量评分 81 分,是唯一覆盖全部 14 种格式、且在每个被评测格式上都拿第一的工具。本文带你全面拆解它。
一、anydoc 是什么
anydoc 是由知名爬虫与数据基础设施团队 Firecrawl 开源的文档转换库,用纯 Rust 编写,能将 Word、PowerPoint、Excel、OpenDocument、RTF、EPUB、CSV、PDF 等常见办公文档,转换成干净的 GitHub-Flavored Markdown(GFM)。它的定位非常明确 —— 把任意办公文档变成 LLM-ready 的 Markdown。
它的杀手锏在于:无论输入是 2003 年的 .doc 还是昨天的 .pptx,输出的都是风格一致的同一份 Markdown。目前它已驱动 Firecrawl 自家的 Parse 产品,并提供了多语言绑定:
二、支持 8 大类、14 种格式
格式覆盖是 anydoc 最直观的优势。它一口气吃下 8 大文档类型、共 14 种扩展名,涵盖了你能在企业里遇到的几乎所有办公文档:
三、八大核心特性
anydoc 的设计哲学,是把"格式差异"这件事彻底藏在转换层之下。具体体现在以下八个方面:
① 一种输出,通吃所有格式
每种格式都先解析进同一个共享文档模型,再经过同一个 Markdown 序列化器输出。所以转义、表格、标题锚点、脚注的行为完全一致 —— 无论输入是 doc 还是 pptx。
② 完整还原文档结构
支持带锚点的标题、粗体/斜体/删除线、行内代码与代码块、链接与内部交叉引用、有序/无序/嵌套/任务列表(保留源文档的原始编号)、含合并单元格与表头的表格、引用块、脚注与尾注,甚至 PPT 的演讲者备注。
③ 嵌入资源不丢失
图片和嵌入对象在 Markdown 中渲染为 alt 文本,而原始字节会保留在文档模型上,并标注 media type;带外部 URL 的图片则变成标准 Markdown 图片语法。
④ 基于内容的格式检测
不靠文件扩展名,而是直接读取字节本身的特征 —— PDF 头、RTF 开放分组、OLE 流名、ZIP 包的 mimetype。文件名标错的也能正确转换。仅 CSV 因无特征标记而需扩展名辅助。
⑤ 极致速度
纯 Rust、零 ML 模型、零外部服务。单文档中位转换时间低于 5ms,比同类工具快一到两个数量级。
⑥ 绑定"不挡路"
Node.js 版在 libuv 线程池上运行,绝不阻塞事件循环;Python 版会释放 GIL,让其他线程继续跑;同时附带完整的 TypeScript 类型与 Python stubs。
⑦ PDF 内置支持
基于同生态的 pdf-inspector 库,文本型 PDF 可直接本地转换,无需任何 OCR 服务。
⑧ Agent 原生就绪
以 Agent Skill 形式发布,一条命令 npx skills add firecrawl/anydoc 即可让任意 Agent 学会读取办公文档。
四、性能基准:数据说话
anydoc 在 100 个真实文档、横跨 14 种格式的语料上,与另外 6 款主流转换器同台竞技。评分由 LLM 评审(Claude Sonnet 5)盲测给出,0–100 分,越高越好;速度为中位单文档转换耗时。
综合对比(核心数据):
注:mammoth 仅支持 docx 一种格式,其评分也仅基于 docx;anydoc 的 81 分横跨全部 14 种格式。
分格式逐项得分(anydoc 全部第一):
注:上表为节选示意,完整 13 种格式的逐项得分可查阅官方 README。
评测方法论:LLM 评审(Claude Sonnet 5)以盲测方式对比两份输出与 ground truth(LibreOffice 渲染的前 6 页图片),从完整性、结构、格式、整洁度四个维度打分。每对输出会交换 A/B 位置判两次以消除位置偏差,共计 482 个判定。测速环境为 Ryzen 9 9950X3D + 64GB DDR5-6400。
结论一句话:anydoc 是本次对比中唯一覆盖全部 14 种格式的工具,在每一个被评测的格式上都拿到最高分,且转换速度比第二快的工具快了一个数量级。
五、五种方式上手
anydoc 覆盖了从命令行到五大运行时的几乎所有接入方式,API 设计高度一致:无论哪种语言,核心都是 转 Markdown、转文档模型、格式检测 三件事。
方式一:命令行(npx 零安装)
npx @firecrawl/anydoc report.docx
# Markdown 输出到 stdout
npx @firecrawl/anydoc slides.pptx -o slides.md
# 写入文件
npx @firecrawl/anydoc - --format csv < data.csv
# 从标准输入读取
方式二:Agent Skill(让 AI 学会读文档)
npx skills add firecrawl/anydoc
# Claude Code / Codex / Cursor / OpenCode 通用
方式三:Node.js
npm install @firecrawl/anydoc
import { toMarkdown, toMarkdownBytes } from '@firecrawl/anydoc';
// 从文件路径转换:
const md = await toMarkdown('report.docx');
// 从字节转换,格式自动检测:
const md2 = await toMarkdownBytes(bytes);
方式四:Python
pip install firecrawl-anydoc
import anydoc
# 从文件路径转换:
markdown = anydoc.to_markdown("report.docx")
方式五:Rust(原生库)
cargo add anydoc
// 从文件路径转换:
let markdown = anydoc::to_markdown("report.docx")?;
// 从字节转换,格式自动检测:
let md = anydoc::to_markdown_bytes(&bytes, None)?;
格式检测 API(三端同名):
Format::from_bytes(&bytes); // Some(Format::Docx)
Format::from_extension("pptm"); // Some(Format::Pptx)
Format::from_path(Path::new("report.odt")); // Some(Format::Odt)
六、架构原理:一个模型收拢所有格式
anydoc 的核心架构可以用一条流水线概括。所有格式的字节,最终都会汇入同一个文档模型和同一个 Markdown 序列化器:
输入
文档字节(docx / pptx / pdf …)
▼
第一步
格式检测(读字节特征,不看扩展名)
▼
第二步
格式解析器(每种格式一个)
▼
第三步
统一文档模型 Document
blocks · inlines · tables · footnotes · assets
▼
第四步
GFM 序列化器
▼
输出
干净的 Markdown
PDF 旁路:PDF 不走通用模型,而是单独由 pdf-inspector 直接转出 Markdown。
这种"漏斗式"设计带来一个巨大的工程红利:输出怪癖只需修一次,全局生效。比如修好了 docx 的表格转义 bug,rtf、odt 等所有格式的表格转义就一起对了 —— 因为它们共用同一个序列化器。
源码模块布局:
七、典型使用场景
anydoc 最适合"接收一袋子杂乱办公文档、需要产出一份一致且结构化 Markdown"的场景。具体而言:
RAG / 知识库 把企业的合同、报告、方案批量转成 Markdown,切片后喂给 LLM。 | 全文检索 为搜索引擎建立统一的文档索引,格式不再是障碍。 |
数据管道 / ETL 毫秒级转换适合大规模批量文档标准化入库。 | AI Agent 作为 Agent Skill,让 Agent 直接读懂任何办公文档。 |
内容迁移 老旧 Office 文档批量迁移到 Markdown 知识库或博客。 | 浏览器端处理 WASM 本地转换,文档不离开设备,隐私与合规无忧。 |
附:工程健壮性
anydoc 在错误处理与测试上同样扎实。转换仅在"无法产出有意义 Markdown"时返回错误,并通过 ConvertError 精确命名问题类型:
测试层面,它采用 快照测试(snapshot)固化 fixture 语料,用 变异测试(mutation)逐个验证 fixture 的健壮性,并为每种格式配备 cargo-fuzz 模糊测试目标 —— 三管齐下保证解析器的稳定性。
八、总结:为什么值得试一试
定位:把任意办公文档变成 LLM-ready 的 Markdown。
亮点:14 种格式全通吃、毫秒级速度、统一输出、纯 Rust 零依赖。
适合谁:做 RAG / 知识库、搜索、数据管道、AI Agent 的开发者。
怎么上手:一条 npx @firecrawl/anydoc file.docx 即可体验。
如果说以前的文档转换工具像"瑞士军刀"——每种格式都得找不同的刀,那么 anydoc 更像一台万能翻译机:你扔进去什么格式不重要,出来的永远是一份干净、结构化、一致的 Markdown。在 AI 把一切非结构化数据"结构化"的浪潮里,这样一个底层基建级的工具,值得进入每个开发者的工具箱。
夜雨聆风