anydoc:毫秒级将任意办公文档转换为干净的 Markdown
anydoc 是一个快速的 Rust 库,可将 Word、PowerPoint、Excel、PDF 等转换为干净的 Markdown。支持 Node.js、Python 和 WASM 绑定,是现有最快、最完整的转换器。
anydoc:毫秒级将任意办公文档转换为干净的 Markdown
如果你曾尝试将 .docx 或 .pptx 文件输入到 LLM,你就会知道其中的痛苦。大多数转换器速度慢、输出杂乱,或者只支持少数几种格式。Firecrawl 的 anydoc 旨在彻底解决这个问题:一个纯 Rust 库,可将 Word、PowerPoint、Excel、OpenDocument、RTF、EPUB、CSV 和 PDF 转换为干净的 GitHub 风格 Markdown (GFM),每个文档耗时 不到 5 毫秒。
由 Firecrawl 团队构建,anydoc 是 Firecrawl Parse 的底层引擎。它现已开源,支持 Node.js、Python 和 WebAssembly 绑定,并附带 Agent Skill,让你的 AI 代理能够原生读取文档。
为什么选择 anydoc?
现有的文档到 Markdown 转换器存在三个问题:
- 速度:LibreOffice 每个文档需要超过一秒。anydoc 中位数仅需 4.4 毫秒。
- 格式覆盖:大多数工具只支持少数几种格式。anydoc 开箱即支持 14 种不同格式。
- 一致性:每个转换器都有自己的怪癖。anydoc 将所有格式统一通过一个文档模型处理,因此输出在所有格式中保持一致。
在与六种其他转换器(LibreOffice、unstructured、markitdown、pandoc、docling、mammoth)的基准测试中,anydoc 在 其支持的每种格式上得分最高,并且比第二快的工具 快 10 倍。
快速开始
CLI
试用 anydoc 最快的方式是通过 npx:
npx @firecrawl/anydoc report.docx # 将 Markdown 输出到标准输出
npx @firecrawl/anydoc slides.pptx -o slides.md # 或输出到文件
npx @firecrawl/anydoc - --format csv < data.csv # 从标准输入读取
永久安装:
npm install -g @firecrawl/anydoc
Node.js
npm install @firecrawl/anydoc
import { toDocument, toMarkdown, toMarkdownBytes } from '@firecrawl/anydoc';
// 从文件路径:
const markdown = await toMarkdown('report.docx');
// 从字节,自动检测格式:
const fromBytes = await toMarkdownBytes(bytes);
// 或显式指定格式(CSV 需要):
const fromCsv = await toMarkdownBytes(bytes, 'csv');
// 或获取包含嵌入资产的文档模型:
const document = await toDocument(bytes);
Python
pip install firecrawl-anydoc
import 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-wasm
import init, { toMarkdownBytes, toDocument } from '@firecrawl/anydoc-wasm';
await init();
const markdown = toMarkdownBytes(bytes);
Rust
cargo add anydoc
let 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)?;
重要特性
完整的文档结构
anydoc 保留了你期望从丰富文档中获得的一切:
- 带锚点的标题
- 粗体、斜体、删除线
- 行内代码和代码块
- 链接和内部交叉引用
- 项目符号、编号、嵌套和任务列表(保留原始编号)
- 带合并单元格和标题行的表格
- 块引用
- 脚注和尾注
- 演讲者备注(来自 PowerPoint)
嵌入资产
图像和嵌入对象在 Markdown 中呈现为替代文本,但原始字节在文档模型上可用,并带有媒体类型标签。外部图像成为标准 Markdown 图像。
基于内容的格式检测
anydoc 不依赖文件扩展名,而是读取实际字节来检测格式:PDF 头、RTF 开放组、OLE 流名称、ZIP 包 mimetype。这意味着标签错误的文件也能正确转换。
内置 PDF 支持
基于文本的 PDF 使用 pdf-inspector 在本地转换——无需 OCR 服务。对于扫描的 PDF,你需要使用 Firecrawl 的托管 API 和 OCR 模型。
代理就绪
anydoc 作为 Agent Skill 提供:
npx skills add firecrawl/anydoc
这适用于 Claude Code、Codex、Cursor、OpenCode 和其他兼容代理。
基准测试:anydoc 与其他工具对比
以下是 anydoc 与其他流行转换器在 14 种格式的 100 份真实文档上的对比(得分满分 100,越高越好):
| 工具 | 格式 | 中位数毫秒 | 得分 | 完整性 | 结构 | 格式 | 清洁度 |
|---|---|---|---|---|---|---|---|
| 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 在每种格式上都胜出或持平。例如,在 .docx 上它得分 88,而 mammoth 为 70;在 .pptx 上它得分 74,而 markitdown 为 66。
基准测试使用 LLM 评判器(Claude Sonnet 5)将输出与真实前六页图像进行盲比。每对比较两次以消除位置偏差,共 482 个判定。
工作原理
anydoc 的架构非常优雅:每种格式解析器都输出到 共享文档模型,然后通过单一的 GFM 序列化器。这意味着对一个格式的修复会自动应用于所有其他格式。
文档字节
│
├─► 格式检测 → 内容标记,而非扩展名
│
├─► 格式解析器 → 每种格式一个(doc、docx、ppt、pptx、xls、
│ xlsx、odt/ods/odp、rtf、epub、csv)
│ │
│ └─► Document → 共享模型:块、内联、表格、
│ 脚注、资产
│ │
│ └─► GFM 序列化器 → Markdown
│
└─► PDF → pdf-inspector → 直接生成 Markdown
错误处理
anydoc 返回一个 ConvertError,具有特定的变体:
Unsupported– 未知格式或纯图像 PDFMalformed– 结构上不可用的文件Encrypted– 受密码保护ResourceLimit– 超过安全限制(解压缩、嵌套等)MissingPart– 缺少必需部分Io– 文件读取错误(仅来自to_markdown)
在 Node 和 WASM 中,变体位于 error.code 上;在 Python 中,每个变体有一个子类。
开发
anydoc 是开源的(MIT)且积极开发中。你可以运行测试、贡献代码,或只是探索代码库:
cargo test
cd node && npm install && npm run build && npm test
cd python && pip install maturin && maturin develop && python -m unittest discover -s tests
仓库包含带有快照测试、变异测试和每种格式的模糊测试目标的固定语料库。
结论
如果你正在构建一个摄取办公文档并需要干净、结构化的 Markdown 供 LLM 使用的管道,anydoc 是一个改变游戏规则的工具。它快速、全面且一致。无论你通过 CLI、Node.js、Python 还是在浏览器中使用它,它都是我们见过的完成此任务的最佳工具。
在浏览器中试用实时演示——文件通过 WebAssembly 在本地处理,因此你的数据不会离开你的机器。