AI Agents · Leçon

Analyser des PDF avec PyMuPDF et pdfplumber

Extrayez par programmation le texte, les tableaux et les métadonnées des PDF.

Leçon 1 sur 413 étapes

Analyser des PDF avec PyMuPDF et pdfplumber est une leçon AI Agents gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Agents, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Agents comprend 4 leçons au total.

Pourquoi l'analyse des PDF est complexe

Les PDF sont un format de présentation, et non un format de données. Le texte y est stocké sous forme de glyphes positionnés, et non de paragraphes logiques. L'extraction d'un texte pertinent nécessite de comprendre la mise en page, l'ordre de lecture et les propriétés des polices, ainsi que de gérer des cas particuliers comme les mises en page à colonnes multiples, les en-têtes et pieds de page et les images intégrées.

Deux bibliothèques dominent : PyMuPDF (rapidité) et pdfplumber (extraction de tableaux).

Bases de PyMuPDF

PyMuPDF (importé sous le nom fitz) est la bibliothèque Python de PDF la plus rapide. Elle gère l'extraction de texte, les métadonnées, les images et le rendu. Installez-la avec pip install pymupdf.

import fitz  # PyMuPDF

# Open a PDF
doc = fitz.open('document.pdf')

print(f'Pages: {len(doc)}')
print(f'Metadata: {doc.metadata}')

# Extract text from all pages
full_text = ''
for page_num in range(len(doc)):
    page = doc[page_num]
    text = page.get_text()  # plain text extraction
    full_text += f'--- Page {page_num + 1} ---\n{text}\n'

doc.close()
print(full_text[:500])

Modes d'extraction de texte de PyMuPDF

page.get_text() accepte différents formats de sortie. Utilisez 'text' pour du texte brut, 'blocks' pour des blocs de texte avec leurs cadres englobants et 'dict' pour une sortie structurée riche comprenant notamment les noms et les tailles des polices.

import fitz

doc = fitz.open('report.pdf')
page = doc[0]

# Mode 1: plain text
plain = page.get_text('text')

# Mode 2: blocks (each block has bbox + text)
blocks = page.get_text('blocks')
for block in blocks:
    x0, y0, x1, y1, text, block_no, block_type = block
    if block_type == 0:  # text block (1 = image)
        print(f'Block at ({x0:.0f},{y0:.0f}): {text[:80]}')

# Mode 3: dict (full detail including font info)
page_dict = page.get_text('dict')
for block in page_dict['blocks']:
    if block.get('type') == 0:  # text
        for line in block['lines']:
            for span in line['spans']:
                print(f"Font: {span['font']}, Size: {span['size']:.1f}, Text: {span['text']}")

doc.close()

Extraction des métadonnées des pages

Les métadonnées des pages aident les agents à comprendre la structure du document : nombre de pages, titre du document, auteur, date de création et dimensions des pages. PyMuPDF fournit toutes ces informations.

import fitz

def extract_pdf_metadata(filepath):
    doc = fitz.open(filepath)
    meta = doc.metadata
    info = {
        'title':    meta.get('title', 'Unknown'),
        'author':   meta.get('author', 'Unknown'),
        'subject':  meta.get('subject', ''),
        'creator':  meta.get('creator', ''),
        'created':  meta.get('creationDate', ''),
        'modified': meta.get('modDate', ''),
        'pages':    len(doc),
        'page_size': {
            'width':  doc[0].rect.width,
            'height': doc[0].rect.height
        }
    }
    doc.close()
    return info

meta = extract_pdf_metadata('contract.pdf')
print(f"Title: {meta['title']}, Pages: {meta['pages']}")

pdfplumber pour l'extraction de tableaux

pdfplumber excelle dans l'extraction de tableaux à partir de PDF. Il utilise une analyse géométrique pour détecter les limites des cellules, même dans les PDF dépourvus de balisage explicite des tableaux.

Installez-le avec pip install pdfplumber.

import pdfplumber

with pdfplumber.open('financial_report.pdf') as pdf:
    for page_num, page in enumerate(pdf.pages):
        tables = page.extract_tables()
        for table_idx, table in enumerate(tables):
            print(f'Page {page_num+1}, Table {table_idx+1}:')
            # table is a list of rows; each row is a list of cell strings
            headers = table[0]
            for row in table[1:]:
                row_dict = dict(zip(headers, row))
                print(row_dict)

