乐于分享
好东西不私藏

anydoc:把任意文档秒变 Markdown 的 Rust 神器

anydoc:把任意文档秒变 Markdown 的 Rust 神器

深度 · 开源工具解析

anydoc:把任意文档秒变 Markdown 的 Rust 神器

Firecrawl 出品 · 14 种格式全通吃 · 中位转换 4.4ms · 纯 Rust 无外部依赖

导读:在 LLM 与 RAG 的时代,文档就是知识库的血液。但现实里的文档格式千差万别 —— Word、PPT、Excel、PDF、RTF、EPUB…… 传统方案要么(LibreOffice headless 动辄上百毫秒),要么格式覆盖少(pandoc、markitdown),要么输出脏(残留各种格式噪音)。Firecrawl 开源的 anydoc 用纯 Rust 一次性解决了这些问题:在 100 个真实文档、14 种格式的基准测试中,它中位转换耗时仅 4.4ms,质量评分 81 分,是唯一覆盖全部 14 种格式、且在每个被评测格式上都拿第一的工具。本文带你全面拆解它。

一、anydoc 是什么

anydoc 是由知名爬虫与数据基础设施团队 Firecrawl 开源的文档转换库,用纯 Rust 编写,能将 Word、PowerPoint、Excel、OpenDocument、RTF、EPUB、CSV、PDF 等常见办公文档,转换成干净的 GitHub-Flavored Markdown(GFM)。它的定位非常明确 —— 把任意办公文档变成 LLM-ready 的 Markdown

它的杀手锏在于:无论输入是 2003 年的 .doc 还是昨天的 .pptx,输出的都是风格一致的同一份 Markdown。目前它已驱动 Firecrawl 自家的 Parse 产品,并提供了多语言绑定:

能力
说明
核心语言
纯 Rust,无 ML 模型、无外部服务
多语言绑定
Node.js、Python、WebAssembly(浏览器)
Agent 集成
原生 Agent Skill,Claude Code / Codex / Cursor 等通用
在线体验
浏览器 WASM Demo,文件本地转换、不上传
开源协议
MIT,完全免费可用

二、支持 8 大类、14 种格式

格式覆盖是 anydoc 最直观的优势。它一口气吃下 8 大文档类型、共 14 种扩展名,涵盖了你能在企业里遇到的几乎所有办公文档:

文档类型
支持的扩展名
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
.pdf(文本型,内置解析)

三、八大核心特性

anydoc 的设计哲学,是把"格式差异"这件事彻底藏在转换层之下。具体体现在以下八个方面:

① 一种输出,通吃所有格式

每种格式都先解析进同一个共享文档模型,再经过同一个 Markdown 序列化器输出。所以转义、表格、标题锚点、脚注的行为完全一致 —— 无论输入是 doc 还是 pptx。

② 完整还原文档结构

支持带锚点的标题、粗体/斜体/删除线、行内代码与代码块、链接与内部交叉引用、有序/无序/嵌套/任务列表(保留源文档的原始编号)、含合并单元格与表头的表格、引用块、脚注与尾注,甚至 PPT 的演讲者备注

③ 嵌入资源不丢失

图片和嵌入对象在 Markdown 中渲染为 alt 文本,而原始字节会保留在文档模型上,并标注 media type;带外部 URL 的图片则变成标准 Markdown 图片语法。

④ 基于内容的格式检测

不靠文件扩展名,而是直接读取字节本身的特征 —— PDF 头、RTF 开放分组、OLE 流名、ZIP 包的 mimetype。文件名标错的也能正确转换。仅 CSV 因无特征标记而需扩展名辅助。

⑤ 极致速度

纯 Rust、零 ML 模型、零外部服务。单文档中位转换时间低于 5ms,比同类工具快一到两个数量级。

⑥ 绑定"不挡路"

Node.js 版在 libuv 线程池上运行,绝不阻塞事件循环;Python 版会释放 GIL,让其他线程继续跑;同时附带完整的 TypeScript 类型与 Python stubs。

⑦ PDF 内置支持

基于同生态的 pdf-inspector 库,文本型 PDF 可直接本地转换,无需任何 OCR 服务。

⑧ Agent 原生就绪

以 Agent Skill 形式发布,一条命令 npx skills add firecrawl/anydoc 即可让任意 Agent 学会读取办公文档。

四、性能基准:数据说话

anydoc 在 100 个真实文档、横跨 14 种格式的语料上,与另外 6 款主流转换器同台竞技。评分由 LLM 评审(Claude Sonnet 5)盲测给出,0–100 分,越高越好;速度为中位单文档转换耗时。

综合对比(核心数据):

工具
格式覆盖
中位耗时
综合评分
anydoc
14 / 14
4.4 ms
81
libreoffice
12 / 14
1129.5 ms
40
unstructured
8 / 14
572.9 ms
63
markitdown
6 / 14
134.8 ms
65
pandoc
5 / 14
102.1 ms
56
docling
4 / 14
513.6 ms
57
mammoth
1 / 14
52.5 ms
70

注:mammoth 仅支持 docx 一种格式,其评分也仅基于 docx;anydoc 的 81 分横跨全部 14 种格式。

分格式逐项得分(anydoc 全部第一):

格式
anydoc
说明
rtf
88
富文本,最高分
docx
88
现代 Word
doc
87
老版 Word 二进制
odp
86
OpenDocument 演示
docm
84
含宏的 Word
ods
82
OpenDocument 表格
xls / ppt
80
老版 Excel / PPT
xlsx / epub
72–77
现代 Excel / 电子书

注:上表为节选示意,完整 13 种格式的逐项得分可查阅官方 README。

