Analyser des PDF avec PyMuPDF et pdfplumber
Extrayez par programmation le texte, les tableaux et les métadonnées des PDF.
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_textFiltrage 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 resultEnregistrer 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.
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
- Analyser des PDF avec PyMuPDF et pdfplumber
- OCR pour les documents numérisés
- Agents de questions-réponses sur plusieurs documents
- Classification et routage des documents