anydoc 深度评测:14 种办公文档一键转为干净 Markdown
anydoc 是 Firecrawl 开源的 Rust 文档转换库,能把 Word、PPT、Excel、PDF 等 14 种格式一键转成统一的 GitHub 风格 Markdown。它完全本地运行、无需模型或服务,单文档转换中位耗时不到 5 毫秒,是 LLM 与 RAG 流水线的理想 ingestion 工具。

它是什么
anydoc 是 Firecrawl 开源(MIT 许可)的文档转 Markdown 库,核心是一套纯 Rust 引擎,能把办公与文档文件转换为 GitHub 风格 Markdown(GFM)——也就是代码仓库和 LLM 上下文里最常用的方言。它是 Firecrawl Parse 的底层引擎,并提供 Node.js、Python、浏览器(WebAssembly) 的原生绑定,以及一个开箱即用的 Agent Skill。
解决的问题
AI 流水线很少只收到一种文件。一个 RAG 系统、智能体或知识库导入器,常常在同一批输入里同时拿到 .docx 简历、.pptx 演示、.xls 表格、.pdf 报告和 .csv 导出。多数转换器只覆盖其中一小部分格式、输出不一致,或依赖笨重缓慢的组件(LibreOffice、ML 模型、外部服务)。anydoc 把这一团乱麻收敛成一条稳定可预测的 Markdown 流。
核心功能
- 每种格式输出一致。 所有格式先解析进统一的文档模型,再经由同一个 Markdown 序列化器输出,因此转义、表格、标题锚点、脚注的行为完全一致,无论输入是 2003 年的
.doc还是昨天的.pptx。 - 完整文档结构。 带锚点的标题、加粗/斜体/删除线、行内代码与代码块、链接与交叉引用、嵌套/任务列表(保留原始编号)、含合并单元格与表头的表格、引用块、脚注/尾注、演讲者备注。
- 公式转 LaTeX。 Word/PPT(OMML)、OpenDocument/EPUB(MathML)、RTF 公式统一转为 GFM 数学:
$...$行内、$$块级。 - 内嵌资源。 图片与嵌入对象在 Markdown 中以 alt 文本呈现,原始字节仍保留在文档模型上并标记媒体类型;外链图片转为普通 Markdown 图片。
- 基于内容的格式识别。 从文件字节本身判断格式(PDF 头、RTF 分组、OLE 流、ZIP mimetype),因此被错误命名的文件也能正确转换。
- 速度快。 纯 Rust、无 ML 模型、无外部服务,单文档中位转换耗时低于 5 毫秒。
- 不打扰主线程的绑定。 Node.js 跑在 libuv 线程池(不阻塞事件循环);Python 释放 GIL;包内附带 TS 类型与 Python 类型桩。
- 内置 PDF 支持。 文本型 PDF 通过 pdf-inspector 本地转换,无需 OCR 服务。
- 面向 Agent。 一条
npx skills add firecrawl/anydoc即可让 Claude Code、Codex、Cursor、OpenCode 等兼容智能体读取办公文档。
支持格式
| 格式 | 扩展名 |
|---|---|
| Word | .doc、.docx、.docm |
| PowerPoint | .ppt、.pps、.pot、.pptx、.pptm、.ppsx、.ppsm |
| Excel | .xls、.xlsx、.xlsm、.xlsb |
| OpenDocument | .odt、.ods、.odp |
| 富文本 | .rtf |
| EPUB | .epub |
| CSV | .csv |
.pdf |
工作原理
文档字节
├─► 格式识别 → 看内容特征,而非扩展名
├─► 格式解析器 → 每种格式一个(doc, docx, ppt, pptx, xls,
│ xlsx, odt/ods/odp, rtf, epub, csv)
│ └─► Document → 统一模型:块、行内、表格、脚注、资源
│ └─► GFM 序列化器 → Markdown
└─► PDF → pdf-inspector → 直接输出 Markdown因为所有格式都流经同一模型与序列化器,对某一格式的修复(如 .docx 的表格转义)会自动惠及所有其他格式。
安装与使用
Agent 技能
npx skills add firecrawl/anydoc命令行
npx @firecrawl/anydoc report.docx # Markdown 输出到 stdout
npx @firecrawl/anydoc slides.pptx -o slides.md # 输出到文件
npx @firecrawl/anydoc - --format csv < data.csv # 从 stdin 读取
# 全局安装:npm install -g @firecrawl/anydocNode.js
npm install @firecrawl/anydocimport { toMarkdown, toMarkdownBytes, toDocument } 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 anydoc
markdown = anydoc.to_markdown("report.docx")
markdown = anydoc.to_markdown_bytes(data)
markdown = anydoc.to_markdown_bytes(data, "csv")
document = anydoc.to_document(data)浏览器(WebAssembly)
npm install @firecrawl/anydoc-wasmimport init, { toMarkdownBytes, toDocument } from '@firecrawl/anydoc-wasm';
await init();
const markdown = toMarkdownBytes(bytes);浏览器内转换的文件不会离开本机,在线演示见 https://firecrawl.github.io/anydoc/。
Rust
cargo add anydoclet markdown = anydoc::to_markdown("report.docx")?;
let markdown = anydoc::to_markdown_bytes(&bytes, None)?;
let markdown = anydoc::to_markdown_bytes(&bytes, anydoc::Format::Csv)?;
let document = anydoc::to_document(&bytes, None)?;基准测试(对比同类工具)
在 100 份真实文档、14 种格式上测得;分数为 0–100(越高越好),速度为单文档中位毫秒数:
| 工具 | 格式覆盖 | 中位 ms | 总分 | 完整性 | 结构 | 格式 | 整洁度 |
|---|---|---|---|---|---|---|---|
| anydoc | 14/14 | 4.4 | 81 | 87 | 79 | 78 | 81 |
| libreoffice | 12/14 | 1129.5 | 40 | 59 | 42 | 40 | 24 |
| unstructured | 8/14 | 572.9 | 63 | 76 | 59 | 51 | 63 |
| markitdown | 6/14 | 134.8 | 65 | 78 | 66 | 60 | 52 |
| pandoc | 5/14 | 102.1 | 56 | 74 | 57 | 56 | 38 |
| docling | 4/14 | 513.6 | 57 | 60 | 60 | 57 | 51 |
| mammoth | 1/14 | 52.5 | 70 | 84 | 71 | 75 | 51 |
anydoc 是唯一覆盖全部 14 种格式、在每个被测格式上分数最高、且比次快工具快一个数量级的转换器。质量由 LLM(Claude Sonnet 5)盲评裁决,对照 LibreOffice 渲染的真值(共 482 次裁决,已消除位置偏差)。
优势
- 真正多格式:一个工具替代 mammoth(仅 docx)、markitdown、pandoc、docling 等。
- 极快且无运行时依赖(无 ML、无 LibreOffice)。
- 一致、可预测的 Markdown 输出——非常适合向量化、RAG 与智能体上下文。
- 可在本地与浏览器运行;除非主动选用托管 API,否则数据不出本机。
- 在 Rust、Node、Python、WASM 四大生态中提供简洁的最小 API。
- 宽松的 MIT 许可,易于自托管或内嵌。
局限
- 无本地 OCR。 纯图片/扫描版 PDF 与栅格内容会返回
Unsupported;托管版 Firecrawl Parse API 为此类场景提供 OCR。 - 加密/受密码保护的文件会被拒绝(
ConvertError::Encrypted)。 - 图片在 Markdown 中仅以 alt 文本呈现;原始字节保留在文档模型上但不会内联嵌入。
- 结构损坏的文件会抛出
Malformed;超大/超复杂文件可能触达固定的安全上限(ResourceLimit:解压、嵌套、节点数)。 - 默认输出是 Markdown 而非富结构 JSON(若需要,可用
toDocument获取含资源的完整模型)。
目标用户与典型场景
- AI/RAG 工程师:把异构文档语料规整为统一的 Markdown 表示。
- 智能体开发者:让编程智能体能读取办公文档(通过 Agent Skill)。
- 数据/平台团队:在流水线中做快速、无依赖的文档归一化。
- 注重隐私的工作流:必须完全在本机完成转换(本地二进制或浏览器 WASM)。
价格与可用性
- 自托管 / 库:免费,基于 MIT 许可开源。通过 crates.io(
anydoc)、npm(@firecrawl/anydoc、@firecrawl/anydoc-wasm)、PyPI(firecrawl-anydoc)分发。 - 托管 API(Firecrawl Parse):额外提供 OCR 与托管弹性,按 Firecrawl 商业订阅计费;开源库本身零使用成本。
- 浏览器演示:免费,本地运行于 https://firecrawl.github.io/anydoc/。
产品对比
传统工具各自只覆盖一小块(mammoth 仅 docx;pandoc 多为文本/标记;markitdown 支持少量办公类型;LibreOffice 准确但慢且重),而 anydoc 是基准中唯一覆盖全部 14 种格式、质量分数最高、速度最快的选项。如果你需要对扫描 PDF 做 OCR,或开箱即用地拿到富结构 JSON 文档树,可搭配 Firecrawl Parse,或后置处理 toDocument 模型。