PyMuPDF vs. pypdf – Welche Python-PDF-Bibliothek?
PyMuPDF und pypdf sind zwei der beliebtesten Python-PDF-Bibliotheken, doch beide haben erhebliche Kompromisse. PyMuPDF ist schnell, aber hinter der AGPL-3.0-Lizenz eingesperrt. pypdf ist permissiv lizenziert, aber 15× langsamer. Diese Seite vergleicht beide direkt – und zeigt, warum PDF Oxide die bessere Wahl ist als jede der beiden.
Die kurze Antwort: PDF Oxide ist 5,8× schneller als PyMuPDF, 15× schneller als pypdf, MIT-lizenziert und bietet mehr Funktionen als beide – darunter integrierte Markdown-/HTML-Ausgabe, Unterstützung für XFA-Formulare und OCR ohne Systemabhängigkeiten.
Schnellvergleich
| PyMuPDF | pypdf | PDF Oxide | |
|---|---|---|---|
| Lizenz | AGPL-3.0 | BSD-3 | MIT |
| Sprache | C (MuPDF) | Reines Python | Rust + PyO3 |
| Mittlere Extraktionszeit | 4.6ms | 12.1ms | 0.8ms |
| p99-Extraktionszeit | 28ms | 97ms | 9ms |
| Erfolgsquote (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, doch seine AGPL-Lizenz ist für viele kommerzielle Projekte ein Ausschlusskriterium. pypdf ist schlanker und BSD-lizenziert, aber deutlich langsamer und in den Extraktionsfähigkeiten eingeschränkter. PDF Oxide verbindet den Geschwindigkeitsvorteil einer nativen Engine mit der lizenzrechtlichen Freiheit einer permissiven Lizenz.
Lizenzierung: AGPL vs. BSD vs. MIT
Der Lizenzunterschied zwischen PyMuPDF und pypdf ist oft der ausschlaggebende Faktor für Teams, die sich zwischen beiden entscheiden.
PyMuPDF – AGPL-3.0
PyMuPDF umhüllt MuPDF, das unter der AGPL-3.0 lizenziert ist. Das ist eine starke Copyleft-Lizenz. Wenn Sie irgendeine Software verteilen, die PyMuPDF nutzt – einschließlich SaaS-Anwendungen, Docker-Containern, Webdiensten, Desktop-Apps oder CLI-Tools –, muss Ihre gesamte Anwendung unter der AGPL-3.0 veröffentlicht werden. Das bedeutet, Ihren vollständigen Quellcode unter derselben Lizenz zu veröffentlichen.
Die Alternative ist der Erwerb einer kommerziellen Lizenz von Artifex, dem Unternehmen hinter MuPDF. Artifex veröffentlicht keine Preise; für ein Angebot müssen Sie das Vertriebsteam kontaktieren. Kommerzielle Lizenzen werden in der Regel jährlich und pro Anwendung berechnet.
Die AGPL betrifft Sie, wenn:
- Sie ein Produkt ausliefern, das PyMuPDF enthält (Desktop-App, Mobile-App, Electron)
- Sie ein SaaS oder einen Webdienst betreiben, der PDFs mit PyMuPDF verarbeitet
- Sie Docker-Images verteilen, die PyMuPDF enthalten
- Sie eine API bereitstellen, die intern PyMuPDF verwendet
Die AGPL betrifft Sie nicht, wenn:
- Ihr Projekt bereits unter einer AGPL-kompatiblen Lizenz quelloffen ist
- Sie PyMuPDF nur für interne Werkzeuge verwenden, die niemals 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 einsetzen, ohne Ihren Code offenlegen zu müssen. Die einzige Anforderung ist, den Copyright-Hinweis bei Weitergaben beizubehalten.
PDF Oxide – MIT
PDF Oxide ist MIT-lizenziert – die permissivste der gängigen Open-Source-Lizenzen. Setzen Sie es in jedem Kontext (kommerziell, proprietär, SaaS, Open Source) ohne Einschränkungen ein, abgesehen vom Beifügen des Lizenztextes.
Zusammenfassung der Lizenzierung
| Anwendungsfall | PyMuPDF (AGPL) | pypdf (BSD) | PDF Oxide (MIT) |
|---|---|---|---|
| Kommerzielles Produkt | Lizenz erforderlich | Ja | Ja |
| Closed-Source-SaaS | Lizenz erforderlich | Ja | Ja |
| Docker-Verteilung | Lizenz erforderlich | 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 aus 3.830 PDFs ausgeführt – drei unabhängigen, öffentlich verfügbaren Test-Suiten (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 | Mittelwert | p99 | Relativ zu PDF Oxide |
|---|---|---|---|
| PDF Oxide | 0.8ms | 9ms | 1x |
| PyMuPDF | 4.6ms | 28ms | 5.8x langsamer |
| pypdf | 12.1ms | 97ms | 15.1x langsamer |
PyMuPDF ist 2.6x schneller als pypdf, weil es das Parsen an die C-Engine von MuPDF delegiert. pypdf erledigt alles in reinem Python – Parsen, Schriftartdekodierung, Textzusammensetzung –, sodass jeder Vorgang den Overhead des Interpreters trägt.
PDF Oxide ist schneller als beide, weil sein Rust-Kern das gesamte PDF-Parsen, die Schriftartdekodierung und das Textlayout nativ über PyO3 erledigt und nur das Endergebnis die Python-Grenze überquert. Es gibt keinen Subprozess-Overhead, keine Anbindung einer C-Bibliothek über ctypes und keinen Interpreter-Engpass.
Zuverlässigkeit
| Bibliothek | Bestandene gültige PDFs | Erfolgsquote |
|---|---|---|
| PDF Oxide | 3.823 / 3.823 | 100% |
| PyMuPDF | 3.796 / 3.823 | 99.3% |
| pypdf | 3.762 / 3.823 | 98.4% |
PyMuPDF scheitert an 27 gültigen PDFs im Korpus. pypdf scheitert an 61. In beiden Fällen handelt es sich um gültige PDF-Dateien, bei denen die Bibliothek entweder abstürzt oder leeren/falschen Text zurückgibt. PDF Oxide verarbeitet alle 3.823 gültigen PDFs ohne Fehler.
Die 7 nicht bestandenen Dateien im vollständigen Korpus aus 3.830 Dateien sind absichtlich beschädigte Test-Fixtures (fehlender PDF-Header, durch Fuzzing beschädigte Kataloge, ungültige xref-Streams) und werden bei der Berechnung der Erfolgsquote für alle Bibliotheken ausgeschlossen.
Was das in der Praxis bedeutet
Für eine Pipeline, die täglich Tausende von PDFs verarbeitet, bedeutet die Erfolgsquote von 99,3 % bei PyMuPDF etwa 7 Fehlschläge pro 1.000 Dokumente. Die 98,4 % von pypdf bedeuten 16 Fehlschläge pro 1.000. Das sind Dokumente, die Sie mit Fallback-Logik, manueller Prüfung behandeln oder schlicht als verlorene Daten hinnehmen müssen.
Die Erfolgsquote von 100 % bei PDF Oxide auf dem Test-Korpus bedeutet weniger Sonderfälle, die in der Produktion zu behandeln sind.
Funktionsvergleich
Textextraktion
Alle drei Bibliotheken unterstützen die 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 Seitenobjekt-Modell (doc[0] gibt eine Seite zurück). pypdf nutzt ein Reader/Pages-Muster. PDF Oxide verwendet Seitenindizes direkt.
Für die Extraktion auf Zeichenebene (Positionen, Schriftgrößen, Begrenzungsrahmen) bietet PyMuPDF get_text("dict"), das eine verschachtelte Dictionary-Struktur zurückgibt. pypdf bietet teilweise Daten zu Zeichenpositionen. PDF Oxide bietet extract_chars() mit Begrenzungsrahmen pro Zeichen und Schriftart-Metadaten.
Markdown-Konvertierung
Das ist ein wesentliches Unterscheidungsmerkmal. Viele LLM- und RAG-Pipelines benötigen Markdown-Ausgabe aus PDFs.
PyMuPDF:
# PyMuPDF has no built-in Markdown conversion.
# You need pymupdf4llm, a separate package:
import pymupdf4llm
md = pymupdf4llm.to_markdown("paper.pdf")
pymupdf4llm funktioniert, ist aber 69x langsamer als die integrierte Markdown-Konvertierung von PDF Oxide (im Mittel 55.5ms gegenüber 0.8ms). Außerdem ist es eine separate Abhängigkeit mit eigenem Wartungszyklus.
pypdf:
# pypdf has no Markdown conversion.
# You would need an external tool chain (e.g., extract text,
# then use a separate library to structure it as Markdown).
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, übernimmt die Überschriftenerkennung, bewahrt die Tabellenstruktur und läuft mit derselben 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 bewältigen 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 bewältigen die Extraktion eingebetteter Bilder. Der Ansatz von PyMuPDF erfordert eine zweistufige xref-Suche. pypdf und PDF Oxide bieten schlankere APIs.
Rendering
PyMuPDF kann PDF-Seiten mithilfe der Rendering-Engine von MuPDF in Bilder (PNG, JPEG) rendern. pypdf kann Seiten überhaupt nicht rendern. PDF Oxide enthält eine integrierte Rendering-Engine.
OCR
PyMuPDF integriert sich für OCR auf gescannten PDFs mit Tesseract. pypdf hat keine OCR-Unterstützung. PDF Oxide verfügt über integriertes OCR via PaddleOCR und benötigt keine externen Systemabhängigkeiten.
PDF-Erstellung
PyMuPDF kann PDFs erstellen, erfordert aber die manuelle Platzierung von Text, Bildern und Formen auf den Seiten – es gibt keine High-Level-API zum Erstellen von PDFs aus strukturierten Inhalten.
pypdf kann keine PDFs von Grund auf erstellen. Es kann bestehende PDFs zusammenführen, aufteilen und ändern, 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übersicht
| 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/Aufteilen | 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-Manipulationen durchführen (Zusammenführen, Aufteilen, Drehen, Ver-/Entschlüsseln)
- Geschwindigkeit für Ihren Anwendungsfall nicht entscheidend 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 besitzen
- Sie SVG-Export aus PDF-Seiten benötigen
- Ihr Projekt bereits unter der 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.8x schneller als PyMuPDF, 15x 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 Unterstützung für XFA-Formulare 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 großes Wheel mit gebündeltem MuPDF aus. pypdf ist reines Python mit ~1 MB. PDF Oxide liefert vorgefertigte 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, entscheiden Sie zwischen Geschwindigkeit und lizenzrechtlicher Freiheit. PDF Oxide bietet 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 – die einzige Bibliothek, die sie unterstützt |
| 100 % Zuverlässigkeit | PDF Oxide – 100 % Erfolgsquote |
| 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. allen Python-PDF-Bibliotheken – vollständiger Ökosystem-Vergleich
- Performance-Benchmarks – Methodik und Ergebnisse