Extrahieren Sie Text aus PDFs mit PDFMiner in Python
Meistern Sie die PDF-Textextraktion mit Python
PDFMiner.six ist eine leistungsstarke Python-Bibliothek zum Extrahieren von Text, Metadaten und Layout-Informationen aus PDF-Dokumenten.
Im Gegensatz zu einfachen PDF-Lesern bietet es eine tiefe Analyse der PDF-Struktur und behandelt komplexe Layouts effektiv.

Was ist PDFMiner und warum sollte man es verwenden?
PDFMiner ist eine reine Python-Bibliothek, die zum Extrahieren und Analysieren von Text aus PDF-Dokumenten entwickelt wurde. Die Version .six ist der aktiv gepflegte Fork, der Python 3.x unterstützt, während das ursprüngliche PDFMiner-Projekt nicht mehr aktualisiert wird.
Wichtige Funktionen:
- Reine Python-Implementierung (keine externen Abhängigkeiten)
- Detaillierte Layout-Analyse und Textpositionierung
- Erkennung von Schriftarten und Zeichenkodierung
- Unterstützung für verschlüsselte PDFs
- Enthaltene Befehlszeilen-Tools
- Erweiterbare Architektur für benutzerdefinierte Verarbeitung
PDFMiner ist besonders nützlich, wenn Sie präzise Kontrolle über die Textextraktion benötigen, Layout-Informationen beibehalten müssen oder mit komplexen Mehrspaltendokumenten arbeiten. Obwohl es möglicherweise langsamer ist als einige Alternativen, machen seine Genauigkeit und detaillierten Analysefähigkeiten es zur bevorzugten Wahl für Dokumentenverarbeitungs-Pipelines. Für den umgekehrten Arbeitsablauf könnten Sie auch an der programmgesteuerten Erstellung von PDFs 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 # Unter Windows: venv\Scripts\activate
pip install pdfminer.six
Wenn Sie neu bei der Python-Paketverwaltung sind, werfen Sie einen Blick auf unseren Python-Cheat-Sheet für weitere Details zu pip und virtuellen Umgebungen.
Überprüfen Sie die Installation:
pdf2txt.py --version
Die Bibliothek enthält mehrere Befehlszeilen-Tools:
pdf2txt.py- Text aus PDFs extrahierendumppdf.py- PDF-Interne Struktur anzeigenlatin2ascii.py- Lateinische Zeichen in ASCII umwandeln
Diese Tools ergänzen andere PDF-Manipulations-Utilities wie Poppler, die zusätzliche Funktionen wie Seitenextraktion und Formatumwandlung bieten.
Grundlegende Textextraktion
Einfache Textextraktion
Der einfachste Weg, Text aus einer PDF zu extrahieren:
from pdfminer.high_level import extract_text
# Extrahieren Sie den gesamten Text aus einer PDF
text = extract_text('document.pdf')
print(text)
Diese High-Level-API behandelt die meisten häufigen Anwendungsfälle und gibt das gesamte Dokument als einzelne Zeichenkette zurück.
Text von bestimmten Seiten extrahieren
Um Text von bestimmten Seiten zu extrahieren:
from pdfminer.high_level import extract_text
# Text von Seiten 2-5 (0-basierend) extrahieren
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, was die Leistung erheblich verbessert.
Text mit Seiteniteration extrahieren
Zur individuellen Verarbeitung von Seiten:
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.
Fortgeschrittene Layout-Analyse
Verständnis von LAParams
LAParams (Layout-Analyse-Parameter) steuern, wie PDFMiner die Dokumentenlayout interpretiert. Das Verständnis des Unterschieds zwischen PDFMiner und einfacheren 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, # Minimale Überlappung für Textzeilen
char_margin=2.0, # Zeichenrand
line_margin=0.5, # Zeilenrand
word_margin=0.1, # Wortabstand
boxes_flow=0.5, # Box-Flow-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 sehr sich Zeilen vertikal überlappen müssen, um als dieselbe Zeile betrachtet zu werden (0.0-1.0)char_margin: Maximale Beabstandung zwischen Zeichen im selben Wort (als Vielfaches der Zeichenbreite)line_margin: Maximale Beabstandung zwischen Zeilen im selben Absatzword_margin: Abstandsschwellenwert zur Trennung von Wörternboxes_flow: Schwellenwert für die Textbox-Flussrichtungdetect_vertical: Erkennung von vertikalem Text aktivieren (häufig in asiatischen Sprachen)
Extrahieren von Layout-Informationen
Erhalten Sie detaillierte Positions- und Schriftarteninformationen:
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 des Begrenzungsrahmens
x0, y0, x1, y1 = element.bbox
print(f"Text bei ({x0}, {y0}): {element.get_text()}")
# Iterieren Sie durch die Zeilen
for text_line in element:
if isinstance(text_line, LTTextLine):
# Erhalten Sie Zeichenebenen-Details
for char in text_line:
if isinstance(char, LTChar):
print(f"Zeichen: {char.get_text()}, "
f"Schriftart: {char.fontname}, "
f"Größe: {char.height}")
Dieses Detailniveau ist unschätzbar für die Dokumentenanalyse, Formularextraktion oder wenn Sie die Dokumentenstruktur programmgesteuert verstehen müssen.
Umgang mit verschiedenen PDF-Typen
Verschlüsselte PDFs
PDFMiner kann mit passwortgeschützten PDFs umgehen:
from pdfminer.high_level import extract_text
# Extrahieren aus einem passwortgeschützten PDF
text = extract_text('encrypted.pdf', password='your_password')
Beachten Sie, dass PDFMiner nur Text aus PDFs extrahieren kann - es kann keine Sicherheitsbeschränkungen umgehen, die die Textextraktion auf PDF-Ebene verhindern.
Mehrspaltige Dokumente
Für Dokumente mit mehreren Spalten LAParams anpassen:
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Optimieren für Mehrspalten-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 Parameter boxes_flow ist besonders wichtig für mehrspaltige Dokumente - niedrigere Werte helfen PDFMiner, zwischen separaten Spalten zu unterscheiden.
Nicht-englischer und Unicode-Text
PDFMiner unterstützt Unicode gut, stellen Sie jedoch die richtige Kodierung sicher:
from pdfminer.high_level import extract_text
# Text mit Unicode-Unterstützung extrahieren
text = extract_text('multilingual.pdf', codec='utf-8')
# In Datei mit UTF-8-Kodierung speichern
with open('output.txt', 'w', encoding='utf-8') als f:
f.write(text)
Arbeiten mit gescannten PDFs
PDFMiner kann Text nicht direkt aus gescannten PDFs (Bildern) extrahieren. Diese benötigen OCR (Optical Character Recognition). Sie können PDFMiner jedoch 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):
"""Überprüfen, ob PDF gescannt erscheint (meistens Bilder)"""
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, 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 sollten Sie die Integration mit Tesseract OCR oder die Verwendung von Tools zum Extrahieren von Bildern aus PDFs in Betracht ziehen, bevor Sie OCR auf diese Bilder anwenden.
Befehlszeilen-Nutzung
PDFMiner enthält leistungsstarke Befehlszeilen-Tools:
Textextraktion mit Befehlszeilen-Tools
# Text an stdout extrahieren
pdf2txt.py document.pdf
# In Datei speichern
pdf2txt.py -o output.txt document.pdf
# Bestimmte Seiten extrahieren
pdf2txt.py -p 1,2,3 document.pdf
# Als HTML extrahieren
pdf2txt.py -t html -o output.html document.pdf
Erweitere Optionen
# Benutzerdefinierte Layout-Parameter
pdf2txt.py -L 0.3 -W 0.1 document.pdf
# Layout mit Details extrahieren (XML)
pdf2txt.py -t xml -o layout.xml document.pdf
# Passwort für verschlüsselte PDF festlegen
pdf2txt.py -P mypassword encrypted.pdf
Diese Befehlszeilen-Tools sind hervorragend für schnelle Tests, Shell-Skripte und die Integration in automatisierte Arbeitsabläufe.
Leistungsoptimierung
Verarbeitung großer PDFs
Für große Dokumente sollten Sie diese Optimierungsstrategien in Betracht ziehen:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LAParams
# Verarbeiten Sie nur die benötigten Seiten
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
# Deaktivieren Sie die Layoutanalyse für Geschwindigkeit
from pdfminer.high_level import extract_text
text = extract_text('large.pdf', laparams=None) # Viel schneller
Batch-Verarbeitung
Für die effiziente Verarbeitung mehrerer PDFs:
from multiprocessing import Pool
from pdfminer.high_level import extract_text
import os
def process_pdf(pdf_path):
"""Verarbeiten Sie eine einzelne PDF-Datei"""
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 bei der Verarbeitung von {pdf_path}: {str(e)}"
# Verarbeiten Sie PDFs 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)
# Verwendung
batch_process_pdfs('/path/to/pdfs', num_workers=4)
Häufige Probleme und Lösungen
Problem: Falsche Textreihenfolge
Problem: Der extrahierte Text erscheint durcheinander oder in falscher Reihenfolge.
Lösung: Passen Sie LAParams an, insbesondere boxes_flow:
from pdfminer.layout import LAParams
laparams = LAParams(boxes_flow=0.3) # Versuchen Sie verschiedene Werte
text = extract_text('document.pdf', laparams=laparams)
Problem: Fehlende Leerzeichen zwischen Wörtern
Problem: Wörter laufen ohne Leerzeichen zusammen.
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: Geben Sie den Codec explizit an:
text = extract_text('document.pdf', codec='utf-8')
Problem: Speicherfehler bei großen PDFs
Problem: Speicherfehler bei großen Dateien.
Lösung: Verarbeiten Sie Seite für Seite:
def extract_text_chunked(pdf_path, chunk_size=10):
"""Extrahieren Sie Text in Blöcken, um den Speicherverbrauch 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
# Verarbeiten Sie in Blöcken
if page_count % chunk_size == 0:
yield ''.join(all_text)
all_text = []
# Geben Sie den verbleibenden Text zurück
if all_text:
yield ''.join(all_text)
Vergleich von PDFMiner mit Alternativen
Es ist wichtig zu verstehen, wann man PDFMiner gegenüber anderen Bibliotheken verwenden sollte:
PDFMiner vs PyPDF2
PyPDF2 ist einfacher und schneller, aber weniger genau:
- Verwenden Sie PyPDF2 für: Einfache PDFs, schnelle Extraktion, Zusammenführen/Aufteilen von PDFs
- Verwenden Sie PDFMiner für: Komplexe Layouts, genaue Textpositionierung, detaillierte Analyse
PDFMiner vs pdfplumber
pdfplumber baut auf PDFMiner mit einer höherwertigen API auf:
- Verwenden Sie pdfplumber für: Tabellenextraktion, einfachere API, schnelles Prototyping
- Verwenden Sie PDFMiner für: Maximale Kontrolle, benutzerdefinierte Verarbeitung, Produktionssysteme
PDFMiner vs PyMuPDF (fitz)
PyMuPDF ist deutlich schneller, hat aber C-Abhängigkeiten:
- Verwenden Sie PyMuPDF für: Leistungskritische Anwendungen, groß angelegte Verarbeitung
- Verwenden Sie PDFMiner für: Anforderung an reines Python, detaillierte Layoutanalyse
Praktisches Beispiel: Extraktion und Analyse eines Dokuments
Hier ist ein vollständiges Beispiel, das Text extrahiert und Dokumentstatistiken 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):
"""Extrahieren Sie Text und bieten Sie Dokumentanalyse"""
# Extrahieren Sie den vollständigen Text
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"Hauptschriftart: {result['most_common_font']}")
print(f"Hauptgröße: {result['most_common_size']}")
Integration in Dokumentverarbeitungs-Pipelines
PDFMiner funktioniert gut in größeren Dokumentverarbeitungs-Workflows. Zum Beispiel, wenn Sie RAG-Systeme (Retrieval-Augmented Generation) oder Dokumentenmanagementsysteme erstellen, können Sie es mit anderen Python-Tools kombinieren, um eine vollständige Pipeline zu erstellen.
Sobald Sie Text aus PDFs extrahiert haben, müssen Sie ihn oft in andere Formate umwandeln. Sie können HTML-Inhalte mit Python-Bibliotheken in Markdown umwandeln oder sogar LLM-gestützte Umwandlung mit Ollama für eine intelligente Dokumententransformation nutzen. Diese Techniken sind besonders nützlich, wenn die PDF-Extraktion HTML-ähnlichen strukturierten Text erzeugt, der gereinigt und neu formatiert werden muss.
Für umfassende Dokumentenumwandlungs-Pipelines müssen Sie möglicherweise auch Word-Dokumenten in Markdown umwandeln, um einen einheitlichen Workflow zu erstellen, der mehrere Dokumentenformate in ein gemeinsames AusgabefORMAT umwandelt.
Best Practices
-
Verwenden Sie LAParams für komplexe Dokumente - Die Standardeinstellungen funktionieren für einfache Dokumente, aber das Anpassen von LAParams verbessert die Ergebnisse für komplexe Layouts erheblich.
-
Testen Sie zunächst mit Beispielseiten - Bevor Sie große Batches verarbeiten, testen Sie Ihre Extraktionseinstellungen an repräsentativen Beispielen.
-
Behandeln Sie Ausnahmen anmutig - PDF-Dateien können beschädigt oder fehlerhaft sein. Umgeben Sie den Extraktionscode immer mit try-except-Blöcken.
-
Zwischenspeichern Sie extrahierten Text - Für wiederholte Verarbeitungen zwischenspeichern Sie extrahierten Text, um eine erneute Verarbeitung zu vermeiden.
-
Validieren Sie den extrahierten Text - Implementieren Sie Prüfungen, um die Extraktionsqualität zu überprüfen (z. B. Mindesttextlänge, erwartete Schlüsselwörter).
-
Berücksichtigen Sie Alternativen für spezifische Anwendungsfälle - Obwohl PDFMiner leistungsfähig 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 aktualisiert, um Fehlerbehebungen und Verbesserungen zu erhalten. -
Dokumentieren Sie Ihren Code ordnungsgemäß - Wenn Sie PDF-Extraktionsskripte teilen, verwenden Sie ordnungsgemäße Markdown-Codeblöcke mit Syntaxhervorhebung für bessere Lesbarkeit.
Fazit
PDFMiner.six ist ein unverzichtbares Werkzeug für Python-Entwickler, die mit PDF-Dokumenten arbeiten. Seine reine Python-Implementierung, detaillierte Layoutanalyse und erweiterbare Architektur machen es ideal für Produktionsdokumentenverarbeitungssysteme. Obwohl es möglicherweise eine steilere Lernkurve als einfachere Bibliotheken hat, ist die Präzision und Kontrolle, die es bietet, für komplexe PDF-Extraktionsaufgaben unübertroffen.
Ob Sie ein Dokumentenmanagementsystem erstellen, wissenschaftliche Artikel analysieren oder Daten für Machine-Learning-Pipelines extrahieren, PDFMiner bietet die Grundlage für zuverlässige PDF-Textextraktion in Python.
Verwandte Ressourcen
Verwandte Artikel auf dieser Website
- Pdf-Manipulationstools in Ubuntu - Poppler - Umfassender Leitfaden zu PDF-Tools in der Kommandozeile, einschließlich pdftotext, pdfimages und anderer Poppler-Dienstprogramme, die mit PDFMiner in Dokumentenverarbeitungs-Workflows arbeiten
- Bilder aus PDF extrahieren - Cheatsheet - Erfahren Sie, wie Sie eingebettete Bilder aus PDFs mit Poppler-Kommandozeilentools extrahieren, die die Textextraktionsfähigkeiten von PDFMiner ergänzen
- PDFs in Python generieren - Bibliotheken und Beispiele - Erkunden Sie Python-Bibliotheken zur PDF-Generierung, einschließlich ReportLab, PyPDF2 und FPDF, um den umgekehrten Arbeitsablauf der PDF-Textextraktion zu erstellen
- Python Cheatsheet - Wichtige Python-Syntaxreferenz, einschließlich Dateihandhabung, Zeichenkettenoperationen und bewährte Methoden zum Schreiben sauberer PDF-Verarbeitungsskripte
- HTML in Markdown mit Python umwandeln: Ein umfassender Leitfaden - Beim Aufbau von Dokumentenumwandlungspipelines erfahren Sie, wie Sie HTML (extrahiert aus PDFs oder dem Web) in das Markdown-Format mit Python-Bibliotheken umwandeln
- HTML-Inhalt in Markdown mit LLM und Ollama umwandeln - Fortgeschrittene Technik unter Verwendung lokaler LLMs zur intelligenten Umwandlung von HTML-Inhalten in Markdown, nützlich zum Aufbereiten von extrahiertem PDF-Text
- Verwendung von Markdown-Codeblöcken - Beherrschen Sie die Markdown-Syntax zum Dokumentieren Ihres PDF-Extraktionscodes mit der richtigen Formatierung und Syntaxhervorhebung
- Word-Dokumente in Markdown umwandeln: Ein vollständiger Leitfaden - Vollständiger Dokumentenumwandlungsleitfaden, einschließlich Word, PDF und anderer Formate für plattformübergreifende Dokumentenverarbeitungs-Pipelines