Skip to content

Scala API 레퍼런스

PDF Oxide는 단일 JNI 네이티브 브리지(pdf_oxide_jni 크레이트)를 담당하는 성숙한 fyi.oxide:pdf-oxide Java 바인딩 위에 얹은 얇은 순수 JVM 파사드로서, 관용적인 Scala 3 바인딩을 제공합니다. Scala 모듈은 네이티브 코드를 전혀 추가하지 않습니다. Java 타입(Pdf, PdfDocument, PdfPage, DocumentEditor, AutoExtractor, PdfSigner, PdfValidator, 그리고 geometry/text/table/search 값 타입)을 그대로 사용하고, 그 위에 java.util.Optional[T]Option[T]로, java.util.List[T]Seq[T]로 바꿔 주는 Scala 3 extension 메서드를 한 겹 덧입힙니다. AutoCloseable 핸들이라면 어디든 scala.util.Using이 곧바로 잘 맞물립니다.

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

JNI 네이티브 라이브러리(libpdf_oxide_jni)는 함께 번들되지 않습니다. java.library.path에서 System.loadLibrary("pdf_oxide_jni")로 로드할 수 있게 하거나, -Dfyi.oxide.pdf.lib.path=<path>로 Java의 NativeLoader가 해당 경로를 가리키도록 지정하세요.

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

Java API는 Java API 레퍼런스를, Rust API는 Rust API 레퍼런스를 참고하세요. 타입 세부 정보는 타입 & 열거형을 참고하세요.


Pdf

fyi.oxide.pdf.Pdf — 소스 포맷에서 새 PDF를 만들거나 기존 PDF를 분할합니다. AutoCloseable을 구현합니다.

팩토리 메서드

def fromMarkdown(markdown: String): Pdf

Markdown 콘텐츠로부터 PDF를 생성합니다.

def fromHtml(html: String): Pdf

HTML 콘텐츠로부터 PDF를 생성합니다.

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

이미지(JPEG/PNG 바이트) 한 장당 한 페이지씩, 여러 페이지로 된 PDF를 생성합니다.

분할

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

바이트를 생성하지 않고 북마크 기반 분할 계획만 세웁니다. 생성될 세그먼트들을 반환합니다.

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

북마크 경계에서 문서를 분할하여, 세그먼트마다 하나씩 PDF 바이트 배열을 반환합니다.

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

정적 헬퍼: 주어진 아웃라인 레벨로 북마크 분할을 수행했을 때 생성될 세그먼트 수를 계산합니다.

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

정적 헬퍼: 소스 PDF 바이트를 주어진 아웃라인 레벨에서 분할하여 세그먼트별 바이트 배열로 만듭니다.

저장 & 라이프사이클

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

PDF를 바이트나 파일 경로로 직렬화하고, 네이티브 핸들이 살아있는지 확인하고, 핸들을 해제합니다.


PdfDocument

fyi.oxide.pdf.PdfDocument — PDF를 열고, 추출하고, 렌더링하고, 조회합니다. AutoCloseable을 구현합니다.

열기

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

파일 경로, 메모리상의 바이트, 또는 입력 스트림으로부터 PDF를 엽니다. 암호 오버로드는 암호화된 문서를 한 번에 복호화합니다.

정적 추출

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

한 번에 끝내는 편의 메서드: 파일을 열고, 전체 텍스트를 추출한 뒤 닫습니다.

문서 정보 & 인증

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

페이지 수, 암호화된 PDF에 대한 열기 후 인증(문자열 또는 raw 바이트), 핸들 활성 여부 확인, 그리고 폐기를 처리합니다.

메타데이터

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

문서 producer / creator 문자열입니다. 관용적인 Option[String]을 쓰려면 파사드의 producerOption / creatorOption을 사용하세요.

텍스트 추출

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

페이지의 일반 텍스트, 스캔된 페이지를 위해 자동 OCR 폴백이 적용된 텍스트, 또는 구조화된 JSON 표현을 추출합니다. 페이지는 0부터 시작합니다.

변환

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

문서 전체 또는 단일 페이지를 Markdown이나 HTML로 변환합니다.

렌더링

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

페이지를 PNG 바이트로 래스터화합니다. DPI를 선택적으로 지정할 수 있습니다.

페이지 & 검색

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]

단일 페이지 핸들, 전체 페이지(리스트 또는 스트림으로), 모든 AcroForm 필드, 그리고 문서 전체에 걸친 검색 매치를 가져옵니다. maxResults = 0은 무제한을 뜻합니다. Scala Seq 결과를 원하면 파사드의 pagesSeq, formFieldsSeq, searchSeq를 사용하세요.


PdfPage

fyi.oxide.pdf.PdfPagePdfDocument.page / pages가 반환하는 단일 페이지 핸들입니다.

지오메트리

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

소유 문서, 0부터 시작하는 인덱스, MediaBox / CropBox 사각형, 포인트 단위 페이지 크기, 회전 각도(도)를 제공합니다.

콘텐츠 추출

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]

