Une feuille épaisse traversée par une barre de lumière cyan, comme sous un scanner.

OCR open source et conversion de PDF en Markdown : quel outil choisir

Neuf outils libres tirent le texte et la structure de PDF et d'images, et c'est la page scannée qui les départage. PaddleOCR, Chandra et Falcon-Perception la lisent sur la machine avec un modèle téléchargé, tableaux et formules compris. Chandra et Falcon-Perception ne documentent aucune exécution sur CPU, à la différence de PaddleOCR, et les poids de Chandra ne sont libres d'usage commercial que sous 2 millions de dollars de chiffre d'affaires ou de levée. Tesseract.js lit le texte imprimé d'une image, dans le navigateur ou sous Node.js, sans PDF ni mise en page. MarkItDown, anydoc et Markdownify MCP passent en Markdown les documents qui contiennent déjà leur texte : un scan, MarkItDown l'envoie à un LLM, anydoc au service de son éditeur, et Markdownify MCP ne le lit pas. Unstract et Receipt OCR vont jusqu'au JSON : Unstract confie la lecture à un extracteur de texte puis à un LLM, Receipt OCR envoie la photo d'un ticket de caisse à un modèle de vision.

Moteur OCR, modèle de vision ou convertisseur : trois familles

Un moteur OCR classique rend le texte d'une image ligne par ligne, avec ses coordonnées. Tesseract.js porte le moteur Tesseract en WebAssembly sans le modifier ; PP-OCRv6, le modèle OCR par défaut de PaddleOCR, se décline en trois tailles, de 1,5 à 34,5 millions de paramètres. Ce texte positionné ne dit pas où sont les titres ni les cellules d'un tableau. Tesseract.js lit d'ailleurs l'image, par défaut, comme un seul bloc de texte. PaddleOCR ajoute pour cela PP-StructureV3, qui découpe la page et la rend en Markdown ou en JSON.

Un modèle vision-langage lit la page entière et en écrit directement la structure. Chandra rend du Markdown, du HTML ou du JSON avec la position de plus de 15 types de blocs, et convertit un logigramme en Mermaid. Falcon OCR, le modèle de 270 millions de paramètres que sert Falcon-Perception, transcrit le texte, les formules en LaTeX et les tableaux en HTML. PaddleOCR-VL associe un modèle de mise en page à un modèle de 0,9 milliard de paramètres ; sa documentation prévient qu'appelé seul, ce dernier ne reproduit pas les scores publiés et peut halluciner. Le README de Falcon-Perception annonce Falcon OCR 1.5 environ trois fois plus petit que PaddleOCR-VL et vingt fois plus petit que Chandra 2.

Un convertisseur de documents ne fait pas d'OCR : il lit le texte que contient déjà un fichier Word, Excel, PowerPoint ou un PDF natif, et le rend en Markdown pour un LLM. MarkItDown, de Microsoft, est écrit en Python ; anydoc, de Firecrawl, en Rust, sans modèle ni Python ; Markdownify MCP sert MarkItDown à un agent IA par le Model Context Protocol. Un PDF scanné n'a pas de couche texte : anydoc s'arrête alors sur une erreur NeedsOcr qui liste les pages en cause, et MarkItDown ne le lit qu'avec son plugin markitdown-ocr, qui envoie chaque page à un LLM.

Unstract et Receipt OCR ajoutent un étage : ils tirent d'un document des champs nommés, en JSON, par un LLM. Unstract décrit ces champs par des prompts, sur tout type de document, et confie l'OCR à l'extracteur de texte qu'on lui branche. Receipt OCR se limite aux tickets de caisse.

Ce que chaque outil demande pour tourner

Relevé dans les dépôts et les documentations le 7 octobre 2026.

OutilLicenceÀ faire tournerPages scannéesSortieDernière version
PaddleOCRApache-2.0, poids comprisPython et PaddlePaddle, Transformers ou ONNX Runtime ; un serveur d'inférence pour PaddleOCR-VL en productionoui, en localtexte positionné, Markdown, JSON, DOCX3.7.0, 11 juin 2026
ChandraApache-2.0 ; poids sous OpenRAIL-M modifiéePython 3.10, GPU NVIDIA de 16 à 80 Go pour vLLM, poids de 10,6 Gooui, en localMarkdown, HTML, JSON0.2.0, 18 mars 2026
Falcon-PerceptionApache-2.0, poids comprisPython 3.10 et PyTorch sur CUDA 12.8, ou MLX sur Mac Apple Siliconoui, en local ; PDF par l'image Dockertexte, LaTeX, tableaux HTML1.0.0, 7 avr. 2026
Tesseract.jsApache-2.0un navigateur ou Node.js 16 ; cœur et langues pris sur jsDelivr par défautimages seulement, pas de PDFtexte, mots positionnés, hOCR7.0.0, 15 déc. 2025
MarkItDownMIT ; plugin OCR lié à PyMuPDF (AGPL-3.0)Python 3.10 à 3.14par un LLM, avec le plugin markitdown-ocrMarkdown0.1.8, 21 sept. 2026
anydocMITcrate Rust, module Node.js 20, wheel Python ou WebAssemblynon ; une option envoie le document à Firecrawl ParseMarkdown0.2.4, 27 août 2026
Markdownify MCPMITNode.js, Bun à l'installation, Python et markitdownnonMarkdown1.1.0, 1er mai 2026
UnstractAGPL-3.025 services Docker, 8 Go de RAM libres ; un LLM, des embeddings, une base vectorielle, un extracteur de textepar l'extracteur branchéJSON par champs0.192.7, 7 oct. 2026
Receipt OCRMITPython 3.10, une clé d'API pour un modèle de vision compatible OpenAIpar le LLM, photos de tickets seulementJSON0.4.0, 6 oct. 2026

