Skip to content

Python-PDF-Bibliothek: PDF Oxide in zehn Zeilen

PDF Oxide ist die schnellste PDF-Bibliothek für Python: 0,8 ms durchschnittliche Textextraktion, 5-mal schneller als PyMuPDF und 100 % Trefferquote bei 3.830 getesteten PDFs. Eine Bibliothek für Extraktion, Erstellung und Bearbeitung — MIT-Lizenz, Rust-Kern, keine Systemabhängigkeiten.

Installation

pip install pdf_oxide

Voraussetzungen: Python 3.8 oder neuer. Fertige Wheels stehen für Linux, macOS und Windows auf x86_64 und ARM64 bereit. Ein Compiler oder Systempakete sind nicht nötig.

Ein PDF öffnen

Mit PdfDocument öffnen und inspizieren Sie jede PDF-Datei.

from pdf_oxide import PdfDocument

doc = PdfDocument("research-paper.pdf")
print(f"Pages: {doc.page_count()}")
print(f"PDF version: {doc.version()}")

Page-API

Seit v0.3.34 ist PdfDocument iterierbar und indexierbar und liefert PdfPage-Objekte mit lazy Properties.

from pdf_oxide import PdfDocument

with PdfDocument("paper.pdf") as doc:
    for page in doc:            # len(doc), doc[i], doc[-1] funktionieren alle
        text = page.text        # lazy — wird beim Zugriff berechnet
        md = page.markdown(detect_headings=True)
        for table in page.tables:
            for row in table["rows"]:
                print([cell["text"] for cell in row["cells"]])

Seiten-Properties (alle lazy): text, chars, words, lines, spans, tables, images, paths, annotations, width, height, bbox. Methoden: markdown(), plain_text(), html(), render(), search(), region(x, y, w, h).

Die Editor-Seitenklasse wurde in v0.3.34 in EditorPage umbenannt, um Kollisionen mit PdfPage zu vermeiden.

Textextraktion

Einzelne Seite

Klartext einer Seite über ihren nullbasierten Index extrahieren.

from pdf_oxide import PdfDocument

doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)

Alle Seiten

from pdf_oxide import PdfDocument

doc = PdfDocument("book.pdf")
for i in range(doc.page_count()):
    text = doc.extract_text(i)
    print(f"--- Page {i + 1} ---")
    print(text)

Zeichenweise Extraktion

extract_chars() liefert eine Liste von TextChar-Objekten mit exakter Position und Font-Metadaten für jedes Zeichen der Seite.

from pdf_oxide import PdfDocument

doc = PdfDocument("paper.pdf")
chars = doc.extract_chars(0)

for ch in chars[:10]:
    print(f"'{ch.char}' at ({ch.x:.1f}, {ch.y:.1f}) "
          f"size={ch.font_size:.1f} font={ch.font_name} "
          f"bbox={ch.bbox}")

Jedes TextChar hat folgende Felder:

Feld Typ Beschreibung
char str Das Unicode-Zeichen
x float Horizontale Position in Punkt
y float Vertikale Position in Punkt
font_size float Schriftgröße in Punkt
font_name str PostScript-Schriftname
bbox tuple[float, 4] Umgebungsbox (x0, y0, x1, y1)

Text-Spans

extract_spans() fasst aufeinanderfolgende Zeichen mit gleicher Schrift und Größe zu Spans zusammen und liefert strukturierten Text inklusive Font-Metadaten.

from pdf_oxide import PdfDocument

doc = PdfDocument("paper.pdf")
spans = doc.extract_spans(0)

for span in spans:
    print(f"'{span.text}' font={span.font_name} size={span.font_size}")

Markdown-Konvertierung

Eine PDF-Seite mit optionaler Überschriftenerkennung in Markdown umwandeln.

from pdf_oxide import PdfDocument

doc = PdfDocument("paper.pdf")
md = doc.to_markdown(0, detect_headings=True)
print(md)

HTML-Konvertierung

Eine PDF-Seite nach HTML konvertieren.

from pdf_oxide import PdfDocument

doc = PdfDocument("paper.pdf")
html = doc.to_html(0)
print(html)

Bildextraktion

extract_images() liefert eine Liste von ImageInfo-Objekten für jedes eingebettete Bild einer Seite — inklusive Bildern aus Content Streams und verschachtelten Form-XObjects.

from pdf_oxide import PdfDocument

doc = PdfDocument("brochure.pdf")
images = doc.extract_image_bytes(0)

for i, img in enumerate(images):
    print(f"Image {i}: {img['width']}x{img['height']} "
          f"({len(img['data'])} bytes)")
    with open(f"image_{i}.{img['format']}", "wb") as f:
        f.write(img["data"])

Jedes Dict, das extract_image_bytes() zurückgibt, enthält folgende Schlüssel:

Schlüssel Typ Beschreibung
width int Bildbreite in Pixeln
height int Bildhöhe in Pixeln
data bytes Rohe Bilddaten
format str Bildformat (z. B. png, jpeg)

Aus Bytes öffnen

PDF aus In-Memory-Bytes öffnen — praktisch beim Download aus S3, HTTP oder Datenbanken:

from pdf_oxide import PdfDocument

doc = PdfDocument.from_bytes(pdf_bytes)
text = doc.extract_text(0)

# Passwort wird ebenfalls unterstützt:
doc = PdfDocument.from_bytes(pdf_bytes, password="secret")

Für die Builder-API:

from pdf_oxide import Pdf

pdf = Pdf.from_bytes(existing_pdf_bytes)
pdf.save("modified.pdf")

Passwortgeschützte PDFs

Übergeben Sie password= im Konstruktor, um verschlüsselte Dokumente zu öffnen.

from pdf_oxide import PdfDocument

doc = PdfDocument("confidential.pdf", password="secret")
text = doc.extract_text(0)
print(text)

Alternativ können Sie nach dem Öffnen doc.authenticate(password) aufrufen.

PDF-Erstellung

Die Klasse Pdf bietet Factory-Methoden, um PDFs aus verschiedenen Quellformaten zu erzeugen.

Aus Markdown

from pdf_oxide import Pdf

pdf = Pdf.from_markdown("# Hello World\n\nThis is a PDF.")
pdf.save("output.pdf")

Aus HTML

from pdf_oxide import Pdf

pdf = Pdf.from_html("<h1>Invoice</h1><p>Amount due: $42.00</p>")
pdf.save("invoice.pdf")

Aus Klartext

from pdf_oxide import Pdf

pdf = Pdf.from_text("Plain text document.\n\nSecond paragraph.")
pdf.save("notes.pdf")

Aus Bildern

from pdf_oxide import Pdf

pdf = Pdf.from_image("scan.jpg")
pdf.save("scan.pdf")

Suche

Suchen Sie im gesamten Dokument oder gezielt auf einer Seite.

from pdf_oxide import PdfDocument

doc = PdfDocument("manual.pdf")

# Alle Seiten durchsuchen
results = doc.search("configuration")
for r in results:
    print(f"Page {r.page}: '{r.text}' at ({r.x:.0f}, {r.y:.0f})")

# Nur eine einzelne Seite durchsuchen
page_results = doc.search_page(0, "configuration")

Fehlerbehandlung

PDF Oxide löst PdfError bei PDF-spezifischen Fehlern aus und nutzt Standard-Python-Ausnahmen für I/O-Probleme.

from pdf_oxide import PdfDocument, PdfError

try:
    doc = PdfDocument("document.pdf")
    text = doc.extract_text(0)
except PdfError as e:
    print(f"PDF error: {e}")
except FileNotFoundError:
    print("File not found")

Nächste Schritte