Skip to content

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