Skip to content

Python-API-Referenz

PDF Oxide stellt native Python-Bindings bereit, die mit PyO3 erstellt wurden. Fertige Wheels gibt es für Python 3.8–3.14 auf Linux, macOS und Windows (x86_64 und ARM64).

pip install pdf_oxide

Die Rust-API finden Sie in der Rust-API-Referenz. Die JavaScript-API finden Sie in der Node.js-API-Referenz oder der WASM-API-Referenz. Details zu Typen finden Sie unter Typen & Enums.


PdfDocument

Die zentrale Klasse zum Öffnen, Extrahieren, Bearbeiten und Speichern von PDF-Dateien.

from pdf_oxide import PdfDocument

Konstruktor

PdfDocument(path: str, password: str | None = None)
Parameter Typ Beschreibung
path str Pfad zur PDF-Datei
password str | None Optionales Passwort für verschlüsselte PDFs (Standard: None)

Übergeben Sie password=, um verschlüsselte PDFs in einem Schritt zu öffnen. Alternativ können Sie nach dem Öffnen doc.authenticate(password) aufrufen.

Löst FileNotFoundError aus, wenn die Datei nicht existiert. Löst PdfError aus, wenn die Datei keine gültige PDF ist.

Klassenmethoden

PdfDocument.from_bytes(data: bytes, password: str | None = None) -> PdfDocument

Öffnet eine PDF aus In-Memory-Bytes (z. B. aus S3 heruntergeladen, per HTTP empfangen). Akzeptiert ein optionales Passwort für verschlüsselte PDFs.

Parameter Typ Beschreibung
data bytes Rohe Bytes der PDF-Datei
password str | None Optionales Passwort für verschlüsselte PDFs (Standard: None)
from pdf_oxide import PdfDocument

# Open PDF from bytes (e.g., downloaded from S3)
doc = PdfDocument.from_bytes(pdf_bytes)

# Also supports password:
doc = PdfDocument.from_bytes(pdf_bytes, password="secret")

Methoden

Allgemein

Methode Rückgabetyp Beschreibung
version() tuple[int, int] PDF-Version als (major, minor) (z. B. (1, 7))
authenticate(password) bool Verschlüsselte PDF mit Benutzer- oder Eigentümerpasswort authentifizieren

Dokumentinfo

doc.page_count() -> int

Gibt die Anzahl der Seiten im Dokument zurück.

doc.has_structure_tree() -> bool

Prüft, ob das Dokument ein Tagged PDF mit Strukturbaum ist.

Authentifizierung

doc.authenticate(password: str) -> bool

Authentifizierung mit einem Passwort nach dem Öffnen. Gibt True zurück, wenn die Authentifizierung erfolgreich war.

Textextraktion

doc.extract_text(
    page: int,
    region: tuple[float, float, float, float] | None = None,
    exclude_layers: list[str] | None = None,
    exclude_inks: list[str] | None = None,
    extract_tables: bool = True
) -> str

Extrahiert Klartext aus einer einzelnen Seite. Seiten sind nullbasiert indexiert. Optional auf eine region zuschneiden, benannte Optional-Content-Ebenen oder Ink-/Separations-Namen ausschließen und die Tabellenrekonstruktion ein- bzw. ausschalten.

doc.extract_chars(
    page: int,
    region: tuple[float, float, float, float] | None = None,
    exclude_layers: list[str] | None = None,
    exclude_inks: list[str] | None = None
) -> list[TextChar]

Extrahiert Position und Font-Metadaten pro Zeichen. Gibt eine Liste von TextChar-Objekten zurück.

doc.extract_spans(page: int, region: tuple | None = None, reading_order: str | None = None) -> list[TextSpan]

Extrahiert Text-Spans mit Font-Metadaten. Jeder Span ist ein zusammenhängender Lauf gleich formatierten Texts. Übergeben Sie reading_order="column_aware" für mehrspaltige PDFs.

doc.extract_words(
    page: int,
    *,
    include_artifacts: bool = True,
    region: tuple | None = None,
    word_gap_threshold: float | None = None,
    profile: ExtractionProfile | None = None
) -> list[TextWord]

Extrahiert wortgruppierten Text mit Begrenzungsrahmen. Gibt eine Liste von TextWord-Objekten zurück.

doc.extract_text_lines(
    page: int,
    *,
    include_artifacts: bool = True,
    region: tuple | None = None,
    word_gap_threshold: float | None = None,
    line_gap_threshold: float | None = None,
    profile: ExtractionProfile | None = None
) -> list[TextLine]

Extrahiert zeilengruppierten Text. Gibt eine Liste von TextLine-Objekten zurück.

doc.extract_page_text(page: int, reading_order: str | None = None) -> dict

Extrahiert Spans, Zeichen und Seitenmaße in einem einzigen Durchlauf. Gibt ein Dict mit den Schlüsseln spans, chars, page_width, page_height und text zurück. Effizienter, als extract_spans() und extract_chars() getrennt aufzurufen.

doc.page_layout_params(page: int) -> LayoutParams

Berechnet adaptive Layout-Parameter (Wort-/Zeilenabstands-Schwellen, Medianmetriken, Spaltenanzahl) für eine Seite. Siehe LayoutParams.

doc.within(page: int, bbox: tuple[float, float, float, float]) -> PdfPageRegion

Erzeugt ein zugeschnittenes Region-Handle, um Text, Wörter, Zeilen, Tabellen, Bilder und Pfade innerhalb von bbox zu extrahieren. Siehe PdfPageRegion.

Auto-Extraktion & Klassifizierung

doc.extract_text_auto(page: int) -> str

Wählt automatisch die beste Extraktionsstrategie (nativer Text vs. OCR) für eine Seite und gibt Klartext zurück.

doc.extract_page_auto(page: int, options_json: str | None = None) -> str

Extrahiert eine Seite automatisch und gibt ein JSON-Dokument zurück; übergeben Sie einen JSON-String options_json, um die Pipeline anzupassen.

doc.classify_page(page: int) -> str

Klassifiziert eine einzelne Seite (z. B. "text", "scanned", "mixed").

doc.classify_document() -> str

Klassifiziert das gesamte Dokument anhand einer Stichprobe seiner Seiten.

doc.has_text_layer(page: int) -> bool

Prüft, ob eine Seite bereits eine extrahierbare native Textebene besitzt (anstatt OCR zu erfordern).

Konvertierung

doc.to_plain_text(
    page: int,
    preserve_layout: bool = False,
    detect_headings: bool = True,
    include_images: bool = True,
    image_output_dir: str | None = None
) -> str

Konvertiert eine Seite in Klartext mit Layout-Optionen.

doc.to_plain_text_all(
    preserve_layout: bool = False,
    detect_headings: bool = True,
    include_images: bool = True,
    image_output_dir: str | None = None
) -> str

Konvertiert alle Seiten in Klartext.

doc.to_markdown(
    page: int,
    preserve_layout: bool = False,
    detect_headings: bool = True,
    include_images: bool = True,
    image_output_dir: str | None = None,
    embed_images: bool = True,
    include_form_fields: bool = True
) -> str

Konvertiert eine Seite in Markdown.

doc.to_markdown_all(
    preserve_layout: bool = False,
    detect_headings: bool = True,
    include_images: bool = True,
    image_output_dir: str | None = None,
    embed_images: bool = True,
    include_form_fields: bool = True
) -> str

Konvertiert alle Seiten in Markdown.

doc.to_html(
    page: int,
    preserve_layout: bool = False,
    detect_headings: bool = True,
    include_images: bool = True,
    image_output_dir: str | None = None,
    embed_images: bool = True,
    include_form_fields: bool = True
) -> str

Konvertiert eine Seite in HTML.

doc.to_html_all(
    preserve_layout: bool = False,
    detect_headings: bool = True,
    include_images: bool = True,
    image_output_dir: str | None = None,
    embed_images: bool = True,
    include_form_fields: bool = True
) -> str

Konvertiert alle Seiten in HTML.

Office-Konvertierung

Methode Rückgabetyp Beschreibung
to_docx(path) Konvertiert die PDF in eine Word-Dokumentdatei
to_docx_bytes() bytes Konvertiert die PDF in DOCX-Bytes
to_pptx(path) Konvertiert die PDF in eine PowerPoint-Datei
to_pptx_bytes() bytes Konvertiert die PDF in PPTX-Bytes
to_xlsx(path) Konvertiert die PDF in eine Excel-Arbeitsmappendatei
to_xlsx_bytes() bytes Konvertiert die PDF in XLSX-Bytes

