Skip to content

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

  1. Installieren: pip install pdf_oxide
  2. Imports austauschen: import fitzfrom pdf_oxide import PdfDocument
  3. Öffnen umstellen: fitz.open(path)PdfDocument(path)
  4. Extraktion umstellen: page.get_text()doc.extract_text(page_index)
  5. Bilder umstellen: mehrstufiger xref-Lookup → doc.extract_images(page_index)
  6. Passwort-Logik anpassen: PdfDocument(path, password="pw") oder nach dem Öffnen doc.authenticate("pw")
  7. 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