Parser les Documents PDF avec PyMuPDF
Maîtrisez le parsing PDF : extrayez le texte, les images, les tableaux et les métadonnées des PDF en utilisant PyMuPDF et les alternatives.
- Auteur
- Équipe de Recherche Ailog
- Date de publication
- Temps de lecture
- 10 min de lecture
- Niveau
- intermediate
- Étape du pipeline RAG
- Parsing
Pourquoi les PDF sont difficiles
Les PDF sont conçus pour l'affichage, pas pour l'extraction de données. Le texte peut être : • Des images (documents scannés) • Des polices intégrées avec encodages personnalisés • Des mises en page complexes (multi-colonnes, tableaux) • Protégé ou chiffré
PyMuPDF : La référence (2025)
PyMuPDF (fitz) est l'analyseur PDF le plus rapide et le plus fiable.
``python import fitz PyMuPDF
def extract_pdf_content(pdf_path): doc = fitz.open(pdf_path)
full_text = "" metadata = { "title": doc.metadata.get("title", ""), "author": doc.metadata.get("author", ""), "pages": len(doc) }
for page_num, page in enumerate(doc): Extraire le texte avec préservation de la mise en page text = page.get_text("text") full_text += f"\n\n--- Page {page_num + 1} ---\n{text}"
return full_text, metadata `
Extraire les images des PDF
`python def extract_images(pdf_path): doc = fitz.open(pdf_path) images = []
for page_num, page in enumerate(doc): image_list = page.get_images()
for img_index, img in enumerate(image_list): xref = img[0] base_image = doc.extract_image(xref)
images.append({ "page": page_num + 1, "image_data": base_image["image"], "extension": base_image["ext"] })
return images `
Gérer les PDF scannés (OCR)
Pour les PDF basés sur images, utilisez Tesseract OCR :
`python from PIL import Image import pytesseract import fitz
def ocr_pdf(pdf_path): doc = fitz.open(pdf_path) text = ""
for page in doc: Convertir la page en image pix = page.get_pixmap() img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
OCR sur l'image page_text = pytesseract.image_to_string(img) text += page_text + "\n\n"
return text `
Extraire les tableaux
Utilisez pdfplumber pour l'extraction de tableaux :
`python import pdfplumber
def extract_tables(pdf_path): tables = []
with pdfplumber.open(pdf_path) as pdf: for page in pdf.pages: page_tables = page.extract_tables() tables.extend(page_tables)
return tables `
Extraction consciente de la mise en page
Préserver la structure du document :
`python def extract_with_layout(pdf_path): doc = fitz.open(pdf_path) structured_content = []
for page in doc: blocks = page.get_text("dict")["blocks"]
for block in blocks: if block["type"] == 0: Bloc de texte text = "" for line in block["lines"]: for span in line["spans"]: text += span["text"]
structured_content.append({ "type": "text", "content": text, "bbox": block["bbox"], Position "page": page.number })
return structured_content `
Optimisation des performances
Traitement parallèle pour les gros PDF :
`python from concurrent.futures import ThreadPoolExecutor
def parse_pdf_parallel(pdf_path, num_workers=4): doc = fitz.open(pdf_path)
def process_page(page_num): page = doc[page_num] return page.get_text()
with ThreadPoolExecutor(max_workers=num_workers) as executor: texts = list(executor.map(process_page, range(len(doc))))
return "\n\n".join(texts) ``
Outils alternatifs (2025) • PyPDF2 : Simple mais plus lent • pdfplumber : Excellent pour les tableaux • Camelot : Extraction spécialisée de tableaux • Adobe PDF Extract API : Commercial, très précis
Meilleures pratiques Tester d'abord avec des documents échantillon Gérer gracieusement les PDF chiffrés Préserver les numéros de page pour les citations Extraire les métadonnées (titre, auteur, date) Utiliser l'OCR uniquement si nécessaire (plus lent) Mettre en cache les résultats analysés pour éviter le retraitement
Les PDF sont l'épine dorsale de la connaissance d'entreprise. Maîtrisez l'analyse PDF pour débloquer le potentiel de votre RAG.