Bildextraktion

doc.extract_images(page: int) -> list[ImageInfo]

Extrahiert alle Bilder einer Seite, einschließlich Bildern in Content Streams und verschachtelten Form-XObjects.

doc.extract_image_bytes(page: int) -> list[dict]

Extrahiert rohe Bild-Bytes aus einer Seite. Jedes Dict enthält width, height, data (Bytes) und format.

Suche

doc.search(
    pattern: str,
    case_insensitive: bool = False,
    literal: bool = False,
    whole_word: bool = False,
    max_results: int = 0
) -> list[SearchResult]

Sucht Text über alle Seiten hinweg. Setzen Sie max_results=0 für unbegrenzte Ergebnisse. Gibt eine Liste von Treffern mit Seitennummer, Text und Koordinaten zurück.

doc.search_page(
    page: int,
    pattern: str,
    case_insensitive: bool = False,
    literal: bool = False,
    whole_word: bool = False,
    max_results: int = 0
) -> list[SearchResult]

Sucht Text auf einer einzelnen Seite.

Metadaten bearbeiten

Methode Parameter Beschreibung
set_title(title) str Dokumenttitel setzen
set_author(author) str Dokumentautor setzen
set_subject(subject) str Dokumentbetreff setzen
set_keywords(keywords) str Dokumentschlüsselwörter setzen

Seitendrehung

Methode Parameter Rückgabe Beschreibung
page_rotation(page) int int Aktuelle Drehung abrufen (0, 90, 180, 270)
set_page_rotation(page, degrees) int, int Absolute Drehung setzen
rotate_page(page, degrees) int, int Zur aktuellen Drehung addieren
rotate_all_pages(degrees) int Alle Seiten drehen

Seitenmaße

Methode Parameter Rückgabe Beschreibung
page_media_box(page) int tuple[float, float, float, float] MediaBox abrufen (llx, lly, urx, ury)
set_page_media_box(page, llx, lly, urx, ury) int, float, float, float, float MediaBox setzen
page_crop_box(page) int `tuple None`
set_page_crop_box(page, llx, lly, urx, ury) int, float, float, float, float CropBox setzen
crop_margins(left, right, top, bottom) float, float, float, float Alle Seitenränder beschneiden

Löschen / Übermalen

Methode Parameter Beschreibung
erase_region(page, llx, lly, urx, ury) int, float, float, float, float Eine rechteckige Region löschen
erase_regions(page, rects) int, list[tuple] Mehrere Regionen löschen
clear_erase_regions(page) int Ausstehende Löschvorgänge verwerfen

Anmerkungen

doc.get_annotations(page: int) -> list[dict]

Ruft Anmerkungs-Metadaten (Typ, Rechteck, Inhalt usw.) für eine Seite ab.

Methode Parameter Rückgabe Beschreibung
flatten_page_annotations(page) int Anmerkungen einer Seite flachzeichnen
flatten_all_annotations() Alle Anmerkungen flachzeichnen
is_page_marked_for_flatten(page) int bool Prüfen, ob die Seite zum Flachzeichnen markiert ist
unmark_page_for_flatten(page) int Markierung zum Flachzeichnen einer Seite aufheben

Schwärzung

doc.add_redaction(
    page: int,
    rect: tuple[float, float, float, float],
    fill: tuple[float, float, float] | None = None
) -> None

Markiert eine rechteckige Region zur Schwärzung mit einer optionalen RGB-Füllfarbe.

doc.redaction_count(page: int) -> int

Gibt die Anzahl der ausstehenden Schwärzungen auf einer Seite zurück.

doc.apply_redactions_destructive(
    scrub_metadata: bool = True,
    remove_javascript: bool = True,
    remove_embedded_files: bool = True,
    fill: tuple[float, float, float] = (0.0, 0.0, 0.0)
) -> None

Wendet alle Schwärzungen destruktiv an, entfernt den darunterliegenden Inhalt und bereinigt optional Metadaten, JavaScript und eingebettete Dateien.

doc.sanitize_document(
    scrub_metadata: bool = True,
    remove_javascript: bool = True,
    remove_embedded_files: bool = True
) -> None

Bereinigt das Dokument, ohne Regionen zu schwärzen: entfernt Metadaten, JavaScript und/oder eingebettete Dateien.

Methode Parameter Rückgabe Beschreibung
apply_page_redactions(page) int Schwärzungen auf einer Seite anwenden
apply_all_redactions() Alle ausstehenden Schwärzungen anwenden
is_page_marked_for_redaction(page) int bool Prüfen, ob die Seite zur Schwärzung markiert ist
unmark_page_for_redaction(page) int Markierung zur Schwärzung einer Seite aufheben

Ebenen & Inks

Methode Parameter Rückgabe Beschreibung
get_layers() list[str] Namen der Optional-Content-Ebenen (OCG) auflisten
get_page_inks(page) int list[str] Ink-/Separations-Farbnamen auf einer Seite auflisten
get_page_inks_deep(page) int list[str] Inks einschließlich der in Form-XObjects verschachtelten auflisten

Kopf-/Fußzeilen-Bereinigung

doc.remove_headers(threshold: float = 0.8) -> int
doc.remove_footers(threshold: float = 0.8) -> int
doc.remove_artifacts(threshold: float = 0.8) -> int

Erkennt und entfernt wiederkehrende Kopfzeilen, Fußzeilen oder Seitenartefakte im gesamten Dokument. threshold ist das seitenübergreifende Wiederholungsverhältnis. Gibt die Anzahl der entfernten Elemente zurück.

Methode Parameter Beschreibung
erase_header(page) int Die erkannte Kopfzeilenregion auf einer Seite löschen
edit_header(page) int Die Kopfzeilenregion zur Bearbeitung markieren
erase_footer(page) int Die erkannte Fußzeilenregion auf einer Seite löschen
edit_footer(page) int Die Fußzeilenregion zur Bearbeitung markieren
erase_artifacts(page) int Erkannte Artefakte auf einer Seite löschen
sync_editor_erasures() Ausstehende Kopf-/Fußzeilen-/Artefakt-Löschungen in den Editor übernehmen

Formularfelder

doc.get_form_fields() -> list[FormField]

Ruft alle Formularfelder ab. Eigenschaften siehe FormField.

doc.get_form_field_value(name: str) -> str | bool | list | None

Ruft einen Formularfeldwert anhand des Namens ab. Gibt den passenden Python-Typ je nach Feldtyp zurück.

doc.set_form_field_value(name: str, value: str | bool) -> None

Setzt einen Formularfeldwert anhand des Namens.

doc.has_xfa() -> bool

Prüft, ob das Dokument XFA-Formulare enthält.

doc.export_form_data(path: str, format: str = "fdf") -> None

Exportiert Formulardaten in eine Datei. Unterstützte Formate: "fdf" und "xfdf".

Methode Parameter Beschreibung
flatten_forms() Alle Formularfelder in den Seiteninhalt flachzeichnen
flatten_forms_on_page(page) int Formulare auf einer bestimmten Seite flachzeichnen

Bildmanipulation

doc.page_images(page: int) -> list[dict]

Ruft Bildnamen und -grenzen für Positionierungsoperationen ab. Jedes Dict enthält name, bounds [x, y, width, height] und matrix.

Methode Parameter Beschreibung
reposition_image(page, name, x, y) int, str, float, float Ein Bild verschieben
resize_image(page, name, width, height) int, str, float, float Größe eines Bilds ändern
set_image_bounds(page, name, x, y, width, height) int, str, float, float, float, float Position und Größe eines Bilds setzen
clear_image_modifications(page) int Ausstehende Bildänderungen verwerfen
has_image_modifications(page) intbool Auf ausstehende Bildänderungen prüfen

Dokumentoperationen

doc.merge_from(source: str | PdfDocument) -> int

Führt Seiten aus einer anderen PDF zusammen. Akzeptiert einen Dateipfad oder eine PdfDocument-Instanz. Gibt die Anzahl der zusammengeführten Seiten zurück.

doc.embed_file(name: str, data: bytes) -> None

Hängt eine Datei an die PDF an.

doc.get_outline() -> list[dict] | None

Ruft Lesezeichen / Inhaltsverzeichnis des Dokuments ab. Gibt None zurück, wenn keine Gliederung existiert.

doc.extract_paths(page: int, region: tuple | None = None) -> list[dict]

