pdfplumber vs PyMuPDF – Geschwindigkeit, Tabellen und Lizenzierung
pdfplumber und PyMuPDF sind beliebte Python-PDF-Bibliotheken, doch beide zwingen einen zu Kompromissen. pdfplumber ist hervorragend für Tabellen, aber 29× langsamer als nötig. PyMuPDF ist schnell, aber an die AGPL-3.0-Lizenz gebunden, die kommerzielle Nutzung blockiert. 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 einzigen Bibliothek. Der einzige Bereich, in dem pdfplumber weiterhin führt, ist die Extraktion komplexer Tabellen mit visuellem Debugging.
Schnellvergleich
| pdfplumber | PyMuPDF | PDF Oxide | |
|---|---|---|---|
| Lizenz | MIT | AGPL-3.0 | MIT |
| Sprache | Reines Python | C (MuPDF) | Rust + PyO3 |
| Mittlere Extraktionszeit | 23,2ms | 4,6ms | 0,8ms |
| p99-Extraktionszeit | 189ms | 28ms | 9ms |
| Erfolgsquote (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 wurden mit demselben Korpus aus 3.830 PDFs getestet, der aus drei unabhängigen öffentlichen Testsuiten (veraPDF, Mozilla pdf.js, DARPA SafeDocs) zusammengestellt wurde. Der Korpus deckt jede Version der PDF-Spezifikation (1.0–2.0), verschlüsselte Dateien, fehlerhafte Dokumente, CJK-Kodierungen und komplexe Layouts ab.
| Metrik | pdfplumber | PyMuPDF | PDF Oxide |
|---|---|---|---|
| Mittlere Extraktionszeit | 23,2ms | 4,6ms | 0,8ms |
| p99-Extraktionszeit | 189ms | 28ms | 9ms |
| Relativ zu PDF Oxide | 29x langsamer | 5,8x langsamer | 1x |
| Erfolgsquote (gültige PDFs) | 98,8% (3.777/3.823) | 99,3% (3.796/3.823) | 100% (3.823/3.823) |
PyMuPDF ist etwa 5x schneller als pdfplumber, weil es das gesamte Parsen an die C-Bibliothek MuPDF delegiert. pdfplumber setzt zum Parsen auf pdfminer und fügt dann eine eigene Schicht für räumliche Analyse hinzu – beide in reinem Python geschrieben. PDF Oxide erledigt das gesamte Parsen, die Schriftdekodierung und den Textzusammenbau in kompiliertem Rust, das über PyO3 direkt im Python-Prozess läuft, was den Vorsprung von 5,8x gegenüber PyMuPDF und 29x 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 Produktions-Pipelines, die täglich Tausende Dokumente verarbeiten, ändert die Kluft zwischen 39 Minuten und 80 Sekunden die Architekturentscheidungen.
Tabellenextraktion
Tabellenextraktion ist der Hauptgrund, warum Entwickler pdfplumber gegenüber PyMuPDF wählen. Genau hier glänzt pdfplumber wirklich.
pdfplumber: strukturiertes Tabellen-Parsing
pdfplumber bietet eine spezialisierte Tabellenextraktion mit konfigurierbarer Linienerkennung, Zellzusammenführung und visuellem Debugging:
import pdfplumber
with pdfplumber.open("invoice.pdf") as pdf:
page = pdf.pages[0]
# Extract all tables as structured data
tables = page.extract_tables()
for table in tables:
for row in table:
print(row)
# Fine-tune detection with custom settings
tables = page.extract_tables({
"vertical_strategy": "text",
"horizontal_strategy": "lines",
"snap_tolerance": 5,
})
# Visual debugging: render page with detected table boundaries
im = page.to_image()
im.debug_tablefinder()
im.save("debug.png")
pdfplumber liefert strukturierte Zeilen-/Spaltendaten und verarbeitet zusammengeführte Zellen, übergreifende Kopfzeilen und randlose Tabellen. Die visuelle Debugging-Überlagerung ist von unschätzbarem Wert, um Extraktionsparameter bei kniffligen Layouts abzustimmen.
PyMuPDF: grundlegende Tabellenerkennung
PyMuPDF hat in jüngeren Versionen eine Tabellenerkennung hinzugefügt, sie ist jedoch weniger ausgereift als die Algorithmen von pdfplumber:
import fitz
doc = fitz.open("invoice.pdf")
page = doc[0]
# PyMuPDF's built-in table finder (added in v1.23)
tabs = page.find_tables()
for table in tabs:
df = table.to_pandas() # requires pandas
print(df)
Die Tabellenextraktion von PyMuPDF funktioniert bei einfachen rasterbasierten Tabellen mit sichtbaren Rändern. Sie kämpft mit randlosen Layouts, mehrstufigen Kopfzeilen und Zellen, die sich über mehrere Zeilen oder Spalten erstrecken – genau die Fälle, in denen pdfplumber am stärksten ist.
PDF Oxide: Tabellenausgabe in Markdown
PDF Oxide wandelt Tabellen als Teil seiner strukturierten Ausgabe-Pipeline in Markdown-Syntax um:
from pdf_oxide import PdfDocument
doc = PdfDocument("invoice.pdf")
# Tables are detected and converted to Markdown table format
md = doc.to_markdown(0, detect_headings=True)
print(md)
# Also available as HTML with table tags
html = doc.to_html(0)
print(html)
Die Tabellenerkennung von PDF Oxide funktioniert bei standardmäßigen Rasterlayouts und erzeugt saubere Markdown- oder HTML-Ausgaben. Für komplexe Tabellen mit zusammengeführten Zellen, randlosen Designs oder übergreifenden Kopfzeilen bleiben die spezialisierten Algorithmen von pdfplumber robuster.
Zusammenfassung der Tabellenextraktion
| Fähigkeit | pdfplumber | PyMuPDF | PDF Oxide |
|---|---|---|---|
| Einfache umrandete Tabellen | 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 die Extraktion komplexer Tabellen Ihr einziger Anwendungsfall ist, ist pdfplumber das beste Werkzeug. Wenn Sie Tabellen zusammen mit schneller Textextraktion, Bildextraktion oder PDF-Erstellung benötigen, deckt PDF Oxide mehr ab.
Textextraktion
Bei der Extraktion von reinem Text 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 bei wohlgeformten PDFs vergleichbare Textausgaben. PDF Oxide erreicht über den gesamten Korpus eine Textübereinstimmung von 99,5% mit PyMuPDF, wobei der verbleibende Unterschied von 0,5% auf die Normalisierung von Leerzeichen und die Behandlung von Ligaturen entfällt.
Positionierung auf Zeichenebene
Sowohl pdfplumber als auch PyMuPDF liefern Positionsdaten auf Zeichenebene, was für räumliche Analyse, Erkennung von Begrenzungsrahmen und die individuelle Rekonstruktion von Layouts wichtig ist.
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 liefert Dictionaries pro Zeichen mit reichhaltigen Metadaten. PyMuPDF liefert verschachtelte Block-/Zeilen-/Span-Strukturen. PDF Oxide liefert flache Zeichenobjekte mit Positions- und Schriftdaten.
Lizenzierung
Für kommerzielle Projekte ist dies der folgenreichste Unterschied zwischen pdfplumber und PyMuPDF.
| 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 (sofern AGPL-kompatibel) | Ja |
Das AGPL-Problem von PyMuPDF
PyMuPDF umschließt MuPDF, das unter AGPL-3.0 lizenziert ist. Wenn Sie Software vertreiben, die PyMuPDF enthält – einschließlich SaaS, Web-Apps und Docker-Containern – muss Ihr Code unter AGPL offengelegt werden, oder Sie müssen eine kommerzielle Lizenz von Artifex erwerben.
Artifex veröffentlicht die Preise für kommerzielle Lizenzen nicht öffentlich. Sie müssen das Vertriebsteam für ein Angebot kontaktieren. Lizenzen gelten in der Regel pro Anwendung, werden jährlich verlängert und bieten weder eine kostenlose Stufe noch eine Ausnahme für Start-ups.
pdfplumber und PDF Oxide sind beide MIT
Sowohl pdfplumber als auch PDF Oxide sind MIT-lizenziert. Nutzen Sie eines von beiden in jedem Projekt – kommerziell, proprietär, SaaS oder Open Source – ohne Verpflichtungen. Wenn Lizenzierung Ihre Hauptsorge ist und Sie zwischen pdfplumber und PyMuPDF wählen, ist pdfplumber (oder PDF Oxide) die sicherere Wahl.
Verschlüsselte PDFs
Der Umgang mit Verschlüsselung ist eine erhebliche Lücke im Funktionsumfang von pdfplumber 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, löst es einen Fehler aus. Sie müssen die Datei zuerst mit einem anderen Werkzeug entschlüsseln:
import pdfplumber
# This will fail on encrypted PDFs:
with pdfplumber.open("encrypted.pdf") as pdf:
# raises pdfminer.pdfparser.PDFSyntaxError or similar
pass
Eine gängige Umgehungslösung besteht darin, die Datei zuerst mit PyMuPDF oder pypdf zu entschlüsseln und sie dann zur Tabellenextraktion an pdfplumber zu übergeben – wodurch Ihrer Pipeline eine weitere Abhängigkeit hinzugefügt wird.
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 Eigentümerpasswö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 beherrscht alle standardmäßigen PDF-Verschlüsselungsmethoden (RC4, AES-128, AES-256) sowohl beim Lesen als auch beim Schreiben. Es sind keine zusätzlichen Abhängigkeiten oder Vorverarbeitung erforderlich.
Bildextraktion
Eine weitere Lücke im Funktionsumfang von pdfplumber. 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 die Bildseite nicht abdecken. Dafür benötigen Sie PyMuPDF, PDF Oxide oder pypdfium2.
Markdown- und HTML-Ausgabe
Weder pdfplumber noch PyMuPDF bieten eine integrierte Markdown- oder HTML-Konvertierung. Das ist ein Alleinstellungsmerkmal von PDF Oxide.
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
# Markdown with heading detection and table formatting
md = doc.to_markdown(0, detect_headings=True)
print(md)
# HTML with semantic tags
html = doc.to_html(0)
print(html)
Für LLM-Pipelines, RAG-Systeme und Workflows zur Dokumentenkonvertierung beseitigt die strukturierte Markdown-Ausgabe die Notwendigkeit eines separaten Konvertierungsschritts. PyMuPDF-Nutzer verlassen sich in der Regel auf das separate Paket pymupdf4llm, das 69x langsamer ist als die integrierte Konvertierung von PDF Oxide.
Wann welche Bibliothek wählen
Wählen Sie pdfplumber, wenn:
- Die Extraktion komplexer Tabellen Ihr Hauptanwendungsfall ist. Die Tabellenalgorithmen von pdfplumber verarbeiten 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, um die Extraktion bei kniffligen Dokumenten abzustimmen.
- Sie eine reine Python-Lösung möchten. Keine kompilierten Abhängigkeiten, lässt sich überall installieren, wo Python läuft.
- Geschwindigkeit keine Rolle spielt. Wenn Sie weniger als hundert Dateien auf einmal verarbeiten, sind im Mittel 23ms völlig akzeptabel.
Wählen Sie PyMuPDF, wenn:
- Sie bereits eine kommerzielle MuPDF-Lizenz besitzen und auf MuPDF-spezifisches Rendering oder SVG-Export angewiesen sind.
- Sie hochwertiges Rendering benötigen. Die Rendering-Engine von MuPDF ist ausgereift und verarbeitet komplexe PDFs gut.
- Ihr Projekt AGPL-kompatibel ist. Wenn Sie Open-Source-Software unter AGPL oder einer kompatiblen Lizenz entwickeln, ist die Lizenzierung von PyMuPDF kein Problem.
- Sie OCR über Tesseract benötigen. PyMuPDF verfügt über eine integrierte Tesseract-Anbindung für gescannte Dokumente.
Wählen Sie PDF Oxide, wenn:
- Sie Geschwindigkeit und einen breiten Funktionsumfang benötigen. Im Mittel 0,8ms Extraktion – 5,8x schneller als PyMuPDF, 29x schneller als pdfplumber – mit Text, Bildern, Formularen, Erstellung und Verschlüsselung in einer Bibliothek.
- Sie MIT-Lizenzierung ohne Geschwindigkeitseinbußen möchten. 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 Unterstützung für verschlüsselte PDFs mit einer permissiven Lizenz benötigen. pdfplumber kann keine Verschlüsselung verarbeiten. PyMuPDF kann es, erfordert aber AGPL-Konformität. PDF Oxide verarbeitet Verschlüsselung unter MIT.
- Sie eine einzige Bibliothek für Extraktion, Erstellung und Bearbeitung möchten. Sowohl pdfplumber als auch PyMuPDF erfordern zusätzliche Werkzeuge für Teile des PDF-Workflows. PDF Oxide deckt Extraktion, Erstellung, Bearbeitung, Rendering und Validierung ab.
PDF Oxide + pdfplumber gemeinsam nutzen:
Für Pipelines, die schnelle Textextraktion, Bildextraktion und das Parsen komplexer Tabellen benötigen, verwenden Sie PDF Oxide für die allgemeine Pipeline und pdfplumber für die Tabellen:
from pdf_oxide import PdfDocument
import pdfplumber
# Fast text and image extraction with PDF Oxide
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
images = doc.extract_images(0)
# Complex table extraction with 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 lizenzrechtlichen Auswirkungen, bevor Sie es einem kommerziellen Projekt hinzufügen.
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) |
| Extraktion komplexer Tabellen | 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 hat keine Bildunterstützung |
| 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 Ihr gesamter Workflow nicht aus der Extraktion komplexer Tabellen besteht (randlose Tabellen, zusammengeführte Zellen, visuelles Debugging), ersetzt PDF Oxide sowohl pdfplumber als auch PyMuPDF – schneller, mit 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× faster than pdfplumber
md = doc.to_markdown(0) # built-in, no separate package
images = doc.extract_images(0) # pdfplumber can't do this
Verwandte Seiten
- PDF Oxide vs PyMuPDF – ausführlicher Vergleich mit Migrationsleitfaden
- PDF Oxide vs pdfplumber – ausführlicher Vergleich mit Codebeispielen
- vs Python-PDF-Bibliotheken – alle Python-Bibliotheken im Vergleich
- Leistungs-Benchmarks – vollständige Benchmark-Methodik über den Korpus
- Tabellen aus PDF extrahieren – Leitfaden zur Tabellenextraktion
- Erste Schritte mit Python – Installation und erste Extraktion