Extraire des tableaux d'un PDF vers Markdown
Demandez à quiconque convertit régulièrement des PDF ce qui casse le plus souvent : la réponse est presque toujours la même, les tableaux. Titres, paragraphes et listes se convertissent de façon fiable ; les tableaux sont la partie à vérifier visuellement à chaque fois.
Cet article explique pourquoi les tableaux sont structurellement difficiles dans le format PDF, comment les convertisseurs modernes les reconstruisent en pipe tables Markdown, quelles fonctionnalités de tableau Markdown ne peut absolument pas exprimer, et comment vérifier un tableau converti au lieu de lui faire aveuglément confiance.
Le PDF n'a pas de tableaux — c'est tout le problème
Les documents Word, les pages HTML et les tableurs possèdent un véritable objet tableau : lignes, colonnes, cellules, fusions. Le format PDF n'a rien de tout cela. Ce qui ressemble à un tableau dans un PDF est un ensemble de fragments de texte placés à des coordonnées, plus, éventuellement, quelques lignes et rectangles dessinés à proximité.
Cela signifie qu'extraire un tableau n'est pas une récupération, mais une inférence. Le convertisseur doit décider quels fragments appartiennent à la même ligne, à quelle colonne chacun appartient, si une ligne proche est une bordure de cellule ou une décoration de page, et où le tableau se termine et où le paragraphe suivant commence.
C'est aussi pourquoi un même tableau peut se convertir parfaitement dans un PDF et mal dans un autre. La différence ne tient pas à la complexité du tableau, mais à la quantité d'indices que le document transporte : des lignes explicites et un alignement cohérent donnent au détecteur de quoi travailler ; leur absence le condamne à deviner.
Tableaux à lignes contre tableaux à espaces
Les tableaux à lignes, ceux qui ont des lignes visibles entre les cellules, sont le cas indulgent. Les lignes segmentent la page en régions, chaque région contient le texte d'une cellule, et le problème de reconnaissance de structure se réduit à l'ordre de lecture dans une grille connue. La plupart des convertisseurs, y compris celui de ce site, les gèrent bien.
Les tableaux sans bordures, alignés par des espaces, sont l'inverse. Sans lignes pour segmenter, le détecteur regroupe les fragments de texte par leurs coordonnées : les fragments dont les lignes de base s'alignent forment une ligne, ceux dont les positions x se regroupent forment une colonne. Un alignement même légèrement incohérent — une cellule décalée de deux points par rapport à sa colonne — peut se propager en valeurs mal attribuées.
Les états financiers exportés depuis des logiciels de reporting ont généralement des lignes et se convertissent proprement. Les tableaux collés depuis des présentations, les tableaux composés uniquement d'espacements et les tableaux coupés entre pages avec en-têtes répétés sont les cas sans bordures et fragmentés où l'inspection est non négociable.
Comment la reconnaissance de structure reconstruit la grille
Le moteur PDF derrière le convertisseur de ce site effectue la reconnaissance de structure de tableau dans le cadre de l'extraction : il détecte les régions de tableau sur la page, les segmente en lignes et colonnes, attribue chaque fragment de texte à une cellule et produit le résultat sous forme de pipe table Markdown à la GitHub.
Ce résultat est le dénominateur commun honnête, avec pertes mais utile. Une pipe table préserve la sémantique essentielle — quelle valeur appartient à quel en-tête de ligne et de colonne — tout en écartant les détails visuels comme les largeurs de colonnes, les ombrages de cellules et l'alignement, que Markdown n'a aucun moyen d'enregistrer.
La qualité de reconnaissance sur les benchmarks publics d'extraction de tableaux s'est nettement améliorée ces dernières années, et des moteurs comme celui-ci obtiennent des scores bien supérieurs à l'approche naïve consistant à copier un PDF et à le coller. Mais un score de benchmark est une moyenne, et votre tableau peut être en dessous. Des conseils de vérification suivent, et ils existent pour une raison.
Ce qui arrive dans votre Markdown
Une conversion propre ressemble exactement à ce qu'un humain écrirait : une ligne d'en-tête, une ligne de séparation et une ligne de pipes par ligne de données. Les cellules vides restent vides, les colonnes numériques gardent leurs valeurs, et le tableau s'affiche comme un vrai tableau sur GitHub, dans Obsidian et dans tous les moteurs de rendu Markdown courants.
Le contexte environnant survit aussi. Le paragraphe au-dessus du tableau, sa légende si elle était composée en texte normal, et les notes de bas de page en dessous se convertissent comme du contenu normal : le tableau garde son contexte au lieu de flotter sans explication.
Ce qui ne survit pas, c'est toute structure bidimensionnelle au-delà des lignes et colonnes. Les groupes de colonnes, les lignes de synthèse qui couvrent toute la largeur et les sous-en-têtes imbriqués sont aplaties en lignes supplémentaires ou fusionnés dans le texte des cellules. Les données sont toujours là ; la forme qu'elles avaient dans l'original ne l'est plus.
Cellules fusionnées et autres limites de GFM
Les pipe tables Markdown à la GitHub sont volontairement minimales. Elles ont exactement une ligne d'en-tête, aucune fusion de cellules, aucune fusion de lignes et aucun alignement au-delà de gauche/centré/droite par colonne. Tout ce qui est plus riche dans le PDF source doit être aplati pour tenir.
Une cellule fusionnée sur trois colonnes devient du texte dans la première cellule suivi de cellules vides, ou du texte répété dans chacune. Un en-tête à deux niveaux devient une seule ligne d'en-tête où les niveaux sont joints, parfois avec un séparateur. Que cet aplatissement soit acceptable dépend entièrement de ce que vous faites ensuite : lisible dans un document, avec pertes dans un import de tableur.
Si la destination a réellement besoin de la structure fusionnée, le tableau a dépassé Markdown, pas le convertisseur. L'export CSV depuis la source d'origine, ou l'import PDF propre à un tableur, est la meilleure voie pour ce tableau-là — un convertisseur ne devrait pas être forcé de faire semblant que la sémantique a survécu.
Vérifiez toujours les chiffres par échantillonnage
Les modes d'échec de la conversion de tableaux sont silencieux par nature. Une colonne décalée s'affiche comme un tableau parfaitement ordinaire avec une valeur au mauvais endroit. Une ligne coupée par un saut de page peut devenir deux lignes. Un signe moins lu comme un trait d'union transforme un négatif en positif sans changer l'apparence du tableau.
Vérifiez donc proportionnellement aux conséquences. Pour un tableau dans un article de blog, jetez un œil au rendu. Pour un tableau financier ou scientifique alimentant un rapport, comparez le nombre de lignes, les sommes de colonnes et un échantillon aléatoire de cellules avec l'original. Pour tout ce qui alimente un modèle ou une base de données, cette vérification fait partie du pipeline, ce n'est pas une étape optionnelle.
Le convertisseur aide là où il peut : les pages dont les tableaux semblent nécessiter une révision sont signalées dans les avertissements de conversion au lieu d'être passées sous silence. Traitez ces signaux comme des pointeurs vers exactement les lignes à vérifier en premier.
Acheminer les tableaux plus loin avec Pandoc
Une fois qu'un tableau est une pipe table Markdown, il est un citoyen de premier ordre du moteur Pandoc qui alimente les autres formats de sortie de ce site. Choisissez la sortie HTML et le tableau devient un véritable balisage <table> ; choisissez LaTeX et il devient un tabular ; choisissez RST et il devient une syntaxe grid.
Cette seconde étape est sans perte en ce sens que Pandoc analyse la pipe table dans un modèle de document avant d'écrire : l'alignement des colonnes et la structure d'en-tête sont préservés dans chaque format. Ce qui a été perdu au moment du PDF vers Markdown ne revient pas, mais rien de plus ne se perd non plus.
Pour la plupart des flux de travail, la chaîne s'arrête au Markdown parce que c'est ce que parle la destination. Quand ce n'est pas le cas — un article LaTeX, un site Sphinx — le chemin de conversion est déjà là, à un menu déroulant de distance, sur le même pipeline local et privé.