Skip to content

Scala-API-Referenz

PDF Oxide liefert idiomatische Scala-3-Bindings als schlanke, reine JVM-Fassade über dem ausgereiften Java-Binding fyi.oxide:pdf-oxide, das die einzige native JNI-Brücke (die pdf_oxide_jni-Crate) besitzt. Das Scala-Modul fügt keinen eigenen nativen Code hinzu: Es verwendet die Java-Typen (Pdf, PdfDocument, PdfPage, DocumentEditor, AutoExtractor, PdfSigner, PdfValidator sowie die Geometrie-/Text-/Tabellen-/Such-Werttypen) direkt und legt darüber Scala-3-extension-Methoden, die aus java.util.Optional[T] ein Option[T] und aus java.util.List[T] ein Seq[T] machen. scala.util.Using funktioniert ohne weiteres Zutun mit jedem AutoCloseable-Handle.

// build.sbt — cross-versioned for Scala 3 (resolves pdf-oxide-scala_3)
libraryDependencies += "fyi.oxide" %% "pdf-oxide-scala" % "0.3.69"

Die native JNI-Bibliothek (libpdf_oxide_jni) ist nicht enthalten. Machen Sie sie über System.loadLibrary("pdf_oxide_jni") auf Ihrem java.library.path ladbar, oder weisen Sie den Java-NativeLoader mit -Dfyi.oxide.pdf.lib.path=<path> darauf hin.

import fyi.oxide.pdf.{Pdf, PdfDocument, producerOption, wordsSeq}
import scala.util.Using

Using.resource(Pdf.fromMarkdown("# Hello\n\nbody\n")): pdf =>
  Using.resource(PdfDocument.open(pdf.save())): doc =>
    println(doc.pageCount())
    println(doc.extractText(0))
    println(doc.toMarkdown())
    println(doc.page(0).wordsSeq.map(_.text))       // List -> Seq
    println(doc.producerOption.getOrElse("(none)")) // Optional -> Option

Die Java-API finden Sie in der Java-API-Referenz. Die Rust-API ist in der Rust-API-Referenz beschrieben. Typdetails finden Sie unter Typen & Enums.


Pdf

fyi.oxide.pdf.Pdf — erstellt neue PDFs aus Quellformaten und teilt bestehende auf. Implementiert AutoCloseable.

Factory-Methoden

def fromMarkdown(markdown: String): Pdf

Erstellt ein PDF aus Markdown-Inhalt.

def fromHtml(html: String): Pdf

Erstellt ein PDF aus HTML-Inhalt.

def fromImages(images: java.util.List[Array[Byte]]): Pdf

Erstellt ein mehrseitiges PDF, eine Seite pro Bild (JPEG-/PNG-Bytes).

Aufteilen

def planSplitByBookmarks(opts: SplitByBookmarksOptions): java.util.List[BookmarkSegment]

Plant eine Lesezeichen-basierte Aufteilung, ohne Bytes zu erzeugen; liefert die Segmente zurück, die erstellt würden.

def splitByBookmarks(opts: SplitByBookmarksOptions): java.util.List[Array[Byte]]

Teilt das Dokument an Lesezeichengrenzen auf und liefert pro Segment ein PDF-Byte-Array zurück.

def planSplitByBookmarksCount(sourcePdf: Array[Byte], level: Int): Int

Statischer Helfer: zählt die Segmente, die eine Lesezeichen-Aufteilung auf der angegebenen Gliederungsebene erzeugen würde.

def splitByBookmarksFromBytes(sourcePdf: Array[Byte], level: Int): Array[Array[Byte]]

Statischer Helfer: teilt Quell-PDF-Bytes auf der angegebenen Gliederungsebene in Byte-Arrays pro Segment auf.

Speichern & Lebenszyklus

def save(): Array[Byte]
def saveTo(out: java.nio.file.Path): Unit
def isOpen(): Boolean
def close(): Unit

Serialisiert das PDF zu Bytes oder in eine Datei, prüft, ob das native Handle noch aktiv ist, und gibt es frei.


PdfDocument

fyi.oxide.pdf.PdfDocument — öffnet, extrahiert, rendert und befragt ein PDF. Implementiert AutoCloseable.

Öffnen

def open(path: java.nio.file.Path): PdfDocument
def open(path: String): PdfDocument
def open(bytes: Array[Byte]): PdfDocument
def open(path: java.nio.file.Path, password: String): PdfDocument
def open(path: String, password: String): PdfDocument
def open(bytes: Array[Byte], password: String): PdfDocument
def open(stream: java.io.InputStream): PdfDocument