Les trois projets de modèles de vision ne demandent pas le même matériel. PaddleOCR-VL tourne en local pour une validation, mais sa documentation confie la production à un serveur d'inférence : vLLM, SGLang, FastDeploy, MLX-VLM ou llama.cpp. vLLM y exige une compute capability de 8.0 et CUDA 12.6, et la documentation déconseille les T4 et V100 ; sur CPU x64, PaddlePaddle, Transformers et llama.cpp sont pris en charge. Chandra lance par sudo un conteneur vLLM sur le runtime NVIDIA, avec des réglages prévus de la T4 de 16 Go à la H100 de 80 Go. Falcon-Perception tire PyTorch pour CUDA 12.8, qui exige un pilote NVIDIA 570 ou plus récent, ou MLX sur un Mac Apple Silicon, limité au moteur par lots. Son code dimensionne le cache à partir de 15 Gio de mémoire, et un utilisateur de deux RTX 3090 l'a vu en réclamer 56 au démarrage.

Les six autres outils ne demandent pas de GPU par eux-mêmes. Tesseract.js charge un cœur WebAssembly d'environ 3,9 Mo et les seules langues demandées, 0,7 Mo compressé pour le français. Sur un serveur Node.js, sa documentation conseille de recréer les workers, par exemple toutes les 500 tâches, parce que leur mémoire ne fait que croître. MarkItDown et anydoc sont des bibliothèques, sans service ni base. Unstract est à l'autre bout : son Compose lance 25 services, dont Postgres, Redis, RabbitMQ, MinIO et Qdrant, et son runner monte le socket Docker de l'hôte.

Ce qui part chez un tiers

Les modèles de vision et Tesseract.js lisent les pages sur la machine, une fois les poids ou les fichiers de langue téléchargés. Tesseract.js prend ces fichiers par défaut sur le CDN jsDelivr, avec le script du worker et le cœur WebAssembly : une application hors ligne doit les héberger et renseigner workerPath, corePath et langPath. Falcon-Perception tire ses modèles de Hugging Face au premier lancement, et la documentation de PaddleOCR installe PaddlePaddle depuis paddlepaddle.org.cn.

Chez les convertisseurs, l'envoi vers un tiers passe par une option ou un extra. MarkItDown passe une image entière à un client compatible OpenAI avec la consigne d'en écrire une légende détaillée : il en sort une description, pas une transcription. Son extra de transcription audio, que Markdownify MCP installe, envoie le son à l'API de reconnaissance vocale de Google, avec une clé générique que la bibliothèque SpeechRecognition réserve aux usages personnels ou de test. L'option --ocr hosted d'anydoc envoie le document entier, et pas seulement les pages scannées, à Firecrawl Parse ; le crate Rust, lui, ne fait jamais d'appel réseau.

Receipt OCR n'a aucun mode local documenté : chaque ticket part chez le fournisseur configuré, que la documentation limite à OpenAI, Gemini et Groq. Unstract peut tout garder sur le serveur, à condition de démarrer le conteneur Unstructured communautaire, que le script de lancement laisse de côté, et de servir le LLM et les embeddings en local, par Ollama par exemple. Ses autres extracteurs, LLMWhisperer et LlamaParse, sont des API en ligne.

Ce que chaque outil sait lire

Le PDF scanné se lit directement avec PaddleOCR et Chandra, et avec Unstract par son extracteur. Falcon-Perception prend des images ; un PDF de plusieurs pages ne passe que par son image Docker. Tesseract.js n'accepte aucun PDF, et sa FAQ conseille de rendre chaque page en image avec PDF.js ou muPDF. Receipt OCR refuse tout fichier qui n'est pas une image.