Paramètres des tableaux de pdfplumber

L'extraction de tableaux de pdfplumber peut être réglée à l'aide de paramètres pour gérer différents styles de tableaux : lignes explicites, colonnes séparées par des espaces ou mises en page mixtes.

import pdfplumber

# Custom table settings for borderless tables
table_settings = {
    'vertical_strategy':   'text',   # 'lines', 'lines_strict', 'text', 'explicit'
    'horizontal_strategy': 'text',
    'snap_tolerance':       5,
    'join_tolerance':       3,
    'edge_min_length':     50,
    'min_words_vertical':   3,
    'min_words_horizontal': 1
}

with pdfplumber.open('nolines_table.pdf') as pdf:
    page = pdf.pages[0]
    table = page.extract_table(table_settings)
    if table:
        import csv
        import io
        output = io.StringIO()
        writer = csv.writer(output)
        writer.writerows(table)
        csv_string = output.getvalue()
        print(csv_string[:300])

Gestion des mises en page à colonnes multiples

Les articles universitaires et les journaux utilisent des mises en page à colonnes multiples. Une extraction de texte naïve lit les colonnes de gauche à droite, ce qui produit un texte incohérent. Pour y remédier, triez d'abord les blocs de texte par colonne.

import fitz

def extract_multicolumn_text(page, n_columns=2):
    page_width = page.rect.width
    col_width = page_width / n_columns

    blocks = page.get_text('blocks')
    # Filter text blocks only
    text_blocks = [b for b in blocks if b[6] == 0]

    # Assign each block to a column based on x position
    columns = [[] for _ in range(n_columns)]
    for block in text_blocks:
        x0 = block[0]
        col_idx = min(int(x0 / col_width), n_columns - 1)
        columns[col_idx].append(block)

    # Sort each column by vertical position
    for col in columns:
        col.sort(key=lambda b: b[1])  # sort by y0

    # Read columns left to right
    full_text = ''
    for col in columns:
        for block in col:
            full_text += block[4] + '\n'
    return full_text

Filtrage des en-têtes et pieds de page

Les en-têtes et pieds de page des PDF se répètent sur chaque page et parasitent le texte extrait. Repérez-les grâce à leur position verticale (dans les 10 % supérieurs ou inférieurs de la page) et excluez-les de l'extraction du contenu.

import fitz

def extract_without_headers_footers(page, margin_ratio=0.08):
    page_height = page.rect.height
    top_margin = page_height * margin_ratio
    bottom_margin = page_height * (1 - margin_ratio)

    blocks = page.get_text('blocks')
    content_blocks = []

    for block in blocks:
        x0, y0, x1, y1, text, block_no, block_type = block
        if block_type != 0:
            continue  # skip image blocks
        # Skip blocks in header or footer zone
        if y0 < top_margin or y1 > bottom_margin:
            continue
        content_blocks.append(text)

    return '\n'.join(content_blocks)

Découpage du texte des PDF pour les agents

Les PDF longs doivent être divisés en segments pour la vectorisation et la récupération. Découpez-les à des limites naturelles : paragraphes, sections ou pages. Incluez un chevauchement entre les segments afin d'éviter de couper le contexte au milieu d'une phrase.

import fitz

def pdf_to_chunks(filepath, chunk_size=1000, overlap=200):
    doc = fitz.open(filepath)
    chunks = []

    for page_num in range(len(doc)):
        page = doc[page_num]
        page_text = page.get_text()

        # Split into chunks with overlap
        start = 0
        while start < len(page_text):
            end = start + chunk_size
            chunk = page_text[start:end]
            chunks.append({
                'text': chunk,
                'page': page_num + 1,
                'char_start': start,
                'source': filepath
            })
            start += chunk_size - overlap  # overlap

    doc.close()
    return chunks

chunks = pdf_to_chunks('research_paper.pdf')
print(f'Total chunks: {len(chunks)}')
print(f'Sample: {chunks[0]["text"][:200]}')

Combiner PyMuPDF et pdfplumber

