PDFs mit PyMuPDF und pdfplumber parsen
Text, Tabellen und Metadaten programmgesteuert aus PDFs extrahieren.
PDFs mit PyMuPDF und pdfplumber parsen ist eine kostenlose AI Agents-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Agents-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Warum PDF-Parsing nicht trivial ist
PDFs sind ein Präsentationsformat und kein Datenformat. Text wird als positionierte Glyphen und nicht als logische Absätze gespeichert. Die Extraktion sinnvoller Texte erfordert das Verständnis von Layout, Lesereihenfolge und Schrifteigenschaften sowie den Umgang mit Sonderfällen wie mehrspaltigen Layouts, Kopf- und Fußzeilen und eingebetteten Bildern.
Zwei Bibliotheken sind besonders verbreitet: PyMuPDF (Geschwindigkeit) und pdfplumber (Tabellenextraktion).
Grundlagen von PyMuPDF
PyMuPDF (importiert als fitz) ist die schnellste Python-Bibliothek für PDFs. Sie unterstützt Textextraktion, Metadaten, Bilder und Rendering. Installieren Sie sie mit pip install pymupdf.
import fitz # PyMuPDF
# Open a PDF
doc = fitz.open('document.pdf')
print(f'Pages: {len(doc)}')
print(f'Metadata: {doc.metadata}')
# Extract text from all pages
full_text = ''
for page_num in range(len(doc)):
page = doc[page_num]
text = page.get_text() # plain text extraction
full_text += f'--- Page {page_num + 1} ---\n{text}\n'
doc.close()
print(full_text[:500])Textextraktionsmodi von PyMuPDF
page.get_text() unterstützt verschiedene Ausgabeformate. Verwenden Sie 'text' für einfachen Text, 'blocks' für Textblöcke mit Begrenzungsrahmen und 'dict' für eine umfangreiche strukturierte Ausgabe einschließlich Schriftartnamen und -größen.
import fitz
doc = fitz.open('report.pdf')
page = doc[0]
# Mode 1: plain text
plain = page.get_text('text')
# Mode 2: blocks (each block has bbox + text)
blocks = page.get_text('blocks')
for block in blocks:
x0, y0, x1, y1, text, block_no, block_type = block
if block_type == 0: # text block (1 = image)
print(f'Block at ({x0:.0f},{y0:.0f}): {text[:80]}')
# Mode 3: dict (full detail including font info)
page_dict = page.get_text('dict')
for block in page_dict['blocks']:
if block.get('type') == 0: # text
for line in block['lines']:
for span in line['spans']:
print(f"Font: {span['font']}, Size: {span['size']:.1f}, Text: {span['text']}")
doc.close()Seitenmetadaten extrahieren
Seitenmetadaten helfen Agenten dabei, die Dokumentstruktur zu verstehen: Seitenanzahl, Dokumenttitel, Autor, Erstellungsdatum und Seitenabmessungen. PyMuPDF stellt all diese Informationen bereit.
import fitz
def extract_pdf_metadata(filepath):
doc = fitz.open(filepath)
meta = doc.metadata
info = {
'title': meta.get('title', 'Unknown'),
'author': meta.get('author', 'Unknown'),
'subject': meta.get('subject', ''),
'creator': meta.get('creator', ''),
'created': meta.get('creationDate', ''),
'modified': meta.get('modDate', ''),
'pages': len(doc),
'page_size': {
'width': doc[0].rect.width,
'height': doc[0].rect.height
}
}
doc.close()
return info
meta = extract_pdf_metadata('contract.pdf')
print(f"Title: {meta['title']}, Pages: {meta['pages']}")pdfplumber zur Tabellenextraktion
pdfplumber eignet sich besonders gut zum Extrahieren von Tabellen aus PDFs. Die Bibliothek verwendet eine geometrische Analyse, um Zellgrenzen zu erkennen, auch in PDFs ohne explizite Tabellenmarkierung.
Installieren Sie sie mit pip install pdfplumber.
import pdfplumber
with pdfplumber.open('financial_report.pdf') as pdf:
for page_num, page in enumerate(pdf.pages):
tables = page.extract_tables()
for table_idx, table in enumerate(tables):
print(f'Page {page_num+1}, Table {table_idx+1}:')
# table is a list of rows; each row is a list of cell strings
headers = table[0]
for row in table[1:]:
row_dict = dict(zip(headers, row))
print(row_dict)Tabelleneinstellungen von pdfplumber
Die Tabellenextraktion von pdfplumber lässt sich mit Einstellungen an verschiedene Tabellenstile anpassen: explizite Linien, durch Leerzeichen getrennte Spalten oder gemischte Layouts.
import pdfplumber
# Custom table settings for borderless tables
table_settings = {
'vertical_strategy': 'text', # 'lines', 'lines_strict', 'text', 'explicit'
'horizontal_strategy': 'text',
'snap_tolerance': 5,
'join_tolerance': 3,
'edge_min_length': 50,
'min_words_vertical': 3,
'min_words_horizontal': 1
}
with pdfplumber.open('nolines_table.pdf') as pdf:
page = pdf.pages[0]
table = page.extract_table(table_settings)
if table:
import csv
import io
output = io.StringIO()
writer = csv.writer(output)
writer.writerows(table)
csv_string = output.getvalue()
print(csv_string[:300])Mehrspaltige Layouts verarbeiten
Wissenschaftliche Arbeiten und Zeitungen verwenden mehrspaltige Layouts. Eine naive Textextraktion liest spaltenübergreifend von links nach rechts und erzeugt dadurch unleserlichen Text. Beheben Sie dies, indem Sie Textblöcke zunächst nach Spalten sortieren.
import fitz
def extract_multicolumn_text(page, n_columns=2):
page_width = page.rect.width
col_width = page_width / n_columns
blocks = page.get_text('blocks')
# Filter text blocks only
text_blocks = [b for b in blocks if b[6] == 0]
# Assign each block to a column based on x position
columns = [[] for _ in range(n_columns)]
for block in text_blocks:
x0 = block[0]
col_idx = min(int(x0 / col_width), n_columns - 1)
columns[col_idx].append(block)
# Sort each column by vertical position
for col in columns:
col.sort(key=lambda b: b[1]) # sort by y0
# Read columns left to right
full_text = ''
for col in columns:
for block in col:
full_text += block[4] + '\n'
return full_textKopf- und Fußzeilen herausfiltern
Kopf- und Fußzeilen in PDFs wiederholen sich auf jeder Seite und verunreinigen den extrahierten Text. Erkennen Sie sie anhand ihrer vertikalen Position (in den oberen oder unteren 10 % der Seite) und schließen Sie sie bei der Inhaltsextraktion aus.
import fitz
def extract_without_headers_footers(page, margin_ratio=0.08):
page_height = page.rect.height
top_margin = page_height * margin_ratio
bottom_margin = page_height * (1 - margin_ratio)
blocks = page.get_text('blocks')
content_blocks = []
for block in blocks:
x0, y0, x1, y1, text, block_no, block_type = block
if block_type != 0:
continue # skip image blocks
# Skip blocks in header or footer zone
if y0 < top_margin or y1 > bottom_margin:
continue
content_blocks.append(text)
return '\n'.join(content_blocks)PDF-Text für Agents in Chunks aufteilen
Lange PDFs müssen für Embedding und Retrieval in Chunks aufgeteilt werden. Teilen Sie an natürlichen Grenzen wie Absätzen, Abschnitten oder Seiten. Überlappen Sie die Chunks, damit der Kontext nicht mitten im Satz abgeschnitten wird.
import fitz
def pdf_to_chunks(filepath, chunk_size=1000, overlap=200):
doc = fitz.open(filepath)
chunks = []
for page_num in range(len(doc)):
page = doc[page_num]
page_text = page.get_text()
# Split into chunks with overlap
start = 0
while start < len(page_text):
end = start + chunk_size
chunk = page_text[start:end]
chunks.append({
'text': chunk,
'page': page_num + 1,
'char_start': start,
'source': filepath
})
start += chunk_size - overlap # overlap
doc.close()
return chunks
chunks = pdf_to_chunks('research_paper.pdf')
print(f'Total chunks: {len(chunks)}')
print(f'Sample: {chunks[0]["text"][:200]}')PyMuPDF und pdfplumber kombinieren
Verwenden Sie PyMuPDF für die Textextraktion (schneller) und pdfplumber für die Tabellenerkennung (genauer). Ein kombinierter Extractor führt beide Bibliotheken für jede Seite aus und gibt strukturierte Inhalte zurück, bei denen Text und Tabellen getrennt sind.
import fitz
import pdfplumber
def full_pdf_extract(filepath):
result = {'text_by_page': [], 'tables': []}
# Text extraction with PyMuPDF
doc = fitz.open(filepath)
for i in range(len(doc)):
text = extract_without_headers_footers(doc[i])
result['text_by_page'].append({'page': i + 1, 'text': text})
doc.close()
# Table extraction with pdfplumber
with pdfplumber.open(filepath) as pdf:
for page_num, page in enumerate(pdf.pages):
tables = page.extract_tables()
for t in tables:
result['tables'].append({
'page': page_num + 1,
'headers': t[0] if t else [],
'rows': t[1:] if t and len(t) > 1 else []
})
return resultExtrahierten Text in Dateien speichern
Speichern Sie den aus PDFs extrahierten Text in einem Format, das nachgelagerte Agents verarbeiten können. Textdateien eignen sich gut für Embedding-Pipelines; JSON bewahrt die Seitenstruktur für die Nachverfolgung von Zitaten.
import json, os
class FakePage:
def __init__(self, text): self.text = text
def get_text(self): return self.text
class FakeDoc(list):
def close(self): pass
def fitz_open(path):
return FakeDoc([FakePage('Page 1 text'), FakePage('Page 2 text')])
def pdf_to_text_file(pdf_path, output_dir):
doc = fitz_open(pdf_path)
base = os.path.splitext(os.path.basename(pdf_path))[0]
txt_path = os.path.join(output_dir, base + '.txt')
with open(txt_path, 'w', encoding='utf-8') as f:
for i, page in enumerate(doc):
f.write(f'--- Page {i+1} ---\n{page.get_text()}\n')
json_path = os.path.join(output_dir, base + '.json')
pages = [{'page': i+1, 'text': p.get_text()} for i, p in enumerate(doc)]
with open(json_path, 'w') as f:
json.dump({'source': pdf_path, 'pages': pages}, f, indent=2)
doc.close()
print(f'Saved: {txt_path} and {json_path}')
return txt_path, json_path
pdf_to_text_file('sample.pdf', '.')Wissensüberprüfung
Welche Python-Bibliothek eignet sich am besten zum Extrahieren von Tabellen aus PDF-Dateien?
Zusammenfassung: PDF-Parsing mit PyMuPDF und pdfplumber
PyMuPDF (fitz) ist die schnelle Wahl für Textextraktion, Metadaten und die Verarbeitung mehrspaltiger Layouts. pdfplumber eignet sich besonders für die Extraktion von Tabellen mit konfigurierbaren geometrischen Strategien.
Wichtige Techniken: Verwenden Sie get_text('blocks') für positionsbezogene Extraktion, filtern Sie Kopf- und Fußzeilen anhand ihrer vertikalen Position, verarbeiten Sie mehrspaltige Layouts, indem Sie Blöcke nach Spalten sortieren, und teilen Sie Text für Agent-Retrieval-Systeme mit Überlappung in Chunks auf. Kombinieren Sie beide Bibliotheken, um die besten Ergebnisse zu erzielen.
Häufig gestellte Fragen
Ist die Lektion „PDFs mit PyMuPDF und pdfplumber parsen“ kostenlos?
Ja — der vollständige Text von „PDFs mit PyMuPDF und pdfplumber parsen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Agents-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „PDFs mit PyMuPDF und pdfplumber parsen“?
Text, Tabellen und Metadaten programmgesteuert aus PDFs extrahieren. Du übst AI Agents mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um AI Agents zu starten?
Keine Vorkenntnisse erforderlich. AI Agents auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „PDFs mit PyMuPDF und pdfplumber parsen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser AI Agents-Lektion Code schreiben und ausführen?
Ja. Jede AI Agents-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- PDFs mit PyMuPDF und pdfplumber parsen
- OCR für gescannte Dokumente
- Q&A-Agenten für mehrere Dokumente
- Dokumente klassifizieren und weiterleiten