0Pricing
AI Agents · Lektion

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_text

Kopf- 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 result

Extrahierten 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

  1. PDFs mit PyMuPDF und pdfplumber parsen
  2. OCR für gescannte Dokumente
  3. Q&A-Agenten für mehrere Dokumente
  4. Dokumente klassifizieren und weiterleiten
← Zurück zu AI Agents