乐于分享
好东西不私藏

Word、PPT、PDF 怎么喂给 AI?这个开源库一行搞定,速度比 LibreOffice 快 256 倍

Word、PPT、PDF 怎么喂给 AI?这个开源库一行搞定,速度比 LibreOffice 快 256 倍
橄榄手记 · 编辑部观察ISSUE {{002}}

firecrawl/anydoc

◉DOODLE

Github.com

RAG,AI
01

一句话摘要

由 Firecrawl 开源的Rust文档转换库,把Word、PowerPoint、Excel、OpenDocument、RTF、EPUB、CSV、PDF等14种办公文档统一转成GitHub-FlavoredMarkdown,并附带Node.js、Python与浏览器WebAssembly绑定,单文档中位转换时间<5ms。

02

适用场景

接收混合办公文档、需要统一Markdown输出再喂给LLM的RAG/Agent管道(典型用途:上传.docx/.pptx/.pdf后直接转给大模型)。

在浏览器或边缘环境里做本地转换:WebAssembly包支持浏览器内转换,文件不出设备,适合隐私敏感场景。

作为AgentSkill集成进ClaudeCode/Codex/Cursor/OpenCode等编码Agent,让Agent能读取任意办公文档。

Firecrawl自身的Parse服务后端:本库即该服务的核心转换组件;不想自托管可直接调用FirecrawlParse托管API(带OCR兜底扫描件)。

03

核心能力

统一输出: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。

04

技术与部署

核心用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/跑速度与质量基准。

05

上手方式

bash

# 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

ts

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

# 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

// 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,应当跳过文件而不是中止流水线。

06

成熟度信号

由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。

07

局限与风险

文档格式识别依赖内容标记;CSV无内容标记,需要扩展名或显式format参数,否则会报错。

扫描型/纯图片PDF返回Unsupported,需要外接OCR(如FirecrawlParse托管API的OCR模型)才能继续;自托管用户需自行组合OCR方案。

加密/密码保护文件返回Encrypted,需在管道里单独处理。

README内的100文档基准语料"isnotredistributableandisnotintherepo",外部复现需要自备语料,结论不能直接挪用到其它数据集。

评分是Sonnet5的成对盲判,模型本身会随版本漂移,跨模型版本对比要谨慎。

文档展示的"highestoneveryjudgedformat"是基于项目方自维护基准得出,独立第三方复测较少;引用其结论时建议同时引用LibreOffice/unstructured等成熟基线做对照。

浏览器/WASM版本有体积与内存成本,单页demo可以接受,长文档或大批量仍应优先使用Node.js/Python绑定或CLI。

08

相似项目与差异

工具
格式覆盖
转换质量基线
速度基线
备注
anydoc
14/14
81
4.4ms
统一Document模型+GFM序列化器
LibreOffice(soffice --convert-to)
12/14
40
1129.5ms
系统级重转换,慢且输出不够"LLM-ready"
unstructured
8/14
63
572.9ms
Python生态主力,PDF/HTML更擅长
markitdown(微软)
6/14
65
134.8ms
Python,简单场景够用
pandoc
5/14
56
102.1ms
文档转换金标准,但PDF/EPUB不支持
docling(IBM)
4/14
57
513.6ms
偏文档智能/布局分析
mammoth
1/14(仅docx)
70
52.5ms
经典docx→HTML/MD

与Pandoc:pandoc在学术写作/Markdown互转上是金标准,但不覆盖PDF/EPUB/Office二进制旧格式;anydoc强在"来什么办公文档都能转成LLM-readyMarkdown"。

与LibreOffice / soffice:覆盖相似但速度慢1–2个数量级,输出样式噪声大,更适合人看而不是模型读。

与unstructured / markitdown:Python生态更友好、社区更厚;但anydoc在格式覆盖与盲评质量上都领先一截。

与Firecrawl 自家服务:自托管用本库;要省心/要OCR兜底扫描件直接调FirecrawlParse。

09

来源与核验时间

仓库: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主分支)

END

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料