페이지 전체 또는 영역으로 잘라낸 텍스트와, 구조화된 단어, 줄, 문자, 이미지, 표, 주석을 제공합니다. Scala Seq가 필요하면 파사드의 wordsSeq, linesSeq, charsSeq, imagesSeq, tablesSeq, annotationsSeq를 사용하세요.


DocumentEditor

fyi.oxide.pdf.DocumentEditor — 양식을 채우고, 리댁션하고, 메타데이터를 지우고, 저장합니다(증분 또는 전체). AutoCloseable을 구현합니다. setter 메서드는 플루언트 방식이며 this를 반환합니다.

열기

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

양식

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

텍스트/선택형 필드 값을 설정하거나 체크박스/라디오 필드를 토글합니다.

리댁션

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

리댁션 사각형을 큐에 추가하고, 페이지별 또는 전체 대기 중인 리댁션 수를 세고, 이를 파괴적으로(원본 콘텐츠를 제거하며) 적용하여 RedactResult를 반환합니다.

메타데이터 & 저장

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

식별 가능한 메타데이터를 제거한 뒤, 완전히 재작성된 PDF 또는 증분으로 덧붙인 PDF를 바이트나 디스크로 저장합니다.


AutoExtractor

fyi.oxide.pdf.AutoExtractor — 페이지를 분류하고 필요한 경우 OCR로 폴백하는 지능형 추출기입니다.

생성

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

기본값, 커스텀, 또는 프리셋(fast / balanced / high-fidelity) 설정으로 추출기를 만듭니다.

추출

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

문서 전체 또는 단일 페이지에 대해 일반 텍스트나 (텍스트, 선택적 Markdown/HTML, 신뢰도, OCR 사용 여부, 영역을 담은) 풍부한 AutoResult 레코드를 추출합니다. JSON 버전도 함께 제공합니다.

분류 & 접근자

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

추출하지 않고 페이지를 분류합니다(텍스트 레이어 / 스캔됨 / 혼합, 그리고 OCR/차트/암호화 페이지 목록). 원본 문서와 설정을 다시 읽어올 수도 있습니다.


MarkdownConverter

fyi.oxide.pdf.MarkdownConverter — 정적 Markdown/HTML 변환 헬퍼입니다.

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

문서 전체 또는 단일 페이지를 Markdown이나 HTML로 변환합니다.


PdfSigner

fyi.oxide.pdf.PdfSigner — PAdES / CMS 디지털 서명 및 검증입니다.

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

PKCS#12 키스토어(파일 또는 바이트)로부터 서명자를 로드하고, 주어진 SignOptions로 PDF에 서명하고, 기존 서명을 검증하고, 서명된 PDF의 PAdES 레벨을 정적으로 분류합니다.


PdfValidator

fyi.oxide.pdf.PdfValidator — PDF/A, PDF/X, PDF/UA 준수 여부 검사입니다.

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

PDF/A, PDF/X, PDF/UA에 대한 불리언 간이 검사와, 규칙별 위반 사항을 담은 전체 ValidationResult 리포트를 제공합니다.


PdfPolicy

fyi.oxide.pdf.PdfPolicy — 전역 암호화 정책 모드입니다.

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

프로세스 전체의 정책 모드를 읽거나 설정하고, COMPAT / STRICT / FIPS_STRICT 프리셋에 접근합니다.


결과 & 값 타입

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

AutoExtractConfig.builder()(또는 .toBuilder())로 생성하는 불변 설정입니다. 접근자는 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

Text 타입

// 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

지오메트리

// 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

메타데이터

// 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

서명 & 분할 옵션

// 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

열거형

열거형 상수
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 (각각 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 파사드 확장 메서드

Scala 모듈은 Java 타입 위에 이 extension 메서드들을 더해, 호출자가 java.util.Optional/java.util.List 대신 Option/Seq를 받도록 합니다. 필요한 것만 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]

예외

모든 오류는 fyi.oxide.pdf.exception.PdfException을 상속합니다.

예외 원인
PdfException 모든 PDF Oxide 오류의 기반 클래스
PdfParseException 손상되었거나 형식이 잘못된 PDF
PdfEncryptedException 암호 없이 암호화된 PDF를 열려고 함
PdfPermissionException 문서의 암호화 플래그가 허용하지 않는 작업
PdfInvalidStateException 닫혔거나 유효하지 않은 핸들에 대한 작업
PdfIoException 하위 I/O 실패
PdfUnsupportedException 지원되지 않는 기능이나 포맷
PdfOcrUnavailableException OCR을 요청했지만 ocr 기능이 빌드에 포함되어 있지 않음
PdfSignatureException 서명 또는 서명 검증 실패

PdfErrorKindPdfException이 담고 있는 구체적인 오류 범주를 분류하는 열거형입니다.


전체 예제

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는 모든 주요 생태계를 위한 네이티브 바인딩을 제공합니다: Rust, Python, Node.js, WASM, C#, Golang, Java, PHP, Ruby, C++, Swift, Kotlin, Dart, R, Julia, Zig, Clojure, Objective-C, Elixir

다음 단계