Ruft Vektorpfade (Linien, Kurven, Formen) einer Seite ab.

doc.extract_rects(page: int, region: tuple | None = None) -> list[dict]

Ruft achsenparallele Rechtecke (aus gefüllten/umrandeten Pfaden) auf einer Seite ab.

doc.extract_lines(page: int, region: tuple | None = None) -> list[dict]

Ruft gerade Liniensegmente auf einer Seite ab.

doc.extract_tables(page: int, region: tuple | None = None, table_settings: dict | None = None) -> list[dict]

Erkennt und extrahiert Tabellen. Jede Tabelle ist ein Dict mit Zeilen und Zellen (Text + Begrenzungsrahmen). Übergeben Sie table_settings, um die Erkennungsstrategie anzupassen.

doc.extract_structured(page: int) -> str

Extrahiert die Seite als strukturiertes JSON-Dokument (logische Lesereihenfolge, Blöcke und Rollen).

doc.page_labels() -> list[dict]

Ruft Seitenlabel-Bereiche ab. Jedes Dict enthält start_page, style, prefix und start_value.

doc.xmp_metadata() -> dict | None

Ruft XMP-Metadaten als Dictionary mit Feldern wie dc_title, dc_creator, xmp_create_date usw. ab. Gibt None zurück, wenn keine XMP-Metadaten existieren.

OCR

doc.extract_text_ocr(page: int, engine: OcrEngine | None = None) -> str

Extrahiert Text per OCR. Erfordert das ocr-Feature im Rust-Build. Übergeben Sie eine eigene OcrEngine oder None für die Standard-Engine.

Seitenextraktion & Neuanordnung

doc.extract_pages(pages: list[int], output: str) -> None

Extrahiert die angegebenen Seitenindizes in eine neue PDF-Datei unter output.

doc.extract_pages_to_bytes(pages: list[int]) -> bytes

Extrahiert die angegebenen Seitenindizes in eine neue PDF, die als Bytes zurückgegeben wird.

doc.extract_page_ranges_to_bytes(ranges: list[tuple[int, int]]) -> bytes

Extrahiert einen oder mehrere (start, end)-Seitenbereiche in eine neue PDF, die als Bytes zurückgegeben wird.

Methode Parameter Beschreibung
select_pages(pages) list[int] Nur die aufgeführten Seiten in der angegebenen Reihenfolge behalten
delete_page(index) int Eine einzelne Seite löschen
move_page(from_index, to_index) int, int Eine Seite an eine neue Position verschieben

Konformität & Validierung

doc.validate_pdf_a(level: str = "1b") -> dict

Validiert gegen eine PDF/A-Konformitätsstufe (z. B. "1b", "2b", "3b"). Gibt ein Report-Dict zurück.

doc.convert_to_pdf_a(level: str = "2b") -> dict

Konvertiert das Dokument in PDF/A und gibt ein Konvertierungs-Report-Dict zurück.

doc.validate_pdf_ua() -> dict

Validiert gegen die PDF/UA-Anforderungen (Barrierefreiheit).

doc.validate_pdf_x(level: str = "1a_2001") -> dict

Validiert gegen eine PDF/X-Konformitätsstufe (Druckproduktion).

Berechtigungen & Warnungen

doc.permissions() -> dict

Gibt die Verschlüsselungs-Berechtigungsflags des Dokuments zurück (Drucken, Kopieren, Ändern, Anmerken usw.).

doc.structured_warnings() -> list

Gibt Warnungen zurück, die während der strukturierten / getaggten Inhaltsextraktion gesammelt wurden.

doc.flatten_warnings() -> list[str]

Gibt Warnungen zurück, die während des Flachzeichnens von Formularen/Anmerkungen gesammelt wurden.

Signaturen & Document Security Store

doc.signatures() -> list[Signature]

Gibt alle digitalen Signaturen im Dokument zurück. Siehe Signature.

doc.signature_count() -> int

Gibt die Anzahl der digitalen Signaturen zurück.

doc.dss() -> Dss | None

Gibt den geparsten Document Security Store (LTV-Material) des Dokuments zurück oder None. Siehe Dss.

Page-API (v0.3.34)

PdfDocument ist iterierbar und indexierbar und liefert lazy Page-Objekte. Siehe Page.

len(doc)                  # number of pages
doc[i]                    # page at index i (negative indexing supported)
doc[-1]                   # last page
for page in doc: ...      # iterate pages

DOM-Zugriff

doc.page(index: int) -> PdfPage

Ruft ein DOM-ähnliches Seiten-Handle für die Bearbeitung auf Elementebene ab. Siehe PdfPage.

doc.save_page(page: PdfPage) -> None

Speichert eine geänderte PdfPage zurück in das Dokument.

Rendering

doc.render_page(
    page: int,
    dpi: int | None = None,
    format: str | None = None,
    background: tuple[float, float, float, float] | None = None,
    transparent: bool = False,
    render_annotations: bool | None = None,
    jpeg_quality: int | None = None,
    excluded_layers: list[str] | None = None
) -> bytes

Rendert eine Seite in PNG- oder JPEG-Bytes mit Kontrolle über DPI, Hintergrund, Transparenz, Anmerkungs-Rendering, JPEG-Qualität und ausgeschlossene Ebenen.

doc.render_pixmap(page: int, dpi: int | None = None) -> RenderedPixmap

Rendert eine Seite in ein rohes RGBA-RenderedPixmap (Named Tuple mit width, height, data).

doc.render_separations(page: int, dpi: int | None = None) -> list[SeparationPlate]

Rendert Separations-Druckplatten pro Ink für eine Seite. Gibt eine Liste von SeparationPlate-Named-Tuples (name, width, height, data) zurück.

doc.render_separation(page: int, ink_name: str, dpi: int | None = None) -> SeparationPlate

Rendert eine einzelne benannte Ink-Separationsplatte.

Methode Rückgabetyp Beschreibung
render_page_fit(page, fit_width, fit_height, format=0) bytes Eine Seite skaliert in eine Pixelbox einpassen
flatten_to_images(dpi=150) bytes Alle Seiten in eine bildbasierte PDF flachzeichnen

Speichern

doc.save(path: str, compress: bool = True, garbage_collect: bool = True, linearize: bool = False) -> None

Speichert die PDF in eine Datei. Schaltet Stream-Komprimierung, Garbage Collection toter Objekte und Linearisierung (Fast Web View) um.

doc.to_bytes(compress: bool = True, garbage_collect: bool = True, linearize: bool = False) -> bytes

Serialisiert die PDF zu Bytes mit denselben Optionen wie save().

doc.save_encrypted(
    path: str,
    user_password: str,
    owner_password: str | None = None,
    allow_print: bool = True,
    allow_copy: bool = True,
    allow_modify: bool = True,
    allow_annotate: bool = True
) -> None

Speichert mit AES-256-Passwortschutz und Berechtigungssteuerung. Wenn owner_password None ist, wird das Benutzerpasswort verwendet.

doc.to_bytes_encrypted(
    user_password: str,
    owner_password: str | None = None,
    allow_print: bool = True,
    allow_copy: bool = True,
    allow_modify: bool = True,
    allow_annotate: bool = True
) -> bytes

Serialisiert eine AES-256-verschlüsselte PDF zu Bytes.


Page

Ein lazy Seiten-Handle, das von doc[i] oder beim Iterieren über PdfDocument zurückgegeben wird. Alle Properties werden beim Zugriff berechnet und an das übergeordnete Dokument delegiert.

from pdf_oxide import PdfDocument

with PdfDocument("paper.pdf") as doc:
    page = doc[0]
    text = page.text
    md = page.markdown(detect_headings=True)

Properties (lazy)

Property Typ Beschreibung
index int Nullbasierter Seitenindex
width, height float Seitenmaße in PDF-Punkten
bbox tuple[float, 4] (llx, lly, urx, ury)
text str Extrahierter Klartext
chars, words, lines, spans list[...] Strukturierter Text
tables list[dict] Tabellen mit Zeilen + Zellen (Text + bboxes)
images, paths, annotations list[...] Seiteninhalt

Methoden

page.markdown(preserve_layout=False, detect_headings=True,
              include_images=False, image_output_dir=None,
              embed_images=True, include_form_fields=True) -> str
page.plain_text(...) -> str
page.html(...) -> str
page.render(dpi=None, format=None, background=None, transparent=False,
            render_annotations=None, jpeg_quality=None, excluded_layers=None) -> bytes