Öffnet ein PDF aus einem Dateipfad, In-Memory-Bytes oder einem Input-Stream. Die Passwort-Überladungen entschlüsseln verschlüsselte Dokumente in einem Schritt.

Statische Extraktion

def extractText(path: String): String
def extractText(path: java.nio.file.Path): String

Komfortfunktion für den Einmalgebrauch: öffnet die Datei, extrahiert den gesamten Text und schließt sie wieder.

Dokumentinfo & Authentifizierung

def pageCount(): Int
def authenticate(password: String): Boolean
def authenticate(password: Array[Byte]): Boolean
def isOpen(): Boolean
def close(): Unit

Seitenanzahl, nachträgliche Authentifizierung für verschlüsselte PDFs (als String oder Roh-Bytes), Prüfung der Handle-Lebendigkeit und Freigabe.

Metadaten

def producer(): java.util.Optional[String]
def creator(): java.util.Optional[String]

Producer-/Creator-Strings des Dokuments. Verwenden Sie die Fassaden-Methoden producerOption / creatorOption für idiomatisches Option[String].

Textextraktion

def extractText(pageIndex: Int): String
def extractTextAuto(pageIndex: Int): String
def extractStructured(page: Int): String

Extrahiert reinen Text einer Seite, Text mit automatischem OCR-Fallback für gescannte Seiten oder eine strukturierte JSON-Darstellung. Seiten sind nullbasiert indiziert.

Konvertierung

def toMarkdown(): String
def toMarkdown(pageIndex: Int): String
def toHtml(): String
def toHtml(pageIndex: Int): String

Konvertiert das gesamte Dokument oder eine einzelne Seite nach Markdown oder HTML.

Rendering

def render(pageIndex: Int): Array[Byte]
def render(pageIndex: Int, dpi: Int): Array[Byte]

Rastert eine Seite zu PNG-Bytes, optional mit gewählter DPI.

Seiten & Suche

def page(index: Int): PdfPage
def pages(): java.util.List[PdfPage]
def pagesStream(): java.util.stream.Stream[PdfPage]
def formFields(): java.util.List[FormField]
def search(query: String): java.util.List[SearchMatch]
def search(query: String, caseInsensitive: Boolean, regex: Boolean, maxResults: Int): java.util.List[SearchMatch]

Liefert ein einzelnes Seiten-Handle, alle Seiten (als Liste oder Stream), alle AcroForm-Felder sowie Suchtreffer im gesamten Dokument. maxResults = 0 bedeutet unbegrenzt. Verwenden Sie die Fassaden-Methoden pagesSeq, formFieldsSeq und searchSeq für Scala-Seq-Ergebnisse.


PdfPage

fyi.oxide.pdf.PdfPage — ein einzelnes Seiten-Handle, das von PdfDocument.page / pages zurückgegeben wird.

Geometrie

def parent(): PdfDocument
def index(): Int
def mediaBox(): BBox
def cropBox(): BBox
def width(): Double
def height(): Double
def rotation(): Int

Besitzendes Dokument, nullbasierter Index, MediaBox-/CropBox-Rechtecke, Seitenmaße in Punkt und Rotation in Grad.

Inhaltsextraktion

def text(): String
def text(region: BBox): String
def words(): java.util.List[TextWord]
def lines(): java.util.List[TextLine]
def chars(): java.util.List[TextChar]
def images(): java.util.List[ExtractedImage]
def tables(): java.util.List[Table]
def annotations(): java.util.List[Annotation]

Text der gesamten Seite oder eines begrenzten Bereichs sowie strukturierte Wörter, Zeilen, Zeichen, Bilder, Tabellen und Annotationen. Verwenden Sie die Fassaden-Methoden wordsSeq, linesSeq, charsSeq, imagesSeq, tablesSeq und annotationsSeq für Scala-Seq.


DocumentEditor

fyi.oxide.pdf.DocumentEditor — füllt Formulare aus, schwärzt, entfernt Metadaten und speichert (inkrementell oder vollständig). Implementiert AutoCloseable. Setter-Methoden sind fluent und geben this zurück.

Öffnen

def open(path: java.nio.file.Path): DocumentEditor
def open(path: String): DocumentEditor
def open(bytes: Array[Byte]): DocumentEditor

Formulare

