做 RAG 或 Agent 开发时,处理几百个 PDF、Word、PPT 并转换为 Markdown 是个常见痛点。传统方案如 LibreOffice 速度慢(单文档 1 秒以上),Python 解析库遇到复杂表格会乱码,文件后缀名伪造还会导致程序崩溃。Firecrawl 团队开源的 anydoc 专门解决这个问题,上线 5 天 GitHub 已获得 11000+ Star。

anydoc 是一个将各种办公文档转换为干净 Markdown 格式的 Rust 库,支持 Word、PPT、Excel、PDF、RTF、EPUB、CSV 等 14 种格式。单文档转换中位数仅需 4.4 毫秒,比 LibreOffice 快 256 倍,比第二名快 20 多倍。

无需安装任何东西,一行命令即可完成转换,还支持 Agent Skill,AI 编程助手可直接使用。
实测演示
假设需要将 .doc、.pptx、.xls、.epub 等格式的文档转换为 Markdown。安装后终端输入一行命令,anydoc 自动识别真实格式(不依赖后缀名),并转换为干净的 Markdown——标题锚点、合并单元格表格、嵌套列表、脚注尾注全部保留。

单文件转换不到 500 毫秒,批量 100 个在半秒内完成,而 LibreOffice 需要约 2 分钟。

如果文档包含图片,Markdown 中会保留替代文本,原始图片数据也会一并返回。
技术架构
统一文档模型
每种格式由各自的解析器拆解(Word/PPT/Excel 各有解析器),然后映射到同一个内部文档模型(标题、段落、表格、列表、脚注、嵌入资源等结构体),最后使用同一 Markdown 序列化器输出。维护成本集中在模型和序列化层。

格式检测:看字节头,不看后缀名
根据文件的原始字节签名读取:PDF 头、RTF 开头标记、OLE 流名、ZIP 包的 mimetype。CSV 没有签名时才需要扩展名或显式指定。生产环境中用户上传文件后缀名经常是乱的,anydoc 不受影响。
不阻塞主线程
Node.js 转换在 libuv 线程池中进行,不影响事件循环。Python 转换释放 GIL,其他线程正常运行。TypeScript 类型和 Python stub 直接打包进包中。Node 使用 NAPI-RS,Python 使用 PyO3。还有 WASM 版本,可在浏览器中运行,文件不会上传第三方。
纯 Rust 实现,无 ML/GPU/外部 API
纯 Rust 编写,无机器学习模型、无 GPU 依赖、无需调用外部 API。4.4 毫秒是 Ryzen 9 CPU 跑出来的结果,未使用 GPU 加速。

官方使用 100 份真实文档进行盲评,对 14 种格式共评了 482 次,Claude 评分如下:

anydoc 是唯一包含全部 14 种格式且每个格式评分最高的工具。对比对象包括 LibreOffice、pandoc、unstructured、markitdown、docling、mammoth 等主流工具。
快速上手
Node.js 和 Python 用户一条命令即可安装:
npx @firecrawl/anydoc report.docx
pip install firecrawl-anydoc
Rust 用户使用 cargo add,浏览器运行安装 WASM 包。四个语言的 API 完全一致:to_markdown、to_markdown_bytes、to_document。
Claude Code 或 Codex 用户一行命令即可为 Agent 添加文档读取能力:
npx skills add firecrawl/anydoc
限制说明
- 纯图片 PDF:无法转换(没有 OCR),需使用 Firecrawl 云解析接口
- 加密文档:会报 Encrypted 错误
- 格式错误/超出安全限制:返回明确错误码,不会无头乱转
总结
Firecrawl 做网页抓取做到了 14.9 万 Star,现在把文档解析也开源了。anydoc 最打动人的地方是省心——无需 LibreOffice、Python 环境或 GPU,一个二进制文件,一条命令,各种格式都能转换。
开源地址:https://github.com/firecrawl/anydoc