Extraheer tekst uit PDF's met PDFMiner in Python
Meester PDF tekstextractie met Python
PDFMiner.six is een krachtige Python-bibliotheek voor het extraheren van tekst, metadata en layoutinformatie uit PDF-documenten.
In tegenstelling tot eenvoudige PDF-lectoren biedt het een diepgaande analyse van de PDF-structuur en verwerkt complexe layouts effectief.

Wat is PDFMiner en waarom het gebruiken?
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 layoutanalyse en tekstpositionering
- Detectie van lettertype en tekencodering
- Ondersteuning voor versleutelde PDF’s
- Inbegrepen commandoregeltools
- Uitbreidbare architectuur voor aangepaste verwerking
PDFMiner is vooral handig als je nauwkeurige controle over de tekstextractie nodig hebt, layoutinformatie moet behouden blijven of werkt met complexe meerkolomdocumenten. Hoewel het mogelijk langzamer is dan enkele alternatieven, maken de nauwkeurigheid en gedetailleerde analysefunctionaliteiten het de voorkeurskeuze voor documentverwerkingspijplijnen. Voor de omgekeerde workflow zou je ook geïnteresseerd kunnen zijn in het genereren van PDF’s op programmeermate in Python.
Installatie en opzet
Installeer PDFMiner.six met 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-manipulatietaalhulpmiddelen zoals Poppler aan die aanvullende functionaliteit bieden zoals paginaverwijdering en formaatconversie.
Basis Tekstextractie
Eenvoudige Tekstextractie
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 één string.
Tekst extraheren van specifieke pagina’s
Om tekst uit specifieke pagina’s te extraheren:
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, wat handig is bij het werken met documenten waarbij de paginaleiding varieert.
Geavanceerde Layoutanalyse
Begrijpen van LAParams
LAParams (Layout Analyseparameters) bepalen hoe PDFMiner de documentlayout interpreteert. Het begrijpen van het verschil tussen PDFMiner en eenvoudigere bibliotheken is hier cruciaal - PDFMiner analyseert in feite 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, # Detectie van verticale tekst
all_texts=False # Alleen tekst in dozen 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 lijnen in hetzelfde paragraafword_margin: Afstandsdrempel om woorden te scheidenboxes_flow: Drempel voor tekstbox stroomrichtingdetect_vertical: Detectie van verticale tekst (vaak gebruikt in Aziatische talen)
Layoutinformatie 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 de coördinaten van de tekstbox
x0, y0, x1, y1 = element.bbox
print(f"Tekst op ({x0}, {y0}): {element.get_text()}")
# Itereer door lijnen
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 afhandelen van verschillende PDF-typen
Versleutelde PDF’s
PDFMiner kan met wachtwoordbeschermd PDF’s omgaan:
from pdfminer.high_level import extract_text
# Extraheer uit 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 tekstextractie op PDF-niveau voorkomen.
Meerkolomdocumenten
Voor documenten met meerkolommen, stel LAParams in:
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Optimaliseer voor meerkolomlay-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 parameter boxes_flow is vooral belangrijk voor meerkolomdocumenten - 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 direct extraheren uit gescande PDF’s (afbeeldingen). Deze vereisen OCR (Optische Tekstherkenning). Je kunt echter PDFMiner integreren met OCR-tools.
Hier is hoe je kunt 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 een PDF gescand is (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, en dan OCR toepassen op die afbeeldingen.
Opdrachtregelgebruik
PDFMiner bevat krachtige opdrachtregeltools:
Tekst extraheren met opdrachtregeltools
# Extraheer tekst naar stdout
pdf2txt.py document.pdf
# Sla op naar bestand
pdf2txt.py -o output.txt document.pdf
# Extraheer specifieke pagina's
pdf2txt.py -p 1,2,3 document.pdf
# Extraheer als HTML
pdf2txt.py -t html -o output.html document.pdf
Geavanceerde opties
# Aangepaste layoutparameters
pdf2txt.py -L 0.3 -W 0.1 document.pdf
# Extraheren met gedetailleerde layout (XML)
pdf2txt.py -t xml -o layout.xml document.pdf
# Stel wachtwoord in voor versleutelde PDF
pdf2txt.py -P mypassword encrypted.pdf
Deze opdrachtregeltools zijn uitstekend voor snelle testen, shellscripts en integratie in geautomatiseerde werkstromen.
Prestatieoptimalisatie
Verwerken 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 layoutanalyse uit voor snelheid
from pdfminer.high_level import extract_text
text = extract_text('large.pdf', laparams=None) # Veel sneller
Batchverwerking
Voor het 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 een enkel 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 het 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: De uitgezogen tekst lijkt verwilderd of in de verkeerde volgorde.
Oplossing: Pas LAParams aan, 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 vanaf standaard 0,1
text = extract_text('document.pdf', laparams=laparams)
Probleem: Codificeringsfouten
Probleem: Bizarre tekens of codificeringsfouten.
Oplossing: Specificeer codec 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 stukken 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 stukken
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 versus PyPDF2
PyPDF2 is eenvoudiger en sneller, maar minder nauwkeurig:
- Gebruik PyPDF2 voor: Eenvoudige PDF’s, snelle extractie, samenvoegen/splitsen van PDF’s
- Gebruik PDFMiner voor: Complexere lay-outs, nauwkeurige tekstpositionering, gedetailleerde analyse
PDFMiner versus pdfplumber
pdfplumber bouwt voort op PDFMiner met een hoger niveau API:
- Gebruik pdfplumber voor: Tabel extractie, eenvoudigere API, snelle prototyping
- Gebruik PDFMiner voor: Maximaal controle, aangepaste verwerking, productiesystemen
PDFMiner versus PyMuPDF (fitz)
PyMuPDF is aanzienlijk sneller, maar heeft C-afhankelijkheden:
- Gebruik PyMuPDF voor: Prestatiekritieke toepassingen, grote-schaalverwerking
- Gebruik PDFMiner voor: Pure Python-eis, gedetailleerde layoutanalyse
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_lijnen': full_text.count('\n'),
'lettertypen': Counter(),
'lettertypengroottes': 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['lettertypengroottes'][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['lettertypengroottes'].most_common(1)[0] if stats['lettertypengroottes'] 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 documentverwerkingspijplijnen
PDFMiner werkt goed in grotere documentverwerkingswerkstromen. Bijvoorbeeld, wanneer je RAG (Retrieval-Augmented Generation)-systemen of documentbeheersystemen bouwt, zou je het kunnen combineren met andere Python-tools voor een volledige pijplijn.
Zodra je tekst hebt geëxtraheerd uit PDF’s, heb je vaak behoefte aan het converteren naar andere formaten. Je kunt HTML-inhoud converteren naar Markdown met Pythonbibliotheken of zelfs LLM-geïmplementeerde conversie met Ollama gebruiken voor slimme documenttransformatie. Deze technieken zijn vooral handig wanneer PDF-extractie HTML-achtige gestructureerde tekst produceert die moet worden opgeruimd en opnieuw geformateerd.
Voor uitgebreide documentconversiepijplijnen, zou je ook Worddocumenten naar Markdown converteren moeten verwerken, waardoor een geïntegreerde werkstroom ontstaat die meerdere documentformaten verwerkt naar een gemeenschappelijk 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 extractie-instellingen op representatieve voorbeelden.
-
Behandel uitzonderingen met tact - PDF-bestanden kunnen beschadigd of incorrect zijn. Omwille van extractiecode altijd in try-except-blokken omwikkelen.
-
Cache geëxtraheerde tekst - Voor herhaalde verwerking, cache geëxtraheerde tekst om herverwerking te vermijden.
-
Valideer geëxtraheerde tekst - Implementeer controles om de kwaliteit van de extractie te verifiëren (bijvoorbeeld minimum 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-extractiescripts deelt, gebruik dan correcte Markdown-codeblokken met syntaxhervorming voor betere leesbaarheid.
Conclusie
PDFMiner.six is een essentieel hulpmiddel voor Python-ontwikkelaars die werken met PDF-documenten. Zijn pure-Python-implementatie, gedetailleerde layoutanalyse en uitbreidbare architectuur maken het ideaal voor productiedocumentverwerkingsystemen. Hoewel het een steilere leercurve heeft dan eenvoudigere bibliotheken, biedt het nauwkeurigheid en controle die onvergelijkbaar zijn voor complexe PDF-extractietaken.
Of je nu een documentbeheersysteem bouwt, wetenschappelijke artikelen analyseert of gegevens extrahert voor machinelearning-pijplijnen, biedt PDFMiner de basis voor betrouwbare PDF-tekstextractie in Python.
Gerelateerde bronnen
Gerelateerde artikelen op deze site
- Pdf manipulerende tools in Ubuntu - Poppler - Gedetailleerde gids over commandoregeltools voor PDF’s, inclusief pdftotext, pdfimages en andere poppler-hulpmiddelen die samenwerken met PDFMiner in documentverwerkingswerkstromen
- Hoe afbeeldingen uit PDF te extraheren - Cheat sheet - Leer hoe je ingesloten afbeeldingen uit PDF’s kunt extraheren met poppler-commandoregeltools, aanvullend op PDFMiner’s tekstextractiefuncties
- PDF genereren in Python - Bibliotheken en voorbeelden - Ontdek Python-bibliotheken voor PDF-generatie, inclusief ReportLab, PyPDF2 en FPDF om de omgekeerde workflow van PDF-tekstextractie te creëren
- Python Cheat Sheet - Essentiële Python-syntaxisverwijzing, inclusief bestandsbehandeling, stringoperaties en beste praktijken voor het schrijven van nette PDF-verwerkingscripts
- HTML converteren naar Markdown met Python: Een uitgebreide gids - Wanneer je documentconversiepijplijnen bouwt, leer hoe je HTML (geëxtraheerd uit PDF’s of web) naar Markdownformaat kunt converteren met Python-bibliotheken
- HTML-inhoud converteren naar Markdown met LLM en Ollama - Geavanceerde techniek met lokale LLMs om HTML-inhoud slim naar Markdown te converteren, handig voor het opkuisen van geëxtraheerde PDF-tekst
- Markdown-codeblokken gebruiken - Master Markdown-syntaxis voor het documenteren van je PDF-extractiecode met correcte opmaak en syntaxhervorming
- Worddocumenten converteren naar Markdown: Een volledige gids - Volledige documentconversiegids inclusief Word, PDF en andere formaten voor cross-platform documentverwerkingspijplijnen