PDF Oxide vs PyMuPDF
PDF Oxide ist die MIT-lizenzierte Alternative zu PyMuPDF — 5,8× schneller und ohne AGPL-Compliance-Aufwand. Wer PyMuPDF für ein kommerzielles Produkt evaluiert oder aus Lizenzgründen ablösen will, findet hier die entscheidenden Unterschiede kompakt zusammengefasst.
Warum Teams von PyMuPDF wechseln
Lizenz. PyMuPDF stützt sich auf MuPDF unter AGPL-3.0. Sobald Sie Software ausliefern, die PyMuPDF enthält — egal ob SaaS, Webanwendung oder Docker-Container — müssen Sie entweder Ihren gesamten Quellcode unter AGPL offenlegen oder eine kommerzielle Lizenz bei Artifex einkaufen. PDF Oxide steht unter MIT, ohne jede derartige Auflage.
Tempo. PDF Oxide extrahiert Text im Mittel in 0,8 ms, PyMuPDF braucht 4,6 ms — auf 3.830 PDFs ist das Faktor 5,8.
Zuverlässigkeit. Auf demselben Korpus erreicht PDF Oxide 100 % Trefferquote; PyMuPDF liegt bei 99,3 % und scheitert an 27 gültigen PDFs.
Vergleich auf einen Blick
| PDF Oxide | PyMuPDF | |
|---|---|---|
| Lizenz | MIT | AGPL-3.0 |
| Mittlere Extraktionszeit | 0,8 ms | 4,6 ms |
| Trefferquote (3.830 PDFs) | 100 % | 99,3 % |
| Textextraktion | Ja | Ja |
| Zeichenpositionen | Ja | Ja |
| Bildextraktion | Ja | Ja |
| Formularfelder | Lesen + Schreiben | Lesen + Schreiben |
| PDF-Erzeugung | Ja (Markdown/HTML) | Ja |
| Markdown-Ausgabe | Ja | Nein |
| HTML-Ausgabe | Ja | Nein |
| Verschlüsselung | Lesen + Schreiben | Lesen + Schreiben |
| Rendering | Ja | Ja |
| OCR | Eingebaut (PaddleOCR) | Tesseract |
| Installationsgröße | ~5 MB | ~20 MB |
| Python-Versionen | 3.8–3.14 | 3.8–3.12 |
Code im direkten Vergleich
Textextraktion
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)
PyMuPDF:
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
text = page.get_text()
print(text)
Markdown-Konvertierung
PDF Oxide (eingebaut):
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
md = doc.to_markdown(0, detect_headings=True)
print(md)
PyMuPDF:
# PyMuPDF bringt keine Markdown-Konvertierung mit.
# Separater Zusatz: pymupdf4llm (69x langsamer als PDF Oxide):
import pymupdf4llm
md = pymupdf4llm.to_markdown("paper.pdf")
Bildextraktion
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"])
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 aus Markdown erzeugen
PDF Oxide:
from pdf_oxide import Pdf
pdf = Pdf.from_markdown("# Invoice\n\n| Item | Price |\n|------|-------|\n| Widget | $9.99 |")
pdf.save("invoice.pdf")
PyMuPDF:
import fitz
# PyMuPDF kann keine PDFs aus Markdown erzeugen.
# Sie muessen Texte manuell platzieren:
doc = fitz.open()
page = doc.new_page()
page.insert_text(fitz.Point(72, 72), "Invoice", fontsize=24)
doc.save("invoice.pdf")
Details zum Benchmark
Gemessen an 3.830 PDFs aus drei unabhängigen öffentlichen Testsuiten (veraPDF, Mozilla pdf.js, DARPA SafeDocs).
| Metrik | PDF Oxide | PyMuPDF |
|---|---|---|
| Mittlere Extraktionszeit | 0,8 ms | 4,6 ms |
| Extraktionszeit p99 | 9 ms | 28 ms |
| Trefferquote (gültige PDFs) | 100 % (3.823/3.823) | 99,3 % (3.796/3.823) |
| Paritaet der Textqualitaet | 99,5 % | Referenz |
Zum Korpus und zur Reproduktion siehe die vollständige Benchmark-Methodik.
AGPL-Lizenzierung: was das konkret heißt
PyMuPDF verpackt MuPDF, und MuPDF steht unter AGPL-3.0. Das betrifft Sie, wenn:
- Sie Software ausliefern, die PyMuPDF nutzt (Binaries, Docker-Images, Electron-Apps)
- Sie ein SaaS betreiben, in dem PyMuPDF auf Ihren Servern Nutzer-PDFs verarbeitet
- Sie PyMuPDF in ein Produkt einbetten — auch als Microservice hinter einer API
In allen diesen Fällen verlangt die AGPL, dass Sie den kompletten Quellcode Ihrer Anwendung unter AGPL-3.0 veröffentlichen — oder eine kommerzielle Lizenz bei Artifex kaufen.
PDF Oxide steht unter MIT. Sie können es in jedem Projekt einsetzen — kommerziell, proprietär, SaaS oder Open Source — ganz ohne Folgepflichten.
| Einsatzszenario | PDF Oxide (MIT) | PyMuPDF (AGPL) |
|---|---|---|
| Kommerzielles Produkt | Ja | Lizenz erforderlich |
| Closed-Source-SaaS | Ja | Lizenz erforderlich |
| Interne Tools | Ja | Ja |
| Open-Source-Projekt | Ja | Ja (wenn AGPL-kompatibel) |
| Docker-Auslieferung | Ja | Lizenz erforderlich |
Preise der kommerziellen PyMuPDF-Lizenz
Artifex (die Firma hinter MuPDF und PyMuPDF) veröffentlicht keine Preisliste. Aus Branchenberichten bekannt:
- Anfrage nötig — Sie müssen beim Artifex-Vertrieb ein Angebot einholen
- Lizenz pro Anwendung — der Preis hängt vom Deployment-Modell und der Skalierung ab
- Jahresgebühren — kommerzielle Lizenzen werden üblicherweise jährlich verlängert
- Keine Freistufe — es gibt keine Ausnahme für Communitys oder Startups
Für Teams, die PyMuPDF kommerziell einsetzen wollen, sind die Lizenzkosten eine dauerhafte Betriebsausgabe zusätzlich zur Entwicklungszeit.
PDF Oxide ist MIT-lizenziert — kostenfrei für jeden Zweck, dauerhaft. Keine Vertriebstermine, keine Lizenzaudits, kein Compliance-Risiko. Ob im SaaS, im Docker-Container oder eingebettet in ein kommerzielles Produkt — ohne Einschränkungen.
Migrationsleitfaden
API-Zuordnung
| Aufgabe | PyMuPDF | PDF Oxide |
|---|---|---|
| PDF öffnen | fitz.open("f.pdf") |
PdfDocument("f.pdf") |
| Seitenzahl | doc.page_count |
doc.page_count() |
| Text extrahieren | doc[0].get_text() |
doc.extract_text(0) |
| Zeichendaten | doc[0].get_text("dict") |
doc.extract_chars(0) |
| Bilder extrahieren | doc[0].get_images() + doc.extract_image(xref) |
doc.extract_images(0) |
| Text suchen | doc[0].search_for("query") |
doc.search_page(0, "query") |
| Verschlüsseltes PDF | doc.authenticate("pw") |
PdfDocument("f.pdf", password="pw") |
| Nach Markdown | pymupdf4llm (separat) | doc.to_markdown(0) |
| Aus Text erzeugen | Manuell insert_text() |
Pdf.from_markdown("# Titel") |
Schritt für Schritt
- Installieren:
pip install pdf_oxide - Imports austauschen:
import fitz→from pdf_oxide import PdfDocument - Öffnen umstellen:
fitz.open(path)→PdfDocument(path) - Extraktion umstellen:
page.get_text()→doc.extract_text(page_index) - Bilder umstellen: mehrstufiger xref-Lookup →
doc.extract_images(page_index) - Passwort-Logik anpassen:
PdfDocument(path, password="pw")oder nach dem Öffnendoc.authenticate("pw") - Testen: Pipeline auf den vorhandenen Testdateien laufen lassen
Wann PyMuPDF weiterhin sinnvoll ist
- Sie haben bereits eine kommerzielle MuPDF-Lizenz und hängen an MuPDF-spezifischem Rendering
- Sie brauchen SVG-Export (den PDF Oxide nicht anbietet)
- Ihr eigenes Projekt ist ohnehin AGPL-lizenziert
Verwandte Seiten
- Performance-Benchmarks — vollständige Korpus-Ergebnisse
- vs Python-PDF-Bibliotheken — alle Python-Bibliotheken im Vergleich
- Erste Schritte mit Python — Installation und erste Extraktion