anydoc: あらゆるオフィス文書を数ミリ秒でクリーンなMarkdownに変換

anydocは、Word、PowerPoint、Excel、PDFなどをクリーンなMarkdownに変換する高速なRustライブラリです。Node.js、Python、WASMバインディングを備え、最速かつ最も完全なコンバーターです。

anydoc: あらゆるオフィス文書を数ミリ秒でクリーンなMarkdownに変換

.docx.pptxファイルをLLMに読み込ませようとしたことがあるなら、その苦痛をご存知でしょう。ほとんどのコンバーターは遅く、出力が乱雑で、対応フォーマットも限られています。Firecrawlのanydocはこれを完全に解決することを目指しています。純粋なRustライブラリで、Word、PowerPoint、Excel、OpenDocument、RTF、EPUB、CSV、PDFをクリーンなGitHub Flavored Markdown(GFM)に、文書あたり5ミリ秒未満で変換します。

Firecrawlのチームによって開発されたanydocは、Firecrawl Parseを支えるエンジンです。現在はオープンソース化されており、Node.js、Python、WebAssembly向けのバインディングに加え、Agent Skillも提供されているため、AIエージェントがドキュメントをネイティブに読み取ることができます。

なぜanydocなのか?

既存のドキュメントからMarkdownへのコンバーターの問題は、次の3つです。

  1. 速度: LibreOfficeは文書あたり1秒以上かかります。anydocは中央値4.4ミリ秒です。
  2. フォーマット対応範囲: ほとんどのツールは数種類のフォーマットしかサポートしていません。anydocは14種類のフォーマットを標準で処理します。
  3. 一貫性: 各コンバーターには独自の癖があります。anydocはすべてを単一のドキュメントモデルに集約するため、全フォーマットで出力が均一です。

他の6つのコンバーター(LibreOffice、unstructured、markitdown、pandoc、docling、mammoth)とのベンチマークでは、anydocはサポートするすべてのフォーマットで最高スコアを獲得し、次に速いツールより10倍高速でした。

はじめに

CLI

anydocを試す最も簡単な方法はnpxです。

npx @firecrawl/anydoc report.docx # Markdownを標準出力へ
npx @firecrawl/anydoc slides.pptx -o slides.md # またはファイルへ
npx @firecrawl/anydoc - --format csv < data.csv # 標準入力から読み取り

恒久的にインストールする場合:

npm install -g @firecrawl/anydoc

Node.js

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

// ファイルパスから:
const markdown = await toMarkdown('report.docx');

// バイトから、フォーマットは自動検出:
const fromBytes = await toMarkdownBytes(bytes);

// またはフォーマットを明示的に指定(CSVで必要):
const fromCsv = await toMarkdownBytes(bytes, 'csv');

// または埋め込みアセットを含むドキュメントモデルを取得:
const document = await toDocument(bytes);

Python

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)

WebAssembly(ブラウザ)

npm install @firecrawl/anydoc-wasm
import init, { toMarkdownBytes, toDocument } from '@firecrawl/anydoc-wasm';
await init();
const markdown = toMarkdownBytes(bytes);

Rust

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)?;

重要な機能

完全なドキュメント構造

anydocは、リッチドキュメントに期待されるすべてを保持します。

  • アンカー付き見出し
  • 太字、斜体、取り消し線
  • インラインコードとコードブロック
  • リンクと内部相互参照
  • 箇条書き、番号付き、ネスト、タスクリスト(元の番号を保持)
  • 結合セルとヘッダー行を含むテーブル
  • ブロック引用
  • 脚注と文末脚注
  • スピーカーノート(PowerPointから)

埋め込みアセット

画像や埋め込みオブジェクトはMarkdownでは代替テキストとしてレンダリングされますが、生のバイトはドキュメントモデルでメディアタイプとともに利用可能です。外部画像は標準的なMarkdown画像になります。

コンテンツベースのフォーマット検出

ファイル拡張子に頼るのではなく、anydocは実際のバイトを読み取ってフォーマットを検出します:PDFヘッダー、RTFオープングループ、OLEストリーム名、ZIPパッケージのmimetype。これにより、誤ったラベルのファイルでも正しく変換されます。