def setFormField(name: String, value: String): DocumentEditor
def setFormField(name: String, checked: Boolean): DocumentEditor

Setzt den Wert eines Text-/Auswahlfelds oder schaltet ein Kontrollkästchen-/Radio-Feld um.

Schwärzung

def addRedaction(pageIndex: Int, region: BBox): DocumentEditor
def redactionCount(pageIndex: Int): Int
def redactionCount(): Int
def applyRedactionsDestructive(): RedactResult

Stellt ein Schwärzungsrechteck zur Anwendung bereit, zählt ausstehende Schwärzungen pro Seite oder insgesamt und wendet sie destruktiv an (entfernt den zugrunde liegenden Inhalt), wobei ein RedactResult zurückgegeben wird.

Metadaten & Speichern

def scrubMetadata(): DocumentEditor
def save(): Array[Byte]
def saveTo(out: java.nio.file.Path): Unit
def saveIncremental(): Array[Byte]
def saveIncrementalTo(out: java.nio.file.Path): Unit
def isOpen(): Boolean
def close(): Unit

Entfernt identifizierende Metadaten und speichert anschließend entweder ein vollständig neu geschriebenes oder ein inkrementell angehängtes PDF als Bytes oder auf Datenträger.


AutoExtractor

fyi.oxide.pdf.AutoExtractor — intelligente Extraktion, die Seiten klassifiziert und bei Bedarf auf OCR zurückgreift.

Konstruktion

def of(doc: PdfDocument): AutoExtractor
def of(doc: PdfDocument, config: AutoExtractConfig): AutoExtractor
def fast(doc: PdfDocument): AutoExtractor
def balanced(doc: PdfDocument): AutoExtractor
def highFidelity(doc: PdfDocument): AutoExtractor

Erstellt einen Extraktor mit Standard-, benutzerdefinierter oder voreingestellter Konfiguration (schnell / ausgewogen / hohe Wiedergabetreue).

Extraktion

def extractText(): String
def extractTextForPage(pageIndex: Int): String
def extractDocument(): AutoResult
def extractPage(pageIndex: Int): AutoResult
def extractAutoDocument(): AutoResult
def extractAutoPage(pageIndex: Int): AutoResult
def extractDocumentJson(): String
def extractPageJson(pageIndex: Int): String

Extrahiert reinen Text oder ausführliche AutoResult-Datensätze (Text, optionales Markdown/HTML, Konfidenz, OCR-Nutzung, Regionen) für das gesamte Dokument oder eine einzelne Seite, jeweils auch als JSON-Variante.

Klassifizierung & Zugriff

def classifyDocument(): ClassifyResult
def classifyPage(pageIndex: Int): ClassifyResult
def document(): PdfDocument
def config(): AutoExtractConfig

Klassifiziert Seiten (Textebene / gescannt / gemischt, plus Listen von OCR-/Diagramm-/verschlüsselten Seiten) ohne zu extrahieren, und liest das Quelldokument sowie die Konfiguration aus.


MarkdownConverter

fyi.oxide.pdf.MarkdownConverter — statische Hilfsfunktionen zur Markdown-/HTML-Konvertierung.

def toMarkdown(doc: PdfDocument): String
def toMarkdown(doc: PdfDocument, pageIndex: Int): String
def toHtml(doc: PdfDocument): String
def toHtml(doc: PdfDocument, pageIndex: Int): String

Konvertiert ein gesamtes Dokument oder eine einzelne Seite nach Markdown oder HTML.


PdfSigner

fyi.oxide.pdf.PdfSigner — PAdES-/CMS-Digitalsignatur und -verifizierung.

def fromPkcs12(keystore: java.nio.file.Path, password: String): PdfSigner
def fromPkcs12(keystoreBytes: Array[Byte], password: String): PdfSigner
def sign(pdf: Array[Byte], opts: SignOptions): Array[Byte]
def verify(pdf: Array[Byte]): Boolean
def classifyLevel(pdf: Array[Byte]): SignatureLevel

Lädt einen Signer aus einem PKCS#12-Keystore (Datei oder Bytes), signiert ein PDF mit den angegebenen SignOptions, verifiziert eine bestehende Signatur und klassifiziert das PAdES-Level eines signierten PDFs statisch.


PdfValidator

fyi.oxide.pdf.PdfValidator — PDF/A-, PDF/X- und PDF/UA-Konformitätsprüfungen.

