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 레퍼런스를 참고하세요. 타입 세부 정보는 타입 & 열거형을 참고하세요.
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.PdfPage — PdfDocument.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 |
서명 또는 서명 검증 실패 |
PdfErrorKind는 PdfException이 담고 있는 구체적인 오류 범주를 분류하는 열거형입니다.
전체 예제
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
다음 단계
- 타입 & 열거형 — 모든 공유 타입과 열거형
- Page API 레퍼런스 — 바인딩 간 일관된 페이지 단위 순회
- Scala 시작하기 — 튜토리얼