评测方法论:LLM 评审(Claude Sonnet 5)以盲测方式对比两份输出与 ground truth(LibreOffice 渲染的前 6 页图片),从完整性、结构、格式、整洁度四个维度打分。每对输出会交换 A/B 位置判两次以消除位置偏差,共计 482 个判定。测速环境为 Ryzen 9 9950X3D + 64GB DDR5-6400。

结论一句话:anydoc 是本次对比中唯一覆盖全部 14 种格式的工具,在每一个被评测的格式上都拿到最高分,且转换速度比第二快的工具快了一个数量级。

五、五种方式上手

anydoc 覆盖了从命令行到五大运行时的几乎所有接入方式,API 设计高度一致:无论哪种语言,核心都是 转 Markdown转文档模型格式检测 三件事。

方式一:命令行(npx 零安装)

npx @firecrawl/anydoc report.docx

# Markdown 输出到 stdout

npx @firecrawl/anydoc slides.pptx -o slides.md

# 写入文件

npx @firecrawl/anydoc - --format csv < data.csv

# 从标准输入读取

方式二:Agent Skill(让 AI 学会读文档)

npx skills add firecrawl/anydoc

# Claude Code / Codex / Cursor / OpenCode 通用

方式三:Node.js

npm install @firecrawl/anydoc

import { toMarkdowntoMarkdownBytes } from '@firecrawl/anydoc';

// 从文件路径转换:

const md = await toMarkdown('report.docx');

// 从字节转换,格式自动检测:

const md2 = await toMarkdownBytes(bytes);

方式四:Python

pip install firecrawl-anydoc

import anydoc

# 从文件路径转换:

markdown = anydoc.to_markdown("report.docx")

方式五:Rust(原生库)

cargo add anydoc

// 从文件路径转换:

let markdown = anydoc::to_markdown("report.docx")?;

// 从字节转换,格式自动检测:

let md = anydoc::to_markdown_bytes(&bytes, None)?;

格式检测 API(三端同名):

Format::from_bytes(&bytes); // Some(Format::Docx)

Format::from_extension("pptm"); // Some(Format::Pptx)

Format::from_path(Path::new("report.odt")); // Some(Format::Odt)

六、架构原理:一个模型收拢所有格式

anydoc 的核心架构可以用一条流水线概括。所有格式的字节,最终都会汇入同一个文档模型同一个 Markdown 序列化器

输入

文档字节(docx / pptx / pdf …)

第一步

格式检测(读字节特征,不看扩展名)

第二步

格式解析器(每种格式一个)

第三步

统一文档模型 Document

blocks · inlines · tables · footnotes · assets

第四步

GFM 序列化器

输出

干净的 Markdown

PDF 旁路:PDF 不走通用模型,而是单独由 pdf-inspector 直接转出 Markdown。

这种"漏斗式"设计带来一个巨大的工程红利:输出怪癖只需修一次,全局生效。比如修好了 docx 的表格转义 bug,rtf、odt 等所有格式的表格转义就一起对了 —— 因为它们共用同一个序列化器。

源码模块布局:

模块
职责
src/formats/
14 种格式各自独立的解析器
src/model/
共享文档模型(block / inline / table / list / asset)
src/render/
GFM Markdown 序列化器
src/package/
包/容器处理(archive / xml / 安全限制)
src/shared/
跨格式共享逻辑(OfficeArt / DrawingML / 编号等)

七、典型使用场景

anydoc 最适合"接收一袋子杂乱办公文档、需要产出一份一致且结构化 Markdown"的场景。具体而言:

RAG / 知识库

把企业的合同、报告、方案批量转成 Markdown,切片后喂给 LLM。

全文检索

为搜索引擎建立统一的文档索引,格式不再是障碍。

数据管道 / ETL

毫秒级转换适合大规模批量文档标准化入库。

AI Agent

作为 Agent Skill,让 Agent 直接读懂任何办公文档。

内容迁移

老旧 Office 文档批量迁移到 Markdown 知识库或博客。

浏览器端处理

WASM 本地转换,文档不离开设备,隐私与合规无忧。

附:工程健壮性

anydoc 在错误处理与测试上同样扎实。转换仅在"无法产出有意义 Markdown"时返回错误,并通过 ConvertError 精确命名问题类型:

错误类型
含义
Unsupported
未知格式,或无法转换(如纯图片 PDF)
Malformed
结构损坏,无法提取有意义内容
Encrypted
文件已加密或有密码保护
ResourceLimit
触及安全上限(解压 / 嵌套 / 节点数)
MissingPart
缺少产出有意义输出所需的部件

测试层面,它采用 快照测试(snapshot)固化 fixture 语料,用 变异测试(mutation)逐个验证 fixture 的健壮性,并为每种格式配备 cargo-fuzz 模糊测试目标 —— 三管齐下保证解析器的稳定性。

八、总结:为什么值得试一试

定位:把任意办公文档变成 LLM-ready 的 Markdown。
亮点:14 种格式全通吃、毫秒级速度、统一输出、纯 Rust 零依赖。
适合谁:做 RAG / 知识库、搜索、数据管道、AI Agent 的开发者。
怎么上手:一条 npx @firecrawl/anydoc file.docx 即可体验。

如果说以前的文档转换工具像"瑞士军刀"——每种格式都得找不同的刀,那么 anydoc 更像一台万能翻译机:你扔进去什么格式不重要,出来的永远是一份干净、结构化、一致的 Markdown。在 AI 把一切非结构化数据"结构化"的浪潮里,这样一个底层基建级的工具,值得进入每个开发者的工具箱。