Extraheer tekst uit PDF's met PDFMiner in Python
Master PDF tekstextractie met Python
PDFMiner.six is een krachtige Python-bibliotheek voor het extraheren van tekst, metadata en lay-outinformatie uit PDF-documenten. Deze gids is onderdeel van onze Documentatie-tools in 2026: Markdown, LaTeX, PDF & Afdrukwerkstromen hub.
In tegenstelling tot eenvoudige PDF-lezers, biedt het een diepgaande analyse van de PDF-structuur en verwerkt complexe lay-outs effectief.

Wat is PDFMiner en waarom gebruik je het?
PDFMiner is een pure-Python-bibliotheek die is ontworpen voor het extraheren en analyseren van tekst uit PDF-documenten. De .six-versie is de actief onderhouden tak die ondersteuning biedt voor Python 3.x, terwijl het originele PDFMiner-project niet meer wordt bijgewerkt.
Belangrijke functies:
- Pure Python-implementatie (geen externe afhankelijkheden)
- Gedetailleerde lay-outanalyse en tekstposities
- Detectie van lettertype en tekencodering
- Ondersteuning voor gecodeerde PDF’s
- Inbegrepen commandoregeltools
- Uitbreidbare architectuur voor aangepaste verwerking
PDFMiner is vooral handig wanneer je nauwkeurige controle over tekstextrahering nodig hebt, de lay-outinformatie moet behouden blijven of werkt met complexe meervoudige kolomdocumenten. Hoewel het mogelijk langzamer is dan sommige alternatieven, maken de nauwkeurigheid en gedetailleerde analysefunctionaliteiten het de voorkeursoptie voor documentverwerkingssystemen. Voor de omgekeerde werkstroom zou je ook geïnteresseerd kunnen zijn in PDF’s genereren met Python.
Installatie en opzet
Installeer PDFMiner.six met behulp van pip:
pip install pdfminer.six
Voor virtuele omgevingen (aangeraden):
python -m venv venv
source venv/bin/activate # Op Windows: venv\Scripts\activate
pip install pdfminer.six
Als je nieuw bent met het beheren van Python-pakketten, raadpleeg dan onze Python Cheat Sheet voor meer informatie over pip en virtuele omgevingen.
Controleer de installatie:
pdf2txt.py --version
De bibliotheek bevat verschillende commandoregeltools:
pdf2txt.py- Tekst extraheren uit PDF’sdumppdf.py- PDF-gegevensstructuur dumpenlatin2ascii.py- Latijnse tekens converteren naar ASCII
Deze tools vullen andere PDF-manipulatierekenhulpmiddelen zoals Poppler aan die aanvullende functionaliteit bieden zoals paginaverwijdering en formaatconversie.
Basis tekstextrahering
Eenvoudige tekstextrahering
De eenvoudigste manier om tekst uit een PDF te extraheren:
from pdfminer.high_level import extract_text
# Extraheer alle tekst uit een PDF
text = extract_text('document.pdf')
print(text)
Deze hoge-niveau API verwerkt de meeste gebruikelijke gevallen en retourneert het hele document als een enkel string.
Tekst extraheren van specifieke pagina’s
Om tekst te extraheren van specifieke pagina’s:
from pdfminer.high_level import extract_text
# Extraheer tekst van pagina's 2-5 (0-gestart)
text = extract_text('document.pdf', page_numbers=[1, 2, 3, 4])
print(text)
Dit is vooral handig voor grote documenten waarbij je alleen bepaalde secties nodig hebt, wat de prestaties aanzienlijk verbetert.
Tekst extraheren met paginaverwerking
Voor het verwerken van pagina’s afzonderlijk:
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())
Deze aanpak geeft je meer controle over hoe elke pagina wordt verwerkt, handig bij het werken met documenten waarbij de paginalay-out varieert.
Geavanceerde lay-outanalyse
Begrip van LAParams
LAParams (Layout Analysis Parameters) bepalen hoe PDFMiner de documentlay-out interpreteert. Het begrip van het verschil tussen PDFMiner en eenvoudigere bibliotheken is hier cruciaal - PDFMiner analyseert inderdaad de ruimtelijke relaties tussen tekstelementen.
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Maak aangepaste LAParams
laparams = LAParams(
line_overlap=0.5, # Minimale overlappende tekstlijnen
char_margin=2.0, # Karaktermarge
line_margin=0.5, # Regelmarge
word_margin=0.1, # Woordafstand
boxes_flow=0.5, # Box-stroomdrempel
detect_vertical=True, # Verticale tekst detecteren
all_texts=False # Alleen tekst in vakken extraheren
)
text = extract_text('document.pdf', laparams=laparams)
Parameterverklaring:
line_overlap: Hoeveel lijnen moeten verticaal overlappen om als dezelfde lijn te worden beschouwd (0,0-1,0)char_margin: Maximaal afstand tussen karakters in hetzelfde woord (in veelvoud van karakterbreedte)line_margin: Maximaal afstand tussen regels in hetzelfde paragraafword_margin: Afstandsdrempel om woorden te scheidenboxes_flow: Drempel voor tekstvakkenstroomrichtingdetect_vertical: Verticale tekst detectie inschakelen (vaak gebruikt in Aziatische talen)
Lay-outinformatie extraheren
Krijg gedetailleerde positie- en lettertypeinformatie:
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):
# Krijg vakkencoördinaten
x0, y0, x1, y1 = element.bbox
print(f"Tekst op ({x0}, {y0}): {element.get_text()}")
# Itereer door regels
for text_line in element:
if isinstance(text_line, LTTextLine):
# Krijg karakterniveau details
for char in text_line:
if isinstance(char, LTChar):
print(f"Karakter: {char.get_text()}, "
f"Lettertype: {char.fontname}, "
f"Grootte: {char.height}")
Deze mate van detail is onmisbaar voor documentanalyse, formulierextrahering of wanneer je de documentstructuur programmatisch moet begrijpen.
Het omgaan met verschillende PDF-typen
Gecodeerde PDF’s
PDFMiner kan met wachtwoordbeschermd PDF’s omgaan:
from pdfminer.high_level import extract_text
# Extraheer van een wachtwoordbeschermd PDF
text = extract_text('encrypted.pdf', password='your_password')
Let op dat PDFMiner alleen tekst kan extraheren uit PDF’s - het kan geen beveiligingsbeperkingen omzeilen die tekstextrahering op PDF-niveau beperken.
Meervoudige kolomdocumenten
Voor documenten met meerdere kolommen, aanpassen LAParams:
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Optimalisatie voor meervoudige kolomlay-outs
laparams = LAParams(
detect_vertical=False,
line_margin=0.3,
word_margin=0.1,
boxes_flow=0.3 # Lagere waarde voor betere kolomdetectie
)
text = extract_text('multi_column.pdf', laparams=laparams)
De boxes_flow parameter is vooral belangrijk voor meervoudige kolomdocumenten - lagere waarden helpen PDFMiner om tussen afzonderlijke kolommen te onderscheiden.
Niet-Engelse en Unicode-tekst
PDFMiner werkt goed met Unicode, maar zorg voor correcte codering:
from pdfminer.high_level import extract_text
# Extraheer tekst met Unicode-ondersteuning
text = extract_text('multilingual.pdf', codec='utf-8')
# Sla op met UTF-8-codering
with open('output.txt', 'w', encoding='utf-8') as f:
f.write(text)
Werken met gescande PDF’s
PDFMiner kan geen tekst rechtstreeks extraheren uit gescande PDF’s (afbeeldingen). Deze vereisen OCR (Optische Tekstherkenning). Je kunt echter PDFMiner integreren met OCR-tools.
Hier is hoe je kan detecteren of een PDF gescand is en OCR nodig heeft:
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):
"""Controleer of PDF lijkt op gescand (vooral afbeeldingen)"""
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
# Als vooral afbeeldingen en weinig tekst, waarschijnlijk gescand
return image_count > text_count * 2
if is_scanned_pdf('document.pdf'):
print("Deze PDF lijkt gescand te zijn - gebruik OCR")
else:
text = extract_text('document.pdf')
print(text)
Voor gescande PDF’s, overweeg het integreren met Tesseract OCR of gebruik gereedschappen om afbeeldingen uit PDF’s te extraheren eerst, dan OCR toepassen op die afbeeldingen.
Commandoregelgebruik
PDFMiner bevat krachtige commandoregeltools:
Tekst extraheren met commandoregeltools
# Extraheer tekst naar stdout
pdf2txt.py document.pdf
# Opslaan in bestand
pdf2txt.py -o output.txt document.pdf
# Extraheren van specifieke pagina's
pdf2txt.py -p 1,2,3 document.pdf
# Extraheren als HTML
pdf2txt.py -t html -o output.html document.pdf
Geavanceerde opties
# Aangepaste lay-outparameters
pdf2txt.py -L 0.3 -W 0.1 document.pdf
# Extraheren met gedetailleerde lay-out (XML)
pdf2txt.py -t xml -o layout.xml document.pdf
# Stel wachtwoord in voor gecodeerde PDF
pdf2txt.py -P mypassword encrypted.pdf
Deze commandoregeltools zijn uitstekend voor snelle testen, shellscripts en integratie in automatiseringswerkstromen.
Prestatiesoptimalisatie
Verwerking van grote PDF’s
Voor grote documenten, overweeg deze optimalisatiestrategieën:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LAParams
# Verwerk alleen benodigde pagina's
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
# Schakel lay-outanalyse uit voor snelheid
from pdfminer.high_level import extract_text
text = extract_text('large.pdf', laparams=None) # Veel sneller
Batchverwerking
Voor efficiënt verwerken van meerdere PDF’s:
from multiprocessing import Pool
from pdfminer.high_level import extract_text
import os
def process_pdf(pdf_path):
"""Verwerk enkele PDF-bestand"""
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"Verwerkt: {pdf_path}"
except Exception as e:
return f"Fout bij verwerken van {pdf_path}: {str(e)}"
# Verwerk PDF's parallel
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)
# Gebruik
batch_process_pdfs('/path/to/pdfs', num_workers=4)
Algemene problemen en oplossingen
Probleem: Verkeerde tekstvolgorde
Probleem: Geëxtraheerde tekst lijkt verward of buiten volgorde.
Oplossing: Aanpassen LAParams, vooral boxes_flow:
from pdfminer.layout import LAParams
laparams = LAParams(boxes_flow=0.3) # Probeer verschillende waarden
text = extract_text('document.pdf', laparams=laparams)
Probleem: Ontbrekende spaties tussen woorden
Probleem: Woorden lopen samen zonder spaties.
Oplossing: Verhoog word_margin:
laparams = LAParams(word_margin=0.2) # Verhoog van standaard 0,1
text = extract_text('document.pdf', laparams=laparams)
Probleem: Codificeringsfouten
Probleem: Vreemde tekens of codificeringsfouten.
Oplossing: Specificeer codering expliciet:
text = extract_text('document.pdf', codec='utf-8')
Probleem: Geheugenfouten bij grote PDF’s
Probleem: Geheugenfouten bij grote bestanden.
Oplossing: Verwerk pagina per pagina:
def extract_text_chunked(pdf_path, chunk_size=10):
"""Extraheer tekst in stukjes om geheugenverbruik te verminderen"""
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
# Verwerk in stukjes
if page_count % chunk_size == 0:
yield ''.join(all_text)
all_text = []
# Geef resterende tekst weer
if all_text:
yield ''.join(all_text)
Vergelijking van PDFMiner met alternatieven
Het begrijpen wanneer PDFMiner te gebruiken is in plaats van andere bibliotheken is belangrijk:
PDFMiner vs PyPDF2
PyPDF2 is eenvoudiger en sneller, maar minder nauwkeurig:
- Gebruik PyPDF2 voor: Eenvoudige PDF’s, snelle extrahering, samenvoegen/splitsen van PDF’s
- Gebruik PDFMiner voor: Complexe lay-outs, nauwkeurige tekstposities, gedetailleerde analyse
PDFMiner vs pdfplumber
pdfplumber bouwt voort op PDFMiner met een hoger niveau API:
- Gebruik pdfplumber voor: Tabelextrahering, eenvoudigere API, snelle prototyping
- Gebruik PDFMiner voor: Maximaal controle, aangepaste verwerking, productiesystemen
PDFMiner vs PyMuPDF (fitz)
PyMuPDF is aanzienlijk sneller maar heeft C-afhankelijkheden:
- Gebruik PyMuPDF voor: Prestatie-kritieke toepassingen, grootschalige verwerking
- Gebruik PDFMiner voor: Pure Python-vereisten, gedetailleerde lay-outanalyse
Praktijkvoorbeeld: Tekst extraheren en document analyseren
Hier is een volledig voorbeeld dat tekst extrahert en documentstatistieken biedt:
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):
"""Extraheer tekst en geef documentanalyse"""
# Extraheer volledige tekst
full_text = extract_text(pdf_path)
# Statistieken
stats = {
'totaal_karakters': len(full_text),
'totaal_woorden': len(full_text.split()),
'totaal_regels': full_text.count('\n'),
'lettertypen': Counter(),
'lettertype_groottes': Counter(),
'pagina's': 0
}
# Gedetailleerde analyse
for page_layout in extract_pages(pdf_path):
stats['pagina's'] += 1
for element in page_layout:
if isinstance(element, LTTextBox):
for line in element:
for char in line:
if isinstance(char, LTChar):
stats['lettertypen'][char.fontname] += 1
stats['lettertype_groottes'][round(char.height, 1)] += 1
return {
'tekst': full_text,
'statistieken': stats,
'meest_gebruikte_lettertype': stats['lettertypen'].most_common(1)[0] if stats['lettertypen'] else None,
'meest_gebruikte_grootte': stats['lettertype_groottes'].most_common(1)[0] if stats['lettertype_groottes'] else None
}
# Gebruik
result = analyze_pdf('document.pdf')
print(f"Pagina's: {result['statistieken']['pagina's']}")
print(f"WOorden: {result['statistieken']['totaal_woorden']}")
print(f"Hoofdlettertype: {result['meest_gebruikte_lettertype']}")
print(f"Hoofdgrootte: {result['meest_gebruikte_grootte']}")
Integratie met documentverwerkingssystemen
PDFMiner werkt goed in grotere documentverwerkingssystemen. Bijvoorbeeld, wanneer je RAG (Retrieval-Augmented Generation)-systemen bouwt of documentbeheersingsoplossingen, kun je het combineren met andere Python-tools voor een compleet systeem.
Zodra je tekst hebt geëxtraherd uit PDF’s, heb je vaak behoefte aan het converteren naar andere formaten. Je kunt HTML-inhoud converteren naar Markdown met Python-bibliotheken of zelfs LLM-gebaseerde conversie met Ollama gebruiken voor slimme documenttransformatie. Deze technieken zijn vooral handig wanneer PDF-extrahering HTML-achtige gestructureerde tekst produceert die gereinigd en hergeformatteerd moet worden.
Voor uitgebreide documentconversie-systemen, zou je ook Worddocument naar Markdown-conversie moeten behandelen, waardoor een geïntegreerde werkstroom ontstaat die meerdere documentformaten verwerkt naar een gemeenschappelijke uitvoerformaat.
Beste praktijken
-
Gebruik altijd LAParams voor complexe documenten - De standaardinstellingen werken voor eenvoudige documenten, maar het aanpassen van LAParams verbetert aanzienlijk de resultaten voor complexe lay-outs.
-
Test eerst met voorbeeldpagina’s - Voordat je grote batches verwerkt, test je extraheringsinstellingen op representatieve voorbeelden.
-
Behandel uitzonderingen met tact - PDF-bestanden kunnen beschadigd of verkeerd gevormd zijn. Omwille van dat, gebruik altijd try-except-blokken om extraheringscode te verpakken.
-
Cache geëxtraherde tekst - Voor herhaalde verwerking, cache geëxtraherde tekst om herverwerking te vermijden.
-
Valideer geëxtraherde tekst - Implementeer controles om de kwaliteit van de extrahering te verifiëren (bijv. minimale tekstlengte, verwachte sleutelwoorden).
-
Overweeg alternatieven voor specifieke toepassingen - Hoewel PDFMiner krachtig is, zijn soms gespecialiseerde tools (zoals tabula-py voor tabellen) geschikter.
-
Houd PDFMiner bijgewerkt - De
.six-tak wordt actief onderhouden. Houd het bijgewerkt voor bugfixes en verbeteringen. -
Documenteer je code goed - Wanneer je PDF-extraheringscripts deelt, gebruik dan correcte Markdown-codeblokken met syntaxverlichting voor betere leesbaarheid.
Conclusie
PDFMiner.six is een essentieel hulpmiddel voor Python-ontwikkelaars die werken met PDF-documenten. De pure-Python-implementatie, gedetailleerde lay-outanalyse en uitbreidbare architectuur maken het ideaal voor productiedocumentverwerkingssystemen. Hoewel het een steilere leercurve heeft dan eenvoudigere bibliotheken, biedt het precisie en controle die ongeëvenaard zijn voor complexe PDF-extraheringsopdrachten.
Of je nu een documentbeheersysteem bouwt, wetenschappelijke artikelen analyseert of data extrahert voor machine learning-pijplijnen, biedt PDFMiner de basis voor betrouwbare PDF-tekstextrahering in Python.
Gerelateerde bronnen
Gerelateerde artikelen op deze site
- Documentatie-tools in 2026: Markdown, LaTeX, PDF & Afdrukwerkstromen
- Pdf manipuleren tools in Ubuntu - Poppler - Uitgebreide gids tot commandoregeltools voor PDF’s inclusief pdftotext, pdfimages en andere poppler-utilities die samenwerken met PDFMiner in documentverwerkingssystemen
- Hoe je afbeeldingen uit PDF extrahereert - Cheatsheet - Leer hoe je ingesloten afbeeldingen uit PDF’s extrahereert met poppler-commandoregeltools, complementend aan PDFMiner’s tekstextraheringsfunctionaliteiten
- PDF genereren in Python - Bibliotheken en voorbeelden - Ontdek Python-bibliotheken voor PDF-generatie zoals ReportLab, PyPDF2 en FPDF om de omgekeerde werkstroom van PDF-tekstextrahering te creëren
- Python Cheatsheet - Essentiële Python-syntaxisverwijzing inclusief bestandsbehandeling, stringbewerkingen en beste praktijken voor het schrijven van schone PDF-verwerkingsscripts