def isPdfA(doc: PdfDocument, level: PdfALevel): Boolean
def isPdfUa(doc: PdfDocument, level: PdfUaLevel): Boolean
def validatePdfA(doc: PdfDocument, level: PdfALevel): ValidationResult
def validatePdfX(doc: PdfDocument, level: PdfXLevel): ValidationResult
def validatePdfUa(doc: PdfDocument, level: PdfUaLevel): ValidationResult

Boolesche Schnellprüfungen sowie vollständige ValidationResult-Berichte (mit Verstößen pro Regel) für PDF/A, PDF/X und PDF/UA.


PdfPolicy

fyi.oxide.pdf.PdfPolicy — globaler kryptografischer Policy-Modus.

def current(): PolicyMode
def set(mode: PolicyMode): Unit
def compat(): PolicyMode
def strict(): PolicyMode
def fipsStrict(): PolicyMode

Liest oder setzt den prozessweiten Policy-Modus und greift auf die Voreinstellungen COMPAT / STRICT / FIPS_STRICT zu.


Ergebnis- & Werttypen

AutoResult

def text(): String
def markdown(): java.util.Optional[String]   // facade: markdownOption
def html(): java.util.Optional[String]       // facade: htmlOption
def reason(): ExtractReason
def confidence(): Double
def ocrUsed(): Boolean
def regions(): java.util.List[RegionResult]
def pagesNeedingOcr(): java.util.List[Integer]  // facade: pagesNeedingOcrSeq

RegionResult

def pageIndex(): Int
def bbox(): BBox
def text(): String
def reason(): ExtractReason
def confidence(): Double
def ocrUsed(): Boolean
def table(): java.util.Optional[Table]

ClassifyResult

def pages(): java.util.List[PageClass]
def pagesNeedingOcr(): java.util.List[Integer]
def pagesWithChart(): java.util.List[Integer]
def pagesEncrypted(): java.util.List[Integer]

AutoExtractConfig

Unveränderliche Konfiguration, erstellt über AutoExtractConfig.builder() (oder .toBuilder()). Die Zugriffsmethoden liefern Optional:

def builder(): AutoExtractConfig.Builder
def toBuilder(): AutoExtractConfig.Builder
def mode(): java.util.Optional[ExtractMode]
def forceOcrPages(): java.util.Optional[java.util.List[Integer]]
def minOcrConfidence(): java.util.Optional[Double]
def ocrLanguages(): java.util.Optional[java.util.List[String]]
def passwords(): java.util.Optional[java.util.List[String]]
def topMarginFraction(): java.util.Optional[Double]
def bottomMarginFraction(): java.util.Optional[Double]
def allowSingleColumnTables(): java.util.Optional[Boolean]
def ocrInlineImages(): java.util.Optional[Boolean]
def cancelToken(): java.util.Optional[String]

AutoExtractConfig.Builder:

def withMode(m: ExtractMode): Builder
def withForceOcrPages(p: java.util.List[Integer]): Builder
def withMinOcrConfidence(c: Double): Builder
def withOcrLanguages(l: java.util.List[String]): Builder
def withOcrLanguages(l: String*): Builder
def withPasswords(p: java.util.List[String]): Builder
def withPasswords(p: String*): Builder
def withTopMarginFraction(f: Double): Builder
def withBottomMarginFraction(f: Double): Builder
def withAllowSingleColumnTables(b: Boolean): Builder
def withOcrInlineImages(b: Boolean): Builder
def withCancelToken(t: String): Builder
def build(): AutoExtractConfig

ValidationResult / ValidationViolation

// ValidationResult
def valid(): Boolean
def violations(): java.util.List[ValidationViolation]

// ValidationViolation
def ruleId(): String
def description(): String
def pageIndex(): java.util.Optional[Integer]  // facade: pageIndexOption

RedactResult

def regionsApplied(): Int
def oracleVerified(): Boolean

SearchResult / SearchMatch / SearchOptions

// SearchResult
def query(): String
def matches(): java.util.List[SearchMatch]
def count(): Int
def isEmpty(): Boolean

// SearchMatch
def pageIndex(): Int
def bbox(): BBox
def text(): String

// SearchOptions (builder via SearchOptions.builder())
def caseSensitive(): Boolean
def wholeWord(): Boolean
def regex(): Boolean
def maxResults(): java.util.Optional[Integer]

SearchOptions.Builder: withCaseSensitive(b: Boolean), withWholeWord(b: Boolean), withRegex(b: Boolean), withMaxResults(m: Int), build().

FormField