Le PDF natif passe aussi par les convertisseurs, avec des limites. MarkItDown extrait sa couche texte avec pdfminer : un PDF de prose sort en texte brut, sans titres, et seules les pages qui portent un tableau ou un formulaire ressortent en tableaux Markdown, via pdfplumber. anydoc lit les PDF à couche texte avec pdf-inspector, mais un ticket ouvert (#173) signale des tableaux multicolonnes écrasés en une seule colonne.

Sur une page scannée, tableaux et formules ne sortent que des modèles. PP-StructureV3 rend les tableaux avec les coordonnées de chaque cellule ; Chandra distingue tableau, formulaire, équation et cases à cocher ; Falcon OCR écrit les tableaux en HTML et les formules en LaTeX. Tesseract.js s'arrête au texte positionné, sans Markdown ni cellules de tableau.

L'écriture manuscrite figure dans le README de Chandra, qui montre de la cursive et des maths écrites à la main, et dans celui de Falcon-Perception, qui recommande son OCR de bout en bout pour les notes manuscrites. La FAQ de Tesseract.js l'exclut. Pour les langues, PP-OCRv6 en lit 50 avec un seul modèle et PaddleOCR-VL plus d'une centaine ; Chandra en annonce plus de 90 et Tesseract.js plus de 100. La fiche Hugging Face de Falcon OCR ne liste pas les siennes.

Les formats bureautiques anciens séparent les convertisseurs. anydoc lit les .doc, .ppt et .xls binaires, l'OpenDocument et le RTF, que MarkItDown n'accepte pas ; Unstract prend aussi DOC, PPT, ODT et ODP. MarkItDown lit en revanche le HTML, l'audio, les messages Outlook et les notebooks Jupyter, absents de la liste d'anydoc.

Où en sont les projets

PaddleOCR a publié six versions entre janvier et juin 2026, puis aucune : sa 3.7.0 date du 11 juin. Chandra en est à la 0.2.0 de mars 2026, sortie avec Chandra 2, et un développeur signe 75 des 82 commits attribués. Falcon-Perception n'a qu'une version, la 1.0.0 d'avril 2026, classée bêta, et Falcon OCR 1.5 n'existe que sur sa branche principale. Son serveur REST n'a aucune authentification documentée, et le signalement public d'une faille exploitable sans authentification (#37, 30 septembre 2026) restait sans réponse le 7 octobre. Tesseract.js sort une version majeure par an environ, chacune avec des ruptures d'API, et n'a reçu qu'un commit depuis sa v7 de décembre 2025 ; son paquet npm a été téléchargé 3,9 millions de fois la semaine du 28 septembre 2026.

MarkItDown reste en 0.1.x, classé bêta sur PyPI, et a publié sa 0.1.8 le 21 septembre 2026. anydoc, créé le 3 août 2026, a sorti ses quatorze versions en trois semaines d'août ; il n'a reçu aucun commit depuis le 28 août, et 64 pull requests attendent. Markdownify MCP n'a rien reçu sur sa branche principale depuis sa v1.1.0 du 1er mai 2026, et des failles signalées restent ouvertes, dont une SSRF par http://[::1] (CVE-2025-65512). Unstract va à l'inverse : 128 versions depuis janvier 2026, toujours en 0.x, et un script de lancement qui tire latest par défaut. Receipt OCR, maintenu par une personne, a publié le 6 octobre 2026 une v0.4.0 de maintenance, près d'un an après la précédente.

Licences des poids et offres payantes

Le code des neuf projets est libre : Apache-2.0 pour PaddleOCR, Chandra, Falcon-Perception et Tesseract.js, MIT pour MarkItDown, anydoc, Markdownify MCP et Receipt OCR, AGPL-3.0 pour Unstract. Les poids d'un modèle de vision ont leur propre licence. PaddleOCR et Falcon-Perception publient les leurs sous Apache-2.0. Ceux de Chandra relèvent d'une licence OpenRAIL-M modifiée par Datalab : libres pour l'usage personnel et la recherche, interdits pour tout autre usage dès que l'utilisateur, son employeur ou sa structure a dépassé 2 millions de dollars de chiffre d'affaires l'année précédente ou en a levé plus de 2 millions. Ils sont interdits à toute structure qui concurrence Datalab, quelle que soit sa taille, et ces restrictions couvrent aussi la sortie du modèle. MarkItDown est sous MIT, mais son plugin markitdown-ocr dépend de PyMuPDF, publié sous AGPL-3.0 ou sous licence commerciale d'Artifex.

Datalab vend une API hébergée qui fait tourner, selon le README, une version de Chandra plus précise que les poids ouverts ; sa formule Team coûte 400 dollars par mois. Firecrawl facture Parse, l'OCR hébergé d'anydoc, un crédit par page : 1 000 crédits gratuits par mois, puis de 16 dollars (facturation annuelle) à 599 dollars par mois. Le cloud d'Unstract démarre à 499 dollars par mois pour 5 000 pages, et son édition libre n'a ni SSO, ni relecture humaine, ni vérification de la réponse par un second LLM. MarkItDown se branche sur deux services Azure facturés à l'appel, Document Intelligence et Content Understanding. La documentation de PaddleOCR annonce de son côté une API gratuite jusqu'à 20 000 pages d'analyse de documents par jour, depuis le site de PaddleOCR, qui renvoie vers Baidu AI Studio. Tesseract.js, Falcon-Perception, Markdownify MCP et Receipt OCR n'ont pas d'offre payante, mais Receipt OCR demande une clé d'API dotée de crédits chez le fournisseur du LLM.