Extrayez du texte à partir de PDF avec PDFMiner en Python
Maîtrisez l'extraction de texte PDF avec Python
PDFMiner.six est une bibliothèque puissante pour Python permettant d’extraire du texte, des métadonnées et des informations de mise en page à partir de documents PDF. Ce guide fait partie de notre Outils de documentation en 2026 : Markdown, LaTeX, PDF et workflows d’impression hub.
Contrairement aux lecteurs PDF simples, il fournit une analyse approfondie de la structure PDF et gère efficacement les mises en page complexes.

Qu’est-ce que PDFMiner et pourquoi l’utiliser ?
PDFMiner est une bibliothèque pure Python conçue pour extraire et analyser du texte à partir de documents PDF. La version .six est la branche activement maintenue qui prend en charge Python 3.x, tandis que le projet PDFMiner original n’est plus mis à jour.
Fonctionnalités clés :
- Implémentation pure Python (aucune dépendance externe)
- Analyse détaillée de la mise en page et positionnement du texte
- Détection de la police et de l’encodage des caractères
- Prise en charge des PDF chiffrés
- Outils en ligne de commande inclus
- Architecture extensible pour un traitement personnalisé
PDFMiner est particulièrement utile lorsque vous avez besoin d’un contrôle précis sur l’extraction du texte, de conserver des informations de mise en page ou de travailler avec des documents à colonnes multiples complexes. Bien qu’il puisse être plus lent que certaines alternatives, sa précision et ses capacités d’analyse détaillées en font le choix préféré pour les pipelines de traitement de documents. Pour le workflow inverse, vous pourriez également être intéressé par la génération de PDF programmable en Python.
Installation et configuration
Installez PDFMiner.six à l’aide de pip :
pip install pdfminer.six
Pour les environnements virtuels (recommandé) :
python -m venv venv
source venv/bin/activate # Sur Windows : venv\Scripts\activate
pip install pdfminer.six
Si vous êtes nouveau dans la gestion des packages Python, consultez notre Feuille de rappel Python pour plus de détails sur pip et les environnements virtuels.
Vérifiez l’installation :
pdf2txt.py --version
La bibliothèque inclut plusieurs outils en ligne de commande :
pdf2txt.py- Extraire du texte à partir de PDFdumppdf.py- Afficher la structure interne du PDFlatin2ascii.py- Convertir les caractères latins en ASCII
Ces outils complètent d’autres outils de manipulation de PDF comme Poppler qui offrent des fonctionnalités supplémentaires telles que l’extraction de pages et la conversion de formats.
Extraction de texte de base
Extraction de texte simple
La manière la plus directe d’extraire du texte d’un PDF :
from pdfminer.high_level import extract_text
# Extraire tout le texte d'un PDF
text = extract_text('document.pdf')
print(text)
Cette API de haut niveau gère la plupart des cas d’utilisation courants et renvoie le document entier sous forme de chaîne unique.
Extraire du texte à partir de pages spécifiques
Pour extraire du texte à partir de pages spécifiques :
from pdfminer.high_level import extract_text
# Extraire le texte des pages 2-5 (indexé à partir de 0)
text = extract_text('document.pdf', page_numbers=[1, 2, 3, 4])
print(text)
Cela est particulièrement utile pour de grands documents où vous n’avez besoin que de certaines sections, améliorant considérablement les performances.
Extraction de texte avec itération par page
Pour traiter les pages individuellement :
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer
for page_layout in extract_pages('document.pdf'):
for element in page_layout:
if isinstance(element, LTTextContainer):
print(element.get_text())
Cette approche vous donne plus de contrôle sur la manière dont chaque page est traitée, utile lorsqu’on travaille avec des documents dont la structure de page varie.
Analyse avancée de la mise en page
Comprendre les LAParams
Les LAParams (paramètres d’analyse de la mise en page) contrôlent la manière dont PDFMiner interprète la mise en page du document. Comprendre la différence entre PDFMiner et des bibliothèques plus simples est crucial ici - PDFMiner analyse réellement les relations spatiales entre les éléments de texte.
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Créer des LAParams personnalisés
laparams = LAParams(
line_overlap=0.5, # Superposition minimale pour les lignes de texte
char_margin=2.0, # Marge entre les caractères
line_margin=0.5, # Marge entre les lignes
word_margin=0.1, # Écart entre les mots
boxes_flow=0.5, # Seuil de direction du flux des boîtes
detect_vertical=True, # Détecter le texte vertical
all_texts=False # Extraire uniquement le texte dans les boîtes
)
text = extract_text('document.pdf', laparams=laparams)
Explication des paramètres :
line_overlap: Combien de lignes doivent se chevaucher verticalement pour être considérées comme la même ligne (0,0-1,0)char_margin: Écart maximum entre les caractères dans le même mot (en multiple de la largeur du caractère)line_margin: Écart maximum entre les lignes dans le même paragrapheword_margin: Seuil d’écart pour séparer les motsboxes_flow: Seuil de direction du flux des boîtes de textedetect_vertical: Activer la détection du texte vertical (commun dans les langues asiatiques)
Extraction d’informations de mise en page
Obtenir des informations détaillées sur la position et la police :
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextBox, LTTextLine, LTChar
for page_layout in extract_pages('document.pdf'):
for element in page_layout:
if isinstance(element, LTTextBox):
# Obtenir les coordonnées du rectangle
x0, y0, x1, y1 = element.bbox
print(f"Texte à ({x0}, {y0}): {element.get_text()}")
# Itérer à travers les lignes
for text_line in element:
if isinstance(text_line, LTTextLine):
# Obtenir les détails au niveau des caractères
for char in text_line:
if isinstance(char, LTChar):
print(f"Caractère : {char.get_text()}, "
f"Police : {char.fontname}, "
f"Taille : {char.height}")
Ce niveau de détail est inestimable pour l’analyse de documents, l’extraction de formulaires ou lorsqu’on a besoin de comprendre la structure des documents de manière programmée.
Gestion de différents types de PDF
PDF chiffrés
PDFMiner peut gérer les PDF protégés par mot de passe :
from pdfminer.high_level import extract_text
# Extraire à partir d'un PDF chiffré
text = extract_text('encrypted.pdf', password='votre_mot_de_passe')
Notez que PDFMiner ne peut extraire que le texte des PDF - il ne peut pas contourner les restrictions de sécurité qui empêchent l’extraction de texte au niveau du PDF.
Documents à colonnes multiples
Pour les documents à colonnes multiples, ajustez les LAParams :
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Optimiser pour les mises en page à colonnes multiples
laparams = LAParams(
detect_vertical=False,
line_margin=0.3,
word_margin=0.1,
boxes_flow=0.3 # Valeur plus basse pour une meilleure détection de colonnes
)
text = extract_text('multi_column.pdf', laparams=laparams)
Le paramètre boxes_flow est particulièrement important pour les documents à colonnes multiples - des valeurs plus basses aident PDFMiner à distinguer entre les colonnes séparées.
Texte non anglais et Unicode
PDFMiner gère bien le Unicode, mais assurez-vous d’utiliser l’encodage correct :
from pdfminer.high_level import extract_text
# Extraire du texte avec le support Unicode
text = extract_text('multilingual.pdf', codec='utf-8')
# Enregistrer dans un fichier avec l'encodage UTF-8
with open('output.txt', 'w', encoding='utf-8') as f:
f.write(text)
Travailler avec des PDF scannés
PDFMiner ne peut pas extraire de texte directement à partir des PDF scannés (images). Ces derniers nécessitent un OCR (reconnaissance optique des caractères). Cependant, vous pouvez intégrer PDFMiner avec des outils OCR.
Voici comment détecter si un PDF est scanné et nécessite un OCR :
from pdfminer.high_level import extract_text
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTFigure, LTImage
def is_scanned_pdf(pdf_path):
"""Vérifier si le PDF semble être scanné (principalement des images)"""
text_count = 0
image_count = 0
for page_layout in extract_pages(pdf_path):
for element in page_layout:
if isinstance(element, (LTFigure, LTImage)):
image_count += 1
elif hasattr(element, 'get_text'):
if element.get_text().strip():
text_count += 1
# Si principalement des images et peu de texte, probablement scanné
return image_count > text_count * 2
if is_scanned_pdf('document.pdf'):
print("Ce PDF semble être scanné - utilisez l'OCR")
else:
text = extract_text('document.pdf')
print(text)
Pour les PDF scannés, envisagez d’intégrer Tesseract OCR ou d’utiliser des outils pour extraire les images des PDF d’abord, puis appliquer l’OCR à ces images.
Utilisation en ligne de commande
PDFMiner inclut des outils en ligne de commande puissants :
Extraire du texte avec des outils en ligne de commande
# Extraire du texte vers la sortie standard
pdf2txt.py document.pdf
# Enregistrer dans un fichier
pdf2txt.py -o output.txt document.pdf
# Extraire des pages spécifiques
pdf2txt.py -p 1,2,3 document.pdf
# Extraire en tant que HTML
pdf2txt.py -t html -o output.html document.pdf
Options avancées
# Paramètres de mise en page personnalisés
pdf2txt.py -L 0.3 -W 0.1 document.pdf
# Extraire avec une mise en page détaillée (XML)
pdf2txt.py -t xml -o layout.xml document.pdf
# Définir le mot de passe pour un PDF chiffré
pdf2txt.py -P mypassword encrypted.pdf
Ces outils en ligne de commande sont excellents pour des tests rapides, des scripts en shell et une intégration dans des workflows automatisés.
Optimisation des performances
Traitement de grands PDF
Pour les grands documents, envisagez ces stratégies d’optimisation :
from pdfminer.high_level import extract_pages
from pdfminer.layout import LAParams
# Traiter uniquement les pages nécessaires
def extract_page_range(pdf_path, start_page, end_page):
text_content = []
for i, page_layout in enumerate(extract_pages(pdf_path)):
if i < start_page:
continue
if i >= end_page:
break
text_content.append(page_layout)
return text_content
# Désactiver l'analyse de la mise en page pour gagner en vitesse
from pdfminer.high_level import extract_text
text = extract_text('large.pdf', laparams=None) # Beaucoup plus rapide
Traitement par lots
Pour traiter efficacement plusieurs PDF :
from multiprocessing import Pool
from pdfminer.high_level import extract_text
import os
def process_pdf(pdf_path):
"""Traiter un seul fichier PDF"""
try:
text = extract_text(pdf_path)
output_path = pdf_path.replace('.pdf', '.txt')
with open(output_path, 'w', encoding='utf-8') as f:
f.write(text)
return f"Traité : {pdf_path}"
except Exception as e:
return f"Erreur lors du traitement de {pdf_path} : {str(e)}"
# Traiter les PDF en parallèle
def batch_process_pdfs(pdf_directory, num_workers=4):
pdf_files = [os.path.join(pdf_directory, f)
for f in os.listdir(pdf_directory)
if f.endswith('.pdf')]
with Pool(num_workers) as pool:
results = pool.map(process_pdf, pdf_files)
for result in results:
print(result)
# Utilisation
batch_process_pdfs('/chemin/vers/pdfs', num_workers=4)
Problèmes courants et solutions
Problème : Ordre incorrect du texte
Problème : Le texte extrait semble désordonné ou mal classé.
Solution : Ajustez les LAParams, surtout boxes_flow :
from pdfminer.layout import LAParams
laparams = LAParams(boxes_flow=0.3) # Essayez différentes valeurs
text = extract_text('document.pdf', laparams=laparams)
Problème : Espaces manquants entre les mots
Problème : Les mots sont collés sans espaces.
Solution : Augmentez word_margin :
laparams = LAParams(word_margin=0.2) # Augmentez à partir de la valeur par défaut 0,1
text = extract_text('document.pdf', laparams=laparams)
Problème : Erreurs d’encodage
Problème : Caractères étranges ou erreurs d’encodage.
Solution : Spécifiez explicitement le codec :
text = extract_text('document.pdf', codec='utf-8')
Problème : Erreurs de mémoire avec de grands PDF
Problème : Erreurs de mémoire avec de grands fichiers.
Solution : Traitez les pages une par une :
def extract_text_chunked(pdf_path, chunk_size=10):
"""Extraire du texte par morceaux pour réduire l'utilisation de la mémoire"""
all_text = []
page_count = 0
for page_layout in extract_pages(pdf_path):
page_text = []
for element in page_layout:
if hasattr(element, 'get_text'):
page_text.append(element.get_text())
all_text.append(''.join(page_text))
page_count += 1
# Traiter par morceaux
if page_count % chunk_size == 0:
yield ''.join(all_text)
all_text = []
# Traiter le texte restant
if all_text:
yield ''.join(all_text)
Comparaison de PDFMiner avec d’autres alternatives
Comprendre quand utiliser PDFMiner par rapport à d’autres bibliothèques est important :
PDFMiner vs PyPDF2
PyPDF2 est plus simple et plus rapide mais moins précis :
- Utilisez PyPDF2 pour : des PDF simples, une extraction rapide, la fusion et la division de PDF
- Utilisez PDFMiner pour : des mises en page complexes, une position précise du texte, une analyse détaillée
PDFMiner vs pdfplumber
pdfplumber s’appuie sur PDFMiner avec une API de haut niveau :
- Utilisez pdfplumber pour : l’extraction de tableaux, une API plus simple, la prototypage rapide
- Utilisez PDFMiner pour : un contrôle maximal, un traitement personnalisé, des systèmes de production
PDFMiner vs PyMuPDF (fitz)
PyMuPDF est significativement plus rapide mais a des dépendances en C :
- Utilisez PyMuPDF pour : des applications critiques en termes de performance, un traitement à grande échelle
- Utilisez PDFMiner pour : un besoin d’une implémentation pure Python, une analyse détaillée de la mise en page
Exemple pratique : extraire et analyser un document
Voici un exemple complet qui extrait du texte et fournit des statistiques sur le document :
from pdfminer.high_level import extract_pages, extract_text
from pdfminer.layout import LTTextBox, LTChar
from collections import Counter
import re
def analyze_pdf(pdf_path):
"""Extraire du texte et fournir une analyse du document"""
# Extraire tout le texte
full_text = extract_text(pdf_path)
# Statistiques
stats = {
'total_chars': len(full_text),
'total_words': len(full_text.split()),
'total_lines': full_text.count('\n'),
'fonts': Counter(),
'font_sizes': Counter(),
'pages': 0
}
# Analyse détaillée
for page_layout in extract_pages(pdf_path):
stats['pages'] += 1
for element in page_layout:
if isinstance(element, LTTextBox):
for line in element:
for char in line:
if isinstance(char, LTChar):
stats['fonts'][char.fontname] += 1
stats['font_sizes'][round(char.height, 1)] += 1
return {
'text': full_text,
'stats': stats,
'most_common_font': stats['fonts'].most_common(1)[0] if stats['fonts'] else None,
'most_common_size': stats['font_sizes'].most_common(1)[0] if stats['font_sizes'] else None
}
# Utilisation
result = analyze_pdf('document.pdf')
print(f"Pages : {result['stats']['pages']}")
print(f"Mots : {result['stats']['total_words']}")
print(f"Police principale : {result['most_common_font']}")
print(f"Taille principale : {result['most_common_size']}")
Intégration avec des pipelines de traitement de documents
PDFMiner s’intègre bien dans des workflows de traitement de documents plus importants. Par exemple, lors de la construction de systèmes RAG (Retrieval-Augmented Generation) ou de solutions de gestion de documents, vous pouvez le combiner avec d’autres outils Python pour un pipeline complet.
Une fois que vous avez extrait du texte à partir de PDF, vous avez souvent besoin de le convertir en d’autres formats. Vous pouvez convertir du contenu HTML en Markdown à l’aide de bibliothèques Python ou même utiliser la conversion alimentée par un LLM avec Ollama pour une transformation intelligente des documents. Ces techniques sont particulièrement utiles lorsque l’extraction de PDF produit un texte structuré semblable à HTML qui nécessite un nettoyage et une reformattage.
Pour des pipelines complets de conversion de documents, vous pourriez également avoir besoin de gérer la conversion de documents Word en Markdown, créant ainsi un workflow unifié qui traite plusieurs formats de documents vers un format de sortie commun.
Bonnes pratiques
-
Utilisez toujours des LAParams pour les documents complexes - Les paramètres par défaut fonctionnent pour les documents simples, mais ajuster les LAParams améliore significativement les résultats pour les mises en page complexes.
-
Testez d’abord avec des pages d’exemple - Avant de traiter de grands lots, testez vos paramètres d’extraction sur des échantillons représentatifs.
-
Gérez les exceptions de manière gracieuse - Les fichiers PDF peuvent être corrompus ou malformés. Enveloppez toujours le code d’extraction dans des blocs try-except.
-
Mémorisez le texte extrait - Pour un traitement répétitif, mémorisez le texte extrait pour éviter de le retraiter.
-
Validez le texte extrait - Implémentez des vérifications pour vérifier la qualité de l’extraction (par exemple, longueur minimale du texte, mots-clés attendus).
-
Considérez des alternatives pour certains cas d’utilisation spécifiques - Bien que PDFMiner soit puissant, parfois des outils spécialisés (comme tabula-py pour les tableaux) sont plus adaptés.
-
Mettez à jour PDFMiner - La branche
.sixest activement maintenue. Mettez-la à jour pour bénéficier des correctifs et des améliorations. -
Documentez correctement votre code - Lorsque vous partagez des scripts d’extraction de PDF, utilisez des blocs de code Markdown avec la mise en évidence de la syntaxe pour une meilleure lisibilité.
Conclusion
PDFMiner.six est un outil essentiel pour les développeurs Python travaillant avec des documents PDF. Son implémentation pure Python, son analyse détaillée de la mise en page et son architecture extensible en font l’idéal pour les systèmes de traitement de documents en production. Bien qu’il puisse avoir une courbe d’apprentissage plus raide que les bibliothèques plus simples, la précision et le contrôle qu’il offre sont inégalés pour les tâches d’extraction de PDF complexes.
Qu’il s’agisse de construire un système de gestion de documents, d’analyser des articles scientifiques ou d’extraire des données pour des pipelines de machine learning, PDFMiner fournit la base d’une extraction fiable du texte en Python à partir de PDF.
Ressources liées
Articles liés sur ce site
- Outils de documentation en 2026 : Markdown, LaTeX, PDF et workflows d’impression
- Outils de manipulation de PDF sous Ubuntu - Poppler - Guide complet des outils en ligne de commande de traitement de PDF incluant pdftotext, pdfimages et d’autres utilitaires poppler qui travaillent en parallèle avec PDFMiner dans les workflows de traitement de documents
- Comment extraire des images de PDF - Feuille de rappel - Apprenez comment extraire des images intégrées à des PDF à l’aide des outils en ligne de commande poppler, complétant ainsi les capacités d’extraction de texte de PDFMiner
- Génération de PDF en Python - Bibliothèques et exemples - Explorez les bibliothèques Python pour la génération de PDF incluant ReportLab, PyPDF2 et FPDF pour créer le workflow inverse de l’extraction de texte de PDF
- Feuille de rappel Python - Référence essentielle de la syntaxe Python incluant le traitement de fichiers, les opérations de chaînes et les bonnes pratiques pour écrire des scripts de traitement de PDF propres