pdfplumber vs PyMuPDF
pdfplumber und PyMuPDF sind beliebte Python-PDF-Bibliotheken, aber beide zwingen Sie zu Kompromissen. pdfplumber eignet sich hervorragend für Tabellen, ist aber 29× langsamer als nötig. PyMuPDF ist schnell, aber durch die AGPL-3.0-Lizenzierung für kommerzielle Nutzung gesperrt. Diese Seite vergleicht beide — und zeigt, warum PDF Oxide für die meisten Anwendungsfälle die bessere Wahl ist.
Die kurze Antwort: PDF Oxide ist 29× schneller als pdfplumber, 5,8× schneller als PyMuPDF, MIT-lizenziert und verarbeitet Text, Bilder, Formulare, Verschlüsselung, Markdown-Ausgabe und OCR — alles in einer Bibliothek. Der einzige Bereich, in dem pdfplumber noch führt, ist die komplexe Tabellenextraktion mit visuellem Debugging.
Schnellvergleich
| pdfplumber | PyMuPDF | PDF Oxide | |
|---|---|---|---|
| Lizenz | MIT | AGPL-3.0 | MIT |
| Sprache | Reines Python | C (MuPDF) | Rust + PyO3 |
| Durchschn. Extraktionszeit | 23,2ms | 4,6ms | 0,8ms |
| p99-Extraktionszeit | 189ms | 28ms | 9ms |
| Erfolgsrate (3.830 PDFs) | 98,8% | 99,3% | 100% |
| Textextraktion | Ja | Ja | Ja |
| Zeichenpositionen | Ja | Ja | Ja |
| Tabellenextraktion | Fortgeschritten | Grundlegend | Grundlegend |
| Bildextraktion | Nein | Ja | Ja |
| Visuelles Debugging | Ja | Nein | Nein |
| PDF-Erstellung | Nein | Ja | Ja |
| PDF-Bearbeitung | Nein | Ja | Ja |
| Markdown-Ausgabe | Nein | Nein | Ja |
| HTML-Ausgabe | Nein | Nein | Ja |
| Formularfelder | Nur Lesen | Lesen + Schreiben | Lesen + Schreiben |
| Verschlüsselung | Nein | Lesen + Schreiben | Lesen + Schreiben |
| Rendering | Nein | Ja | Ja |
| OCR | Nein | Tesseract | Integriert (PaddleOCR) |
| Installationsgröße | ~1 MB | ~20 MB | ~5 MB |
| Python-Versionen | 3.8+ | 3.8–3.12 | 3.8–3.14 |
Geschwindigkeits-Benchmarks
Alle drei Bibliotheken auf demselben Korpus von 3.830 PDFs aus drei unabhängigen öffentlichen Testsuiten (veraPDF, Mozilla pdf.js, DARPA SafeDocs) getestet. Der Korpus deckt jede PDF-Spezifikationsversion (1.0–2.0), verschlüsselte Dateien, fehlerhafte Dokumente, CJK-Kodierungen und komplexe Layouts ab.
| Metrik | pdfplumber | PyMuPDF | PDF Oxide |
|---|---|---|---|
| Durchschn. Extraktionszeit | 23,2ms | 4,6ms | 0,8ms |
| p99-Extraktionszeit | 189ms | 28ms | 9ms |
| Relativ zu PDF Oxide | 29× langsamer | 5,8× langsamer | 1× |
| Erfolgsrate (gültige PDFs) | 98,8% (3.777/3.823) | 99,3% (3.796/3.823) | 100% (3.823/3.823) |
PyMuPDF ist etwa 5× schneller als pdfplumber, weil es alles Parsing an die MuPDF-C-Bibliothek delegiert. pdfplumber baut auf pdfminer zum Parsen auf und fügt dann seine eigene räumliche Analyseschicht hinzu — beides in reinem Python geschrieben. PDF Oxide übernimmt alles Parsen, Schriftdekodierung und Textassemblierung in kompiliertem Rust, der direkt im Python-Prozess via PyO3 läuft, was den 5,8-fachen Vorteil gegenüber PyMuPDF und den 29-fachen Vorteil gegenüber pdfplumber erklärt.
Was die Zahlen in der Praxis bedeuten
| Arbeitslast | pdfplumber | PyMuPDF | PDF Oxide |
|---|---|---|---|
| 100 PDFs | 2,3 Sekunden | 0,46 Sekunden | 0,08 Sekunden |
| 1.000 PDFs | 23 Sekunden | 4,6 Sekunden | 0,8 Sekunden |
| 10.000 PDFs | 3,9 Minuten | 46 Sekunden | 8 Sekunden |
| 100.000 PDFs | 39 Minuten | 7,7 Minuten | 80 Sekunden |
Für einmalige Skripte, die eine Handvoll Dateien verarbeiten, ist der Geschwindigkeitsunterschied irrelevant. Für Produktionspipelines, die täglich Tausende von Dokumenten verarbeiten, verändert der Unterschied zwischen 39 Minuten und 80 Sekunden Architekturentscheidungen.
Tabellenextraktion
Tabellenextraktion ist der Hauptgrund, warum Entwickler pdfplumber gegenüber PyMuPDF wählen. Hier glänzt pdfplumber tatsächlich.
pdfplumber: Strukturiertes Tabellen-Parsing
pdfplumber bietet dedizierte Tabellenextraktion mit konfigurierbarer Linienerkennung, Zellenvereinigung und visuellem Debugging:
import pdfplumber
with pdfplumber.open("invoice.pdf") as pdf:
page = pdf.pages[0]
# Alle Tabellen als strukturierte Daten extrahieren
tables = page.extract_tables()
for table in tables:
for row in table:
print(row)
# Erkennung mit benutzerdefinierten Einstellungen verfeinern
tables = page.extract_tables({
"vertical_strategy": "text",
"horizontal_strategy": "lines",
"snap_tolerance": 5,
})
# Visuelles Debugging: Seite mit erkannten Tabellengrenzen rendern
im = page.to_image()
im.debug_tablefinder()
im.save("debug.png")
pdfplumber gibt strukturierte Zeilen-/Spaltendaten zurück und behandelt zusammengeführte Zellen, übergreifende Kopfzeilen und randlose Tabellen. Das visuelle Debugging-Overlay ist unschätzbar wertvoll für die Feinabstimmung der Extraktionsparameter bei schwierigen Layouts.
PyMuPDF: Grundlegende Tabellenerkennung
PyMuPDF hat in neueren Versionen eine Tabellenerkennung hinzugefügt, die aber weniger ausgereift als pdfplumbers Algorithmen ist:
import fitz
doc = fitz.open("invoice.pdf")
page = doc[0]
# PyMuPDFs integrierter Tabellenfinder (hinzugefügt in v1.23)
tabs = page.find_tables()
for table in tabs:
df = table.to_pandas() # erfordert pandas
print(df)
PyMuPDFs Tabellenextraktion funktioniert für einfache gitterbasierte Tabellen mit sichtbaren Rändern. Bei randlosen Layouts, mehrstufigen Kopfzeilen und Zellen, die sich über mehrere Zeilen oder Spalten erstrecken, hat sie Schwierigkeiten — genau die Fälle, in denen pdfplumber am stärksten ist.
PDF Oxide: Markdown-Tabellenausgabe
PDF Oxide konvertiert Tabellen als Teil seiner strukturierten Ausgabepipeline in Markdown-Syntax:
from pdf_oxide import PdfDocument
doc = PdfDocument("invoice.pdf")
# Tabellen werden erkannt und in Markdown-Tabellenformat konvertiert
md = doc.to_markdown(0, detect_headings=True)
print(md)
# Auch als HTML mit Tabellen-Tags verfügbar
html = doc.to_html(0)
print(html)
Die Tabellenerkennung von PDF Oxide ist funktional für Standard-Gitterlayouts und erzeugt saubere Markdown- oder HTML-Ausgabe. Für komplexe Tabellen mit zusammengeführten Zellen, randlosen Designs oder übergreifenden Kopfzeilen bleiben pdfplumbers dedizierte Algorithmen robuster.
Zusammenfassung der Tabellenextraktion
| Fähigkeit | pdfplumber | PyMuPDF | PDF Oxide |
|---|---|---|---|
| Einfache Tabellen mit Rahmen | Ja | Ja | Ja |
| Randlose Tabellen | Ja | Eingeschränkt | Eingeschränkt |
| Zusammengeführte Zellen | Ja | Eingeschränkt | Eingeschränkt |
| Mehrstufige Kopfzeilen | Ja | Nein | Nein |
| Konfigurierbare Erkennung | Ja | Eingeschränkt | Nein |
| Visuelles Debugging | Ja | Nein | Nein |
| Ausgabeformat | Python-Listen | pandas DataFrames | Markdown / HTML |
| Geschwindigkeit | Langsam (reines Python) | Schnell | Am schnellsten |
Wenn komplexe Tabellenextraktion Ihr einziger Anwendungsfall ist, ist pdfplumber das beste Werkzeug. Wenn Sie Tabellen neben schneller Textextraktion, Bildextraktion oder PDF-Erstellung benötigen, deckt PDF Oxide mehr ab.
Textextraktion
Für reine Textextraktion erledigen beide Bibliotheken die Aufgabe, unterscheiden sich aber in Geschwindigkeit und API-Design.
pdfplumber
import pdfplumber
with pdfplumber.open("report.pdf") as pdf:
page = pdf.pages[0]
text = page.extract_text()
print(text)
PyMuPDF
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
text = page.get_text()
print(text)
PDF Oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)
Alle drei erzeugen vergleichbare Textausgabe für wohlgeformte PDFs. PDF Oxide erreicht 99,5% Textparität mit PyMuPDF über den gesamten Korpus, wobei die verbleibenden 0,5% Unterschied in der Leerzeichennormalisierung und Ligaturbehandlung liegen.
Positionierung auf Zeichenebene
Sowohl pdfplumber als auch PyMuPDF bieten Positionsdaten auf Zeichenebene, die für räumliche Analyse, Bounding-Box-Erkennung und benutzerdefinierte Layout-Rekonstruktion wichtig sind.
pdfplumber
import pdfplumber
with pdfplumber.open("report.pdf") as pdf:
page = pdf.pages[0]
for char in page.chars[:10]:
print(f"'{char['text']}' at ({char['x0']:.1f}, {char['top']:.1f}) "
f"size={char['size']:.1f}")
PyMuPDF
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
blocks = page.get_text("dict")["blocks"]
for block in blocks:
if "lines" in block:
for line in block["lines"]:
for span in line["spans"]:
print(f"'{span['text']}' size={span['size']:.1f}")
PDF Oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
chars = doc.extract_chars(0)
for ch in chars[:10]:
print(f"'{ch.char}' at ({ch.x:.1f}, {ch.y:.1f}) size={ch.font_size:.1f}")
pdfplumber gibt Wörterbücher pro Zeichen mit umfangreichen Metadaten zurück. PyMuPDF gibt verschachtelte Block-/Zeilen-/Span-Strukturen zurück. PDF Oxide gibt flache Zeichenobjekte mit Position und Schriftdaten zurück.
Lizenzierung
Dies ist der folgenschwerste Unterschied zwischen pdfplumber und PyMuPDF für kommerzielle Projekte.
| pdfplumber | PyMuPDF | PDF Oxide | |
|---|---|---|---|
| Lizenz | MIT | AGPL-3.0 | MIT |
| Kommerzielles Produkt | Ja | Erfordert kommerzielle Lizenz | Ja |
| Closed-Source-SaaS | Ja | Erfordert kommerzielle Lizenz | Ja |
| Docker-Distribution | Ja | Erfordert kommerzielle Lizenz | Ja |
| Interne Tools | Ja | Ja | Ja |
| Open-Source-Projekt | Ja | Ja (wenn AGPL-kompatibel) | Ja |
PyMuPDFs AGPL-Problem
PyMuPDF nutzt MuPDF, das unter AGPL-3.0 lizenziert ist. Wenn Sie Software vertreiben, die PyMuPDF enthält — einschließlich SaaS, Webanwendungen und Docker-Container — muss Ihr Code unter AGPL Open-Source gestellt werden, oder Sie müssen eine kommerzielle Lizenz von Artifex erwerben.
Artifex veröffentlicht keine kommerziellen Lizenzpreise. Sie müssen deren Vertriebsteam für ein Angebot kontaktieren. Lizenzen sind typischerweise pro Anwendung, werden jährlich verlängert, ohne kostenlosen Tarif oder Startup-Ausnahme.
pdfplumber und PDF Oxide sind beide MIT
Sowohl pdfplumber als auch PDF Oxide sind MIT-lizenziert. Verwenden Sie beide in jedem Projekt — kommerziell, proprietär, SaaS oder Open Source — ohne Verpflichtungen. Wenn Lizenzierung Ihr Hauptanliegen ist und Sie zwischen pdfplumber und PyMuPDF wählen, ist pdfplumber (oder PDF Oxide) die sicherere Wahl.
Verschlüsselte PDFs
Verschlüsselungsunterstützung ist eine bedeutende Lücke in pdfplumbers Funktionsumfang und ein häufiger Schmerzpunkt für Entwickler, die mit passwortgeschützten Dokumenten arbeiten.
pdfplumber: Keine Verschlüsselungsunterstützung
pdfplumber kann verschlüsselte oder passwortgeschützte PDFs überhaupt nicht öffnen. Wenn Sie ein verschlüsseltes PDF an pdfplumber übergeben, wird ein Fehler ausgelöst. Sie müssen die Datei zuerst mit einem anderen Tool entschlüsseln:
import pdfplumber
# Das wird bei verschlüsselten PDFs fehlschlagen:
with pdfplumber.open("encrypted.pdf") as pdf:
# löst pdfminer.pdfparser.PDFSyntaxError oder ähnliches aus
pass
Ein gängiger Workaround ist, PyMuPDF oder pypdf zum Entschlüsseln der Datei zu verwenden und sie dann an pdfplumber für die Tabellenextraktion zu übergeben — was eine weitere Abhängigkeit zu Ihrer Pipeline hinzufügt.
PyMuPDF: Vollständige Verschlüsselungsunterstützung
import fitz
doc = fitz.open("encrypted.pdf")
doc.authenticate("password")
page = doc[0]
text = page.get_text()
PyMuPDF unterstützt sowohl Benutzer- als auch Besitzerkennwörter, AES-128- und AES-256-Verschlüsselung und kann verschlüsselte PDFs erstellen.
PDF Oxide: Vollständige Verschlüsselungsunterstützung
from pdf_oxide import PdfDocument
doc = PdfDocument("encrypted.pdf", password="password")
text = doc.extract_text(0)
PDF Oxide verarbeitet alle standardmäßigen PDF-Verschlüsselungsmethoden (RC4, AES-128, AES-256) sowohl zum Lesen als auch zum Schreiben. Keine zusätzlichen Abhängigkeiten oder Vorverarbeitung erforderlich.
Bildextraktion
Eine weitere Lücke in pdfplumbers Funktionsumfang. pdfplumber extrahiert keine eingebetteten Bilder aus PDFs.
PyMuPDF
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
for i, img in enumerate(page.get_images()):
xref = img[0]
base_image = doc.extract_image(xref)
with open(f"image_{i}.{base_image['ext']}", "wb") as f:
f.write(base_image["image"])
PDF Oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
images = doc.extract_image_bytes(0)
for i, img in enumerate(images):
with open(f"image_{i}.{img['format']}", "wb") as f:
f.write(img["data"])
Wenn Ihre Pipeline sowohl Text als auch Bilder aus PDFs extrahieren muss, kann pdfplumber den Bildteil nicht übernehmen. Sie benötigen PyMuPDF, PDF Oxide oder pypdfium2 dafür.
Markdown- und HTML-Ausgabe
Weder pdfplumber noch PyMuPDF bieten integrierte Markdown- oder HTML-Konvertierung. Dies ist ein einzigartiges Feature von PDF Oxide.
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
# Markdown mit Überschriftenerkennung und Tabellenformatierung
md = doc.to_markdown(0, detect_headings=True)
print(md)
# HTML mit semantischen Tags
html = doc.to_html(0)
print(html)
Für LLM-Pipelines, RAG-Systeme und Dokumentenkonvertierungs-Workflows eliminiert strukturierte Markdown-Ausgabe die Notwendigkeit eines separaten Konvertierungsschritts. PyMuPDF-Benutzer greifen typischerweise auf das separate Paket pymupdf4llm zurück, das 69× langsamer als die integrierte Konvertierung von PDF Oxide ist.
Wann welche Bibliothek wählen
Wählen Sie pdfplumber, wenn:
- Komplexe Tabellenextraktion Ihr primärer Anwendungsfall ist. pdfplumbers Tabellenalgorithmen bewältigen zusammengeführte Zellen, randlose Tabellen und übergreifende Kopfzeilen besser als jede andere Python-Bibliothek.
- Sie visuelles Debugging benötigen. pdfplumber kann annotierte Seitenbilder rendern, die erkannte Linien, Zeichen und Tabellengrenzen zeigen — unschätzbar wertvoll für die Feinabstimmung der Extraktion bei schwierigen Dokumenten.
- Sie eine reine Python-Lösung wünschen. Keine kompilierten Abhängigkeiten, installiert überall, wo Python läuft.
- Geschwindigkeit kein Thema ist. Wenn Sie weniger als hundert Dateien auf einmal verarbeiten, sind die 23ms Durchschnitt völlig akzeptabel.
Wählen Sie PyMuPDF, wenn:
- Sie bereits eine kommerzielle MuPDF-Lizenz haben und auf MuPDF-spezifisches Rendering oder SVG-Export angewiesen sind.
- Sie hochwertige Rendering-Qualität benötigen. MuPDFs Rendering-Engine ist ausgereift und bewältigt komplexe PDFs gut.
- Ihr Projekt AGPL-kompatibel ist. Wenn Sie Open-Source-Software unter AGPL oder einer kompatiblen Lizenz bauen, ist PyMuPDFs Lizenzierung kein Problem.
- Sie OCR über Tesseract benötigen. PyMuPDF hat integrierte Tesseract-Integration für gescannte Dokumente.
Wählen Sie PDF Oxide, wenn:
- Sie Geschwindigkeit und breite Funktionsabdeckung benötigen. 0,8ms Durchschn. Extraktion — 5,8× schneller als PyMuPDF, 29× schneller als pdfplumber — mit Text, Bildern, Formularen, Erstellung und Verschlüsselung in einer Bibliothek.
- Sie MIT-Lizenzierung ohne Geschwindigkeitsverlust wünschen. pdfplumber ist MIT, aber langsam. PyMuPDF ist schnell, aber AGPL. PDF Oxide ist beides: MIT und schnell.
- Sie Markdown- oder HTML-Ausgabe benötigen. Integrierte strukturierte Konvertierung für LLM-Pipelines und RAG-Systeme.
- Sie verschlüsselte PDFs mit permissiver Lizenz unterstützen müssen. pdfplumber kann keine Verschlüsselung verarbeiten. PyMuPDF kann es, erfordert aber AGPL-Konformität. PDF Oxide verarbeitet Verschlüsselung unter MIT.
- Sie eine einzelne Bibliothek für Extraktion, Erstellung und Bearbeitung wünschen. Sowohl pdfplumber als auch PyMuPDF erfordern zusätzliche Tools für Teile des PDF-Workflows. PDF Oxide deckt Extraktion, Erstellung, Bearbeitung, Rendering und Validierung ab.
PDF Oxide + pdfplumber zusammen verwenden:
Für Pipelines, die schnelle Textextraktion, Bildextraktion und komplexes Tabellen-Parsing benötigen, verwenden Sie PDF Oxide für die allgemeine Pipeline und pdfplumber für Tabellen:
from pdf_oxide import PdfDocument
import pdfplumber
# Schnelle Text- und Bildextraktion mit PDF Oxide
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
images = doc.extract_image_bytes(0)
# Komplexe Tabellenextraktion mit pdfplumber
with pdfplumber.open("report.pdf") as pdf:
tables = pdf.pages[0].extract_tables()
Installation
# pdfplumber
pip install pdfplumber
# PyMuPDF
pip install pymupdf
# PDF Oxide
pip install pdf_oxide
Alle drei werden über pip installiert. pdfplumber und PDF Oxide sind MIT-lizenziert. PyMuPDF ist AGPL-3.0 — prüfen Sie die Lizenzimplikationen, bevor Sie es in ein kommerzielles Projekt aufnehmen.
Das Fazit
pdfplumber und PyMuPDF lösen jeweils Teile des Problems. PDF Oxide löst das Ganze.
| Was Ihnen wichtig ist | Beste Wahl |
|---|---|
| Maximale Geschwindigkeit | PDF Oxide (0,8ms — 29× schneller als pdfplumber) |
| Komplexe Tabellenextraktion | pdfplumber (visuelles Debugging, zusammengeführte Zellen) |
| Permissive Lizenz + Geschwindigkeit | PDF Oxide — pdfplumber ist MIT, aber langsam; PyMuPDF ist schnell, aber AGPL |
| Verschlüsselte PDFs | PDF Oxide oder PyMuPDF — pdfplumber kann nicht entschlüsseln |
| Bildextraktion | PDF Oxide oder PyMuPDF — pdfplumber unterstützt keine Bilder |
| Markdown-/HTML-Ausgabe | PDF Oxide — einzige Bibliothek mit integrierter Konvertierung |
| OCR ohne Tesseract | PDF Oxide — integriertes PaddleOCR |
| Eine Bibliothek für alles | PDF Oxide — Extraktion, Erstellung, Bearbeitung, Verschlüsselung, OCR |
Sofern nicht Ihr gesamter Workflow die komplexe Tabellenextraktion betrifft (randlose Tabellen, zusammengeführte Zellen, visuelles Debugging), ersetzt PDF Oxide sowohl pdfplumber als auch PyMuPDF — schneller, mehr Funktionen, MIT-lizenziert.
In 10 Sekunden loslegen:
pip install pdf_oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0) # 29× schneller als pdfplumber
md = doc.to_markdown(0) # integriert, kein separates Paket
images = doc.extract_image_bytes(0) # pdfplumber kann das nicht
Verwandte Seiten
- PDF Oxide vs PyMuPDF – detaillierter Vergleich mit Migrationsleitfaden
- PDF Oxide vs pdfplumber – detaillierter Vergleich mit Code-Beispielen
- vs Python-PDF-Bibliotheken – alle Python-Bibliotheken im Vergleich
- Leistungsbenchmarks – vollständige Benchmark-Methodik des Korpus
- Tabellen aus PDF extrahieren – Anleitung zur Tabellenextraktion
- Erste Schritte mit Python – Installation und erste Extraktion