anydoc : Convertissez n'importe quel document bureautique en Markdown propre en quelques millisecondes

anydoc est une bibliothèque Rust rapide qui convertit Word, PowerPoint, Excel, PDF et plus encore en Markdown propre. Avec des liaisons Node.js, Python et WASM, c'est le convertisseur le plus rapide et le plus complet disponible.

anydoc : Convertissez n'importe quel document bureautique en Markdown propre en quelques millisecondes

Si vous avez déjà essayé de fournir un fichier .docx ou .pptx à un LLM, vous connaissez la douleur. La plupart des convertisseurs sont lents, produisent une sortie désordonnée ou ne prennent en charge qu'une poignée de formats. anydoc de Firecrawl vise à résoudre ce problème une fois pour toutes : une bibliothèque pure Rust qui convertit Word, PowerPoint, Excel, OpenDocument, RTF, EPUB, CSV et PDF en Markdown propre compatible GitHub (GFM) en moins de 5 millisecondes par document.

Développé par l'équipe derrière Firecrawl, anydoc est le moteur qui alimente Firecrawl Parse. Il est maintenant open source, avec des liaisons pour Node.js, Python et WebAssembly, ainsi qu'une compétence d'agent pour que vos agents IA puissent lire les documents nativement.

Pourquoi anydoc ?

Le problème avec les convertisseurs de documents en Markdown existants est triple :

  1. Vitesse : LibreOffice prend plus d'une seconde par document. anydoc le fait en 4,4 ms en médiane.
  2. Couverture des formats : La plupart des outils ne prennent en charge que quelques formats. anydoc gère 14 formats différents dès le départ.
  3. Cohérence : Chaque convertisseur a ses propres particularités. anydoc canalise tout à travers un modèle de document unique, de sorte que la sortie est uniforme pour tous les formats.

Dans leur benchmark contre six autres convertisseurs (LibreOffice, unstructured, markitdown, pandoc, docling, mammoth), anydoc a obtenu le score le plus élevé pour chaque format pris en charge et était 10 fois plus rapide que l'outil le plus rapide suivant.

Pour commencer

CLI

Le moyen le plus rapide d'essayer anydoc est via npx :

npx @firecrawl/anydoc report.docx # Markdown vers stdout
npx @firecrawl/anydoc slides.pptx -o slides.md # ou vers un fichier
npx @firecrawl/anydoc - --format csv < data.csv # lire stdin

Pour une installation permanente :

npm install -g @firecrawl/anydoc

Node.js

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

// Depuis un chemin de fichier :
const markdown = await toMarkdown('report.docx');

// Depuis des octets, avec détection automatique du format :
const fromBytes = await toMarkdownBytes(bytes);

// Ou spécifiez le format explicitement (nécessaire pour CSV) :
const fromCsv = await toMarkdownBytes(bytes, 'csv');

// Ou obtenez le modèle de document avec les ressources intégrées :
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 (Navigateur)

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

Fonctionnalités importantes

Structure complète du document

anydoc préserve tout ce que vous attendez d'un document riche :

  • Titres avec ancres
  • Gras, italique, barré
  • Code en ligne et blocs de code
  • Liens et références croisées internes
  • Listes à puces, numérotées, imbriquées et de tâches (avec numérotation d'origine)
  • Tableaux avec cellules fusionnées et lignes d'en-tête
  • Citations en bloc
  • Notes de bas de page et notes de fin
  • Notes de l'orateur (de PowerPoint)

Ressources intégrées

Les images et objets intégrés sont rendus comme texte alternatif en Markdown, mais les octets bruts sont disponibles sur le modèle de document, étiquetés avec leur type de média. Les images externes deviennent des images Markdown standard.

Détection de format basée sur le contenu

Au lieu de se fier aux extensions de fichier, anydoc lit les octets réels pour détecter le format : en-tête PDF, groupe ouvert RTF, noms de flux OLE, type MIME du package ZIP. Cela signifie que les fichiers mal étiquetés sont toujours convertis correctement.

Support PDF intégré

Les PDF textuels sont convertis localement à l'aide de pdf-inspector — aucun service OCR requis. Pour les PDF scannés, vous auriez besoin de l'API hébergée de Firecrawl avec des modèles OCR.

Prêt pour les agents

anydoc est fourni comme une compétence d'agent :

npx skills add firecrawl/anydoc

Cela fonctionne avec Claude Code, Codex, Cursor, OpenCode et d'autres agents compatibles.

Benchmark : anydoc contre les autres

Voici comment anydoc se compare à d'autres convertisseurs populaires sur 100 documents réels couvrant 14 formats (scores sur 100, plus c'est mieux) :

Outil Formats ms médiane Score Complétude Structure Formatage Propreté
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

Par format, anydoc gagne ou fait match nul sur chaque format. Par exemple, sur .docx, il obtient 88 contre 70 pour mammoth, et sur .pptx, il obtient 74 contre 66 pour markitdown.

Le benchmark utilise un juge LLM (Claude Sonnet 5) pour comparer les sorties en aveugle par rapport aux images de vérité terrain des six premières pages. Chaque paire est jugée deux fois pour annuler le biais de position, totalisant 482 verdicts.

Comment ça marche

L'architecture d'anydoc est élégante : chaque analyseur de format produit une sortie vers un modèle de document partagé, qui passe ensuite par un sérialiseur GFM unique. Cela signifie que les corrections apportées à un format s'appliquent automatiquement à tous les autres.

Octets du document
│
├─► détection de format → marqueurs de contenu, pas l'extension
│
├─► analyseur de format → un par format (doc, docx, ppt, pptx, xls,
│ xlsx, odt/ods/odp, rtf, epub, csv)
│ │
│ └─► Document → modèle partagé : blocs, inlines, tableaux,
│ notes de bas de page, ressources
│ │
│ └─► Sérialiseur GFM → Markdown
│
└─► PDF → pdf-inspector → Markdown directement

Gestion des erreurs

anydoc renvoie une ConvertError avec des variantes spécifiques :

  • Unsupported – Format inconnu ou PDF image uniquement
  • Malformed – Fichier structurellement inutilisable
  • Encrypted – Protégé par mot de passe
  • ResourceLimit – Limites de sécurité dépassées (décompression, imbrication, etc.)
  • MissingPart – Partie requise absente
  • Io – Erreur de lecture de fichier (uniquement depuis to_markdown)

Dans Node et WASM, la variante est sur error.code ; en Python, il y a une sous-classe par variante.

Développement

anydoc est open source (MIT) et activement développé. Vous pouvez exécuter les tests, contribuer ou simplement explorer le code source :

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

Le dépôt comprend un corpus de fixtures avec des tests de snapshot, des tests de mutation et des cibles de fuzzing pour chaque format.

Conclusion

Si vous construisez un pipeline qui ingère des documents bureautiques et a besoin de Markdown propre et structuré pour les LLM, anydoc change la donne. C'est rapide, complet et cohérent. Que vous l'utilisiez via CLI, Node.js, Python ou dans le navigateur, c'est le meilleur outil que nous ayons vu pour ce travail.

Essayez la démo en direct dans votre navigateur — les fichiers sont traités localement via WebAssembly, donc rien ne quitte votre machine.

Source

firecrawl/anydoc : Convertissez Word, PowerPoint, Excel, OpenDocument, RTF, EPUB, CSV et PDF en Markdown propre. Construit en Rust, avec des liaisons Node.js et Python.