Skip to content

Ruby-API-Referenz

PDF Oxide liefert native Ruby-Bindings (Gem pdf_oxide), aufgebaut auf FFI über das cdylib-C-ABI. Das Gem bündelt eine vorkompilierte native Bibliothek und spiegelt die 9-Klassen-Struktur des Java-Bindings unter dem Namespace PdfOxide wider.

gem install pdf_oxide
require 'pdf_oxide'

Zur Rust-API siehe die Rust-API-Referenz. Zur Python-API siehe die Python-API-Referenz. Zu Typdetails siehe Typen & Enums.

Alle Handle-besitzenden Objekte (PdfDocument, Pdf, DocumentEditor) besitzen nativen Speicher und müssen geschlossen werden. Das idiomatische Muster ist die Block-Form, die automatisch schließt; #close ist idempotent.


PdfOxide (Modul)

Komfortable Einstiegspunkte auf oberster Ebene sowie prozessglobale Schalter.

PdfOxide.open(source, password: nil) { |doc| ... } -> PdfDocument

Öffnet ein PDF zum Lesen. Delegiert an PdfDocument.open. Akzeptiert einen Dateipfad oder rohe PDF-Bytes; die Block-Form schließt automatisch.

PdfOxide.version -> String

Gibt den Versions-String der Bibliothek zurück (z. B. "0.3.69").

PdfOxide.set_max_ops_per_stream(limit) -> Integer

Setzt die prozessglobale Obergrenze für Content-Stream-Operatoren. Ein negativer limit stellt den Standard wieder her (1.000.000); jeder nicht-negative Wert wird zur expliziten Obergrenze. Gibt die vorherige Obergrenze zurück.

PdfOxide.set_preserve_unmapped_glyphs(preserve) -> Integer

Schaltet das prozessglobale Flag zur Erhaltung von U+FFFD (nicht zugeordnete Glyphen) um, das von der Textextraktion verwendet wird. Truthy/ungleich null erhält; falsey/0 filtert (der Standard). Gibt den vorherigen Wert zurück (0 oder 1).


PdfDocument

Der primäre schreibgeschützte Einstiegspunkt zu einem PDF: Extraktion, Suche, Konvertierung, Rendering und Seitenzugriff.

doc = PdfOxide::PdfDocument.open('invoice.pdf')

Konstruktor & Klassenmethoden

PdfOxide::PdfDocument.open(source, password: nil) { |doc| ... } -> PdfDocument

Öffnet ein PDF aus einem Dateisystempfad oder rohen PDF-Bytes (automatisch erkannt über die %PDF--Magic bei binärer Eingabe). Die Block-Form schließt automatisch; die Nicht-Block-Form gibt das Dokument zurück. Löst FileNotFoundError, ParseError oder EncryptedError aus.

PdfOxide::PdfDocument.new(source, password: nil) -> PdfDocument

Konstruiert direkt ohne Block. Bevorzuge .open.

PdfOxide::PdfDocument.extract_text(source, page: 0) -> String

One-Shot-Helfer: öffnet, extrahiert den Text einer einzelnen Seite und schließt.

Dokumentinformationen

doc.page_count -> Integer

Anzahl der Seiten im Dokument.

doc.pdf_version -> String

PDF-Versions-String (z. B. "1.7") oder "unknown", falls nicht verfügbar.

doc.encrypted? -> Boolean

Ob das PDF ein Verschlüsselungs-Dictionary enthält.

doc.path -> String

Absoluter Pfad, aus dem das Dokument geöffnet wurde (oder <in-memory> für aus Bytes geöffnete Dokumente).

Authentifizierung

doc.authenticate(password) -> Boolean

Authentifiziert gegen die Verschlüsselung dieses Dokuments. Gibt true bei Erfolg oder für unverschlüsselte Dokumente zurück.

Textextraktion

doc.extract_text(page_index) -> String

Extrahiert reinen Text aus einer einzelnen nullbasierten Seite (leer für Seiten ohne Textebene).

doc.extract_structured(page) -> Hash

Extrahiert eine strukturierte Darstellung einer Seite als Hash mit page_index, page_width, page_height und regions (jeweils mit kind, text, bbox, spans, column_index).

doc.extract_text_auto(page_index) -> String

Automatisch geroutete Extraktion: nativer Text, wo vorhanden, OCR für gescannte Regionen, wenn das ocr-Feature verfügbar ist, mit elegantem nativem Fallback (löst niemals “OCR unavailable” aus).