def name(): String
def type(): FormFieldType
def value(): java.util.Optional[String]   // facade: valueOption
def bbox(): java.util.Optional[BBox]       // facade: bboxOption
def pageIndex(): Int

Annotation

def `type`(): AnnotationType
def pageIndex(): Int
def bbox(): BBox
def contents(): java.util.Optional[String]  // facade: contentsOption
def uri(): java.util.Optional[String]        // facade: uriOption

ExtractedImage

def bytes(): Array[Byte]
def format(): ImageFormat
def bbox(): BBox
def width(): Int
def height(): Int

Table / TableCell

// Table
def bbox(): BBox
def rows(): Int
def cols(): Int
def cells(): java.util.List[TableCell]

// TableCell
def text(): String
def bbox(): BBox
def row(): Int
def col(): Int
def rowSpan(): Int
def colSpan(): Int

Texttypen

// TextWord
def text(): String
def bbox(): BBox
def confidence(): Float

// TextLine
def text(): String
def bbox(): BBox
def words(): java.util.List[TextWord]

// TextChar
def codepoint(): Int
def bbox(): BBox
def confidence(): Float
def asString(): String

// TextSpan
def text(): String
def bbox(): BBox
def style(): TextStyle

// TextStyle
def size(): Double
def color(): Color
def bold(): Boolean
def italic(): Boolean

Geometrie

// BBox(x0, y0, x1, y1)
def x0(): Double
def y0(): Double
def x1(): Double
def y1(): Double
def width(): Double
def height(): Double

// Color(r, g, b[, a])
def r(): Int
def g(): Int
def b(): Int
def a(): Int

// Point(x, y)
def x(): Double
def y(): Double

// Rect(x, y, width, height)
def x(): Double
def y(): Double
def width(): Double
def height(): Double
def toBBox(): BBox

Metadaten

// DocumentInfo — all accessors return Optional[String]
def title(); def author(); def subject(); def keywords()
def creator(); def producer(); def creationDate(); def modificationDate()

// XmpMetadata(xml: String)
def xml(): String
def isEmpty(): Boolean

Signatur- & Aufteilungsoptionen

// SignOptions (builder via SignOptions.builder())
def level(): SignatureLevel
def reason(): java.util.Optional[String]
def location(): java.util.Optional[String]
def contactInfo(): java.util.Optional[String]
def tsaUrl(): java.util.Optional[String]
// Builder: withLevel, withReason, withLocation, withContactInfo, withTsaUrl, build

// SplitByBookmarksOptions (builder via SplitByBookmarksOptions.builder())
def level(): Int
def filenamePrefix(): java.util.Optional[String]
// Builder: withLevel(l: Int), withFilenamePrefix(p: String), build

// BookmarkSegment
def title(): String
def firstPage(): Int
def lastPage(): Int
def filename(): String

SecurityPolicy

def mode(): PolicyMode
def additionalAllow(): java.util.List[String]
def additionalDeny(): java.util.List[String]
def builder(): SecurityPolicy.Builder
// Builder: withMode(m: PolicyMode), allow(algId: String), deny(algId: String), build

Enums

Enum Konstanten
AnnotationType HIGHLIGHT, TEXT, LINK, STAMP, UNDERLINE, STRIKEOUT, SQUIGGLY, FREE_TEXT, LINE, SQUARE, CIRCLE, FILE_ATTACHMENT
FormFieldType TEXT, CHECKBOX, RADIO, CHOICE, SIGNATURE
ImageFormat JPEG, PNG, JBIG2, JPEG2000, CCITT, RAW
ExtractMode TEXT_ONLY, AUTO
ExtractReason OK, SCANNED_NO_TEXT_LAYER, GLYPH_MAPPING_MISSING, ENCRYPTED_NO_EXTRACT_PERMISSION, IMAGE_TABLE_NO_STRUCTURE, CHART_NOT_TRANSCRIBED, OCR_REQUESTED_BUT_UNAVAILABLE, OCR_LOW_CONFIDENCE, EMPTY
PageClass TEXT_LAYER, SCANNED, MIXED
PdfALevel A_1B, A_1A, A_2B, A_2A, A_2U, A_3B, A_3A, A_3U, A_4, A_4E
PdfUaLevel UA_1, UA_2 (jeweils mit code(): Int)
PdfXLevel X_1A_2001, X_1A_2003, X_3_2002, X_3_2003, X_4, X_4P, X_5G, X_5N, X_5PG, X_6, X_6P
PolicyMode COMPAT, STRICT, FIPS_STRICT
PixelFormat RGBA_8888, RGB_888, GRAY_8
SignatureLevel B_B, B_T, B_LT

