Beste Python-PDF-Bibliothek 2026
PDF Oxide im direkten Vergleich mit PyMuPDF (fitz), pypdfium2, pypdf, pdfplumber, pdfminer und weiteren. Diese Seite stellt Performance, Funktionsabdeckung, Lizenzierung und API-Unterschiede nebeneinander — damit Sie für die Textextraktion in Python die richtige PDF-Bibliothek auswählen.
Zusammenfassung
| PDF Oxide | PyMuPDF | pypdfium2 | pypdf | pdfplumber | pdfminer | |
|---|---|---|---|---|---|---|
| Durchschn. Extraktionszeit | 0,8ms | 4,6ms | 4,1ms | 12,1ms | 23,2ms | 16,8ms |
| Erfolgsrate (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) | Reines Python | Reines Python | Reines 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 |
Performance-Vergleich
Durchschnittliche Textextraktionszeit pro PDF, gemessen auf dem vollständigen Korpus mit 3.830 PDFs — drei unabhängige, öffentlich verfügbare Testsuiten, die zusammen jede PDF-Spezifikationsversion (1.0–2.0), verschlüsselte Dateien, fehlerhafte Dokumente, CJK-Kodierungen, komplexe Layouts und Sicherheitsgrenzfälle abdecken. In den Details zum Korpus lesen Sie, was jede Suite prüft und warum die Ergebnisse reproduzierbar sind.
| Bibliothek | Durchschnitt | Relativ | p99 | Erfolgsrate |
|---|---|---|---|---|
| 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% |
Die Geschwindigkeit von PDF Oxide stammt aus einem nativen Rust-Kern, der über PyO3 als Python-Erweiterungsmodul kompiliert ist. Es gibt keinen Subprozess-Overhead und keine Brücke zu einer C-Bibliothek — der Rust-Code läuft direkt im Python-Prozess.
Zuverlässigkeit
PDF Oxide verarbeitet 3.823 von 3.823 gültigen PDFs fehlerfrei — eine Erfolgsrate von 100 %. Die 7 nicht erfolgreichen Dateien im 3.830-Dateien-Korpus sind absichtlich beschädigte Test-Fixtures (fehlender PDF-Header, fuzz-korrumpierte Kataloge, ungültige xref-Streams).
| Bibliothek | Gültige PDFs bestanden | Erfolgsrate |
|---|---|---|
| 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 das gesamte Korpus 99,5 % Textübereinstimmung gegenüber PyMuPDF und pypdfium2. Die Qualität wurde zeichenweise zwischen den Extraktionsergebnissen verglichen. Die verbleibenden 0,5 % Unterschied betreffen die Normalisierung von Leerzeichen und die Behandlung von Ligaturen, wobei PDF Oxide eine sauberere Ausgabe liefert.
Lizenzvergleich
| Bibliothek | Lizenz | Kommerzielle Nutzung | Copyleft |
|---|---|---|---|
| PDF Oxide | MIT | Uneingeschränkt | Nein |
| pypdfium2 | Apache-2.0 | Uneingeschränkt | Nein |
| PyMuPDF | AGPL-3.0 | Kommerzlizenz erforderlich ($) | Ja |
| pypdf | BSD-3 | Uneingeschränkt | Nein |
| pdfplumber | MIT | Uneingeschränkt | Nein |
| pdfminer | MIT | Uneingeschränkt | Nein |
| pdftext | GPL-3.0 | Open Source erforderlich | Ja |
PyMuPDF setzt auf MuPDF unter AGPL-3.0. Wenn Sie Software verteilen, die PyMuPDF nutzt, muss Ihre Software ebenfalls unter AGPL-3.0 veröffentlicht werden — oder Sie erwerben eine kommerzielle Lizenz bei Artifex. Das betrifft SaaS-Produkte, Webanwendungen und jede verteilte Binärdatei.
PDF Oxide steht unter MIT ohne Einschränkungen. Setzen Sie die Bibliothek in proprietären Produkten, SaaS-Plattformen oder Closed-Source-Anwendungen ein — ohne 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 (ohne Lizenz) | Ja | Ja | Ja | Ja |
| SaaS/Cloud | Ja | Lizenz erforderlich | Ja | Ja | Ja | Ja |
| Interne Tools | 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")
# Unterstützt auch 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 kann PDFs zusammenführen und ändern, aber keine mit Textinhalt neu erstellen.
# Nutzen Sie reportlab oder fpdf2 zum Erzeugen und danach pypdf zum Zusammenführen.
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")
# In Markdown konvertieren mit Überschriftserkennung
md = doc.to_markdown(0, detect_headings=True)
print(md)
# In HTML konvertieren
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 im Benchmark dank Rust-Kern — 5,8× schneller als PyMuPDF
- 100 % Erfolgsrate auf dem 3.830-PDF-Korpus — höchste Zuverlässigkeit aller getesteten Bibliotheken
- Einheitliche API für Extraktion, Erstellung und Bearbeitung in einer Bibliothek
- Integrierter Markdown- und HTML-Export mit Überschriftserkennung
- 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:
- Jüngere Bibliothek mit kleinerer Community
- Tabellenerkennung ist einfacher als die Algorithmen von pdfplumber
- Die Rendering-Engine ist weniger ausgereift als MuPDF
PyMuPDF (fitz)
Stärken:
- Ausgereift und praxiserprobt (getragen von MuPDF, seit 2005 in Entwicklung)
- Hervorragende Rendering-Qualität bei komplexen PDFs
- Integrierte OCR-Anbindung (Tesseract)
- Umfangreicher Funktionsumfang: SVG-Export, Seitenmanipulation, Tabellenerkennung
Einschränkungen:
- AGPL-3.0-Lizenz verlangt, dass Sie Ihre Anwendung quelloffen veröffentlichen oder eine Kommerzlizenz kaufen
- Große Wheel-Größe (~20 MB) durch das gebündelte MuPDF
- Kein integrierter Markdown-Export
- Keine Konformitätsprüfung
pypdfium2
Stärken:
- Schnell (basiert auf Googles PDFium-Engine)
- Apache-2.0-Lizenz — permissiv 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 Formularfeld-Unterstützung über reines Lesen hinaus
pypdf
Stärken:
- Reines Python — installiert sich überall, keine kompilierten Abhängigkeiten
- Leichtgewichtig und aktiv gepflegt
- Gut geeignet für PDF-Manipulation (zusammenführen, teilen, drehen, verschlüsseln)
- Große Community und umfangreiche Dokumentation
Einschränkungen:
- 15× langsamer als PDF Oxide bei der Textextraktion
- Textextraktion stößt bei komplexen Layouts an Grenzen
- Kein Rendering, kein Markdown-/HTML-Export, keine Tabellenerkennung
pdfplumber
Stärken:
- Beste Tabellenerkennung aller Python-PDF-Bibliotheken
- Hervorragende Positionsdaten auf Zeichenebene
- Visuelle Debugging-Werkzeuge (annotierte Seitenbilder)
- MIT-lizenziert
Einschränkungen:
- Reines Python — 29× langsamer als PDF Oxide
- Nur-Lesen — keine PDF-Erstellung oder -Bearbeitung
- Keine Verschlüsselung und kein Rendering
pdfminer
Stärken:
- Detaillierte Zeichen- und Layoutanalyse
- Gute CJK-Textunterstützung
- Grundlage für pdfplumber und andere Werkzeuge
- MIT-lizenziert
Einschränkungen:
- 21× langsamer als PDF Oxide (reines Python, nicht optimiert)
- Nur-Lesen, keine Erstellung oder Bearbeitung
- Umständliche API für übliche Aufgaben
- Weniger aktiv gepflegt
Wann welche Bibliothek einsetzen
| 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 |
| Tabellenerkennung aus Rechnungen | pdfplumber |
| Visuelles Debugging der Extraktion | pdfplumber |
| Bestehende MuPDF-Investition | PyMuPDF (bei AGPL-Verträglichkeit) |
| Minimale Abhängigkeiten | pypdf (reines 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). Kein Compiler, keine Systembibliotheken erforderlich.
Verwandte Seiten
- Performance-Benchmarks – vollständige Ergebnisse auf dem Gesamtkorpus
- Einstieg mit Python – Installation und erste Extraktion
- Python-API-Referenz – vollständige Python-API
- vs Rust-PDF-Bibliotheken – Vergleich im Rust-Ökosystem