Konvertierung

doc.to_markdown(page_index = nil) -> String

Konvertiert eine Seite nach Markdown oder das gesamte Dokument, wenn page_index nil ist.

doc.to_html(page_index = nil) -> String

Konvertiert eine Seite nach HTML oder das gesamte Dokument, wenn page_index nil ist.

Suche

doc.search(query, case_sensitive: false, regex: false) -> Array<Hash>

Durchsucht das Dokument. Jeder Treffer ist { page:, text:, bbox: { x:, y:, width:, height: } }. Übergib regex: true, um query als regulären Ausdruck zu interpretieren (löst UnsupportedFeatureError aus, wenn dem Build die Regex-Suche fehlt).

Formulare

doc.form_fields -> Array<Hash>

AcroForm-Felder als { name:, value:, type:, page: }-Hashes. Gibt [] zurück, wenn dem Build der Form-Extract-Accessor fehlt.

Rendering

doc.render(page_index, dpi: 150) -> String

Rendert eine einzelne Seite zu PNG-Bytes (BINARY) mit der angegebenen DPI.

doc.render_with_layers(page_index, dpi: 150, format: 0,
                       background: [1.0, 1.0, 1.0, 1.0], transparent: false,
                       render_annotations: true, jpeg_quality: 90,
                       excluded_layers: []) -> String

Rendert eine Seite mit der vollständigen RenderOptions-Oberfläche plus Filterung von Optional-Content-Group(OCG)-Ebenen. format: 0 = PNG, 1 = JPEG; excluded_layers listet zu unterdrückende OCG-/Names auf. Gibt codierte Bild-Bytes (BINARY) zurück.

Seitenzugriff

doc.page(index) -> PdfPage

Eine leichtgewichtige PdfPage-Ansicht der Seite bei index.

doc.pages -> Array<PdfPage>

Jede Seite im Dokument (eager).

Auto-Extraktion

doc.auto_extractor -> AutoExtractor

Der konfigurierte AutoExtractor für dieses Dokument (memoisiert).

Lebenszyklus

doc.close -> nil

Gibt das native Handle frei. Idempotent.

doc.open? -> Boolean
doc.closed? -> Boolean

Ob das Dokument noch geöffnet ist / geschlossen wurde.


PdfPage

Eine leichtgewichtige seitenbezogene Ansicht, die von einem PdfDocument geliehen ist. Hält kein eigenes natives Handle. Konstruiere sie über PdfDocument#page oder #pages.

page = doc.page(0)

Attribute

page.parent -> PdfDocument
page.index -> Integer

Das besitzende Dokument und der nullbasierte Seitenindex.

Geometrie

page.width -> Float
page.height -> Float

Seitenbreite und -höhe in PDF-User-Space-Einheiten.

page.media_box -> Hash
page.crop_box -> Hash

{ x:, y:, width:, height: } für die Media-Box / Crop-Box (die Crop-Box fällt auf die Media-Box zurück).

page.rotation -> Integer

Seitenrotation in Grad.

Text

page.text -> String

Extrahiert den Text dieser Seite (entspricht parent.extract_text(index)).

page.to_s -> String
page.inspect -> String