Scala-Fassaden-Extensions

Das Scala-Modul fügt diese extension-Methoden zu den Java-Typen hinzu, damit Aufrufer Option/Seq statt java.util.Optional/java.util.List erhalten. Importieren Sie die benötigten aus fyi.oxide.pdf.

// Generic — any java.util.Optional[T]
extension [T](o: java.util.Optional[T]) def toOption: Option[T]

// PdfDocument
extension (doc: PdfDocument)
  def producerOption: Option[String]
  def creatorOption: Option[String]
  def formFieldsSeq: Seq[FormField]
  def pagesSeq: Seq[PdfPage]
  def searchSeq(query: String): Seq[SearchMatch]

// PdfPage
extension (page: PdfPage)
  def wordsSeq: Seq[TextWord]
  def linesSeq: Seq[TextLine]
  def charsSeq: Seq[TextChar]
  def tablesSeq: Seq[Table]
  def imagesSeq: Seq[ExtractedImage]
  def annotationsSeq: Seq[Annotation]

// FormField
extension (f: FormField)
  def valueOption: Option[String]
  def bboxOption: Option[BBox]

// Annotation
extension (a: Annotation)
  def contentsOption: Option[String]
  def uriOption: Option[String]

// AutoResult
extension (r: AutoResult)
  def markdownOption: Option[String]
  def htmlOption: Option[String]
  def pagesNeedingOcrSeq: Seq[Int]

// ValidationViolation
extension (v: ValidationViolation)
  def pageIndexOption: Option[Int]

Ausnahmen

Alle Fehler leiten sich von fyi.oxide.pdf.exception.PdfException ab:

Exception Ursache
PdfException Basisklasse für alle PDF-Oxide-Fehler
PdfParseException Fehlerhaftes oder beschädigtes PDF
PdfEncryptedException Verschlüsseltes PDF ohne Passwort geöffnet
PdfPermissionException Operation durch die Verschlüsselungsflags des Dokuments nicht erlaubt
PdfInvalidStateException Operation auf einem geschlossenen oder ungültigen Handle
PdfIoException Zugrunde liegender E/A-Fehler
PdfUnsupportedException Nicht unterstütztes Feature oder Format
PdfOcrUnavailableException OCR angefordert, aber das ocr-Feature ist nicht eingebunden
PdfSignatureException Fehler bei Signierung oder Signaturprüfung

PdfErrorKind ist ein Enum, das die spezifische Fehlerkategorie eines PdfException klassifiziert.


Vollständiges Beispiel

import fyi.oxide.pdf.*
import fyi.oxide.pdf.auto.AutoExtractConfig
import scala.util.Using

// --- Creation ---
Using.resource(Pdf.fromMarkdown("# Report\n\nGenerated by PDF Oxide.")): pdf =>
  pdf.saveTo(java.nio.file.Path.of("report.pdf"))

// --- Extraction ---
Using.resource(PdfDocument.open("report.pdf")): doc =>
  println(s"Pages: ${doc.pageCount()}")

  val page = doc.page(0)
  println(s"${page.width()} x ${page.height()}")
  page.wordsSeq.foreach(w => println(s"${w.text} @ ${w.bbox.x0}"))

  // Search (facade -> Seq)
  doc.searchSeq("Report").foreach(m => println(s"p${m.pageIndex}: ${m.text}"))

  // Metadata (facade -> Option)
  println(doc.producerOption.getOrElse("(none)"))

  // Auto extraction with OCR fallback
  val cfg = AutoExtractConfig.builder().withMinOcrConfidence(0.6).build()
  val result = AutoExtractor.of(doc, cfg).extractDocument()
  println(s"confidence=${result.confidence} ocr=${result.ocrUsed}")
  result.markdownOption.foreach(println)

// --- Editing: fill a form, redact, scrub ---
Using.resource(DocumentEditor.open("form.pdf")): ed =>
  ed.setFormField("name", "Jane Doe")
    .setFormField("agree", true)
    .addRedaction(0, BBox(72, 700, 272, 720))
  val redacted = ed.applyRedactionsDestructive()
  println(s"redacted ${redacted.regionsApplied} regions")
  ed.scrubMetadata().saveTo(java.nio.file.Path.of("output.pdf"))

Other Language Bindings

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

Nächste Schritte