Guide
Extraire les tableaux d'un PDF en Python pour une IA
pdfplumber, Camelot, Docling : extraire les tableaux d'un PDF en Python, contrôler la qualité, les passer en Markdown sans perdre l'en-tête.
Mis à jour le
Pour extraire en Python les tableaux d'un PDF qui contient du texte (et non un scan), deux bibliothèques libres sous licence MIT font référence : pdfplumber, pour un contrôle fin, et Camelot, pour des tableaux prêts à exporter avec un indicateur de qualité. Pour une chaîne d'indexation, Docling extrait aussi les tableaux pendant la conversion en Markdown. Le point qui compte pour une IA : chaque tableau doit arriver entier, avec sa ligne d'en-tête et son numéro de page.
Pourquoi les tableaux posent problème
Dans un PDF, un tableau n'existe pas : il n'y a que des caractères placés à des coordonnées et des traits dessinés. Un extracteur de texte simple lit ligne à ligne et mélange les colonnes. Résultat dans l'index : « Délai 15 jours Tarif 120 » sans savoir quel délai va avec quel tarif. Ce sont pourtant souvent les tableaux qui portent les réponses attendues : prix, délais, références, seuils.
pdfplumber : lire la page en détail
pdfplumber se décrit comme un outil pour obtenir « des informations détaillées sur chaque caractère, rectangle et ligne » d'un PDF. Son dépôt prévient qu'il fonctionne mieux sur les PDF produits par un logiciel que sur les PDF scannés.
import pdfplumber
with pdfplumber.open("tarifs.pdf") as pdf:
for numero, page in enumerate(pdf.pages, start=1):
for tableau in page.extract_tables():
entete, *lignes = tableau
print(numero, entete, len(lignes))
extract_tables() renvoie tous les tableaux de la page sous la forme tableau → ligne → cellule ; extract_table() renvoie seulement le plus grand. Le réglage table_settings choisit comment repérer les bordures, avec vertical_strategy et horizontal_strategy : "lines" utilise les traits de la page, "text" l'alignement des mots, utile pour les tableaux sans bordure.
page.extract_tables(table_settings={"vertical_strategy": "text", "horizontal_strategy": "text"})
Camelot : des tableaux prêts à exporter
Camelot vise directement l'extraction de tableaux. Ses analyseurs intégrés demandent un PDF qui contient du texte. Plusieurs modes (flavor) : lattice par défaut, pour les tableaux à bordures ; stream et network, pour les tableaux sans bordure ; auto, qui choisit par page ; et ml pour les tableaux scannés ou sans bordure, avec l'installation pip install "camelot-py[ml,ocr]".
import camelot
tables = camelot.read_pdf("tarifs.pdf", flavor="stream")
for i, t in enumerate(tables):
print(t.parsing_report) # accuracy, whitespace, order, page
t.to_markdown(f"tarifs-{i}.md")
t.df donne le tableau sous forme de tableau pandas ; Camelot exporte aussi en CSV, JSON, Excel, HTML et SQLite, un tableau à la fois (to_csv, to_json…) ou tous d'un coup (tables.export("tarifs.csv", f="csv")). Le parsing_report donne, pour chaque tableau, sa page, un score de précision (accuracy) et un indicateur d'espace vide (whitespace) : un bon filtre pour repérer les tableaux à relire à la main.
Docling et les services de reconnaissance de caractères (OCR)
Si vous convertissez déjà vos documents avec Docling, ses tableaux sortent directement en Markdown ; l'option --table-mode choisit entre fast et accurate (par défaut). Côté services en ligne, Mistral OCR renvoie les tableaux à part, en Markdown ou en HTML selon table_format, et Azure Document Intelligence les extrait avec nombre de lignes, de colonnes et cellules fusionnées. La documentation d'Azure ajoute un conseil pour les tableaux sur plusieurs pages : découper le PDF par page avant l'analyse, puis recoller le tableau ensuite.
Préparer le tableau pour l'indexation
- Un tableau, un morceau. Ne coupez pas un tableau au milieu : la moitié basse perdrait son en-tête.
- Répétez l'en-tête si un tableau trop long doit être scindé.
- Ajoutez le contexte en tête du morceau : titre du document, titre de la section, page.
- Gardez la page source en métadonnée pour pouvoir citer (voir Métadonnées).
- Contrôlez les tableaux dont le
parsing_reportest faible, et ceux qui contiennent des prix.
md = open(f"tarifs-{i}.md", encoding="utf-8").read()
morceau = f"Document : Tarifs 2026, page {t.parsing_report['page']}\n\n{md}"
Le découpage général des documents est traité sur le site consacré au RAG (génération augmentée par récupération).
Et sans Python ?
Pour récupérer un tableau ponctuel vers Excel, sans code, la méthode est décrite sur la page dédiée à l'extraction d'un tableau de PDF vers Excel.
Exemple illustratif
Prenons un distributeur de matériel dont le catalogue PDF compte des tableaux sans bordure. Un passage de Camelot en stream, un tri des tableaux selon leur score de précision, puis une relecture des seuls tableaux douteux donne une base de prix fiable sans tout relire.
Questions fréquentes
pdfplumber ou Camelot pour extraire un tableau ?
pdfplumber donne un accès fin aux caractères, lignes et rectangles de la page et renvoie les tableaux en listes Python. Camelot renvoie des tableaux prêts à exporter (CSV, Markdown, Excel…) avec un rapport de qualité par tableau. Les deux travaillent sur des PDF qui contiennent du texte, pas sur des scans.
Comment extraire un tableau d'un PDF scanné ?
Il faut une reconnaissance de caractères capable de reconstruire les tableaux : Camelot propose pour cela un mode flavor="ml" avec l'installation camelot-py[ml,ocr], et des services comme Mistral OCR ou Azure Document Intelligence renvoient les tableaux à part.
Sources
Pages consultées pour écrire cet article :