C'EST QUOI ?
anydoc est une bibliothèque Rust qui avale un document bureautique et recrache du Markdown GitHub-Flavored. Word, PowerPoint, Excel, OpenDocument, RTF, EPUB, CSV et PDF passent tous par le même modèle de document interne et le même sérialiseur, donc la sortie a la même tête quel que soit le format d'entrée. Elle existe en crate Rust, en paquet npm, en wheel Python, en WebAssembly et en CLI via npx.
POURQUOI C'EST INTÉRESSANT ?
- Un seul modèle de document en interne : chaque parseur de format alimente la même structure de blocs, d'inlines, de tableaux et de notes. Un correctif d'échappement de tableau écrit pour le docx bénéficie aussitôt au rtf, à l'odt et au reste.
- Structure conservée pour de vrai : titres avec ancres, listes imbriquées qui gardent leur numérotation source, tableaux à cellules fusionnées, notes de bas de page, notes de fin et commentaires de présentateur. Les équations OMML, MathML et RTF sortent en LaTeX
$...$et$$. - Détection de format par le contenu : en-tête PDF, groupe ouvrant RTF, noms de flux OLE, mimetype du paquet ZIP. Un fichier mal nommé se convertit quand même, sauf le CSV qui n'a aucun marqueur et réclame son extension.
- Local par défaut : Rust pur, aucun modèle ML, aucun service externe. Le crate Rust ne fait jamais d'appel réseau. Seuls les PDF scannés, qui échouent en
NeedsOcr, partent vers l'OCR hébergé Firecrawl Parse si tu l'actives explicitement. - Bindings qui ne bloquent pas : la conversion Node tourne sur le pool de threads libuv sans bloquer l'event loop, et le binding Python relâche le GIL. Types TypeScript et stubs Python sont livrés avec les paquets.
- Erreurs typées et exploitables :
Unsupported,NeedsOcravec la liste des pages concernées,Malformed,Encrypted,ResourceLimit,MissingPart. De quoi mettre un fichier de côté et passer au suivant dans un traitement par lot.
CAS D'USAGE
- Normaliser un lot hétérogène de documents bureautiques avant indexation dans un pipeline RAG
- Convertir des fichiers dans le navigateur via le build WebAssembly, sans que rien ne quitte la machine
- Donner à un agent la capacité de lire les documents qu'il croise, via
npx skills add firecrawl/anydoc - Extraire des tableaux Excel et OpenDocument en Markdown pour les commiter dans un dépôt
