乐于分享
好东西不私藏

13.3K Star!终于有人把文档转 Markdown 这件事做好了!

13.3K Star!终于有人把文档转 Markdown 这件事做好了!

在 AI 应用越来越普及的今天,把企业内部的 Word 报告、PPT 方案、Excel 报表、PDF 合同喂给大模型做摘要、提取、分析,已经是很多团队的日常操作。

但每一种格式都像一个独立的"物种",需要不同的工具链、不同的转换逻辑,出来的 Markdown 质量也是参差不齐。

更糟糕的是,你好不容易找到一个能转 Word 的工具,换个 PPT 就不支持了;找到一个能转 Excel 的,表格合并单元格又处理不好;甚至同一种格式,用不同版本生成的文件,转换结果都不一样。

有没有一个"万能解药"?

Firecrawl 团队用 Rust 写的 anydoc 就是冲着这个目标来的。

这个开源项目在 GitHub 上已经斩获了 13300+ Star,支持 14 种办公格式统一转成 GitHub-Flavored Markdown,转换速度中位数不到 5 毫秒,更关键的是——所有格式转出来的 Markdown 结构完全一致

项目介绍

anydoc 是 Firecrawl 团队开源的 Rust 文档转换库。

Firecrawl 本身是一家专注于 AI 时代数据提取和网页抓取的公司,他们的核心产品 Firecrawl Parse 已经在处理着大量的文档转换需求。

在实际业务中他们发现,客户的文档格式五花八门:Word、PPT、Excel、PDF、EPUB、RTF、CSV……甚至还有 OpenDocument 格式。

为了给下游的 LLM 提供干净、结构化的 Markdown 输入,团队不得不维护多个转换引擎,每个引擎的输出格式和质量都不一样。

Firecrawl 的联合创始人兼 CTO Nick 提到,"我们决定从零开始写一个库,用统一的架构处理所有格式。"

于是 anydoc 诞生了。它的目标很明确:一个库,14 种格式,统一输出,极速转换。

核心亮点

14 种格式一键通吃

在 Firecrawl 做的基准测试中,anydoc 是唯一能处理全部 14 种格式的工具。其他竞品最多支持 12 种,少的只支持 1-2 种。

具体支持的格式覆盖了办公领域几乎所有主流文件类型:

  • • 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

这意味着你不需要再为 Word 准备一个库、为 PPT 准备另一个、为 Excel 再找一个。anydoc 一个就搞定。

所有格式输出一致的 Markdown

anydoc 最核心的设计理念是"共享文档模型 + 单一序列化器"。

它的架构是这样的:每种格式的文档先解析成同一个内部文档模型(包含 blocks、inlines、tables 等结构化节点),然后通过同一个 GitHub-Flavored Markdown 序列化器输出。

这带来了一个非常重要的结果:无论输入是 2003 年的 .doc 文件,还是昨天刚生成的 .pptx,输出的 Markdown 结构完全一致。 标题层级、嵌套列表、合并单元格的表格、脚注、代码块——这些元素在所有格式的转换结果中都能正确保留。

5ms 极速转换

anydoc 是纯 Rust 实现,不依赖任何 ML 模型或外部服务。在 Firecrawl 的基准测试中:

  • • 中位数转换时间:4.4-4.7 毫秒
  • • 对比 LibreOffice:中位数 1129.5 毫秒,慢了约 245 倍
  • • 其他竞品:52-1130 毫秒,慢了约 20-245 倍

这个速度在实际场景中的意义非常大:如果你要批量处理上百份文档,anydoc 可以在几秒钟内完成,而用其他工具可能需要几分钟。

浏览器版本地转换

anydoc 提供了编译成 WebAssembly 的浏览器版本(@firecrawl/anydoc-wasm),文件在浏览器本地转换,永远不会上传到任何服务器

这对处理敏感文档(合同、财务报表、内部报告等)来说是非常重要的特性。

你可以在自己的 Web 应用中直接集成 WASM 版本,用户上传的文件在本地浏览器中完成转换,零隐私风险。