page.render_pixmap(dpi=None) -> RenderedPixmap
page.search(pattern, case_insensitive=False, literal=False,
            whole_word=False, max_results=100) -> list
page.region(x, y, width, height) -> PdfPageRegion

Das lazy Seitenobjekt ist auch als doc.pages() verfügbar (ein Iterator, der dem direkten Iterieren über das Dokument entspricht).


PdfPage

DOM-ähnliches Seiten-Handle für den Zugriff und die Bearbeitung auf Elementebene. Wird über PdfDocument.page() abgerufen.

from pdf_oxide import PdfDocument

doc = PdfDocument("file.pdf")
page = doc.page(0)

Properties

Property Typ Beschreibung
index int Nullbasierter Seitenindex
width float Seitenbreite in PDF-Punkten
height float Seitenhöhe in PDF-Punkten

Methoden

page.children() -> list[PdfElement]

Ruft alle Elemente der Seite ab.

page.find_text_containing(needle: str) -> list[PdfText]

Findet alle Textelemente, die den angegebenen Teilstring enthalten.

page.find_images() -> list[PdfImage]

Findet alle Bildelemente der Seite.

page.get_element(element_id: str) -> PdfElement | None

Ruft ein bestimmtes Element anhand seiner ID ab.

page.set_text(text_id: PdfTextId, new_text: str) -> None

Ersetzt den Textinhalt eines durch seine PdfTextId identifizierten Elements.

page.annotations() -> list[PdfAnnotation]

Ruft alle Anmerkungen der Seite ab.

page.add_link(x: float, y: float, width: float, height: float, url: str) -> str

Fügt eine URL-Link-Anmerkung hinzu. Gibt die Anmerkungs-ID zurück.

page.add_highlight(x: float, y: float, width: float, height: float, color: tuple[float, float, float]) -> str

Fügt eine Hervorhebungs-Anmerkung mit RGB-Farbe hinzu. Gibt die Anmerkungs-ID zurück.

page.add_note(x: float, y: float, text: str) -> str

Fügt eine Haftnotiz-Anmerkung hinzu. Gibt die Anmerkungs-ID zurück.

page.remove_annotation(index: int) -> bool

Entfernt eine Anmerkung anhand des Index. Gibt True zurück, wenn sie entfernt wurde.

page.add_text(text: str, x: float, y: float, font_size: float = 12.0) -> PdfTextId

Fügt neuen Text zur Seite hinzu. Gibt eine PdfTextId zur späteren Referenzierung zurück.

page.remove_element(element_id: PdfTextId) -> bool

Entfernt ein Element anhand seiner ID. Gibt True zurück, wenn es entfernt wurde.

Beispiel

from pdf_oxide import PdfDocument

doc = PdfDocument("invoice.pdf")
page = doc.page(0)

# Find and replace text
for text in page.find_text_containing("DRAFT"):
    page.set_text(text.id, "FINAL")

# Add a link
page.add_link(100, 700, 200, 20, "https://example.com")

doc.save_page(page)
doc.save("invoice_updated.pdf")

Pdf

Die einheitliche Klasse zum Erstellen von PDFs aus verschiedenen Quellformaten.

from pdf_oxide import Pdf

Factory-Methoden

Pdf.from_markdown(content: str, title: str | None = None, author: str | None = None) -> Pdf

Erstellt eine PDF aus Markdown-Inhalt.

Pdf.from_html(content: str, title: str | None = None, author: str | None = None) -> Pdf

Erstellt eine PDF aus HTML-Inhalt.

Pdf.from_text(content: str, title: str | None = None, author: str | None = None) -> Pdf

Erstellt eine PDF aus Klartext.

Pdf.from_markdown_with_template(content: str, template: str, title: str | None = None, author: str | None = None) -> Pdf

Erstellt eine PDF aus Markdown, gerendert über eine benannte CSS-/Layout-Vorlage.

Pdf.from_image(path: str) -> Pdf

Erstellt eine einseitige PDF aus einer Bilddatei (JPEG, PNG).

Pdf.from_bytes(data: bytes) -> Pdf

Öffnet eine bestehende PDF aus In-Memory-Bytes zur Bearbeitung. Praktisch zum Laden von PDFs, die aus S3, HTTP oder Datenbanken heruntergeladen wurden.

from pdf_oxide import Pdf

pdf = Pdf.from_bytes(existing_pdf_bytes)
pdf.save("modified.pdf")
Pdf.from_images(paths: list[str]) -> Pdf

Erstellt eine mehrseitige PDF aus mehreren Bilddateien, eine Seite pro Bild.

Pdf.from_image_bytes(data: bytes) -> Pdf

Erstellt eine einseitige PDF aus Bild-Bytes.

Pdf.merge(paths: list[str]) -> Pdf

Führt mehrere PDF-Dateien (über Pfade) zu einer einzigen Pdf zusammen.

Methoden

pdf.save(path: str) -> None

Speichert die PDF in eine Datei.

pdf.to_bytes() -> bytes

Ruft den PDF-Inhalt als Bytes ab.

len(pdf) -> int

Ruft die PDF-Größe in Bytes ab (über __len__).


PdfText

Repräsentiert ein Textelement auf einer Seite. Wird von PdfPage.find_text_containing() zurückgegeben.

Property Typ Beschreibung
id PdfTextId Eindeutige Element-Kennung
value str Textinhalt
text str Textinhalt (Alias für value)
bbox tuple[float, float, float, float] Begrenzungsrahmen (x0, y0, x1, y1)
font_name str PostScript-Schriftname
font_size float Schriftgröße in Punkt
is_bold bool Ob der Text fett ist
is_italic bool Ob der Text kursiv ist

Methoden

Methode Parameter Rückgabe Beschreibung
contains(needle) str bool Prüfen, ob der Text einen Teilstring enthält
starts_with(prefix) str bool Prüfen, ob der Text mit einem Präfix beginnt
ends_with(suffix) str bool Prüfen, ob der Text mit einem Suffix endet

PdfImage

Repräsentiert ein Bildelement auf einer Seite. Wird von PdfPage.find_images() zurückgegeben.

Property Typ Beschreibung
bbox tuple[float, float, float, float] Begrenzungsrahmen (x0, y0, x1, y1)
width int Bildbreite in Pixeln
height int Bildhöhe in Pixeln
aspect_ratio float Verhältnis Breite / Höhe

PdfAnnotation

Repräsentiert eine Anmerkung auf einer Seite. Wird von PdfPage.annotations() zurückgegeben.

Property Typ Beschreibung
subtype str Anmerkungstyp (z. B. "Link", "Highlight", "Text")
rect tuple[float, float, float, float] Position (x0, y0, x1, y1)
contents `str None`
color `tuple[float, float, float] None`
is_modified bool Ob die Anmerkung geändert wurde
is_new bool Ob die Anmerkung neu hinzugefügt wurde

PdfElement

Generischer Element-Wrapper. Wird von PdfPage.children() zurückgegeben.

Methode Rückgabe Beschreibung
is_text() bool Prüfen, ob das Element Text ist
is_image() bool Prüfen, ob das Element ein Bild ist
is_path() bool Prüfen, ob das Element ein Vektorpfad ist
is_table() bool Prüfen, ob das Element eine Tabelle ist
is_structure() bool Prüfen, ob das Element ein Strukturelement ist
as_text() `PdfText None`
as_image() `PdfImage None`
Property Typ Beschreibung
bbox tuple[float, float, float, float] Begrenzungsrahmen

TextChar

Repräsentiert ein einzelnes Zeichen mit Position und Font-Metadaten. Wird von PdfDocument.extract_chars() zurückgegeben.

from pdf_oxide import TextChar  # or access via PdfDocument
Attribut Typ Beschreibung
char str Das Unicode-Zeichen
bbox tuple[float, float, float, float] Begrenzungsrahmen (x0, y0, x1, y1)
font_name str PostScript-Schriftname
font_size float Schriftgröße in Punkt
font_weight str Strichstärke ("thin", "light", "normal", "medium", "semi-bold", "bold", "extra-bold", "black")
is_italic bool Ob das Zeichen kursiv ist
color tuple[float, float, float] RGB-Farbe (r, g, b), Werte 0.0–1.0
rotation_degrees float Zeichendrehung in Grad
origin_x float X-Position des Textursprungs
origin_y float Y-Position des Textursprungs
advance_width float Vorschubbreite der Glyphe
mcid `int None`

