文档
变正文。
毫秒级。
一个由 Firecrawl 打造的快速 Rust 库:把 Word、PowerPoint、Excel、 OpenDocument、RTF、EPUB、CSV 与 PDF,统一转换成干净的 GitHub 风格 Markdown。无论是什么格式,输出始终一致。
所有格式统一输出
每种格式都解析为同一个文档模型,经同一序列化器渲染。无论是 2003 年的 .doc 还是昨天的 .pptx,转义、表格、标题锚点与脚注行为完全一致。
完整文档结构
带锚点的标题、粗体/斜体/删除线、行内代码与代码块、链接与交叉引用、保留原始编号的列表、合并单元格表格、块引用、脚注尾注与演讲者备注。
嵌入资源
图片与嵌入对象渲染为替代文本,原始字节保留在文档模型上并标记媒体类型;带外部 URL 的图片则转为普通 Markdown 图片。
基于内容的格式检测
格式从字节本身读取:PDF 头、RTF 开组、OLE 流名称、ZIP 包 mimetype。文件扩展名写错了,照样能正确转换。
快
纯 Rust 实现,无机器学习模型,无外部服务。单文档转换中位数低于 5ms。
非侵入式绑定
Node.js 转换跑在 libuv 线程池,从不阻塞事件循环;Python 释放 GIL 让其他线程继续。TypeScript 类型与 Python 存根随包发布。
内置 PDF 支持
基于文本的 PDF 通过 pdf-inspector 在本地转换,无需 OCR 服务,数据不离开你的机器。
智能体就绪
以 Agent Skill 形式发布:一条 npx skills add firecrawl/anydoc,即可让任何智能体读取办公文档,兼容 Claude Code、Codex、Cursor、OpenCode 等。
# Markdown 输出到 stdout
npx @firecrawl/anydoc report.docx
# 或输出到文件
npx @firecrawl/anydoc slides.pptx -o slides.md
# 从 stdin 读取
npx @firecrawl/anydoc - --format csv < data.csv
# 首次运行自动下载各平台二进制
# 永久安装:npm install -g @firecrawl/anydoc
npm install @firecrawl/anydoc
import { toDocument, toMarkdown, toMarkdownBytes } from '@firecrawl/anydoc';
// 从文件路径:
const markdown = await toMarkdown('report.docx');
// 从字节,格式自动检测:
const fromBytes = await toMarkdownBytes(bytes);
// 或指定格式名(无签名格式需如此):
const fromCsv = await toMarkdownBytes(bytes, 'csv');
// 或返回文档模型,携带嵌入资源:
const document = await toDocument(bytes);
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)
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)?;
# 让任何智能体读取办公文档
npx skills add firecrawl/anydoc
# 兼容 Claude Code · Codex · Cursor
# OpenCode · 及其他兼容智能体
> 完整 API 参考见各语言 README —— Node / Python 绑定随包发布。
| 工具 | 格式 | 中位ms | 评审文档 | 总分 | 完整性 | 结构 | 格式 | 整洁度 |
|---|---|---|---|---|---|---|---|---|
| anydoc | 14/14 | 4.7 | 94 | 80 | 88 | 78 | 77 | 79 |
| libreoffice | 12/14 | 1129.5 | 87 | 40 | 59 | 43 | 43 | 24 |
| unstructured | 8/14 | 572.9 | 58 | 65 | 76 | 62 | 52 | 67 |
| markitdown | 6/14 | 134.8 | 33 | 65 | 80 | 67 | 61 | 53 |
| pandoc | 5/14 | 102.1 | 34 | 57 | 75 | 57 | 58 | 39 |
| docling | 4/14 | 513.6 | 21 | 57 | 63 | 59 | 57 | 52 |
| mammoth | 1/14 | 52.5 | 8 | 70 | 85 | 68 | 74 | 55 |
逐格式对比(anydoc 得分): doc 88 · docm 82 · docx 86 · epub 74 · odp 87 · ods 82 · odt 80 · ppt 80 · pptx 76 · rtf 89 · xls 77 · xlsm 70 · xlsx 70 —— 在除 EPUB 外的所有被评审格式上均为最高分。
评分方式: 由 LLM 评判(Claude Sonnet 5)在盲测中,将工具输出与基准真相(文档前六页由 LibreOffice 渲染为图像)对比,按完整性 / 结构 / 格式 / 整洁度评分;交换顺序各评审一次以消除位置偏差,共 479 次裁决。总分是各工具所支持格式的平均分——因此每行平均的格式集合不同,逐格式对比才是最公平的比较。
速度: Ryzen 9 9950X3D(Windows 11 · 64GB DDR5-6400)单线程、每个文档一次预热后计时。anydoc 与各语言库的计时排除了进程启动开销。
最佳适用场景
接收混合办公文档、需要统一结构化 Markdown 输出的流水线。anydoc 是唯一覆盖全部十四种格式的工具,除 EPUB 外在所有被评审格式上最高分,且转换速度比次快工具高出一个数量级。
因为所有格式都流经同一个文档模型与序列化器,输出问题只需修复一次—— docx 的表格转义修复,会自动成为 rtf、odt 及其它所有格式的修复。
格式检测
基于内容标记而非扩展名:PDF 头、RTF 开组、OLE 流名称、ZIP 包 mimetype。
格式解析器
每种格式一个解析器:doc · docx · ppt · pptx · xls · xlsx · odt/ods/odp · rtf · epub · csv。
文档模型
所有格式统一映射到共享模型:块、内联、表格、脚注、资源。
GFM 序列化器
统一输出 GitHub 风格 Markdown。PDF 由 pdf-inspector 直接产出 Markdown。
格式从文件内容中读取,使用规范指定的标记:PDF 头、RTF 开组、OLE 流名称、ZIP 包 mimetype 与内容类型。CSV 没有此类标记,因此通过扩展名或显式格式名识别。Node(formatFromBytes 等)与 Python(anydoc.format_from_bytes 等)提供相同函数。
Format::from_bytes(&bytes); // Some(Format::Docx)
Format::from_extension("pptm"); // Some(Format::Pptx)
Format::from_path(Path::new("report.odt")); // Some(Format::Odt)
cargo test
cd node && npm install && npm run build && npm test
cd python && pip install maturin && maturin develop
&& python -m unittest discover -s tests
固定语料库快照测试 · 变异测试 · 每种格式的 cargo-fuzz 目标。版本以 v<version> 标签发布,同步发布 crate、npm 包与 PyPI 轮子。许可证 MIT。