ParseJet

Convertir un PDF en Markdown en Python

Convertir des PDF en Markdown est devenu une étape de prétraitement standard des pipelines RAG et des workflows LLM — le Markdown conserve les titres et les tableaux dont les modèles se servent pour comprendre la structure, pour une fraction des tokens. Python offre plusieurs bonnes options, chacune avec de vrais compromis. Voici les quatre qui comptent, avec du code fonctionnel pour chacune.

Pourquoi Markdown, et pourquoi c'est plus difficile qu'il n'y paraît

Les LLM traitent le Markdown remarquablement bien : les titres délimitent les sections, les tableaux à barres verticales gardent les données tabulaires alignées, et les listes restent des listes. Donner au modèle du texte brut extrait d'un PDF fait perdre tout cela — et lui donner le binaire PDF n'est pas une option pour la plupart des pipelines. C'est pourquoi presque toutes les stacks RAG sérieuses convertissent les documents en Markdown avant le chunking et l'embedding.

La difficulté, c'est que les PDF ne contiennent pas de structure — ils contiennent des caractères positionnés à des coordonnées x/y. Un convertisseur doit déduire quelles lignes sont des titres (d'après la taille de police), quels mots forment un tableau (d'après l'alignement) et quel est l'ordre de lecture (d'après l'analyse de la mise en page). Les bibliothèques diffèrent énormément sur ce point, et c'est pour cela que le choix compte.

Deuxième complication : les PDF scannés ne contiennent aucun texte, seulement des images de pages. Seules certaines des options ci-dessous les gèrent, via l'OCR.

Option 1 : PyMuPDF4LLM — rapide et léger

PyMuPDF4LLM est une fine surcouche de PyMuPDF (fitz) conçue pour les pipelines LLM : pip install pymupdf4llm, puis md = pymupdf4llm.to_markdown("doc.pdf") — une seule ligne, et c'est très rapide : la plupart des documents sont traités en bien moins d'une seconde.

Elle détecte les titres d'après les tailles de police, rend les tableaux en tableaux Markdown et peut émettre des blocs par page avec métadonnées, prêts à être ingérés dans LlamaIndex ou LangChain. Pour les PDF nativement numériques à la mise en page simple — rapports, documentation, articles sans mise en forme exotique — c'est un excellent choix par défaut.

Limites : pas d'OCR, donc les pages scannées reviennent vides. Les mises en page complexes en colonnes multiples et les tableaux élaborés peuvent sortir dans le désordre, car les heuristiques sous-jacentes privilégient la vitesse sur l'analyse fine de la mise en page. Point licence : PyMuPDF est sous AGPL — parfait pour des outils internes, mais consultez votre équipe juridique avant de l'embarquer dans un produit commercial.

Option 2 : Marker — la meilleure qualité, GPU requis

Marker s'appuie sur un pipeline de modèles de deep learning pour la détection de la mise en page, l'ordre de lecture et la structure des tableaux, et produit le Markdown le plus fidèle de toutes les options open source — il gère les articles académiques en colonnes multiples, les tableaux complexes et même les équations.

Le prix à payer est l'infrastructure : des poids de modèles de plusieurs gigaoctets, un GPU pour une vitesse raisonnable (le CPU fonctionne mais lentement — souvent des dizaines de secondes par document) et un arbre de dépendances lourd, difficile à déployer en production ou en serverless.

Choisissez Marker quand la qualité de sortie sur les documents difficiles est la priorité absolue et que vous avez le matériel — convertir en masse un corpus académique sur une machine GPU est son terrain de jeu idéal. Pour un service léger ou une fonction serverless, le poids opérationnel l'élimine en général.

Option 3 : MarkItDown — le convertisseur tout-format de Microsoft

MarkItDown est la bibliothèque open source « tout vers Markdown » de Microsoft : pip install markitdown, puis MarkItDown().convert("doc.pdf").text_content. Sa force est l'étendue — la même API convertit PDF, DOCX, PPTX, XLSX, HTML et plus encore, ce qui explique son succès viral pour la préparation de données LLM.

Pour les PDF en particulier, son extraction est plus simple que celle des options dédiées : elle repose sur une extraction de texte basique, si bien que la détection des titres et la fidélité des tableaux restent derrière PyMuPDF4LLM et Marker, et les PDF scannés demandent une configuration OCR supplémentaire.

Choisissez MarkItDown quand il vous faut une seule dépendance couvrant de nombreux types de fichiers à qualité correcte — un script d'ingestion interne qui doit accepter « tout ce que les gens envoient » — plutôt que la meilleure sortie PDF possible.

Option 4 : une API hébergée — zéro dépendance

