1. 项目概述
anydoc 是一个基于 Rust 的快速库,可将 Word、PowerPoint、Excel、OpenDocument、RTF、EPUB、CSV 和 PDF 文件转换为干净、一致的 GitHub 风格 Markdown,为开发者和 AI 智能体提供了一条从任何办公文档到 LLM 就绪文本的可靠路径。
2. 背景与定位
anydoc 由 Firecrawl 构建,旨在解决文档处理与 AI 流水线中反复出现的一个问题:办公文件以多种传统和现代格式到达,而每个现有转换器只处理其中一部分,且输出质量和速度往往差异巨大。anydoc 的核心使命是让每一种格式——从 2003 年保存的 .doc 到昨天导出的 .pptx——共享同一个文档模型和同一个 Markdown 序列化器,这样对表格转义或标题锚点的修复就能同时惠及所有格式,而无需逐格式重新实现。
它与 Pandoc、LibreOffice 的无头转换等通用转换器,以及 markitdown、unstructured、docling 等 Python 工具在三个方面有所不同:它是纯 Rust 实现,不依赖任何机器学习模型或外部服务;它根据文件内容而非扩展名来检测格式;并且——根据 anydoc 自己发布的针对六种竞品工具的基准测试——它是唯一一个覆盖全部十四种测试格式的工具,同时在质量上得分最高,转换速度比第二快的工具快约一个数量级。anydoc 还为托管的 Firecrawl Parse API 提供支持,该 API 为扫描页面增加了 OCR 功能,而开源库有意不尝试此功能。
3. 功能分类
📄 格式覆盖 — 8 大文档族,20+ 扩展名
转换 .doc/.docx/.docm(Word)、.ppt/.pptx/.pptm/.pps/.ppsx/.ppsm/.pot(PowerPoint)、.xls/.xlsx/.xlsm/.xlsb(Excel)、.odt/.ods/.odp(OpenDocument),以及 .rtf、.epub、.csv 和 .pdf。目的:用一个库取代一架子单格式转换器。
🧱 文档结构保真 — 全保真结构元素
带锚点的标题、粗体/斜体/删除线、行内代码和代码块、链接和交叉引用、嵌套/编号/任务列表、带合并单元格的表格、块引用、脚注/尾注和演讲者备注。目的:保留足够多的结构,使 Markdown 输出仍可用于下游解析,而不仅仅是文本转储。
🖼️ 嵌入资源 — 图片和嵌入对象
在 Markdown 中通过替代文本渲染图片,同时将原始字节和媒体类型保留在底层文档模型上;外部图片 URL 变为普通的 Markdown 图片链接。目的:让调用方自行决定是保留、重新托管还是丢弃二进制资源。
🔌 语言绑定 — 4 种运行时目标
原生 Rust crate、Node.js 包(通过 libuv 线程池实现非阻塞)、Python 包(释放 GIL)以及面向浏览器的 WebAssembly 构建。目的:让相同的转换逻辑可以在后端服务、CLI、笔记本或完全客户端环境中运行。
🤖 智能体集成 — 1 个一等公民 Agent Skill
作为可安装的 Agent Skill(npx skills add firecrawl/anydoc)发布,兼容 Claude Code、Codex、Cursor、OpenCode 及其他支持 skill 的智能体。目的:让编码智能体无需自定义胶水代码即可读取遇到的办公文档。
4. 核心亮点
- 一个文档模型,一个序列化器。 每种格式都解析为相同的内部
Document表示,并通过同一个 GFM 序列化器渲染,因此格式错误只需修复一次即可惠及所有格式,而不是每个解析器各修一次。 - 基于内容的格式检测。 anydoc 直接从字节中读取 PDF 头、RTF 起始组、OLE 流名称或 ZIP 包的 mimetype,因此标签错误或无扩展名的文件也能正确转换(
Format::from_bytes)。 - 亚 5 毫秒中位转换时间。 纯 Rust 实现,无机器学习模型或网络调用;已发布的基准测试报告的中位转换时间为 4.4 毫秒,远快于 LibreOffice、Pandoc 或基于 Python 的替代方案。
- 独立基准验证的质量领先者。 在针对 14 种格式的 100 份真实文档、六种其他转换器的对比中,anydoc 是唯一一个格式全覆盖且在每个被评判格式上质量得分最高的工具(由 LLM 以页面渲染的真实结果为基准进行评判)。
- 内置 PDF 支持。 基于文本的 PDF 可通过配套的 pdf-inspector crate 在本地转换——该路径无需外部 OCR 服务。
- 类型化、按变体的错误处理。
ConvertError枚举(Unsupported、Malformed、Encrypted、ResourceLimit、MissingPart、Io)让调用代码能够区分“跳过此文件”的情况与真正的失败,并在 Node/Wasm 中映射为error.code,在 Python 中映射为类型化异常。
5. 按角色划分的使用场景
- 普通开发者 — 将 anydoc 放入文档摄取流水线(Rust、Node.js、Python 或浏览器/WASM),将混合格式的上传内容规范化为 Markdown,而无需为每种格式维护单独的解析器。
- 数据/科研人员(以及 AI/ML 工程师) — 使用 anydoc 将异构语料库(报告、幻灯片、电子表格、CSV、PDF)转换为干净、结构一致的 Markdown,适用于嵌入、RAG 索引或 LLM 上下文窗口。
- 项目经理/工具团队 — 采用 Agent Skill,让编码智能体(Claude Code、Cursor、Codex、OpenCode)在会话期间能够读取以原生办公格式交给它们的设计文档、规格说明或会议纪要。
6. 快速开始
找到所需内容
查看支持的格式表和各绑定的 API 参考(node/README.md、python/README.md、wasm/README.md),确认你的格式和运行时已覆盖。
安装/集成
# CLI(无需安装,运行预构建二进制)
npx @firecrawl/anydoc report.docx
# Node.js
npm install @firecrawl/anydoc
# Python
pip install firecrawl-anydoc
# Rust
cargo add anydoc
# 浏览器 / WebAssembly
npm install @firecrawl/anydoc-wasm
贡献
git clone https://github.com/firecrawl/anydoc.git
cd anydoc
cargo test
直接在 GitHub 仓库 上提交 issue 或 pull request;项目还在 tests/ 和 fuzz/ 下维护了基于 fixture 的快照测试、变异测试和 cargo-fuzz 目标,供贡献者添加格式支持时使用。
7. 项目结构
anydoc/
├── src/ # 核心 Rust 库:格式解析器 + 文档模型 + GFM 序列化器
├── node/ # Node.js 绑定(npm 包,TypeScript 类型)
├── python/ # Python 绑定(通过 maturin 构建的 PyPI wheel)
├── wasm/ # WebAssembly / 浏览器绑定
├── skills/ # Agent Skill 定义(convert-documents-to-markdown)
├── bench/ # 速度和质量基准测试工具
├── tests/ # Fixture 语料库、快照和鲁棒性测试
├── fuzz/ # 每种格式的 cargo-fuzz 目标
├── examples/ # 使用示例
└── Cargo.toml # Crate 清单(已发布版本的事实来源)
src/ 中每种格式有一个解析器,所有解析器在渲染前都汇入共享的 Document 模型,这是仓库其余部分(绑定、基准测试、测试)围绕构建的架构核心。
8. 相关生态
- Firecrawl — 父平台;anydoc 的转换逻辑为托管的 Firecrawl Parse API 提供支持,该 API 为扫描/纯图片页面增加了 OCR 功能。
- pdf-inspector — anydoc 用于本地、非 OCR PDF 文本提取的配套 Rust crate。
- Agent Skills — anydoc 的 Agent Skill 发布到的生态/规范,使其可被 Claude Code、Codex、Cursor 和 OpenCode 发现。
- Crates.io / npm / PyPI — anydoc 以
anydoc(crate)、@firecrawl/anydoc和@firecrawl/anydoc-wasm(npm)以及firecrawl-anydoc(PyPI)发布官方包。
9. 许可证
✅ 可自由使用、修改和分发,包括在商业和闭源产品中(MIT 许可证)。
✅ 可自由嵌入专有流水线和 SaaS 产品,无需发布自己的源代码。
❌ 不提供任何担保;作者不对因使用造成的损害承担责任。
ℹ️ 在软件的副本或实质性部分中必须保留 MIT 许可证文本和版权声明。
10. 常见问题
问:anydoc 支持哪些文档格式?
答:Word(.doc/.docx/.docm)、PowerPoint(.ppt/.pptx/.pptm/.pps/.ppsx/.ppsm/.pot)、Excel(.xls/.xlsx/.xlsm/.xlsb)、OpenDocument(.odt/.ods/.odp)、RTF、EPUB、CSV 和 PDF。
问:anydoc 是否对扫描的 PDF 或图片进行 OCR?
答:不——anydoc 通过 pdf-inspector 在本地转换基于文本的 PDF,但不包含 OCR。对于扫描文档,托管的 Firecrawl Parse API 在相同的转换引擎之上增加了 OCR 模型。
问:我可以在不安装任何东西的情况下使用 anydoc 吗?
答:可以,运行 npx @firecrawl/anydoc report.docx 即可使用预构建二进制立即转换文件,或者尝试浏览器演示,它通过 WebAssembly 完全在客户端运行。
问:anydoc 如何检测文件格式?
答:从文件内容而非扩展名检测——读取 PDF 头、RTF 起始组标记、OLE 流名称或 ZIP 包的 mimetype/内容类型。CSV 没有此类标记,因此依赖扩展名或显式格式参数。
问:anydoc 的商业使用许可如何?
答:它采用 MIT 许可证,因此可以在商业和专有软件中自由使用;详见第 9 节。
11. 快速链接
- 仓库:github.com/firecrawl/anydoc
- 在线演示/主页:firecrawl.github.io/anydoc
- Node.js API 参考:node/README.md
- Python API 参考:python/README.md
- WebAssembly API 参考:wasm/README.md
- 基准测试方法:bench/README.md
- Agent Skill 定义:skills/convert-documents-to-markdown/SKILL.md
12. 总结
anydoc 为团队提供了一种单一、快速、依赖轻量的方式,将 Word、PowerPoint、Excel、OpenDocument、RTF、EPUB、CSV 和 PDF 文件转换为干净、结构忠实的 Markdown——这项任务以前需要拼接多个质量参差不齐的格式专用工具。它最适合构建文档摄取流水线的开发者、准备语料库用于嵌入或 LLM 上下文的数据/AI 团队,以及需要即时读取办公文档的编码智能体,所有这些用户都能从它广泛的格式覆盖、经过基准验证的输出质量和毫秒级的转换速度中受益。