PyMuPDF vs pypdf
PyMuPDF und pypdf sind zwei der beliebtesten Python-PDF-Bibliotheken, aber beide haben erhebliche Kompromisse. PyMuPDF ist schnell, aber durch die AGPL-3.0-Lizenzierung eingeschränkt. pypdf ist permissiv lizenziert, aber 15× langsamer. Diese Seite vergleicht sie direkt — und zeigt, warum PDF Oxide die bessere Wahl als beide ist.
Die kurze Antwort: PDF Oxide ist 5,8× schneller als PyMuPDF, 15× schneller als pypdf, MIT-lizenziert und bietet mehr Funktionen als beide — einschließlich integrierter Markdown-/HTML-Ausgabe, XFA-Formularunterstützung und OCR ohne Systemabhängigkeiten.
Schnellvergleich
| PyMuPDF | pypdf | PDF Oxide | |
|---|---|---|---|
| Lizenz | AGPL-3.0 | BSD-3 | MIT |
| Sprache | C (MuPDF) | Reines Python | Rust + PyO3 |
| Durchschn. Extraktionszeit | 4,6ms | 12,1ms | 0,8ms |
| p99-Extraktionszeit | 28ms | 97ms | 9ms |
| Erfolgsrate (3.830 PDFs) | 99,3% | 98,4% | 100% |
| Textextraktion | Ja | Ja | Ja |
| Zeichenpositionen | Ja | Teilweise | Ja |
| Bildextraktion | Ja | Ja | Ja |
| Formularfelder | Lesen + Schreiben | Lesen + Schreiben | Lesen + Schreiben |
| PDF-Erstellung | Ja | Eingeschränkt (nur Zusammenführen) | Ja (Markdown/HTML) |
| Markdown-Ausgabe | Nein | Nein | Ja |
| HTML-Ausgabe | Nein | Nein | Ja |
| Rendering | Ja | Nein | Ja |
| OCR | Tesseract | Nein | Integriert (PaddleOCR) |
| Installationsgröße | ~20 MB | ~1 MB | ~5 MB |
| Verschlüsselung | Lesen + Schreiben | Lesen + Schreiben | Lesen + Schreiben |
| Suche | Ja | Nein | Regex + räumlich |
| Python-Versionen | 3.8–3.12 | 3.6+ | 3.8–3.14 |
PyMuPDF ist schneller und funktionsreicher als pypdf, aber seine AGPL-Lizenz ist für viele kommerzielle Projekte ein Ausschlusskriterium. pypdf ist leichter und BSD-lizenziert, aber deutlich langsamer und in den Extraktionsfähigkeiten eingeschränkter. PDF Oxide kombiniert den Geschwindigkeitsvorteil einer nativen Engine mit der Lizenzierungsfreiheit einer permissiven Lizenz.
Lizenzierung: AGPL vs BSD vs MIT
Der Lizenzierungsunterschied zwischen PyMuPDF und pypdf ist oft der entscheidende Faktor für Teams.
PyMuPDF — AGPL-3.0
PyMuPDF nutzt MuPDF, das unter AGPL-3.0 lizenziert ist. Dies ist eine starke Copyleft-Lizenz. Wenn Sie Software vertreiben, die PyMuPDF verwendet — einschließlich SaaS-Anwendungen, Docker-Container, Web-Services, Desktop-Apps oder CLI-Tools — muss Ihre gesamte Anwendung unter AGPL-3.0 veröffentlicht werden. Das bedeutet, Ihren vollständigen Quellcode unter derselben Lizenz zu veröffentlichen.
Die Alternative ist der Kauf einer kommerziellen Lizenz von Artifex, dem Unternehmen hinter MuPDF. Artifex veröffentlicht keine Preise; Sie müssen deren Vertriebsteam für ein Angebot kontaktieren. Kommerzielle Lizenzen sind typischerweise jährlich und werden pro Anwendung berechnet.
AGPL betrifft Sie, wenn:
- Sie ein Produkt ausliefern, das PyMuPDF enthält (Desktop-App, Mobile-App, Electron)
- Sie einen SaaS oder Web-Service betreiben, der PDFs mit PyMuPDF verarbeitet
- Sie Docker-Images verteilen, die PyMuPDF enthalten
- Sie eine API bereitstellen, die intern PyMuPDF verwendet
AGPL betrifft Sie nicht, wenn:
- Ihr Projekt bereits unter einer AGPL-kompatiblen Lizenz Open-Source ist
- Sie PyMuPDF nur für interne Tools verwenden, die nie verteilt werden
pypdf — BSD-3
pypdf verwendet die BSD-3-Clause-Lizenz, die permissiv ist. Sie können pypdf in kommerziellen Produkten, Closed-Source-Software und SaaS-Anwendungen verwenden, ohne Ihren Code offen legen zu müssen. Die einzige Anforderung ist die Beibehaltung des Copyright-Hinweises bei Weitergabe.
PDF Oxide — MIT
PDF Oxide ist MIT-lizenziert — die permissivste gängige Open-Source-Lizenz. Verwenden Sie es in jedem Kontext (kommerziell, proprietär, SaaS, Open Source) ohne Einschränkungen außer der Einbeziehung des Lizenztexts.
Lizenz-Zusammenfassung
| Anwendungsfall | PyMuPDF (AGPL) | pypdf (BSD) | PDF Oxide (MIT) |
|---|---|---|---|
| Kommerzielles Produkt | Erfordert Lizenz | Ja | Ja |
| Closed-Source-SaaS | Erfordert Lizenz | Ja | Ja |
| Docker-Distribution | Erfordert Lizenz | Ja | Ja |
| Interne Tools | Ja | Ja | Ja |
| Open Source (AGPL-kompatibel) | Ja | Ja | Ja |
| Open Source (MIT/BSD/Apache) | Nein | Ja | Ja |
Für kommerzielle Projekte, bei denen Lizenz-Compliance wichtig ist, sind pypdf und PDF Oxide beide sichere Optionen. PyMuPDF erfordert entweder die Offenlegung Ihrer Anwendung oder den Kauf einer kommerziellen Lizenz.
Geschwindigkeits-Benchmarks
Alle Benchmarks wurden auf demselben Korpus von 3.830 PDFs ausgeführt — drei unabhängige, öffentlich verfügbare Testsuiten (veraPDF, Mozilla pdf.js, DARPA SafeDocs), die jede PDF-Spezifikationsversion (1.0–2.0), verschlüsselte Dateien, CJK-Kodierungen, komplexe Layouts und fehlerhafte Dokumente abdecken.
Textextraktionsgeschwindigkeit
| Bibliothek | Durchschnitt | p99 | Relativ zu PDF Oxide |
|---|---|---|---|
| PDF Oxide | 0,8ms | 9ms | 1× |
| PyMuPDF | 4,6ms | 28ms | 5,8× langsamer |
| pypdf | 12,1ms | 97ms | 15,1× langsamer |
PyMuPDF ist 2,6× schneller als pypdf, weil es das Parsing an MuPDFs C-Engine delegiert. pypdf macht alles in reinem Python — Parsing, Schriftdekodierung, Textassemblierung — was bedeutet, dass jede Operation den Interpreter-Overhead zahlt.
PDF Oxide ist schneller als beide, weil sein Rust-Kern alles PDF-Parsing, Schriftdekodierung und Textlayout nativ via PyO3 verarbeitet, wobei nur das Endergebnis die Python-Grenze überschreitet. Es gibt keinen Subprozess-Overhead, kein C-Bibliotheks-Bridging über ctypes und keinen Interpreter-Engpass.
Zuverlässigkeit
| Bibliothek | Gültige PDFs bestanden | Erfolgsrate |
|---|---|---|
| PDF Oxide | 3.823 / 3.823 | 100% |
| PyMuPDF | 3.796 / 3.823 | 99,3% |
| pypdf | 3.762 / 3.823 | 98,4% |
PyMuPDF scheitert bei 27 gültigen PDFs im Korpus. pypdf scheitert bei 61. In beiden Fällen handelt es sich um gültige PDF-Dateien, bei denen die Bibliothek entweder abstürzt oder leeren/fehlerhaften Text zurückgibt. PDF Oxide verarbeitet alle 3.823 gültigen PDFs ohne Fehler.
Die 7 nicht bestandenen Dateien im gesamten Korpus von 3.830 Dateien sind absichtlich fehlerhafte Test-Fixtures (fehlender PDF-Header, Fuzz-korrupte Kataloge, ungültige Xref-Streams) und werden von den Erfolgsraten-Berechnungen aller Bibliotheken ausgeschlossen.
Was das in der Praxis bedeutet
Für eine Pipeline, die täglich Tausende PDFs verarbeitet, bedeutet PyMuPDFs 99,3% Erfolgsrate etwa 7 Fehler pro 1.000 Dokumente. pypdfs 98,4% bedeutet 16 Fehler pro 1.000. Das sind Dokumente, die Sie mit Fallback-Logik, manueller Überprüfung oder einfach als verlorene Daten behandeln müssen.
Die 100% Erfolgsrate von PDF Oxide auf dem Test-Korpus bedeutet weniger Sonderfälle in der Produktion.
Funktionsvergleich
Textextraktion
Alle drei Bibliotheken unterstützen grundlegende Textextraktion. Die API-Stile unterscheiden sich:
PyMuPDF:
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
text = page.get_text()
print(text)
pypdf:
from pypdf import PdfReader
reader = PdfReader("report.pdf")
text = reader.pages[0].extract_text()
print(text)
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)
PyMuPDF verwendet ein Seitenobjektmodell (doc[0] gibt eine Seite zurück). pypdf verwendet ein Reader-/Pages-Muster. PDF Oxide verwendet Seitenindizes direkt.
Für die Extraktion auf Zeichenebene (Positionen, Schriftgrößen, Bounding-Boxes) bietet PyMuPDF get_text("dict"), das eine verschachtelte Dict-Struktur zurückgibt. pypdf bietet teilweise Zeichenpositionsdaten. PDF Oxide bietet extract_chars() mit Bounding-Boxes und Schrift-Metadaten pro Zeichen.
Markdown-Konvertierung
Dies ist ein bedeutender Differenzierungsfaktor. Viele LLM- und RAG-Pipelines benötigen Markdown-Ausgabe von PDFs.
PyMuPDF:
# PyMuPDF hat keine integrierte Markdown-Konvertierung.
# Sie benötigen pymupdf4llm, ein separates Paket:
import pymupdf4llm
md = pymupdf4llm.to_markdown("paper.pdf")
pymupdf4llm funktioniert, ist aber 69× langsamer als die integrierte Markdown-Konvertierung von PDF Oxide (55,5ms Durchschnitt gegenüber 0,8ms). Es ist außerdem eine separate Abhängigkeit mit eigenem Wartungszyklus.
pypdf:
# pypdf hat keine Markdown-Konvertierung.
# Sie bräuchten eine externe Toolchain (z.B. Text extrahieren,
# dann eine separate Bibliothek verwenden, um ihn als Markdown zu strukturieren).
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
md = doc.to_markdown(0, detect_headings=True)
print(md)
Die Markdown-Konvertierung von PDF Oxide ist integriert, erkennt Überschriften, bewahrt Tabellenstruktur und läuft mit der gleichen Geschwindigkeit wie die reine Textextraktion.
HTML-Konvertierung
PyMuPDF: Keine integrierte HTML-Ausgabe.
pypdf: Keine HTML-Ausgabe.
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
html = doc.to_html(0)
print(html)
Formularfelder
Alle drei Bibliotheken unterstützen das Lesen und Schreiben von Formularfeldern (AcroForm).
PyMuPDF:
import fitz
doc = fitz.open("form.pdf")
page = doc[0]
for widget in page.widgets():
print(f"{widget.field_name}: {widget.field_value}")
pypdf:
from pypdf import PdfReader
reader = PdfReader("form.pdf")
fields = reader.get_fields()
for name, field in fields.items():
print(f"{name}: {field.get('/V', '')}")
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("form.pdf")
fields = doc.get_form_fields()
for field in fields:
print(f"{field.name}: {field.value}")
Ein bemerkenswerter Unterschied: PDF Oxide unterstützt XFA-Formulare (XML Forms Architecture), die in vielen Behörden- und Unternehmens-PDF-Formularen verwendet werden. Weder PyMuPDF noch pypdf verarbeitet die Extraktion von XFA-Formulardaten.
Bildextraktion
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"])
pypdf:
from pypdf import PdfReader
reader = PdfReader("report.pdf")
page = reader.pages[0]
for i, image in enumerate(page.images):
with open(f"image_{i}.{image.name.split('.')[-1]}", "wb") as f:
f.write(image.data)
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"])
Alle drei verarbeiten eingebettete Bildextraktion. PyMuPDFs Ansatz erfordert einen zweistufigen Xref-Lookup. pypdf und PDF Oxide bieten schlankere APIs.
Rendering
PyMuPDF kann PDF-Seiten in Bilder (PNG, JPEG) mittels MuPDFs Rendering-Engine rendern. pypdf kann Seiten überhaupt nicht rendern. PDF Oxide enthält eine integrierte Rendering-Engine.
OCR
PyMuPDF integriert Tesseract für OCR bei gescannten PDFs. pypdf hat keine OCR-Unterstützung. PDF Oxide hat integriertes OCR über PaddleOCR, ohne externe Systemabhängigkeiten.
PDF-Erstellung
PyMuPDF kann PDFs erstellen, erfordert aber manuelles Platzieren von Text, Bildern und Formen auf Seiten — es gibt keine High-Level-API zum Erstellen von PDFs aus strukturiertem Inhalt.
pypdf kann keine PDFs von Grund auf erstellen. Es kann bestehende PDFs zusammenführen, teilen und modifizieren, aber für die Erstellung benötigen Sie eine separate Bibliothek wie reportlab oder fpdf2.
PDF Oxide kann PDFs aus Markdown oder HTML erstellen:
from pdf_oxide import Pdf
pdf = Pdf.from_markdown("# Invoice\n\n| Item | Price |\n|------|-------|\n| Widget | $9.99 |")
pdf.save("invoice.pdf")
Verschlüsselung
Alle drei Bibliotheken unterstützen das Lesen verschlüsselter PDFs und das Schreiben verschlüsselter Ausgaben.
PyMuPDF:
import fitz
doc = fitz.open("encrypted.pdf")
doc.authenticate("password")
text = doc[0].get_text()
pypdf:
from pypdf import PdfReader
reader = PdfReader("encrypted.pdf")
reader.decrypt("password")
text = reader.pages[0].extract_text()
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("encrypted.pdf", password="password")
text = doc.extract_text(0)
Funktions-Zusammenfassung
| Funktion | PyMuPDF | pypdf | PDF Oxide |
|---|---|---|---|
| Textextraktion | Ja | Ja | Ja |
| Zeichenpositionen | Ja | Teilweise | Ja |
| Bildextraktion | Ja | Ja | Ja |
| Formularfelder (AcroForm) | Lesen + Schreiben | Lesen + Schreiben | Lesen + Schreiben |
| XFA-Formulare | Nein | Nein | Ja |
| PDF-Erstellung | Manuell | Nein | Markdown/HTML |
| Markdown-Ausgabe | Nein (pymupdf4llm) | Nein | Integriert |
| HTML-Ausgabe | Nein | Nein | Integriert |
| Rendering | Ja | Nein | Ja |
| OCR | Tesseract | Nein | Integriert (PaddleOCR) |
| Suche | Ja | Nein | Regex + räumlich |
| Verschlüsselung | Lesen + Schreiben | Lesen + Schreiben | Lesen + Schreiben |
| PDF/A-Validierung | Nein | Nein | Ja |
| SVG-Export | Ja | Nein | Nein |
| Zusammenführen/Teilen | Ja | Ja | Ja |
Wann welche Bibliothek wählen
Wählen Sie pypdf, wenn:
- Sie eine reine Python-Lösung ohne kompilierte C- oder Rust-Erweiterungen benötigen
- Sie einfache PDF-Manipulation durchführen (Zusammenführen, Teilen, Drehen, Verschlüsseln/Entschlüsseln)
- Geschwindigkeit für Ihren Anwendungsfall nicht kritisch ist
- Sie den kleinstmöglichen Installations-Footprint wünschen (~1 MB)
- Sie breite Python-Versionsunterstützung benötigen (3.6+)
Wählen Sie PyMuPDF, wenn:
- Sie bereits eine kommerzielle MuPDF-Lizenz von Artifex haben
- Sie SVG-Export von PDF-Seiten benötigen
- Ihr Projekt bereits unter AGPL-3.0 lizenziert ist
- Sie auf MuPDF-spezifisches Rendering-Verhalten angewiesen sind
Wählen Sie PDF Oxide, wenn:
- Sie maximale Textextraktionsgeschwindigkeit benötigen (5,8× schneller als PyMuPDF, 15× schneller als pypdf)
- Sie MIT-Lizenzierung für kommerzielle oder Closed-Source-Nutzung wünschen
- Sie integrierte Markdown- oder HTML-Ausgabe für LLM-/RAG-Pipelines benötigen
- Sie XFA-Formularunterstützung benötigen
- Sie integriertes OCR ohne externe Systemabhängigkeiten wünschen
- Sie 100% Zuverlässigkeit bei gültigen PDFs wünschen
Installation
# PyMuPDF
pip install pymupdf
# pypdf
pip install pypdf
# PDF Oxide
pip install pdf_oxide
Alle drei sind über pip verfügbar. PyMuPDF liefert ein ~20 MB Wheel mit gebündeltem MuPDF. pypdf ist reines Python mit ~1 MB. PDF Oxide liefert vorkompilierte Wheels (~5 MB) für Linux (x86_64, aarch64), macOS (x86_64, arm64) und Windows (x86_64).
Das Fazit
Wenn Sie zwischen PyMuPDF und pypdf wählen, wählen Sie zwischen Geschwindigkeit und Lizenzierungsfreiheit. PDF Oxide gibt Ihnen beides — schneller als PyMuPDF, permissiver als pypdf, mit Funktionen, die keine der beiden Bibliotheken bietet.
| Was Ihnen wichtig ist | Beste Wahl |
|---|---|
| Maximale Geschwindigkeit | PDF Oxide (0,8ms) |
| Permissive Lizenz | PDF Oxide (MIT) oder pypdf (BSD) |
| Geschwindigkeit + permissive Lizenz | PDF Oxide — die einzige Option |
| Markdown-/HTML-Ausgabe | PDF Oxide — integriert |
| XFA-Formulare | PDF Oxide — einzige Bibliothek, die sie unterstützt |
| 100% Zuverlässigkeit | PDF Oxide — 100% Erfolgsrate |
| OCR ohne Tesseract | PDF Oxide — integriertes PaddleOCR |
| SVG-Export | PyMuPDF |
| Reines Python, keine Binärdateien | pypdf |
In 10 Sekunden loslegen:
pip install pdf_oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
Verwandte Seiten
- PDF Oxide vs PyMuPDF — detaillierter Vergleich
- PDF Oxide vs pypdf — detaillierter Vergleich
- vs alle Python-PDF-Bibliotheken — vollständiger Ökosystemvergleich
- Leistungsbenchmarks — Methodik und Ergebnisse