Beispiel

from pdf_oxide import PdfDocument

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

for ch in chars[:5]:
    print(f"'{ch.char}' at bbox={ch.bbox} "
          f"font={ch.font_name} size={ch.font_size:.1f} "
          f"weight={ch.font_weight} italic={ch.is_italic}")

TextSpan

Repräsentiert einen Textlauf mit gleicher Schrift und gleichem Stil. Wird von PdfDocument.extract_spans() zurückgegeben.

Attribut Typ Beschreibung
text str Der Textinhalt
bbox tuple[float, float, float, float] Begrenzungsrahmen (x0, y0, x1, y1)
font_name str PostScript-Schriftname
font_size float Schriftgröße in Punkt
is_bold bool Ob der Span fett ist
is_italic bool Ob der Span kursiv ist
is_monospace bool Ob die Schrift dicktengleich ist (Courier, Consolas usw.)
char_widths list[float] Vorschubbreiten pro Glyphe für exakte Begrenzungsrahmen
color tuple[float, float, float] RGB-Farbe (r, g, b), Werte 0.0–1.0

Beispiel

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:.1f} "
          f"bold={span.is_bold} italic={span.is_italic} color={span.color}")

Bildextraktion

extract_images() gibt ImageInfo-Objekte mit Bildmetadaten zurück. Verwenden Sie extract_image_bytes() für rohe Bilddaten, die sich zum Speichern auf der Festplatte eignen.

Rückgabeformat von extract_image_bytes()

Jedes von extract_image_bytes() zurückgegebene Dict hat 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")

Beispiel

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']}")
    with open(f"image_{i}.{img['format']}", "wb") as f:
        f.write(img["data"])

SearchResult

Repräsentiert einen Text-Suchtreffer. Wird von search() und search_page() zurückgegeben.

Attribut Typ Beschreibung
page int Nullbasierter Seitenindex
text str Gefundener Text
x float X-Position in PDF-Punkten
y float Y-Position in PDF-Punkten

FormField

Repräsentiert ein Formularfeld. Wird von PdfDocument.get_form_fields() zurückgegeben.

