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 转换器存在三个问题:

  1. 速度:LibreOffice 每个文档需要超过一秒。anydoc 中位数仅需 4.4 毫秒。
  2. 格式覆盖:大多数工具只支持少数几种格式。anydoc 开箱即支持 14 种不同格式。
  3. 一致性:每个转换器都有自己的怪癖。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 – 未知格式或纯图像 PDF
  • Malformed – 结构上不可用的文件
  • 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 在本地处理,因此你的数据不会离开你的机器。

来源

firecrawl/anydoc:将 Word、PowerPoint、Excel、OpenDocument、RTF、EPUB、CSV 和 PDF 转换为干净的 Markdown。使用 Rust 构建,支持 Node.js 和 Python 绑定。