Utilisez PyMuPDF pour l'extraction de texte (plus rapide) et pdfplumber pour la détection des tableaux (plus précis). Un extracteur combiné exécute les deux bibliothèques sur chaque page et renvoie un contenu structuré dans lequel le texte et les tableaux sont séparés.

import fitz
import pdfplumber

def full_pdf_extract(filepath):
    result = {'text_by_page': [], 'tables': []}

    # Text extraction with PyMuPDF
    doc = fitz.open(filepath)
    for i in range(len(doc)):
        text = extract_without_headers_footers(doc[i])
        result['text_by_page'].append({'page': i + 1, 'text': text})
    doc.close()

    # Table extraction with pdfplumber
    with pdfplumber.open(filepath) as pdf:
        for page_num, page in enumerate(pdf.pages):
            tables = page.extract_tables()
            for t in tables:
                result['tables'].append({
                    'page': page_num + 1,
                    'headers': t[0] if t else [],
                    'rows': t[1:] if t and len(t) > 1 else []
                })

    return result

Enregistrer le texte extrait dans des fichiers

Après avoir extrait le texte des PDF, enregistrez-le dans un format que les agents en aval peuvent exploiter. Les fichiers en texte brut conviennent bien aux chaînes de vectorisation ; JSON préserve la structure des pages pour le suivi des citations.

import json, os

class FakePage:
    def __init__(self, text): self.text = text
    def get_text(self): return self.text

class FakeDoc(list):
    def close(self): pass

def fitz_open(path):
    return FakeDoc([FakePage('Page 1 text'), FakePage('Page 2 text')])

def pdf_to_text_file(pdf_path, output_dir):
    doc = fitz_open(pdf_path)
    base = os.path.splitext(os.path.basename(pdf_path))[0]
    txt_path = os.path.join(output_dir, base + '.txt')
    with open(txt_path, 'w', encoding='utf-8') as f:
        for i, page in enumerate(doc):
            f.write(f'--- Page {i+1} ---\n{page.get_text()}\n')
    json_path = os.path.join(output_dir, base + '.json')
    pages = [{'page': i+1, 'text': p.get_text()} for i, p in enumerate(doc)]
    with open(json_path, 'w') as f:
        json.dump({'source': pdf_path, 'pages': pages}, f, indent=2)
    doc.close()
    print(f'Saved: {txt_path} and {json_path}')
    return txt_path, json_path

pdf_to_text_file('sample.pdf', '.')

Vérification des connaissances

Quelle bibliothèque Python est la mieux adaptée à l'extraction de tableaux à partir de fichiers PDF ?

Récapitulatif : analyse de PDF avec PyMuPDF et pdfplumber

PyMuPDF (fitz) est le choix rapide pour l'extraction de texte, des métadonnées et la gestion des mises en page à plusieurs colonnes. pdfplumber excelle dans l'extraction des tableaux grâce à des stratégies géométriques configurables.

Techniques clés : utilisez get_text('blocks') pour une extraction tenant compte des positions, filtrez les en-têtes et pieds de page selon leur position verticale, gérez les mises en page à plusieurs colonnes en triant les blocs par colonne, et découpez le texte avec chevauchement pour les systèmes de récupération destinés aux agents. Combinez les deux bibliothèques pour obtenir les meilleurs résultats.

Gratuit pour commencer

Apprends AI Agents avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
60
Leçons
239

Questions Fréquemment Posées

La leçon « Analyser des PDF avec PyMuPDF et pdfplumber » est-elle gratuite ?

Oui — le texte complet de « Analyser des PDF avec PyMuPDF et pdfplumber » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Agents, passe à CoddyKit PRO. Le cours AI Agents comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Analyser des PDF avec PyMuPDF et pdfplumber » ?

Extrayez par programmation le texte, les tableaux et les métadonnées des PDF. Tu pratiques AI Agents avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer AI Agents ?

Aucune expérience préalable n'est requise. AI Agents sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Analyser des PDF avec PyMuPDF et pdfplumber » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon AI Agents ?

Oui. Chaque leçon AI Agents inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Analyser des PDF avec PyMuPDF et pdfplumber
  2. OCR pour les documents numérisés
  3. Agents de questions-réponses sur plusieurs documents
  4. Classification et routage des documents
← Retour à AI Agents