快速上手

anydoc 提供了 Rust、Node.js、Python 三种主要的编程接口,还有 CLI 工具和 Agent Skill,不同技术栈的开发者都能快速上手。

Node.js 用法

npm install @firecrawl/anydoc
import { toMarkdown, toMarkdownBytes, toDocument } from '@firecrawl/anydoc';

// 从文件路径转换

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

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

import
 { readFile } from 'fs/promises';
const
 bytes = await readFile('report.docx');
const
 markdown2 = await toMarkdownBytes(bytes);

// 显式指定格式(CSV 等无签名格式需要)

const
 csvBytes = await readFile('data.csv');
const
 markdown3 = await toMarkdownBytes(csvBytes, 'csv');

// 获取文档模型(保留嵌入资源)

const
 document = await toDocument(bytes);
console
.log(document.markdown);
console
.log(document.assets);  // 嵌入的图片等资源

Node.js 版本的转换运行在 libuv 线程池上,不会阻塞事件循环,TypeScript 类型定义也随包提供。

Python 用法

pip install firecrawl-anydoc
import anydoc

# 从文件路径转换

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

# 从字节转换

with
 open("report.docx", "rb") as f:
    data = f.read()
markdown2 = anydoc.to_markdown_bytes(data)

# 显式指定格式

markdown3 = anydoc.to_markdown_bytes(data, "csv")

# 获取文档模型

document = anydoc.to_document(data)
print
(document.markdown)
print
(document.assets)

Python 版本在转换时会释放 GIL,不会阻塞其他线程,同样提供了类型存根。

Rust 用法

cargo add anydoc
use anydoc::{to_markdown, to_markdown_bytes, Format};

// 从文件路径转换

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

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

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

// 显式指定格式

let
 markdown3 = anydoc::to_markdown_bytes(&bytes, Some(Format::Csv))?;

// 获取文档模型

let
 document = anydoc::to_document(&bytes, None)?;

CLI 工具

不想写代码?直接用命令行:

# 基本用法
npx @firecrawl/anydoc report.docx

# 输出到文件

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

# 处理 CSV

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

Agent Skill

anydoc 还可以作为 Agent Skill 安装到 Claude Code、Codex、Cursor 等 AI 编程助手中:

npx skills add firecrawl/anydoc

安装后,你可以直接在对话中让 AI 帮你转换文档,比如:"帮我把这份季度报告转成 Markdown"。

PDF 的特殊处理

anydoc 对 PDF 的处理有一个分层策略:

  • • 文本型 PDF:通过内置的 pdf-inspector 库直接提取文本,转换为 Markdown
  • • 扫描型 PDF:需要 OCR 处理,anydoc 本身不做 OCR,但可以对接 Firecrawl Parse API 获取 OCR 支持

需要注意的是,PDF 不能用 to_document 方法(因为它不经过文档模型),需要使用 to_markdown_bytes 或 to_markdown

写在最后

把文档转成 Markdown 这件事,看起来简单,但真正做好并不容易。你需要同时解决格式解析、结构还原、一致性输出、性能优化等多个难题。

anydoc 的价值在于,它不是又一个"凑合用"的转换器,而是用工程化的方式重新定义了这件事的标准:

  • • 一个库,14 种格式:不再需要为不同格式维护不同的工具链
  • • 5ms 极速转换:在批量处理和实时场景下都能跑得动
  • • 统一的 GFM 输出:下游工具和 LLM 不需要做任何适配
  • • 本地处理,隐私安全:浏览器版不上传文件,服务器版无外部依赖
  • • 活跃的开发生态:Firecrawl 团队持续迭代,社区贡献不断

如果你平时有大量文档需要转给大模型处理——不管是 Word 报告、PPT 方案、Excel 数据还是 PDF 合同,anydoc 都值得放进你的工具箱里试一试。

GitHub:https://github.com/firecrawl/anydoc

如果本文对您有帮助,也请帮忙点个 赞👍 + 在看 哈!❤️

在看你就赞赞我!