Text aus PDFs mit PDFMiner in Python extrahieren
PDF-Textextraktion mit Python meistern
PDFMiner.six ist eine leistungsstarke Python-Bibliothek zur Extraktion von Text, Metadaten und Layoutinformationen aus PDF-Dokumenten. Dieser Leitfaden ist Teil unseres Dokumentations-Tools 2026: Markdown, LaTeX, PDF & Druckworkflows-Hubs.
Im Gegensatz zu einfachen PDF-Readern bietet er eine tiefgehende Analyse der PDF-Struktur und verarbeitet komplexe Layouts effektiv.

Was ist PDFMiner und weshalb sollte man ihn verwenden?
PDFMiner ist eine rein-pythonbasierte Bibliothek, die zur Extraktion und Analyse von Text aus PDF-Dokumenten entwickelt wurde. Die Version .six ist der aktuell gepflegte Fork, der Python 3.x unterstützt, während das ursprüngliche PDFMiner-Projekt nicht mehr aktualisiert wird.
Hauptmerkmale:
- Reine Python-Implementierung (keine externen Abhängigkeiten)
- Detaillierte Layoutanalyse und Textpositionierung
- Erkennung von Schriften und Zeichencodierungen
- Unterstützung für verschlüsselte PDFs
- Einbau von Befehlszeilentools
- Erweiterbare Architektur für benutzerdefinierte Verarbeitung
PDFMiner ist besonders nützlich, wenn man präzise Kontrolle über die Textextraktion benötigt, Layoutinformationen beibehalten muss oder mit komplexen mehrspaltigen Dokumenten arbeitet. Obwohl er möglicherweise langsamer als einige Alternativen ist, machen Genauigkeit und detaillierte Analysemöglichkeiten ihn zur bevorzugten Wahl für Dokumentenverarbeitungspipelines. Für den umgekehrten Workflow könnten Sie auch an erstellen Sie PDFs programmatisch in Python interessiert sein.
Installation und Einrichtung
Installieren Sie PDFMiner.six mit pip:
pip install pdfminer.six
Für virtuelle Umgebungen (empfohlen):
python -m venv venv
source venv/bin/activate # Auf Windows: venv\Scripts\activate
pip install pdfminer.six
Wenn Sie neu bei der Python-Paketverwaltung sind, schauen Sie sich unsere Python-Kurzanleitung für weitere Details zu pip und virtuellen Umgebungen an.
Überprüfen Sie die Installation:
pdf2txt.py --version
Die Bibliothek enthält mehrere Befehlszeilentools:
pdf2txt.py- Text aus PDFs extrahierendumppdf.py- PDF-Interne Struktur ausgebenlatin2ascii.py- Lateinische Zeichen in ASCII konvertieren
Diese Tools ergänzen andere PDF-Manipulationswerkzeuge wie Poppler, die zusätzliche Funktionen wie Seitenextraktion und Formatkonvertierung bereitstellen.
Grundlegende Textextraktion
Einfache Textextraktion
Die einfachste Methode, um Text aus einem PDF zu extrahieren:
from pdfminer.high_level import extract_text
# Extrahieren Sie alle Texte aus einem PDF
text = extract_text('document.pdf')
print(text)
Dieser Hochlevel-API-Handler kümmert sich um die meisten gängigen Anwendungsfälle und gibt das gesamte Dokument als einzelnen String zurück.
Text aus bestimmten Seiten extrahieren
Um Text aus bestimmten Seiten zu extrahieren:
from pdfminer.high_level import extract_text
# Extrahieren Sie Text aus Seiten 2-5 (0-basiert)
text = extract_text('document.pdf', page_numbers=[1, 2, 3, 4])
print(text)
Dies ist besonders nützlich für große Dokumente, bei denen Sie nur bestimmte Abschnitte benötigen und die Leistung erheblich verbessert.
Text mit Seiteniteration extrahieren
Für die Verarbeitung von Seiten einzeln:
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())
Dieser Ansatz gibt Ihnen mehr Kontrolle darüber, wie jede Seite verarbeitet wird, was nützlich ist, wenn Sie mit Dokumenten arbeiten, bei denen die Seitenstruktur variiert.
Erweiterte Layoutanalyse
Verständnis von LAParams
LAParams (Layout Analysis Parameters) steuern, wie PDFMiner die Dokumentenlayoutanalyse interpretiert. Das Verständnis der Unterschiede zwischen PDFMiner und einfachen Bibliotheken ist hier entscheidend - PDFMiner analysiert tatsächlich die räumlichen Beziehungen zwischen Textelementen.
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Erstellen Sie benutzerdefinierte LAParams
laparams = LAParams(
line_overlap=0.5, # Mindestüberlappung für Textzeilen
char_margin=2.0, # Zeichenabstand
line_margin=0.5, # Zeilenabstand
word_margin=0.1, # Wortabstand
boxes_flow=0.5, # Box-Fluss-Schwellenwert
detect_vertical=True, # Vertikalen Text erkennen
all_texts=False # Nur Text in Boxen extrahieren
)
text = extract_text('document.pdf', laparams=laparams)
Parametererklärung:
line_overlap: Wie viel Zeilen müssen sich vertikal überschneiden, um als dieselbe Zeile betrachtet zu werden (0.0-1.0)char_margin: Maximaler Abstand zwischen Zeichen im selben Wort (als Vielfaches der Zeichenbreite)line_margin: Maximaler Abstand zwischen Zeilen im selben Absatzword_margin: Schwellenwert zum Trennen von Wörternboxes_flow: Schwellenwert für die Textbox-Flussrichtungdetect_vertical: Aktivieren Sie die Erkennung von vertikalem Text (häufig in asiatischen Sprachen)
Extrahieren von Layoutinformationen
Erhalten Sie detaillierte Position- und Schriftinformationen:
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):
# Erhalten Sie die Koordinaten der Bounding Box
x0, y0, x1, y1 = element.bbox
print(f"Text bei ({x0}, {y0}): {element.get_text()}")
# Durchlaufen Sie die Zeilen
for text_line in element:
if isinstance(text_line, LTTextLine):
# Erhalten Sie Details auf Zeichenebene
for char in text_line:
if isinstance(char, LTChar):
print(f"Zeichen: {char.get_text()}, "
f"Schrift: {char.fontname}, "
f"Größe: {char.height}")
Dieser Grad an Detailgenauigkeit ist unverzichtbar für Dokumentanalyse, Formextraktion oder wenn Sie die Dokumentstruktur programmatisch verstehen müssen.
Umgang mit verschiedenen PDF-Typen
Verschlüsselte PDFs
PDFMiner kann Passwörter geschützte PDFs verarbeiten:
from pdfminer.high_level import extract_text
# Extrahieren Sie aus einem mit Passwort geschützten PDF
text = extract_text('encrypted.pdf', password='your_password')
Hinweis: PDFMiner kann nur Text aus PDFs extrahieren - er kann keine Sicherheitsbeschränkungen umgehen, die auf der PDF-Ebene Textextraktion verhindern.
Mehrspaltige Dokumente
Für Dokumente mit mehreren Spalten, optimieren Sie LAParams:
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Optimieren Sie für mehrspaltige Layouts
laparams = LAParams(
detect_vertical=False,
line_margin=0.3,
word_margin=0.1,
boxes_flow=0.3 # Niedrigerer Wert für bessere Spaltenerkennung
)
text = extract_text('multi_column.pdf', laparams=laparams)
Der boxes_flow-Parameter ist besonders wichtig für mehrspaltige Dokumente - niedrigere Werte helfen PDFMiner, zwischen separaten Spalten zu unterscheiden.
Nicht-englische und Unicode-Texte
PDFMiner verarbeitet Unicode gut, stellen Sie aber sicher, dass die Kodierung richtig ist:
from pdfminer.high_level import extract_text
# Extrahieren Sie Text mit Unicode-Unterstützung
text = extract_text('multilingual.pdf', codec='utf-8')
# Speichern Sie in eine Datei mit UTF-8-Kodierung
with open('output.txt', 'w', encoding='utf-8') as f:
f.write(text)
Arbeiten mit gescannten PDFs
PDFMiner kann Text nicht direkt aus gescannten PDFs (Bildern) extrahieren. Diese benötigen OCR (Optische Zeichenerkennung). Sie können jedoch PDFMiner mit OCR-Tools integrieren.
Hier ist, wie Sie erkennen können, ob ein PDF gescannt ist und OCR benötigt:
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):
"""Prüfen, ob ein PDF als gescannt (hauptsächlich Bilder) erscheint"""
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
# Wenn hauptsächlich Bilder und wenig Text vorhanden, wahrscheinlich gescannt
return image_count > text_count * 2
if is_scanned_pdf('document.pdf'):
print("Dieses PDF scheint gescannt zu sein - verwenden Sie OCR")
else:
text = extract_text('document.pdf')
print(text)
Für gescannte PDFs können Sie Tesseract OCR integrieren oder Tools zur Extraktion von Bildern aus PDFs verwenden, bevor Sie OCR auf diese Bilder anwenden.
Befehlszeilenverwendung
PDFMiner enthält leistungsstarke Befehlszeilentools:
Text mit Befehlszeilentools extrahieren
# Text in die Standardausgabe extrahieren
pdf2txt.py document.pdf
# In eine Datei speichern
pdf2txt.py -o output.txt document.pdf
# Spezifische Seiten extrahieren
pdf2txt.py -p 1,2,3 document.pdf
# Als HTML extrahieren
pdf2txt.py -t html -o output.html document.pdf
Erweiterte Optionen
# Benutzerdefinierte Layoutparameter
pdf2txt.py -L 0.3 -W 0.1 document.pdf
# Mit detaillierter Layoutanalyse (XML) extrahieren
pdf2txt.py -t xml -o layout.xml document.pdf
# Passwort für verschlüsselte PDF setzen
pdf2txt.py -P mypassword encrypted.pdf
Diese Befehlszeilentools sind ausgezeichnet für schnelles Testen, Shell-Skripte und Integration in automatisierte Workflows.
Leistungsoptimierung
Verarbeitung großer PDFs
Für große Dokumente, berücksichtigen Sie diese Optimierungsstrategien:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LAParams
# Nur benötigte Seiten verarbeiten
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
# Layoutanalyse für Geschwindigkeit deaktivieren
from pdfminer.high_level import extract_text
text = extract_text('large.pdf', laparams=None) # Viel schneller
Batch-Verarbeitung
Für effiziente Verarbeitung mehrerer PDFs:
from multiprocessing import Pool
from pdfminer.high_level import extract_text
import os
def process_pdf(pdf_path):
"""Einzeln PDF-Datei verarbeiten"""
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"Verarbeitet: {pdf_path}"
except Exception as e:
return f"Fehler beim Verarbeiten von {pdf_path}: {str(e)}"
# PDFs parallel verarbeiten
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)
# Verwendung
batch_process_pdfs('/path/to/pdfs', num_workers=4)
Typische Probleme und Lösungen
Problem: Falsche Textreihenfolge
Problem: Extrahierter Text erscheint verwirrt oder in falscher Reihenfolge.
Lösung: Anpassen von LAParams, insbesondere boxes_flow:
from pdfminer.layout import LAParams
laparams = LAParams(boxes_flow=0.3) # Verschiedene Werte probieren
text = extract_text('document.pdf', laparams=laparams)
Problem: Fehlende Leerzeichen zwischen Wörtern
Problem: Wörter laufen zusammen, ohne Leerzeichen.
Lösung: Erhöhen Sie word_margin:
laparams = LAParams(word_margin=0.2) # Erhöhen Sie den Standardwert von 0,1
text = extract_text('document.pdf', laparams=laparams)
Problem: Kodierungsfehler
Problem: Seltsame Zeichen oder Kodierungsfehler.
Lösung: Kodierung explizit angeben:
text = extract_text('document.pdf', codec='utf-8')
Problem: Speicherfehler mit großen PDFs
Problem: Speicherfehler bei großen Dateien.
Lösung: Seite für Seite verarbeiten:
def extract_text_chunked(pdf_path, chunk_size=10):
"""Text in Abschnitten extrahieren, um den Speicherbedarf zu reduzieren"""
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
# In Abschnitten verarbeiten
if page_count % chunk_size == 0:
yield ''.join(all_text)
all_text = []
# Übrigen Text ausgeben
if all_text:
yield ''.join(all_text)
Vergleich von PDFMiner mit Alternativen
Das Verständnis, wann man PDFMiner gegenüber anderen Bibliotheken verwenden sollte, ist wichtig:
PDFMiner vs. PyPDF2
PyPDF2 ist einfacher und schneller, aber weniger präzise:
- Verwenden Sie PyPDF2 für: Einfache PDFs, schnelle Extraktion, Zusammenführen/Teilen von PDFs
- Verwenden Sie PDFMiner für: Komplexe Layouts, präzise Textpositionierung, detaillierte Analyse
PDFMiner vs. pdfplumber
pdfplumber baut auf PDFMiner auf und bietet eine höhere Ebene API:
- Verwenden Sie pdfplumber für: Tabellenextraktion, einfachere API, schnelles Prototyping
- Verwenden Sie PDFMiner für: Maximale Kontrolle, benutzerdefinierte Verarbeitung, Produktionsumgebungen
PDFMiner vs. PyMuPDF (fitz)
PyMuPDF ist deutlich schneller, hat aber C-Abhängigkeiten:
- Verwenden Sie PyMuPDF für: Leistungskritische Anwendungen, großflächige Verarbeitung
- Verwenden Sie PDFMiner für: Reine Python-Anforderung, detaillierte Layoutanalyse
Praktisches Beispiel: Dokument extrahieren und analysieren
Hier ist ein vollständiges Beispiel, das Text extrahiert und Dokumentenstatistiken bereitstellt:
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):
"""Text extrahieren und Dokumentenanalyse bereitstellen"""
# Vollständigen Text extrahieren
full_text = extract_text(pdf_path)
# Statistiken
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
}
# Detaillierte Analyse
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
}
# Verwendung
result = analyze_pdf('document.pdf')
print(f"Seiten: {result['stats']['pages']}")
print(f"Wörter: {result['stats']['total_words']}")
print(f"Hauptfont: {result['most_common_font']}")
print(f"Hauptgröße: {result['most_common_size']}")
Integration in Dokumentenverarbeitungs-Pipelines
PDFMiner arbeitet gut in größeren Dokumentenverarbeitungsworkflows. Zum Beispiel, wenn Sie RAG (Retrieval-Augmented Generation)-Systeme oder Dokumentenverwaltungslösungen erstellen, könnten Sie ihn mit anderen Python-Tools kombinieren, um eine vollständige Pipeline zu erstellen.
Sobald Sie Text aus PDFs extrahiert haben, benötigen Sie oft eine Konvertierung in andere Formate. Sie können HTML-Inhalt in Markdown mit Python-Bibliotheken konvertieren oder sogar LLM-basierte Konvertierung mit Ollama für intelligente Dokumententransformation nutzen. Diese Techniken sind besonders nützlich, wenn die PDF-Extraktion HTML-artigen strukturierten Text erzeugt, der bereinigt und neu formatiert werden muss.
Für umfassende Dokumentenkonvertierungs-Pipelines könnten Sie auch Word-Dokumente in Markdown konvertieren, um einen einheitlichen Workflow zu erstellen, der mehrere Dokumentenformate in ein gemeinsames Ausgabeformat konvertiert.
Best Practices
-
Verwenden Sie immer LAParams für komplexe Dokumente - Die Standardeinstellungen funktionieren für einfache Dokumente, aber das Anpassen von LAParams verbessert die Ergebnisse erheblich für komplexe Layouts.
-
Testen Sie zunächst mit Beispielseiten - Vor der Verarbeitung großer Batche testen Sie Ihre Extraktionseinstellungen an repräsentativen Beispielen.
-
Behandeln Sie Ausnahmen sanft - PDF-Dateien können beschädigt oder falsch formatiert sein. Schreiben Sie immer Extraktionscode in try-except-Blöcken.
-
Kacheln Sie den extrahierten Text - Für wiederholte Verarbeitung kacheln Sie den extrahierten Text, um erneutes Verarbeiten zu vermeiden.
-
Validieren Sie den extrahierten Text - Implementieren Sie Checks, um die Qualität der Extraktion zu prüfen (z. B. Mindesttextlänge, erwartete Schlüsselwörter).
-
Überlegen Sie Alternativen für bestimmte Anwendungsfälle - Obwohl PDFMiner leistungsstark ist, sind manchmal spezialisierte Tools (wie tabula-py für Tabellen) besser geeignet.
-
Halten Sie PDFMiner aktuell - Der
.six-Fork wird aktiv gepflegt. Halten Sie ihn aktuell, um Fehlerbehebungen und Verbesserungen zu erhalten. -
Dokumentieren Sie Ihren Code ordnungsgemäß - Wenn Sie PDF-Extraktions-Skripte teilen, verwenden Sie ordnungsgemäß Markdown-Codeblöcke mit Syntaxhervorhebung für bessere Lesbarkeit.
Schlussfolgerung
PDFMiner.six ist ein unverzichtbares Werkzeug für Python-Entwickler, die mit PDF-Dokumenten arbeiten. Seine rein-pythonbasierte Implementierung, detaillierte Layoutanalyse und erweiterbare Architektur machen es ideal für Produktionsdokumentenverarbeitungssysteme. Obwohl er eine steilere Lernkurve als einfachere Bibliotheken hat, bietet er Präzision und Kontrolle, die für komplexe PDF-Extraktionsaufgaben unverzichtbar sind.
Ob Sie ein Dokumentenverwaltungssystem erstellen, wissenschaftliche Artikel analysieren oder Daten für maschinelle Lernpipelines extrahieren, bietet PDFMiner die Grundlage für zuverlässige PDF-Textextraktion in Python.
Verwandte Ressourcen
Verwandte Artikel auf dieser Website
- Dokumentations-Tools 2026: Markdown, LaTeX, PDF & Druckworkflows
- PDF-Manipulations-Tools in Ubuntu - Poppler - Umfassender Leitfaden zu Befehlszeilen-PDF-Tools, einschließlich pdftotext, pdfimages und anderen Poppler-Utilities, die gemeinsam mit PDFMiner in Dokumentenverarbeitungsworkflows arbeiten
- Wie man Bilder aus PDF extrahiert - Kurzanleitung - Lernen Sie, wie Sie eingebettete Bilder aus PDFs mit Poppler-Befehlszeilentools extrahieren, die die Textextraktionsfähigkeiten von PDFMiner ergänzen
- PDF in Python generieren - Bibliotheken und Beispiele - Erforschen Sie Python-Bibliotheken zur PDF-Generierung, einschließlich ReportLab, PyPDF2 und FPDF, um den umgekehrten Workflow der PDF-Textextraktion zu erstellen
- Python-Kurzanleitung - Wichtige Python-Syntaxreferenz, einschließlich Dateioperationen, Zeichenkettenoperationen und Best Practices für das Schreiben von sauberen PDF-Verarbeitungsskripten