La quatrième option consiste à ne pas exécuter la conversion localement : envoyez le PDF en POST à une API de parsing et récupérez le Markdown. Avec ParseJet : resp = httpx.post("https://api.parsejet.com/v1/parse/auto/file", headers={"Authorization": "Bearer KEY"}, files={"file": open("doc.pdf", "rb")}) — le champ "text" de la réponse JSON est le Markdown.

Cette voie intègre l'OCR pour les pages scannées, n'exige ni poids de modèles ni bibliothèques natives, et fonctionne à l'identique dans une fonction serverless, un conteneur ou un notebook. Elle évite aussi entièrement la question de l'AGPL. Le compromis : un aller-retour réseau et un coût par document au-delà de l'offre gratuite (300 crédits/mois offerts ; un PDF coûte 3 crédits).

Choisissez l'API quand vous voulez un pipeline opérationnel aujourd'hui, quand vos PDF incluent des scans, ou quand vous déployez là où les dépendances lourdes font mal — Lambda, Cloud Run, Vercel.

Laquelle choisir ?

PDF nativement numériques, mises en page simples à modérées, la vitesse compte : PyMuPDF4LLM. C'est le meilleur rapport effort/qualité en pur Python.

Documents difficiles (articles en colonnes multiples, tableaux complexes) et un GPU disponible : Marker. Rien en open source ne surpasse sa qualité de sortie.

De nombreux types de fichiers via une seule bibliothèque, une qualité correcte suffit : MarkItDown.

Des PDF scannés dans le lot, un déploiement serverless, ou aucune envie de gérer des dépendances : l'API hébergée. Un appel HTTP, OCR inclus, même schéma de sortie pour chaque document.

Exemple complet : d'un dossier de PDF à des fichiers Markdown

Quelle que soit la voie choisie, la forme du pipeline reste la même — itérer, convertir, écrire. La voici avec l'API (remplacez l'appel interne par pymupdf4llm.to_markdown() pour tout exécuter localement) :

import httpx; from pathlib import Path — puis pour chaque pdf dans Path("pdfs/").glob("*.pdf") : resp = httpx.post("https://api.parsejet.com/v1/parse/auto/file", headers={"Authorization": "Bearer KEY"}, files={"file": pdf.read_bytes()}); Path("md/", pdf.stem + ".md").write_text(resp.json()["text"], encoding="utf-8").

Pour l'ingestion RAG, découpez le Markdown par titres plutôt que par nombre fixe de caractères — les chunks alignés sur les titres gardent les sections intactes et se retrouvent nettement mieux à la recherche. Cette fidélité structurelle est précisément la raison pour laquelle la conversion méritait d'être soignée.

Testez la conversion sans écrire de code

Déposez un PDF et voyez le Markdown que produit cette API — titres, tableaux et OCR pour les pages scannées inclus.

Convertir un PDF en Markdown gratuitement

Questions fréquentes

Quelle est la meilleure bibliothèque Python pour convertir un PDF en Markdown ?

Pour les PDF nativement numériques, PyMuPDF4LLM offre le meilleur rapport vitesse/qualité. Pour les mises en page difficiles avec un GPU disponible, Marker produit la meilleure qualité. Pour les PDF scannés ou un déploiement sans dépendances, une API hébergée comme ParseJet gère OCR et structure en un seul appel HTTP.

Comment convertir un PDF scanné en Markdown en Python ?

Les pages scannées ne contiennent aucun texte, il faut donc de l'OCR. En local, cela signifie câbler soi-même un moteur d'OCR ; la voie la plus simple est une API avec OCR intégré — ParseJet détecte les pages en image et les traite automatiquement dans la même requête.

MarkItDown est-il un bon choix pour convertir un PDF en Markdown ?

La force de MarkItDown est de convertir de nombreux formats (PDF, DOCX, PPTX, XLSX) via une seule bibliothèque. Pour les PDF en particulier, sa détection de structure est plus simple que celle de PyMuPDF4LLM ou Marker — suffisante pour une qualité correcte, mais pas le meilleur choix pour une extraction fidèle des titres et des tableaux.

Pourquoi convertir les PDF en Markdown pour le RAG plutôt qu'en texte brut ?

Le Markdown préserve les titres, les listes et les tableaux que le texte brut aplatit. Le chunking par titres retrouve mieux l'information à la recherche, et les LLM exploitent la structure pour comprendre le contexte — pour un coût en tokens à peu près identique.

Puis-je convertir un PDF en Markdown en Python sans rien installer ?

Oui — appelez une API de parsing en HTTP avec httpx ou requests. Envoyez le fichier en POST sur /v1/parse/auto/file de ParseJet : le champ "text" de la réponse est le Markdown. Les clés d'API gratuites incluent 300 crédits par mois.

Commencez à extraire du texte gratuitement

Aucune inscription requise. Analysez votre premier fichier en quelques secondes.

Voir les tarifs