Property Typ Beschreibung
name str Vollständig qualifizierter Feldname
field_type str Feldtyp: "text", "button", "choice", "signature" oder "unknown"
value `str bool
tooltip `str None`
bounds `tuple[float, float, float, float] None`
flags `int None`
max_length `int None`
is_readonly bool Ob das Feld schreibgeschützt ist
is_required bool Ob das Feld erforderlich ist

TextWord

Ein wortgruppierter Textlauf. Wird von PdfDocument.extract_words() und PdfPageRegion.extract_words() zurückgegeben.

Property Typ Beschreibung
text str Der Worttext
bbox tuple[float, float, float, float] Begrenzungsrahmen (x0, y0, x1, y1)
font_name str PostScript-Schriftname
font_size float Schriftgröße in Punkt
is_bold bool Ob das Wort fett ist
is_italic bool Ob das Wort kursiv ist
chars list[TextChar] Bestandteilzeichen

TextLine

Ein zeilengruppierter Textlauf. Wird von PdfDocument.extract_text_lines() und PdfPageRegion.extract_text_lines() zurückgegeben.

Property Typ Beschreibung
text str Der Zeilentext
bbox tuple[float, float, float, float] Begrenzungsrahmen (x0, y0, x1, y1)
words list[TextWord] Wörter in der Zeile
chars list[TextChar] Zeichen in der Zeile

PdfPageRegion

Ein zugeschnittener Bereich einer Seite. Wird von PdfDocument.within() und PdfPage.region() zurückgegeben.

Property Typ Beschreibung
bbox tuple[float, float, float, float] Die Grenzen des Bereichs

Methoden

region.extract_text() -> str
region.extract_words() -> list[TextWord]
region.extract_text_lines() -> list[TextLine]
region.extract_tables(table_settings: dict | None = None) -> list[dict]
region.extract_images() -> list
region.extract_paths() -> list

Extraktionsmethoden, die auf den Begrenzungsrahmen des Bereichs beschränkt sind.


LayoutParams

Berechnete adaptive Layout-Parameter für eine Seite. Wird von PdfDocument.page_layout_params() zurückgegeben.

Property Typ Beschreibung
word_gap_threshold float Schwelle für den Wortzwischenraum in Punkt
line_gap_threshold float Schwelle für den Zeilenzwischenraum in Punkt
median_char_width float Mittlere Zeichenbreite
median_font_size float Mittlere Schriftgröße
median_line_spacing float Mittlerer Zeilenabstand
column_count int Erkannte Anzahl von Textspalten

ExtractionProfile

Ein anpassbares Textextraktions-Profil, das an extract_words() / extract_text_lines() übergeben wird.

from pdf_oxide import ExtractionProfile

Statische Konstruktoren

ExtractionProfile.conservative()
ExtractionProfile.aggressive()
ExtractionProfile.balanced()
ExtractionProfile.academic()
ExtractionProfile.policy()
ExtractionProfile.form()
ExtractionProfile.government()
ExtractionProfile.scanned_ocr()
ExtractionProfile.adaptive()
ExtractionProfile.available() -> list[str]   # names of all built-in profiles

Properties

Property Typ Beschreibung
name str Profilname
tj_offset_threshold float Wortumbruch-Schwelle für TJ-Array-Offsets
word_margin_ratio float Wortrand-Verhältnis
space_threshold_em_ratio float Schwelle der Leerzeichenbreite (em-Verhältnis)
space_char_multiplier float Leerzeichen-Multiplikator
use_adaptive_threshold bool Ob adaptive Schwellen aktiviert sind

OfficeConverter

Konvertiert Office-Dokumente (DOCX, XLSX, PPTX) in PDF. Erfordert das office-Feature im Rust-Build.

from pdf_oxide import OfficeConverter

OfficeConverter()   # instances are stateless; the conversion methods are also usable as static methods

Methoden

OfficeConverter.from_docx(path: str) -> Pdf

Konvertiert ein Word-Dokument in ein Pdf-Objekt.

OfficeConverter.from_docx_bytes(data: bytes) -> Pdf

Konvertiert Word-Dokument-Bytes in ein Pdf-Objekt.

OfficeConverter.from_xlsx(path: str) -> Pdf

Konvertiert ein Excel-Tabellenblatt in ein Pdf-Objekt.

OfficeConverter.from_xlsx_bytes(data: bytes) -> Pdf

Konvertiert Excel-Tabellenblatt-Bytes in ein Pdf-Objekt.

OfficeConverter.from_pptx(path: str) -> Pdf

Konvertiert eine PowerPoint-Präsentation in ein Pdf-Objekt.

OfficeConverter.from_pptx_bytes(data: bytes) -> Pdf

Konvertiert PowerPoint-Präsentations-Bytes in ein Pdf-Objekt.

OfficeConverter.convert(path: str) -> Pdf

Erkennt das Format automatisch und konvertiert jedes unterstützte Office-Dokument in ein Pdf-Objekt.

Beispiel

from pdf_oxide import OfficeConverter

pdf = OfficeConverter.from_docx("report.docx")
pdf.save("report.pdf")

# Or use convert() for auto-detection
pdf = OfficeConverter.convert("spreadsheet.xlsx")
pdf.save("spreadsheet.pdf")

Grafikklassen

Diese Klassen stehen für die erweiterte PDF-Erstellung mit Grafiken zur Verfügung:

Color

from pdf_oxide import Color

Color(r: float, g: float, b: float)  # RGB, values 0.0-1.0
Color.from_hex("#ff0000")
Color.black()
Color.white()
Color.red()
Color.green()
Color.blue()

BlendMode

from pdf_oxide import BlendMode

BlendMode.NORMAL()
BlendMode.MULTIPLY()
BlendMode.SCREEN()
BlendMode.OVERLAY()
BlendMode.DARKEN()
BlendMode.LIGHTEN()
BlendMode.COLOR_DODGE()
BlendMode.COLOR_BURN()
BlendMode.HARD_LIGHT()
BlendMode.SOFT_LIGHT()
BlendMode.DIFFERENCE()
BlendMode.EXCLUSION()

ExtGState

from pdf_oxide import ExtGState

gs = ExtGState()
gs = gs.fill_alpha(0.5)
gs = gs.stroke_alpha(0.8)
gs = gs.alpha(0.5)  # Set both fill and stroke
gs = gs.blend_mode(BlendMode.MULTIPLY())

gs = ExtGState.semi_transparent()  # Preset

LineCap / LineJoin

from pdf_oxide import LineCap, LineJoin

LineCap.BUTT()       # Default
LineCap.ROUND()
LineCap.SQUARE()

LineJoin.MITER()     # Default
LineJoin.ROUND()
LineJoin.BEVEL()

Verläufe

from pdf_oxide import LinearGradient, RadialGradient, Color

# Linear gradient (fluent API)
grad = (LinearGradient()
    .start(0, 0)
    .end(100, 0)
    .add_stop(0.0, Color.red())
    .add_stop(1.0, Color.blue()))

# Convenience constructors
hgrad = LinearGradient.horizontal(200, Color.red(), Color.blue())
vgrad = LinearGradient.vertical(100, Color(1, 1, 0), Color(0, 0, 1))

# Radial gradient
rgrad = RadialGradient.centered(50, 50, 50)
rgrad = rgrad.add_stop(0.0, Color(1, 1, 0))
rgrad = rgrad.add_stop(1.0, Color(1, 0, 0))

PatternPresets

from pdf_oxide import PatternPresets, Color

PatternPresets.horizontal_stripes(width, height, stripe_height, color)
PatternPresets.vertical_stripes(width, height, stripe_width, color)
PatternPresets.checkerboard(size, color1, color2)
PatternPresets.dots(spacing, radius, color)
PatternPresets.diagonal_lines(size, line_width, color)
PatternPresets.crosshatch(size, line_width, color)

OCR-Klassen

Erfordert das ocr-Feature im Rust-Build.

OcrEngine

from pdf_oxide import OcrEngine, OcrConfig

engine = OcrEngine(
    det_model_path: str,
    rec_model_path: str,
    dict_path: str,
    config: OcrConfig | None = None
)

OcrConfig

from pdf_oxide import OcrConfig

config = OcrConfig(
    det_threshold: float | None = None,
    box_threshold: float | None = None,
    rec_threshold: float | None = None,
    num_threads: int | None = None,
    max_candidates: int | None = None,
    use_v5: bool = False
)

DocumentBuilder

Fluent Builder zum seitenweisen Zusammensetzen von PDFs. Siehe das Beispiel unten und Von Grund auf erstellen.

from pdf_oxide import DocumentBuilder

Methoden auf Dokumentebene

Methode Parameter Beschreibung
DocumentBuilder() Einen neuen Builder erzeugen
title(title) str Dokumenttitel setzen
author(author) str Dokumentautor setzen
subject(subject) str Dokumentbetreff setzen
keywords(keywords) str Dokumentschlüsselwörter setzen
creator(creator) str Den Namen der erzeugenden Anwendung setzen
on_open(script) str Eine dokumentweite Open-JavaScript-Aktion setzen
tagged_pdf_ua1() Ein barrierefreies Tagged PDF/UA-1-Dokument ausgeben
language(lang) str Die Dokumentsprache setzen (z. B. "en-US")
role_map(custom, standard) str, str Ein benutzerdefiniertes Struktur-Tag auf ein Standard-Tag abbilden
register_embedded_font(name, font) str, EmbeddedFont Eine Schrift registrieren (konsumiert die EmbeddedFont)

Seiten-Factories

builder.a4_page() -> FluentPageBuilder       # 595 x 842 pt
builder.letter_page() -> FluentPageBuilder   # 612 x 792 pt
builder.page(width: float, height: float) -> FluentPageBuilder

Ausgabe

builder.build() -> bytes
builder.save(path: str) -> None
builder.save_encrypted(path: str, user_password: str, owner_password: str) -> None
builder.to_bytes_encrypted(user_password: str, owner_password: str) -> bytes

FluentPageBuilder

Puffert Operationen auf Seitenebene bis done(). Wird von DocumentBuilder.a4_page() / letter_page() / page() zurückgegeben. Jede Methode gibt self für die Verkettung zurück; done() schließt die Seite ab und gibt den übergeordneten DocumentBuilder zurück.

Text & Layout

Methode Parameter Beschreibung
font(name, size) str, float Aktuelle Schrift und Größe setzen
at(x, y) float, float Den Cursor an eine absolute Position bewegen
text(text) str Text am Cursor zeichnen
heading(level, text) int, str Eine Überschrift zeichnen (Stufe 1–6)
paragraph(text) str Einen umgebrochenen Absatz zeichnen
space(points) float Vertikalen Abstand vorschieben
horizontal_rule() Eine horizontale Trennlinie zeichnen
columns(column_count, gap_pt, text) int, float, str Ausgeglichener mehrspaltiger Textfluss
footnote(ref_mark, note_text) str, str Inline-Referenzzeichen + Notiz am Seitenende
new_page_same_size() Eine neue Seite mit denselben Maßen beginnen
measure(text) -> float str Die gerenderte Textbreite in Punkt messen
remaining_space() -> float Verbleibender vertikaler Raum auf der Seite

Inline-Läufe

page.inline(text: str)
page.inline_bold(text: str)
page.inline_italic(text: str)
page.inline_color(text: str, r: float, g: float, b: float)
page.newline()
page.link_url(url: str)
page.link_page(page: int)
page.link_named(name: str)
page.link_javascript(script: str)
page.on_open(script: str)
page.on_close(script: str)
page.field_keystroke(script: str)
page.field_format(script: str)
page.field_validate(script: str)
page.field_calculate(script: str)

Markup-Anmerkungen

page.highlight(color: tuple[float, float, float])
page.underline(color: tuple[float, float, float])
page.strikeout(color: tuple[float, float, float])
page.squiggly(color: tuple[float, float, float])
page.sticky_note(text: str)
page.sticky_note_at(x: float, y: float, text: str)
page.watermark(text: str)
page.watermark_confidential()
page.watermark_draft()
page.stamp(name: str)
page.freetext(x: float, y: float, w: float, h: float, text: str)

AcroForm-Widgets

page.text_field(name: str, x: float, y: float, w: float, h: float, default_value: str | None = None)
page.checkbox(name: str, x: float, y: float, w: float, h: float, checked: bool = False)
page.combo_box(name: str, x: float, y: float, w: float, h: float, options: list[str], selected: str | None = None)
page.radio_group(name: str, buttons: list[tuple[str, float, float, float, float]], selected: str | None = None)
page.push_button(name: str, x: float, y: float, w: float, h: float, caption: str)
page.signature_field(name: str, x: float, y: float, w: float, h: float)

Grafik

page.rect(x: float, y: float, w: float, h: float)
page.filled_rect(x: float, y: float, w: float, h: float, r: float, g: float, b: float)
page.line(x1: float, y1: float, x2: float, y2: float)
page.text_in_rect(x: float, y: float, w: float, h: float, text: str, align: int | None = None)
page.stroke_rect(x, y, w, h, width=1.0, color=(0.0, 0.0, 0.0))
page.stroke_rect_dashed(x, y, w, h, dash, width=1.0, color=(0.0, 0.0, 0.0), phase=0.0)
page.stroke_line(x1, y1, x2, y2, width=1.0, color=(0.0, 0.0, 0.0))
page.stroke_line_dashed(x1, y1, x2, y2, dash, width=1.0, color=(0.0, 0.0, 0.0), phase=0.0)

Bilder & Barcodes

page.image_with_alt(bytes: bytes, x: float, y: float, w: float, h: float, alt_text: str)
page.image_artifact(bytes: bytes, x: float, y: float, w: float, h: float)
page.barcode_1d(barcode_type: int, data: str, x: float, y: float, w: float, h: float)
page.barcode_qr(data: str, x: float, y: float, size: float)

barcode_type: 0=Code128, 1=Code39, 2=EAN13, 3=EAN8, 4=UPCA, 5=ITF, 6=Code93, 7=Codabar.

Tabellen

page.table(table: Table)
page.streaming_table(
    columns: list[Column],
    repeat_header: bool = False,
    mode: str = "fixed",
    sample_rows: int = 50,
    min_col_width_pt: float = 20.0,
    max_col_width_pt: float = 400.0,
    max_rowspan: int = 1,
    batch_size: int = 256
) -> StreamingTable

Commit

page.done() -> DocumentBuilder

EmbeddedFont

Eine bei einem DocumentBuilder registrierte TTF-/OTF-Schrift.

from pdf_oxide import EmbeddedFont

EmbeddedFont.from_file(path: str) -> EmbeddedFont
EmbeddedFont.from_bytes(data: bytes, name: str | None = None) -> EmbeddedFont
Property Typ Beschreibung
name str Der registrierte Name der Schrift

Tabellen

Value Objects für die fluent Tabellen-API.

Align

from pdf_oxide import Align

Align.LEFT     # 0
Align.CENTER   # 1
Align.RIGHT    # 2

Column

from pdf_oxide import Column

Column(header: str, width: float = 100.0, align: Align | int | None = None)
Property Typ Beschreibung
header str Spaltenüberschrift
width float Spaltenbreite in Punkt
align int Zellenausrichtung

Table

from pdf_oxide import Table

Table(columns: list[Column], rows: list[list[str]], has_header: bool = False)

Eine gepufferte Tabelle, die von FluentPageBuilder.table() konsumiert wird. Mit has_header=True werden die Spaltenüberschriften als formatierte Kopfzeile gerendert.

StreamingTable

Ein zeilenstreamendes Tabellen-Handle, das von FluentPageBuilder.streaming_table() zurückgegeben wird — für Tabellen, die zu groß sind, um auf einmal materialisiert zu werden.

Methode Parameter Beschreibung
push_row(cells) list[str] Eine Zeile aus Zellen-Strings anhängen
push_row_span(cells) list[tuple[str, int]] Eine Zeile aus (text, colspan)-Zellen anhängen
flush() Den aktuellen Batch leeren
finish() Die Tabelle abschließen und den FluentPageBuilder zurückgeben
column_count() – → int Anzahl der Spalten
pending_row_count() – → int Gepufferte, aber noch nicht festgeschriebene Zeilen
batch_count() – → int Anzahl der abgeschlossenen Batches

Seitenvorlagen

Wiederkehrende Kopf-/Fußzeilen-Artefakte, die über Seiten hinweg angewendet werden.

Artifact / ArtifactStyle

from pdf_oxide import Artifact, ArtifactStyle

Artifact()                       # empty artifact
Artifact.center(text: str)       # centered artifact text
artifact.with_left(text: str)    # add left-aligned text

style = ArtifactStyle()
style = style.font(name: str, size: float)
style = style.bold()
from pdf_oxide import Header, Footer

Header()                  # or Header.center(text: str)
Footer()                  # or Footer.center(text: str)

PageTemplate

from pdf_oxide import PageTemplate, Header, Footer

template = (PageTemplate()
    .header(Header.center("Confidential"))
    .footer(Footer.center("Page")))

Digitale Signaturen

PDFs signieren, mit Zeitstempel versehen und verifizieren (PAdES / LTV). Erfordert die Features signatures (und optional tsa-client) im Rust-Build.

Certificate

from pdf_oxide import Certificate

Certificate.load(data: bytes) -> Certificate                       # DER certificate (verify only)
Certificate.load_pem(cert_pem: str, key_pem: str) -> Certificate   # signing credential
Certificate.load_pkcs12(data: bytes, password: str) -> Certificate # PKCS#12 / .p12 signing credential
Methode Rückgabe Beschreibung
subject() str Subject-DN des Zertifikats
issuer() str Issuer-DN des Zertifikats
serial() str Seriennummer
validity() tuple[int, int] (not_before, not_after) Unix-Zeitstempel
is_valid() bool Ob sich das Zertifikat derzeit innerhalb seines Gültigkeitsfensters befindet

Signature

Wird von PdfDocument.signatures() zurückgegeben.

Property / Methode Typ Beschreibung
signer_name `str None`
reason `str None`
location `str None`
contact_info `str None`
signing_time `int None`
covers_whole_document bool Ob die Signatur die gesamte Datei abdeckt
pades_level PadesLevel Erkannte PAdES-Baseline (B-B/B-T/B-LT)
verify() bool Die Signatur kryptografisch verifizieren
verify_detached(pdf_data) bool Verifizieren einschließlich des messageDigest gegen die Datei-Bytes

Timestamp

from pdf_oxide import Timestamp

Timestamp.parse(data: bytes) -> Timestamp
Property / Methode Typ Beschreibung
time int Zeitstempel-Zeit (Unix)
serial str Seriennummer der TSA-Antwort
policy_oid str TSA-Policy-OID
tsa_name str TSA-Name
hash_algorithm int Code des Hash-Algorithmus des Message-Imprints
message_imprint bytes Das gehashte Message-Imprint
verify() bool Das Zeitstempel-Token verifizieren

TsaClient

from pdf_oxide import TsaClient

client = TsaClient(
    url: str,
    username: str | None = None,
    password: str | None = None,
    timeout_seconds: int = 30,
    hash_algorithm: int = 2,
    use_nonce: bool = True,
    cert_req: bool = True
)
client.request_timestamp(data: bytes) -> Timestamp
client.request_timestamp_hash(digest: bytes, algorithm: int = 2) -> Timestamp

PadesLevel

from pdf_oxide import PadesLevel

PadesLevel.B_B     # baseline
PadesLevel.B_T     # + trusted timestamp
PadesLevel.B_LT    # + long-term validation material
PadesLevel.B_LTA   # + archival timestamp

RevocationMaterial

from pdf_oxide import RevocationMaterial

RevocationMaterial(
    certs: list[bytes] | None = None,
    crls: list[bytes] | None = None,
    ocsps: list[bytes] | None = None
)

DER-codierte Zertifikate, CRLs und OCSP-Antworten für die B-LT-Signierung.

Dss

Ein geparster Document Security Store, der von PdfDocument.dss() zurückgegeben wird.

Property Typ Beschreibung
certs list[bytes] Dokumentweite Zertifikat-DER-Blobs
crls list[bytes] CRL-DER-Blobs
ocsps list[bytes] OCSP-Antwort-DER-Blobs
vri list[str] VRI-Schlüssel pro Signatur (hexadezimaler SHA-1 von /Contents)

Funktionen auf Modulebene

from pdf_oxide import (
    sign_pdf_bytes, sign_pdf_bytes_pades, has_document_timestamp,
    generate_barcode_svg, generate_qr_svg,
    plan_split_by_bookmarks, split_by_bookmarks,
)

Signieren

sign_pdf_bytes(pdf_data: bytes, cert: Certificate, reason: str | None = None, location: str | None = None) -> bytes

Signiert rohe PDF-Bytes mit einem geladenen Signier-Certificate und gibt die signierte PDF zurück.

sign_pdf_bytes_pades(
    pdf_data: bytes,
    cert: Certificate,
    level: PadesLevel,
    tsa_url: str | None = None,
    reason: str | None = None,
    location: str | None = None,
    revocation: RevocationMaterial | None = None
) -> bytes

Signiert rohe PDF-Bytes auf einer PAdES-Baseline-Stufe. B_T/B_LT erfordern eine tsa_url.

has_document_timestamp(pdf_data: bytes) -> bool

Ob die PDF einen dokumentweiten RFC-3161-Archivzeitstempel (PAdES-B-LTA) trägt.

Barcodes

generate_barcode_svg(barcode_type: int, data: str) -> str
generate_qr_svg(data: str, error_correction: int, size: int) -> str

Erzeugt einen 1D-Barcode oder QR-Code als SVG-String. Erfordert das barcodes-Feature.

Anhand von Lesezeichen aufteilen

plan_split_by_bookmarks(src_bytes: bytes, title_prefix: str | None = None, ignore_case: bool = False, level: int = 1, include_front_matter: bool = True) -> list[dict]
split_by_bookmarks(src_bytes: bytes, title_prefix: str | None = None, ignore_case: bool = False, level: int = 1, include_front_matter: bool = True) -> list[tuple[dict, bytes]]

Plant oder führt eine Aufteilung einer PDF an Lesezeichengrenzen durch. plan_* gibt nur Segment-Metadaten zurück; split_* gibt jedes Segment zusammen mit seinen PDF-Bytes zurück.

OCR-Modellbereitstellung

prefetch_models(languages: list[str]) -> str
model_manifest() -> str
prefetch_available() -> bool

Stellt OCR-Modelle für die Offline-/Air-Gap-Nutzung bereit, inspiziert das Modell-Manifest (JSON) und prüft, ob dieser Build Modelle herunterladen kann.

Logging

setup_logging() -> None
set_log_level(level: str) -> None     # "off" | "error" | "warn" | "info" | "debug" | "trace"
get_log_level() -> str
disable_logging() -> None

Engine-Tuning

set_max_ops_per_stream(limit: int | None) -> int | None
set_preserve_unmapped_glyphs(preserve: bool) -> bool

Passt die Operator-Obergrenze pro Stream (Schutz vor adversen Eingaben) und die U+FFFD-Erhaltung für nicht zugeordnete Glyphen an. Beide geben den vorherigen Wert zurück.

Kryptografische Governance

crypto_active_provider() -> str
crypto_available_providers() -> list[str]
crypto_use_fips() -> None                 # install the FIPS aws-lc-rs provider (requires the fips feature)
crypto_set_policy(spec: str) -> None      # e.g. "strict" or "compat;deny:rc4@write"
crypto_policy() -> str
crypto_inventory() -> list[str]
crypto_cbom() -> str                      # CycloneDX 1.6 CBOM (JSON)

Asynchrone API

async/await-Wrapper, die blockierende Operationen in einem Thread-Pool ausführen. Die Methoden spiegeln ihre synchronen Gegenstücke wider.

from pdf_oxide import AsyncPdfDocument, AsyncPdf, AsyncOfficeConverter

async def main():
    doc = await AsyncPdfDocument.open("input.pdf")
    text = await doc.extract_text(0)
    await doc.close()
    # Or use as an async context manager:
    async with await AsyncPdfDocument.from_bytes(pdf_bytes) as doc:
        md = await doc.to_markdown_all()
Klasse Konstruktoren Hinweise
AsyncPdfDocument await AsyncPdfDocument.open(path, password=None), await AsyncPdfDocument.from_bytes(data, password=None) Alle PdfDocument-Methoden sind als Awaitables verfügbar; unterstützt async with und .close()
AsyncPdf umschließt Pdf-Factory-Methoden await pdf.save(path), await pdf.to_bytes()
AsyncOfficeConverter umschließt die statischen OfficeConverter-Methoden z. B. await AsyncOfficeConverter.from_docx(path)

Fehlerbehandlung

PdfError

Alle PDF-spezifischen Fehler lösen PdfError aus:

from pdf_oxide import PdfDocument, PdfError

try:
    doc = PdfDocument("file.pdf")
    text = doc.extract_text(0)
except PdfError as e:
    print(f"PDF error: {e}")
except FileNotFoundError:
    print("File not found")
except IndexError:
    print("Page index out of range")

Häufige Fehlerszenarien:

Ausnahme Ursache
PdfError Fehlerhafte PDF, verschlüsselt ohne Passwort, Parse-Fehler
FileNotFoundError Datei existiert nicht
IndexError Seitenindex überschreitet page_count()
ValueError Ungültiges Argument (z. B. negativer Seitenindex)

Vollständiges Beispiel

from pdf_oxide import PdfDocument, Pdf

# --- Extraction ---
doc = PdfDocument("input.pdf")
print(f"Pages: {doc.page_count()}")

for i in range(doc.page_count()):
    text = doc.extract_text(i)
    print(f"Page {i + 1}: {len(text)} characters")

# Character-level analysis
chars = doc.extract_chars(0)
fonts = set(ch.font_name for ch in chars)
print(f"Fonts on page 1: {fonts}")

# Image extraction
images = doc.extract_image_bytes(0)
for i, img in enumerate(images):
    with open(f"extracted_{i}.{img['format']}", "wb") as f:
        f.write(img["data"])

# --- Creation ---
pdf = Pdf.from_markdown("# Report\n\nGenerated by PDF Oxide.",
                        title="Report", author="PDF Oxide")
pdf.save("report.pdf")

# --- Editing ---
doc = PdfDocument("document.pdf")
doc.set_title("Updated Title")
doc.set_author("New Author")
doc.rotate_all_pages(90)

# Search and replace via DOM
page = doc.page(0)
for text in page.find_text_containing("DRAFT"):
    page.set_text(text.id, "FINAL")
doc.save_page(page)

# Form filling
fields = doc.get_form_fields()
for f in fields:
    print(f"{f.name} ({f.field_type}) = {f.value}")
doc.set_form_field_value("name", "John Doe")

# Merge another PDF
merged_count = doc.merge_from("appendix.pdf")
print(f"Merged {merged_count} pages")

doc.save("output.pdf")

# --- Search ---
results = doc.search("configuration", case_insensitive=True)
for r in results:
    print(f"Page {r.page + 1}: '{r.text}' at ({r.x:.0f}, {r.y:.0f})")

Ergänzungen in v0.3.38

DocumentBuilder / FluentPageBuilder / EmbeddedFont

from pdf_oxide import DocumentBuilder, EmbeddedFont, StampType

font = EmbeddedFont.from_file("DejaVuSans.ttf")
# Alt: EmbeddedFont.from_bytes(data: bytes, name: str | None = None)

(DocumentBuilder()
    .register_embedded_font("DejaVu", font)
    .letter_page()           # or .a4_page() / .page(size)
        .at(72, 720).font("DejaVu", 12).text("Hello")
        .heading(1, "Title")
        .paragraph("Body text with automatic wrapping")
        # Annotations (15 methods)
        .link_url("https://example.com")
        .link_page(2)
        .link_named("glossary")
        .highlight((1.0, 1.0, 0.0))
        .underline((0.0, 0.0, 1.0))
        .strikeout((1.0, 0.0, 0.0))
        .squiggly((1.0, 0.5, 0.0))
        .sticky_note("Review this")
        .stamp(StampType.APPROVED)
        .freetext((100, 500, 200, 50), "Comment")
        .watermark("DRAFT")
        .watermark_confidential()
        .watermark_draft()
        # AcroForm widgets (5 types)
        .text_field("name", 150, 400, 200, 20, "Jane Doe")
        .checkbox("agree", 72, 380, 15, 15, True)
        .combo_box("country", 150, 360, 200, 20, ["US", "UK"], "US")
        .radio_group("tier", [("free", 72, 340, 15, 15), ("pro", 120, 340, 15, 15)], "pro")
        .push_button("submit", 72, 300, 80, 25, "Submit")
        # Graphics primitives
        .rect(50, 270, 500, 2)
        .filled_rect(50, 260, 500, 2, (0.9, 0.9, 0.9))
        .line(50, 250, 550, 250)
    .done()
    .save_encrypted("out.pdf", "user-pw", "owner-pw"))
# Alt: .save("out.pdf") / .build() -> bytes
# Alt: .to_bytes_encrypted("user-pw", "owner-pw") -> bytes

HTML- + CSS-Pipeline

Pdf.from_html_css(html: str, css: str, font_bytes: bytes) -> Pdf
Pdf.from_html_css_with_fonts(html: str, css: str, fonts: list[tuple[str, bytes]]) -> Pdf

Siehe Aus HTML erstellen.

Signaturverifizierung

from pdf_oxide import PdfDocument, Timestamp, TsaClient

doc = PdfDocument("signed.pdf")
doc.signature_count()                # int
for sig in doc.signatures():
    sig.signer_name                  # str
    sig.reason                       # str | None
    sig.location                     # str | None
    sig.signing_time                 # datetime | None
    sig.verify()                     # "Valid" | "Invalid" | "Unknown"
    sig.verify_detached(pdf_bytes)   # adds messageDigest check

# Timestamp
ts = Timestamp.parse(tst_bytes)
ts.time, ts.serial, ts.policy_oid, ts.tsa_name, ts.hash_algorithm, ts.message_imprint

# TSA client (behind `tsa-client` feature)
client = TsaClient(url="https://freetsa.org/tsr",
                   username=None, password=None,
                   timeout_seconds=30, hash_algorithm=2,
                   use_nonce=True, cert_req=True)
ts = client.request_timestamp(pdf_bytes)
ts = client.request_timestamp_hash(digest, algorithm=2)

Details siehe Digitale Signaturen.

Rendering

doc.render_page_region(page: int, x: float, y: float, w: float, h: float, format: int = 0) -> bytes
doc.render_page_fit(page: int, fit_width: int, fit_height: int, format: int = 0) -> bytes

format: 0 = PNG, 1 = JPEG. Koordinaten in PDF-Punkten ab der unteren linken Ecke.

Pdf-Flatten

doc.flatten_to_images(dpi: int = 150) -> bytes

Other Language Bindings

PDF Oxide bietet native Bindings für jedes wichtige Ökosystem: Rust, Node.js, WASM, C#, Golang, Java, PHP, Ruby, C++, Swift, Kotlin, Dart, R, Julia, Zig, Scala, Clojure, Objective-C und Elixir.

Nächste Schritte