PDFサポート内蔵

テキストベースのPDFは、pdf-inspectorを使用してローカルで変換されます。OCRサービスは不要です。スキャンされたPDFの場合は、OCRモデルを備えたFirecrawlのホスト型APIが必要です。

エージェント対応

anydocはAgent Skillとして提供されます:

npx skills add firecrawl/anydoc

これはClaude Code、Codex、Cursor、OpenCode、その他の互換エージェントで動作します。

ベンチマーク:anydoc vs. 他ツール

14フォーマットにわたる100の実世界ドキュメントでのanydocと他の人気コンバーターの比較は次のとおりです(スコアは100点満点、高いほど良い):

ツール フォーマット 中央値(ms) スコア 完全性 構造 整形 清潔さ
anydoc 14/14 4.4 81 87 79 78 81
libreoffice 12/14 1129.5 40 59 42 40 24
unstructured 8/14 572.9 63 76 59 51 63
markitdown 6/14 134.8 65 78 66 60 52
pandoc 5/14 102.1 56 74 57 56 38
docling 4/14 513.6 57 60 60 57 51
mammoth 1/14 52.5 70 84 71 75 51

フォーマットごとに、anydocはすべてのフォーマットで勝利または同点です。例えば、.docxでは88点(mammothは70点)、.pptxでは74点(markitdownは66点)です。

ベンチマークでは、LLMジャッジ(Claude Sonnet 5)を使用して、最初の6ページのグラウンドトゥルース画像とブラインドで出力を比較します。各ペアは位置バイアスを打ち消すために2回判定され、合計482の判定が行われます。

仕組み

anydocのアーキテクチャはエレガントです:各フォーマットパーサーは共有ドキュメントモデルに出力し、その後単一のGFMシリアライザーを通過します。つまり、あるフォーマットへの修正は自動的に他のすべてのフォーマットに適用されます。

ドキュメントバイト
│
├─► フォーマット検出 → コンテンツマーカー、拡張子ではない
│
├─► フォーマットパーサー → フォーマットごとに1つ(doc、docx、ppt、pptx、xls、
│ xlsx、odt/ods/odp、rtf、epub、csv)
│ │
│ └─► Document → 共有モデル:ブロック、インライン、テーブル、
│ 脚注、アセット
│ │
│ └─► GFMシリアライザー → Markdown
│
└─► PDF → pdf-inspector → Markdownに直接

エラーハンドリング

anydocは特定のバリアントを持つConvertErrorを返します:

  • Unsupported – 不明なフォーマットまたは画像のみのPDF
  • Malformed – 構造的に使用できないファイル
  • Encrypted – パスワード保護
  • ResourceLimit – 安全制限を超えた(解凍、ネストなど)
  • MissingPart – 必要な部分が存在しない
  • Io – ファイル読み取りエラー(to_markdownからのみ)

NodeとWASMでは、バリアントはerror.codeにあります。Pythonでは、バリアントごとにサブクラスがあります。

開発

anydocはオープンソース(MIT)であり、活発に開発されています。テストを実行したり、貢献したり、コードベースを探索したりできます:

cargo test
cd node && npm install && npm run build && npm test
cd python && pip install maturin && maturin develop && python -m unittest discover -s tests

リポジトリには、フォーマットごとのスナップショットテスト、ミューテーションテスト、ファズターゲットを含むフィクスチャコーパスが含まれています。

結論

オフィスドキュメントを取り込み、LLM用のクリーンで構造化されたMarkdownが必要なパイプラインを構築しているなら、anydocはゲームチェンジャーです。高速で、包括的で、一貫性があります。CLI、Node.js、Python、ブラウザのいずれで使用しても、この仕事に最適なツールです。

ブラウザでライブデモをお試しください。ファイルはWebAssemblyを介してローカルで処理されるため、データが外部に送信されることはありません。

ソース

firecrawl/anydoc: Word、PowerPoint、Excel、OpenDocument、RTF、EPUB、CSV、PDFをクリーンなMarkdownに変換します。Rustで構築され、Node.jsとPythonバインディングを備えています。