vs. Python-PDF-Bibliotheken
PDF Oxide im Vergleich mit PyMuPDF (fitz), pypdfium2, pypdf, pdfplumber, pdfminer und weiteren. Diese Seite behandelt Leistung, Funktionsumfang, Lizenzierung und API-Unterschiede, damit Sie die richtige Python-PDF-Bibliothek für die Textextraktion auswählen können.
Überblick
| PDF Oxide | PyMuPDF | pypdfium2 | pypdf | pdfplumber | pdfminer | |
|---|---|---|---|---|---|---|
| Mittlere Extraktionszeit | 0.8ms | 4.6ms | 4.1ms | 12.1ms | 23.2ms | 16.8ms |
| Erfolgsquote (3.830 PDFs) | 100% | 99.3% | 99.2% | 98.4% | 98.8% | 98.8% |
| Lizenz | MIT | AGPL-3.0 | Apache-2.0 | BSD-3 | MIT | MIT |
| Sprache | Rust + PyO3 | C (MuPDF) | C (PDFium) | Pure Python | Pure Python | Pure Python |
| Textextraktion | Ja | Ja | Ja | Ja | Ja | Ja |
| Zeichenpositionen | Ja | Ja | Ja | Teilweise | Ja | Ja |
| Bildextraktion | Ja | Ja | Ja | Ja | Nein | Nein |
| Formularfelder | Lesen + Schreiben | Lesen + Schreiben | Nur Lesen | Lesen + Schreiben | Nur Lesen | Nein |
| PDF-Erstellung | Ja | Ja | Nein | Eingeschränkt | Nein | Nein |
| PDF-Bearbeitung | Ja | Ja | Nein | Ja | Nein | Nein |
| Markdown-Ausgabe | Ja | Nein | Nein | Nein | Nein | Nein |
| HTML-Ausgabe | Ja | Nein | Nein | Nein | Nein | Nein |
| Verschlüsselung | Lesen + Schreiben | Lesen + Schreiben | Nur Lesen | Lesen + Schreiben | Nein | Nein |
| PDF/A-Validierung | Ja | Nein | Nein | Nein | Nein | Nein |
| Rendering | Ja | Ja | Ja | Nein | Nein | Nein |
| Suche | Regex + räumlich | Ja | Ja | Nein | Nein | Nein |
| Python-Versionen | 3.8–3.14 | 3.8–3.12 | 3.8+ | 3.6+ | 3.8+ | 3.6+ |
| Installationsgröße | ~5 MB Wheel | ~20 MB Wheel | ~3 MB Wheel | ~1 MB | ~1 MB | ~1 MB |
Leistungsvergleich
Mittlere Textextraktionszeit pro PDF, gemessen am vollständigen Korpus aus 3.830 PDFs – drei unabhängige, öffentlich verfügbare Testsuiten, die zusammen alle PDF-Spezifikationsversionen (1.0–2.0), verschlüsselte Dateien, fehlerhafte Dokumente, CJK-Kodierungen, komplexe Layouts und sicherheitsrelevante Grenzfälle abdecken. Was jede Suite testet und warum diese Ergebnisse reproduzierbar sind, finden Sie in den vollständigen Korpus-Details.
| Bibliothek | Mittelwert | Relativ | p99 | Erfolgsquote |
|---|---|---|---|---|
| PDF Oxide | 0.8ms | 1× | 9ms | 100% |
| PyMuPDF | 4.6ms | 5.8× | 28ms | 99.3% |
| pypdfium2 | 4.1ms | 5.1× | 42ms | 99.2% |
| pymupdf4llm | 55.5ms | 69× | 280ms | 99.1% |
| pdftext | 7.3ms | 9.1× | 82ms | 99.0% |
| pdfminer | 16.8ms | 21× | 124ms | 98.8% |
| pdfplumber | 23.2ms | 29× | 189ms | 98.8% |
| markitdown | 108.8ms | 136× | 378ms | 98.6% |
| pypdf | 12.1ms | 15.1× | 97ms | 98.4% |
PDF Oxide erreicht diese Geschwindigkeit durch einen nativen Rust-Kern, der über PyO3 zu einem Python-Erweiterungsmodul kompiliert wird. Es gibt keinen Subprozess-Overhead und keine Brücke zu C-Bibliotheken – der Rust-Code läuft direkt im Python-Prozess.
Zuverlässigkeit
PDF Oxide verarbeitet 3.823 von 3.823 gültigen PDFs ohne Fehler – eine Erfolgsquote von 100 %. Die 7 nicht bestandenen Dateien im Korpus aus 3.830 Dateien sind absichtlich beschädigte Test-Fixtures (fehlender PDF-Header, durch Fuzzing beschädigte Kataloge, ungültige xref-Streams).
| Bibliothek | Bestandene gültige PDFs | Erfolgsquote |
|---|---|---|
| PDF Oxide | 3,823 / 3,823 | 100% |
| PyMuPDF | 3,796 / 3,823 | 99.3% |
| pypdfium2 | 3,792 / 3,823 | 99.2% |
| pymupdf4llm | 3,787 / 3,823 | 99.1% |
| pdftext | 3,784 / 3,823 | 99.0% |
| pdfminer | 3,777 / 3,823 | 98.8% |
| pdfplumber | 3,777 / 3,823 | 98.8% |
| markitdown | 3,771 / 3,823 | 98.6% |
| pypdf | 3,762 / 3,823 | 98.4% |
Textqualität
PDF Oxide erreicht über den gesamten Korpus eine Textübereinstimmung von 99,5 % im Vergleich zu PyMuPDF und pypdfium2. Die Qualität wurde durch einen Zeichen-für-Zeichen-Vergleich der extrahierten Textausgabe gemessen. Der verbleibende Unterschied von 0,5 % betrifft die Normalisierung von Leerräumen und die Behandlung von Ligaturen, wo PDF Oxide eine sauberere Ausgabe erzeugt.
Lizenzvergleich
| Bibliothek | Lizenz | Kommerzielle Nutzung | Copyleft |
|---|---|---|---|
| PDF Oxide | MIT | Uneingeschränkt | Nein |
| pypdfium2 | Apache-2.0 | Uneingeschränkt | Nein |
| PyMuPDF | AGPL-3.0 | Erfordert kommerzielle Lizenz ($) | Ja |
| pypdf | BSD-3 | Uneingeschränkt | Nein |
| pdfplumber | MIT | Uneingeschränkt | Nein |
| pdfminer | MIT | Uneingeschränkt | Nein |
| pdftext | GPL-3.0 | Erfordert Open Source | Ja |
PyMuPDF verwendet MuPDF unter der AGPL-3.0-Lizenz. Wenn Sie Software vertreiben, die PyMuPDF nutzt, muss auch Ihre Software unter der AGPL-3.0 veröffentlicht werden – oder Sie müssen eine kommerzielle Lizenz von Artifex erwerben. Das gilt für SaaS-Produkte, Webanwendungen und alle vertriebenen Binärdateien.
PDF Oxide steht ohne Einschränkungen unter der MIT-Lizenz. Nutzen Sie es in proprietären Produkten, SaaS-Plattformen oder Closed-Source-Anwendungen ohne jegliche Lizenzverpflichtungen.
| Anwendungsfall | PDF Oxide (MIT) | PyMuPDF (AGPL) | pypdfium2 (Apache) | pypdf (BSD) | pdfplumber (MIT) | pdfminer (MIT) |
|---|---|---|---|---|---|---|
| Kommerzielles Produkt | Ja | Lizenz erforderlich | Ja | Ja | Ja | Ja |
| Closed Source | Ja | Nein (außer mit Lizenz) | Ja | Ja | Ja | Ja |
| SaaS/Cloud | Ja | Lizenz erforderlich | Ja | Ja | Ja | Ja |
| Interne Werkzeuge | Ja | Ja | Ja | Ja | Ja | Ja |
API-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)
pypdf:
from pypdf import PdfReader
reader = PdfReader("report.pdf")
page = reader.pages[0]
text = page.extract_text()
print(text)
pdfplumber:
import pdfplumber
with pdfplumber.open("report.pdf") as pdf:
page = pdf.pages[0]
text = page.extract_text()
print(text)
pdfminer:
from pdfminer.high_level import extract_text
text = extract_text("report.pdf", page_numbers=[0])
print(text)
Extraktion auf Zeichenebene
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
chars = doc.extract_chars(0)
for ch in chars:
print(f"'{ch.char}' at ({ch.bbox[0]:.1f}, {ch.bbox[1]:.1f}) "
f"size={ch.font_size:.1f}")
PyMuPDF:
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
blocks = page.get_text("dict")["blocks"]
for block in blocks:
if "lines" in block:
for line in block["lines"]:
for span in line["spans"]:
print(f"'{span['text']}' size={span['size']:.1f}")
pdfplumber:
import pdfplumber
with pdfplumber.open("report.pdf") as pdf:
page = pdf.pages[0]
for char in page.chars:
print(f"'{char['text']}' at ({char['x0']:.1f}, {char['top']:.1f}) "
f"size={char['size']:.1f}")
pdfminer:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTChar
for page_layout in extract_pages("report.pdf"):
for element in page_layout:
if hasattr(element, '__iter__'):
for text_line in element:
if hasattr(text_line, '__iter__'):
for char in text_line:
if isinstance(char, LTChar):
print(f"'{char.get_text()}' at ({char.x0:.1f}, {char.y0:.1f}) "
f"size={char.size:.1f}")
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"])
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-Erstellung
PDF Oxide:
from pdf_oxide import Pdf
pdf = Pdf.from_markdown("# Hello World\n\nThis is a PDF.")
pdf.save("output.pdf")
# Also supports HTML
pdf = Pdf.from_html("<h1>Hello</h1><p>World</p>")
pdf.save("output.pdf")
PyMuPDF:
import fitz
doc = fitz.open()
page = doc.new_page()
text_point = fitz.Point(72, 72)
page.insert_text(text_point, "Hello World", fontsize=24)
doc.save("output.pdf")
pypdf:
# pypdf can merge/modify PDFs but cannot create from scratch with text content.
# Use reportlab or fpdf2 for creation, then merge with pypdf.
Verschlüsselte PDFs
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("encrypted.pdf", password="password")
text = doc.extract_text(0)
PyMuPDF:
import fitz
doc = fitz.open("encrypted.pdf")
doc.authenticate("password")
page = doc[0]
text = page.get_text()
pypdf:
from pypdf import PdfReader
reader = PdfReader("encrypted.pdf")
reader.decrypt("password")
text = reader.pages[0].extract_text()
Markdown- und HTML-Ausgabe
PDF Oxide (Alleinstellungsmerkmal):
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
# Convert to Markdown with heading detection
md = doc.to_markdown(0, detect_headings=True)
print(md)
# Convert to HTML
html = doc.to_html(0)
print(html)
Keine andere Python-PDF-Bibliothek bietet eine integrierte Konvertierung nach Markdown oder HTML.
Bibliotheksprofile
PDF Oxide
Stärken:
- Schnellste Textextraktion in den Benchmarks dank Rust-Kern – 5,8× schneller als PyMuPDF
- 100 % Erfolgsquote beim Korpus aus 3.830 PDFs – die höchste Zuverlässigkeit aller getesteten Bibliotheken
- Einheitliche API für Extraktion, Erstellung und Bearbeitung in einer einzigen Bibliothek
- Integrierter Markdown- und HTML-Export mit Überschriftenerkennung
- MIT-Lizenz ohne Copyleft-Einschränkungen
- Native Konformitätsprüfung (PDF/A, PDF/UA, PDF/X)
- Vorgefertigte Wheels für alle gängigen Plattformen und Python 3.8–3.14
- Keine Systemabhängigkeiten – das Wheel enthält alles
Einschränkungen:
- Neuere Bibliothek mit kleinerer Community
- Die Tabellenextraktion ist im Vergleich zu den Algorithmen von pdfplumber grundlegend
- Die Rendering-Engine ist weniger ausgereift als MuPDF
PyMuPDF (fitz)
Stärken:
- Ausgereift und praxiserprobt (basiert auf MuPDF, in Entwicklung seit 2005)
- Hervorragende Rendering-Qualität bei komplexen PDFs
- Integrierte OCR-Anbindung (Tesseract)
- Umfangreicher Funktionsumfang: SVG-Export, Seitenmanipulation, Tabellenerkennung
Einschränkungen:
- Die AGPL-3.0-Lizenz erfordert, dass Sie Ihre Anwendung als Open Source veröffentlichen oder eine kommerzielle Lizenz erwerben
- Große Wheel-Größe (~20 MB) wegen des gebündelten MuPDF
- Kein integrierter Markdown-Export
- Keine Konformitätsprüfung
pypdfium2
Stärken:
- Schnell (basiert auf Googles PDFium-Engine)
- Apache-2.0-Lizenz – freizügig für kommerzielle Nutzung
- Gute Rendering-Qualität
Einschränkungen:
- Eingeschränkte Textextraktions-API im Vergleich zu PDF Oxide oder PyMuPDF
- Keine PDF-Erstellung oder -Bearbeitung
- Keine Formularfeldunterstützung über reines Lesen hinaus
pypdf
Stärken:
- Pure Python – überall installierbar, keine kompilierten Abhängigkeiten
- Leichtgewichtig und gut gepflegt
- Gut für PDF-Manipulation (Zusammenführen, Aufteilen, Drehen, Verschlüsseln)
- Große Community und umfangreiche Dokumentation
Einschränkungen:
- 15× langsamer als PDF Oxide bei der Textextraktion
- Die Textextraktionsqualität kämpft mit komplexen Layouts
- Kein Rendering, kein Markdown-/HTML-Export, keine Tabellenextraktion
pdfplumber
Stärken:
- Beste Tabellenextraktion aller Python-PDF-Bibliotheken
- Hervorragende Positionsdaten auf Zeichenebene
- Visuelle Debugging-Werkzeuge (annotierte Seitenbilder)
- MIT-Lizenz
Einschränkungen:
- Pure Python – 29× langsamer als PDF Oxide
- Nur Lesen – keine PDF-Erstellung oder -Bearbeitung
- Keine Verschlüsselung oder Rendering
pdfminer
Stärken:
- Detaillierte Zeichen- und Layoutanalyse
- Gute Unterstützung für CJK-Text
- Grundlage für pdfplumber und andere Werkzeuge
- MIT-Lizenz
Einschränkungen:
- 21× langsamer als PDF Oxide (Pure Python, nicht optimiert)
- Nur Lesen, keine Erstellung oder Bearbeitung
- Ausführliche API für gängige Aufgaben
- Weniger aktiv gepflegt
Wann was verwenden
| Anwendungsfall | Empfohlene Bibliothek |
|---|---|
| Schnelle Textextraktion | PDF Oxide |
| Kommerzielles / proprietäres Produkt | PDF Oxide, pypdfium2, pypdf, pdfplumber oder pdfminer |
| PyMuPDF-Alternative (MIT-lizenziert) | PDF Oxide |
| PDF-Erstellung aus Markdown/HTML | PDF Oxide |
| Konformitätsprüfung (PDF/A, PDF/X) | PDF Oxide |
| Tabellenextraktion aus Rechnungen | pdfplumber |
| Visuelles Debugging der Extraktion | pdfplumber |
| Bestehende MuPDF-Investition | PyMuPDF (sofern AGPL-kompatibel) |
| Minimale Abhängigkeiten | pypdf (Pure Python) |
| Detaillierte Layoutanalyse | pdfminer |
| OCR für gescannte Dokumente | PyMuPDF |
Installation
# PDF Oxide
pip install pdf_oxide
# PyMuPDF
pip install pymupdf
# pypdfium2
pip install pypdfium2
# pypdf
pip install pypdf
# pdfplumber
pip install pdfplumber
# pdfminer
pip install pdfminer.six
PDF Oxide liefert vorgefertigte Wheels für Linux (x86_64, aarch64), macOS (x86_64, arm64) und Windows (x86_64). Es werden weder ein Compiler noch Systembibliotheken benötigt.
Verwandte Seiten
- Leistungs-Benchmarks – Benchmark-Ergebnisse des vollständigen Korpus
- Erste Schritte mit Python – Installation und erste Extraktion
- Python-API-Referenz – vollständige Python-API
- vs. Rust-PDF-Bibliotheken – Vergleich des Rust-Ökosystems