在 AI 应用快速普及的当下,把 Word 报告、PPT 方案、Excel 数据表、PDF 合同等文件喂给大模型做摘要分析,已经成为不少团队的日常操作。但现实很骨感:每种文件格式都像一个独立的"物种",需要不同的转换工具,输出的 Markdown 质量也参差不齐。
更头疼的是,好不容易找到能转 Word 的工具,换个 PPT 就不灵了;能转 Excel 的,又处理不好合并单元格。同一个格式,不同版本生成的文件转换结果也可能天差地别。
有没有一个"万能解药"?Firecrawl 团队用 Rust 打造的 anydoc,正是冲着这个目标来的。

这个开源项目在 GitHub 上已斩获 13300+ Star,支持 14 种办公格式统一转为 GitHub-Flavored Markdown,中位转换速度不到 5 毫秒。更关键的是——所有格式输出的 Markdown 结构完全一致。
项目背景
anydoc 是 Firecrawl 团队开源的 Rust 文档转换库。Firecrawl 专注于 AI 时代的数据提取与网页抓取,其核心产品 Firecrawl Parse 每天处理大量文档转换需求。
在实际业务中,团队发现客户文档格式五花八门:Word、PPT、Excel、PDF、EPUB、RTF、CSV……甚至还有 OpenDocument 格式。为了给下游 LLM 提供干净、结构化的 Markdown 输入,他们不得不维护多套转换引擎,输出质量参差不齐。
Firecrawl 联合创始人兼 CTO Nick 表示:"我们决定从零开始,用统一架构处理所有格式。"于是 anydoc 应运而生,目标非常明确:一个库,14 种格式,统一输出,极速转换。
核心亮点
14 种格式一键通吃
在 Firecrawl 的基准测试中,anydoc 是唯一能处理全部 14 种格式的工具,其他竞品最多支持 12 种,少的仅支持 1-2 种:
- 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
这意味着你不需要再为 Word 准备一个库、为 PPT 准备另一个——anydoc 一个搞定。
所有格式输出一致的 Markdown
anydoc 最核心的设计理念是"共享文档模型 + 单一序列化器"。每种格式的文档先解析成同一个内部文档模型(包含 blocks、inlines、tables 等结构化节点),再通过同一个 GFM 序列化器输出。
结果就是:无论输入是 2003 年的 .doc 还是昨天的 .pptx,输出的 Markdown 结构完全一致。标题层级、嵌套列表、合并单元格表格、脚注、代码块——所有元素都能正确保留。
5ms 极速转换
anydoc 是纯 Rust 实现,不依赖任何 ML 模型或外部服务。基准测试数据:
- 中位转换时间:4.4-4.7 毫秒
- 对比 LibreOffice:中位 1129.5 毫秒,慢了约 245 倍
- 其他竞品:52-1130 毫秒,慢了约 20-245 倍
批量处理上百份文档时,anydoc 几秒就能搞定,其他工具可能需要几分钟。
浏览器本地转换
anydoc 提供了编译为 WebAssembly 的浏览器版本(@firecrawl/anydoc-wasm),文件在浏览器本地完成转换,永远不会上传到任何服务器。处理合同、财报、内部报告等敏感文档时,这是非常重要的安全特性。
快速上手
anydoc 提供了 Rust、Node.js、Python 三种编程接口,另有 CLI 工具和 Agent Skill,不同技术栈的开发者都能快速上手。
Node.js 用法
npm install @firecrawl/anydoc
import { toMarkdown, toMarkdownBytes, toDocument } from '@firecrawl/anydoc';
// 从文件路径转换
const md = await toMarkdown('report.docx');
// 从字节转换,自动检测格式
const md2 = await toMarkdownBytes(bytes);
// 显式指定格式(CSV 等无签名格式需要)
const md3 = await toMarkdownBytes(csvBytes, 'csv');
Node.js 版本运行在 libuv 线程池上,不会阻塞事件循环,附带 TypeScript 类型定义。
Python 用法
pip install firecrawl-anydoc
import anydoc
md = anydoc.to_markdown("report.docx")
md2 = anydoc.to_markdown_bytes(data)
md3 = anydoc.to_markdown_bytes(data, "csv")
Python 版本在转换时释放 GIL,不会阻塞其他线程,同样提供类型存根。
Rust 用法
cargo add anydoc
use anydoc::{to_markdown, to_markdown_bytes, Format};
let md = anydoc::to_markdown("report.docx")?;
let md2 = anydoc::to_markdown_bytes(&bytes, None)?;
CLI 工具
不想写代码?直接用命令行:
# 基本用法
npx @firecrawl/anydoc report.docx
# 输出到文件
npx @firecrawl/anydoc slides.pptx -o slides.md
# 处理 CSV
npx @firecrawl/anydoc - --format csv
Agent Skill
anydoc 还可以作为 Agent Skill 安装到 Claude Code、Codex、Cursor 等 AI 编程助手中:
npx skills add firecrawl/anydoc
安装后可以直接让 AI 帮你转换文档,比如"帮我把这份季度报告转成 Markdown"。
PDF 的特殊处理
anydoc 对 PDF 采用分层策略:
- 文本型 PDF:通过内置 pdf-inspector 库直接提取文本转 Markdown
- 扫描型 PDF:需要 OCR,anydoc 本身不做 OCR,但可对接 Firecrawl Parse API 获取支持
注意:PDF 不能用 to_document 方法,需使用 to_markdown_bytes 或 to_markdown。
写在最后
文档转 Markdown 看似简单,但要真正做好需要同时解决格式解析、结构还原、一致性输出、性能优化等多个难题。anydoc 的价值在于,它用工程化的方式重新定义了这件事的标准:
- 一个库,14 种格式:不再为不同格式维护不同工具链
- 5ms 极速转换:批量处理和实时场景都能胜任
- 统一 GFM 输出:下游工具和 LLM 无需额外适配
- 本地处理,隐私安全:浏览器版不上传,服务器版无外部依赖
如果你有大量文档需要转给大模型处理——Word 报告、PPT 方案、Excel 数据还是 PDF 合同,anydoc 都值得放进工具箱试试。