firecrawl/anydoc
Github.com
RAG,AI一句话摘要
由 Firecrawl 开源的Rust文档转换库,把Word、PowerPoint、Excel、OpenDocument、RTF、EPUB、CSV、PDF等14种办公文档统一转成GitHub-FlavoredMarkdown,并附带Node.js、Python与浏览器WebAssembly绑定,单文档中位转换时间<5ms。
适用场景
接收混合办公文档、需要统一Markdown输出再喂给LLM的RAG/Agent管道(典型用途:上传.docx/.pptx/.pdf后直接转给大模型)。
在浏览器或边缘环境里做本地转换:WebAssembly包支持浏览器内转换,文件不出设备,适合隐私敏感场景。
作为AgentSkill集成进ClaudeCode/Codex/Cursor/OpenCode等编码Agent,让Agent能读取任意办公文档。
Firecrawl自身的Parse服务后端:本库即该服务的核心转换组件;不想自托管可直接调用FirecrawlParse托管API(带OCR兜底扫描件)。
核心能力
统一输出:14种格式都解析到同一份Document模型,再用同一份GFM序列化器输出;表格转义、标题锚点、footnote等行为跨格式一致。
完整文档结构:标题(含锚点)、粗体/斜体/删除线、行内代码与代码块、链接与内交叉引用、有序/无序/嵌套/任务列表(保留源编号)、合并单元格表格、引用、footnote/endnote、PPT演讲者备注。
嵌入资源:图片与嵌入对象以alt文本形式渲染到Markdown;原始字节保留在Document模型上并标注媒体类型;外部URL图片直接生成Markdown图片。
基于内容的格式探测:从PDF头、RTF开组符、OLE流名、ZIP包mimetype等内容标记识别格式,扩展名错标也能正确转换(CSV无内容标记,需要扩展名或显式指定)。
速度:纯Rust实现、无ML模型、无外部服务,单文档中位转换时间<5ms。
非阻塞绑定:Node.js在libuv线程池上跑、不阻塞事件循环;Python释放GIL;TypeScript类型与Pythonstub一同发布。
PDF 支持:文本型PDF通过pdf-inspector本地转换,无需OCR;扫描型PDF会返回Unsupported,需交给FirecrawlOCR兜底。
Agent Skill:以npx skills add firecrawl/anydoc一行安装,ClaudeCode、Codex、Cursor、OpenCode等兼容Agent即获"读任意文档"能力。
支持的格式: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。
技术与部署
核心用Rust编写,发布在crates.io(anydoc);绑定层用napi-rs(Node.js)、PyO3/maturin(Python)、wasm-bindgen(WASM)。
部署形态:CLI:npx @firecrawl/anydoc <file>,首次运行会下载预编译二进制;全局安装可用npm install -g @firecrawl/anydoc,支持--format csv、stdin、-o输出文件等。Node.js 库:npm install @firecrawl/anydoc,导出toDocument / toMarkdown / toMarkdownBytes。Python 库:pip install firecrawl-anydoc,提供todocument / tomarkdown / tomarkdownbytes。WASM 浏览器包:npm install @firecrawl/anydoc-wasm,文件本地转换,不上传。Rust crate:cargo add anydoc。
CI/CD:.github/workflows/release.yml在tagv<version>时同步发布crate、npm包与PyPIwheel;版本号三处保持一致(Cargo.toml、node/package.json、python/Cargo.toml)。
测试:tests/fixtures/提供snapshot黄金样本,tests/robustness.rs做mutation测试,fuzz/提供每个格式的cargo-fuzz目标,bench/跑速度与质量基准。
上手方式
# CLI(任意已支持格式)
npx @firecrawl/anydoc report.docx
npx @firecrawl/anydoc slides.pptx -o slides.md
npx @firecrawl/anydoc - --format csv < data.csv
# Agent Skill 安装
npx skills add firecrawl/anydoc
// Node.js
import { toMarkdown, toMarkdownBytes, toDocument } from '@firecrawl/anydoc';
const md = await toMarkdown('report.docx');
const fromBytes = await toMarkdownBytes(bytes); // 从内容自动识别格式
const fromCsv = await toMarkdownBytes(bytes, 'csv'); // 无签名格式需显式指定
const doc = await toDocument(bytes); // 拿原始 document 模型(可访问嵌入资源字节)
# Python
import anydoc
md = anydoc.to_markdown("report.docx")
md = anydoc.to_markdown_bytes(data) # 从内容自动识别格式
md = anydoc.to_markdown_bytes(data, "csv") # 无签名格式需显式指定
doc = anydoc.to_document(data) # 拿原始 document 模型
// Rust
let md = anydoc::to_markdown("report.docx")?;
let md = anydoc::to_markdown_bytes(&bytes, None)?; // 自动识别
let md = anydoc::to_markdown_bytes(&bytes, anydoc::Format::Csv)?;
let doc = anydoc::to_document(&bytes, None)?;
错误模型(Rust枚举,Node/Python暴露等价名):Unsupported(未知/纯图PDF)、Malformed、Encrypted、ResourceLimit、MissingPart、Io。Encrypted与Unsupported通常意味着无可用Markdown,应当跳过文件而不是中止流水线。
成熟度信号
由Firecrawl团队维护,已用于其商业Parse服务,来源文档即明确"powersFirecrawlParse"。
README内置100份真实文档×14格式的盲评基准(ClaudeSonnet5任裁判,482次成对对比去位置偏置),anydoc在completeness/structure/formatting/cleanliness四个维度均高于LibreOffice、unstructured、markitdown、pandoc、docling、mammoth。
基准显示:14/14格式支持、任何格式的judgedscore都最高、转换速度比第二名快一个数量级(中位4.4ms对pandoc102.1ms、libreoffice1129.5ms)。
测试覆盖:snapshot+mutation+fuzz;release用GitHubActions同步三端版本。
License:MIT。
局限与风险
文档格式识别依赖内容标记;CSV无内容标记,需要扩展名或显式format参数,否则会报错。
扫描型/纯图片PDF返回Unsupported,需要外接OCR(如FirecrawlParse托管API的OCR模型)才能继续;自托管用户需自行组合OCR方案。
加密/密码保护文件返回Encrypted,需在管道里单独处理。
README内的100文档基准语料"isnotredistributableandisnotintherepo",外部复现需要自备语料,结论不能直接挪用到其它数据集。
评分是Sonnet5的成对盲判,模型本身会随版本漂移,跨模型版本对比要谨慎。
文档展示的"highestoneveryjudgedformat"是基于项目方自维护基准得出,独立第三方复测较少;引用其结论时建议同时引用LibreOffice/unstructured等成熟基线做对照。
浏览器/WASM版本有体积与内存成本,单页demo可以接受,长文档或大批量仍应优先使用Node.js/Python绑定或CLI。
相似项目与差异
| anydoc | ||||
与Pandoc:pandoc在学术写作/Markdown互转上是金标准,但不覆盖PDF/EPUB/Office二进制旧格式;anydoc强在"来什么办公文档都能转成LLM-readyMarkdown"。
与LibreOffice / soffice:覆盖相似但速度慢1–2个数量级,输出样式噪声大,更适合人看而不是模型读。
与unstructured / markitdown:Python生态更友好、社区更厚;但anydoc在格式覆盖与盲评质量上都领先一截。
与Firecrawl 自家服务:自托管用本库;要省心/要OCR兜底扫描件直接调FirecrawlParse。
来源与核验时间
仓库:https://github.com/firecrawl/anydoc
crates.io:https://crates.io/crates/anydoc
npm:https://www.npmjs.com/package/@firecrawl/anydoc
PyPI:https://pypi.org/project/firecrawl-anydoc/
WASMdemo:https://firecrawl.github.io/anydoc/
AgentSkill注册:https://skills.sh/firecrawl/anydoc
许可证:MIT(见/firecrawl/anydoc/blob/main/LICENSE)
核验日期:2026-08-11(基于README主分支)
夜雨聆风