Parsing de PDF : extraction de texte et de tableaux, OCR et exemples multi-langages

Extraire texte et tableaux des PDF : couches texte contre scans, OCR avec Tesseract et exemples en Python, JavaScript et Java.

ÉW
Équipe Web-Scraping.fr
Collecte de données pour votre activité
Publié le: 30 mars 2025

Le PDF est un format pensé pour l'impression et la lecture, pas pour le stockage de données. C'est pourquoi en extraire l'information de façon fiable est le plus difficile de tous les formats de notre panorama du parsing de documents. Les factures, contrats, spécifications, tarifs, relevés bancaires et documents administratifs arrivent en PDF — et il faut presque toujours les transformer en données structurées.

La bifurcation principale : texte ou image

Ce qui détermine toute la stratégie, c'est la façon dont le texte est stocké dans le fichier. Dans un PDF « numérique » (généré depuis Word, un outil de mise en page ou un navigateur), le texte existe sous forme de caractères sélectionnables — on peut l'extraire directement. Dans un PDF scanné, la page est une image : sans reconnaissance optique (OCR), il n'y a aucun caractère à extraire — le résultat sera vide. Le test est simple : si le texte se sélectionne à la souris dans une visionneuse, il est numérique ; sinon, il faut de l'OCR. Ces deux cas exigent des outils totalement différents, donc commencez toujours par cette vérification.

Extraire le texte des PDF numériques

Python

Pour extraire le texte et, surtout, les tableaux, le meilleur choix est pdfplumber. Il comprend les coordonnées des caractères et des lignes, et sait donc reconstituer la structure tabulaire.

python
import pdfplumber

with pdfplumber.open("invoice.pdf") as pdf:
    page = pdf.pages[0]

    text = page.extract_text()
    print(text)

    for table in page.extract_tables():
        for row in table:
            print(row)  # row — liste des cellules de la ligne du tableau

Quand seul le texte compte et que la vitesse importe, on prend PyMuPDF (importé sous le nom fitz) : très rapide, il respecte bien la mise en page.

python
import fitz  # PyMuPDF

doc = fitz.open("contract.pdf")
for page in doc:
    print(page.get_text())

Pour les tâches simples — extraction page par page ou métadonnées — pypdf (successeur de l'obsolète PyPDF2) suffit.

python
from pypdf import PdfReader

reader = PdfReader("report.pdf")
for page in reader.pages:
    print(page.extract_text())

JavaScript / Node.js

Sous Node, le moyen rapide de récupérer tout le texte d'un document est pdf-parse.

javascript
const fs = require("fs");
const pdf = require("pdf-parse");

const buffer = fs.readFileSync("invoice.pdf");
pdf(buffer).then((data) => {
  console.log(data.text);   // tout le texte
  console.log(data.numpages);
});

Quand il faut un contrôle bas niveau ou travailler dans le navigateur, on utilise pdf.js de Mozilla : il donne accès aux fragments de texte individuels avec leurs coordonnées.

Java

Dans les projets d'entreprise, Apache PDFBox est très répandu. Attention au changement d'API entre versions : dans PDFBox 3.x, le document s'ouvre via Loader.loadPDF(...), alors qu'en 2.x c'était PDDocument.load(...).

java
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import java.io.File;

try (PDDocument doc = Loader.loadPDF(new File("report.pdf"))) {
    String text = new PDFTextStripper().getText(doc);
    System.out.println(text);
}

Les tableaux : la vraie difficulté

Le PDF n'a pas de notion de « tableau » : ce que l'humain voit comme un tableau n'est qu'un ensemble de blocs de texte et de lignes avec des coordonnées. L'extraction de tableaux est donc toujours une heuristique. pdfplumber les reconstitue à partir des lignes de la grille et fonctionne bien quand le tableau est tracé. Pour les tableaux complexes sans lignes, on utilise en Python Camelot (méthode par tracé) ou tabula-py (surcouche du moteur Java Tabula). Si les tableaux sont nombreux et de même type, on choisit généralement un outil et on le calibre sur la maquette concernée.

Le plus pratique est souvent d'exporter directement le résultat en tableau : le traitement se poursuit alors dans Excel ou en CSV, comme pour toute source tabulaire.

Scans et OCR

Si le texte ne se sélectionne pas, il faut d'abord reconnaître la page. La pile classique en Python : rendu des pages en images (avec le même PyMuPDF) puis reconnaissance par le moteur Tesseract via la surcouche pytesseract.

python
import fitz
import pytesseract
from PIL import Image
import io

doc = fitz.open("scan.pdf")
for page in doc:
    pix = page.get_pixmap(dpi=300)              # rendu de la page en image
    img = Image.open(io.BytesIO(pix.tobytes()))
    text = pytesseract.image_to_string(img, lang="fra")
    print(text)

La qualité de l'OCR dépend fortement de la résolution (300 DPI minimum), de la propreté du scan et de la langue. Pour des documents en français, précisez impérativement le pack de langue fra. N'attendez pas de l'OCR une précision parfaite : le résultat demande presque toujours un post-traitement et une vérification.

Quand il vaut mieux ne pas parser le PDF « de front »

Il arrive que le document existe aussi dans un autre format : le même relevé est disponible en export CSV, ou une API fournit les données en JSON. C'est presque toujours plus fiable que d'extraire un tableau de la version imprimable — vérifiez donc la source avant de vous attaquer au PDF.

Le PDF est un format sans solution « universelle » : une facture, un contrat et un scan demandent des outils différents. Si vous traitez un flux régulier de documents homogènes — factures, bons, spécifications — nous mettons en place l'extraction de données PDF adaptée à votre maquette, tableaux et OCR des scans compris, avec livraison du résultat dans votre système.