Kurzes Inspektions-Label (#<PdfOxide::PdfPage index=N>).


Pdf

Erstellt und speichert PDFs: Markdown-/HTML-/Text-/Bildquellen, Byte-Export und Planung der Bookmark-Aufteilung.

pdf = PdfOxide::Pdf.from_markdown("# Title\n\nBody")

Factory-Methoden

PdfOxide::Pdf.from_markdown(markdown) { |pdf| ... } -> Pdf

Erstellt ein PDF aus Markdown.

PdfOxide::Pdf.from_html(html) { |pdf| ... } -> Pdf

Erstellt ein PDF aus HTML (CSS wird über die html_css-Pipeline berücksichtigt).

PdfOxide::Pdf.from_text(text) { |pdf| ... } -> Pdf

Erstellt ein PDF aus reinem Text.

PdfOxide::Pdf.from_images(images) { |pdf| ... } -> Pdf

Erstellt ein PDF aus einem Array von JPEG-/PNG-Byte-Blobs (Format automatisch anhand der Magic-Bytes erkannt).

PdfOxide::Pdf.create_empty { |pdf| ... } -> Pdf

Erstellt ein leeres einseitiges PDF.

Statische Helfer

PdfOxide::Pdf.version -> String

Die Version der Bibliothek.

PdfOxide::Pdf.prefetch_models(languages) -> String

Lädt OCR-Modelle für die angegebenen BCP-47-/ISO-Sprachtags vorab. Gibt den Pfad des Cache-Verzeichnisses zurück (leer bei Builds ohne OCR).

PdfOxide::Pdf.prefetch_available? -> Boolean

Ob der Build die Bereitstellung von OCR-Modellen unterstützt.

PdfOxide::Pdf.plan_split_by_bookmarks_count(source_pdf, level) -> Integer

Zählt die Bookmark-Aufteilungssegmente, die aus dem Aufteilen von source_pdf (rohe Bytes) bei level (1 = oberste Ebene, 0 = alle) resultieren würden, ohne Ausgabe zu erzeugen.

Instanzmethoden

pdf.to_bytes -> String

Das PDF als BINARY-codierte Bytes.

pdf.save(path) -> String

Schreibt das PDF nach path. Gibt den geschriebenen absoluten Pfad zurück.

pdf.close -> nil
pdf.closed? -> Boolean

Gibt das native Handle frei (idempotent) / ob es geschlossen wurde.


DocumentEditor

Schreibseitiger Editor: destruktive Schwärzung, Metadaten-Bereinigung, Formularausfüllung und inkrementelles Speichern. Jede Schwärzungsoperation schlägt fehlersicher fehl (ein Rückgabewert ungleich null löst aus).

PdfOxide::DocumentEditor.open('source.pdf') do |ed|
  ed.add_redaction(page: 0, rect: [100, 200, 300, 250])
  ed.apply_redactions!
  ed.save_to('redacted.pdf')
end

Konstruktor

PdfOxide::DocumentEditor.open(source) { |ed| ... } -> DocumentEditor

Öffnet einen Editor über ein PDF auf der Festplatte oder im Speicher als Bytes. Die Block-Form schließt automatisch.

PdfOxide::DocumentEditor.new(source) -> DocumentEditor

Konstruiert direkt ohne Block.

Schwärzung

ed.add_redaction(page:, rect:, color: [0.0, 0.0, 0.0]) -> self

Stellt ein Schwärzungsrechteck in die Warteschlange (rect = [x1, y1, x2, y2] im PDF-User-Space; color = [r, g, b]). Wird erst bei apply_redactions! angewendet.

ed.redaction_count(page) -> Integer

Gesamtzahl der für die Seite in die Warteschlange gestellten Schwärzungen.

ed.apply_redactions!(scrub_metadata: false, fill_color: [0.0, 0.0, 0.0]) -> self

Wendet alle in der Warteschlange befindlichen Schwärzungen destruktiv an, optional unter Bereinigung von /Info, XMP und JS.

ed.scrub_metadata -> self

Entfernt Metadaten ohne Schwärzungsregionen.

Formulare

ed.set_form_field(name, value) -> self

Setzt ein AcroForm-Feld über seinen punktgetrennten vollständigen Namen. Ein boolescher value adressiert ein Kontrollkästchen/Optionsfeld; andernfalls wird ein Textwert gesetzt.

Speichern & Lebenszyklus

ed.save_to(path) -> String

Speichert das bearbeitete PDF. Gibt den geschriebenen absoluten Pfad zurück.

ed.to_bytes -> String

Das bearbeitete PDF als BINARY-codierte Bytes.

ed.close -> nil
ed.closed? -> Boolean

Gibt das native Handle frei (idempotent) / ob es geschlossen wurde.


AutoExtractor

Auto-Extraktion mit typisierten Begründungen (Routing zwischen Text und OCR mit elegantem nativem Fallback). Konstruiere sie aus einem PdfDocument.

ax = PdfOxide::AutoExtractor.new(doc)
result = ax.extract_page(0)
warn "degraded: #{result[:reason]}" unless ax.ok?(result[:reason])

Konstruktor & Attribut

PdfOxide::AutoExtractor.new(document) -> AutoExtractor

Umhüllt ein PdfDocument für die Auto-Extraktion.

ax.document -> PdfDocument

Das umhüllte Dokument.

Klassifizierung

ax.classify_page(page_index) -> Hash

Günstiger seitenweiser Klassifikator (kein OCR/Rasterisierung). Gibt { reason:, kind:, confidence:, classification: } zurück.

ax.classify_document -> Hash

Klassifikator für das gesamte Dokument; gibt den decodierten JSON-Envelope zurück.

Extraktion

ax.extract_text(page_index) -> Hash

Extrahiert den Text einer Seite über den Auto-Router; gibt { text:, reason:, kind:, confidence:, classification: } zurück.

ax.extract_page(page_index, options: nil) -> Hash

Reichhaltige seitenweise Extraktion, die den vollständigen PageExtraction-Envelope (Text + bbox je Region + Begründung + Konfidenz), zu einem Hash zusammengeführt, zurückgibt.

Prädikate

ax.ok?(reason) -> Boolean

Ob reason einen sauberen Extrakt darstellt.

ax.ocr_fallback?(reason) -> Boolean

Ob der elegante Fallback-Pfad bei nicht verfügbarem OCR aktiviert wurde.

PdfOxide::AutoExtractor.prefetch_available? -> Boolean

Ob der Build die OCR-Bereitstellung unterstützt.

Konstanten

AutoExtractor::REASONS — eingefrorenes Array typisierter Begründungssymbole (:ok, :native_text_high_confidence, :no_text_layer_present, :ocr_requested_but_unavailable usw.). AutoExtractor::PAGE_KINDS — Seitenart-Symbole (:text_layer, :scanned, :image_text, :mixed, :empty).


MarkdownConverter

Zustandsloses Modul, das ein PdfDocument nach Markdown oder HTML konvertiert.

PdfOxide::MarkdownConverter.to_markdown(doc, page_index = nil) -> String

Konvertiert eine Seite (oder das gesamte Dokument, wenn page_index nil ist) nach Markdown.

PdfOxide::MarkdownConverter.to_html(doc, page_index = nil) -> String

Konvertiert eine Seite (oder das gesamte Dokument) nach HTML.


PdfPolicy

Prozessglobale Krypto-Governance-Policy mit Set-Once-Semantik. Rufe .set vor jeder anderen PDF-Oxide-Operation auf.

PdfOxide::PdfPolicy.current -> Symbol

Der aktuelle Prozess-Policy-Modus (:compat, :strict oder :fips_strict).

PdfOxide::PdfPolicy.set(mode) -> Symbol

Setzt den prozessglobalen Policy-Modus. Löst aus, wenn bereits gesetzt oder vom Build nicht unterstützt.

PdfOxide::PdfPolicy.compat -> Symbol
PdfOxide::PdfPolicy.strict -> Symbol
PdfOxide::PdfPolicy.fips_strict -> Symbol

Voreingestellte Modus-Symbole: alle Algorithmen akzeptieren / Legacy-Algorithmen ablehnen / nur FIPS 140-3.

PdfPolicy::MODES — eingefrorene Zuordnung von Modus-Symbolen zu cdylib-Ordinalwerten.


PdfSigner

PAdES B-B / B-T / B-LT / B-LTA-Signierer für digitale Signaturen. Das Signieren ist eine Sicherheitsoperation: jeder Rückgabewert ungleich null schlägt fehlersicher fehl.

PdfOxide::PdfSigner.new(certificate_handle) -> PdfSigner

Konstruiert einen Signierer aus einem opaken PKCS#12-/PEM-Credentials-Handle.

signer.sign(pdf, level:, tsa_url: nil, reason: nil, location: nil) -> String

Signiert rohe PDF-Bytes auf der angeforderten PAdES-Ebene (:b, :t, :lt, :lta). Für Ebenen >= :t ist eine tsa_url erforderlich. Gibt BINARY-codierte signierte PDF-Bytes zurück.

PdfOxide::PdfSigner.sign(pdf:, certificate_handle:, level:, tsa_url: nil, reason: nil, location: nil) -> String

Statischer Komfort: signieren, ohne eine Signierer-Instanz zu konstruieren.

PdfOxide::PdfSigner.pades_level(signature_handle) -> Integer

Der PAdES-Ebenen-Ordinalwert eines bestehenden Signatur-Handles.

PdfOxide::PdfSigner.document_has_timestamp?(document_handle) -> Boolean

Ob das Dokument einen dokumentweiten /DocTimeStamp enthält.

PdfSigner::LEVELS — eingefrorene Zuordnung von Ebenen-Symbolen zu Codes. PdfSigner::PadesSignOptions — gepackte FFI::Struct, die das C-PadesSignOptionsC-Layout spiegelt.


PdfValidator

Zustandslose Validierung der PDF/A- und PDF/UA-Konformität.

PdfOxide::PdfValidator.pdf_a?(doc, level: :a1b) -> Boolean

Ob das Dokument PDF/A-konform für level ist (:a1b, :a1a, :a2b, :a2a, :a2u, :a3b, :a3a, :a3u).

PdfOxide::PdfValidator.pdf_ua?(doc, level: :ua1) -> Boolean

Ob das Dokument PDF/UA-konform für level ist (:ua1 oder :ua2).

PdfOxide::PdfValidator.validate_pdf_a(doc, level: :a1b) -> Hash

Vereinfachtes PDF/A-Ergebnis: { compliant:, violations: }.

PdfOxide::PdfValidator.validate_pdf_ua(doc, level: :ua1) -> Hash

Vereinfachtes PDF/UA-Ergebnis: { compliant:, violations: }.

PdfValidator::PDF_A_LEVELS und PdfValidator::PDF_UA_LEVELS — eingefrorene Zuordnungen von Ebene zu Ordinalwert.


Fehlerbehandlung

Alle PDF-Oxide-Ausnahmen leiten sich von PdfOxide::Error ab. Native Fehlercodes werden 1-zu-1 auf die folgenden Unterklassen abgebildet.

begin
  doc = PdfOxide::PdfDocument.open('file.pdf')
  text = doc.extract_text(0)
rescue PdfOxide::FileNotFoundError
  warn 'file not found'
rescue PdfOxide::ParseError => e
  warn "malformed PDF: #{e.message}"
rescue PdfOxide::Error => e
  warn "PDF error: #{e.message}"
ensure
  doc&.close
end
Ausnahme Ursache
Error Basisklasse für alle PDF-Oxide-Fehler
UnsupportedPlatformError Host-Plattform wird von der gebündelten cdylib nicht unterstützt
ArgumentError Argument hat die Validierung vor dem nativen Aufruf nicht bestanden
IoError Dateisystem-/E/A-Fehler
FileNotFoundError Fehlende Datei (spezialisiert IoError)
ParseError Fehlerhafter Header, beschädigte xref, Extraktionsfehler
StateError Falsche Operationsreihenfolge
InvalidStateError Operation auf einem bereits geschlossenen Handle (spezialisiert StateError)
EncryptedError Verschlüsselungs-/Falschpasswort-Fehler
PermissionError Verschlüsseltes PDF ohne Extraktions-/Signierberechtigung
UnsupportedFeatureError Feature nicht in diesen cdylib-Build kompiliert
SignatureError PAdES-Signier-/Verifizierungsfehler
RedactionError Fehler bei destruktiver Schwärzung (schlägt fehlersicher fehl)
ComplianceError PDF/A- · PDF/UA-Validierungsfehler
SearchError Nativer Textsuchfehler
InternalError Generischer Fehler auf nativer Seite

Vollständiges Beispiel

require 'pdf_oxide'

# --- Extraction ---
PdfOxide::PdfDocument.open('input.pdf') do |doc|
  puts "Pages: #{doc.page_count}"
  doc.page_count.times do |i|
    puts "Page #{i + 1}: #{doc.extract_text(i).length} characters"
  end

  # Search
  doc.search('configuration', case_sensitive: false).each do |m|
    puts "Page #{m[:page] + 1}: '#{m[:text]}' at (#{m[:bbox][:x]}, #{m[:bbox][:y]})"
  end

  # Render page 1 to PNG
  File.binwrite('page1.png', doc.render(0, dpi: 150))
end

# --- Creation ---
PdfOxide::Pdf.from_markdown("# Report\n\nGenerated by PDF Oxide.") do |pdf|
  pdf.save('report.pdf')
end

# --- Redaction ---
PdfOxide::DocumentEditor.open('source.pdf') do |ed|
  ed.add_redaction(page: 0, rect: [100, 200, 300, 250])
  ed.apply_redactions!(scrub_metadata: true)
  ed.save_to('redacted.pdf')
end

# --- Validation ---
PdfOxide::PdfDocument.open('archive.pdf') do |doc|
  puts "PDF/A-1b compliant: #{PdfOxide::PdfValidator.pdf_a?(doc, level: :a1b)}"
end

Other Language Bindings

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

Nächste Schritte