PDF Oxide 시작하기 (Objective-C)
PDF Oxide는 Rust 코어 위에 자연스러운 Objective-C 바인딩을 제공합니다 — 텍스트 추출 평균 0.8ms, PDF 3,830개에서 통과율 100%. NSObject 래퍼(POXDocument, POXPdf)가 네이티브 핸들을 소유하고 ARC 아래에서 이를 해제하며, 반환되는 문자열은 NSString으로 돌아오고, C-ABI 오류 코드는 모두 POXErrorDomain의 NSError로 표면화됩니다. v0.3.69에서 새로 추가되었습니다.
설치
Objective-C 바인딩은 기본 기능 cdylib에 링크하며 ARC 아래에서 clang으로 빌드됩니다. 먼저 네이티브 라이브러리를 빌드한 다음, 그에 대해 make build를 실행하세요:
# 1. build the native library (shipped binding feature set)
cargo build --release --lib --features ocr,rendering,signatures,barcodes,tsa-client,system-fonts
# 2. build the Objective-C binding (clang, ARC)
cd objc
make build PDF_OXIDE_LIB_DIR="$PWD/../target/release"
DYLD_LIBRARY_PATH="$PWD/../target/release" ./basic_extraction
소스에서 단일 공개 헤더를 임포트하세요:
#import "POXPdfOxide.h"
빠른 시작
PDF를 열고, 메타데이터를 살펴본 다음, 첫 페이지에서 텍스트를 추출합니다. 실패할 수 있는 모든 호출은 마지막 인자로 NSError**를 받습니다.
#import "POXPdfOxide.h"
NSError *err = nil;
POXDocument *doc = [POXDocument openPath:@"research-paper.pdf" error:&err];
if (!doc) {
NSLog(@"open failed: %@", err.localizedDescription);
return;
}
NSInteger pages = [doc pageCountError:&err];
POXVersion ver = [doc version];
NSLog(@"pages: %ld version: %d.%d", (long)pages, ver.major, ver.minor);
NSString *text = [doc extractText:0 error:&err];
NSLog(@"%@", text);
메모리에 있는 바이트에서도 열 수 있으며 — PDF가 네트워크나 데이터베이스에서 도착할 때 유용합니다 — 비밀번호로 보호된 파일도 열 수 있습니다:
POXDocument *doc = [POXDocument openFromBytes:pdfData error:&err];
// Encrypted document, password supplied up front:
POXDocument *enc = [POXDocument openWithPassword:@"confidential.pdf"
password:@"secret"
error:&err];
// Or authenticate after opening:
BOOL ok = [doc authenticate:@"secret" error:&err];
텍스트 추출
일반 텍스트가 가장 빠른 경로입니다. 0부터 시작하는 인덱스로 단일 페이지를 추출하거나, 문서 전체를 한 번에 가져오세요.
// One page
NSString *text = [doc extractText:0 error:&err];
// Whole document, joined
NSString *all = [doc toPlainTextAllWithError:&err];
// Page by page
NSInteger count = [doc pageCountError:&err];
for (NSInteger i = 0; i < count; i++) {
NSLog(@"--- page %ld ---\n%@", (long)i, [doc extractText:i error:&err]);
}
단어와 줄
extractWords:와 extractTextLines:는 경계 상자와 글꼴 메타데이터를 담은 요소 객체의 배열을 반환하며, 모두 PDF 사용자 공간 포인트 단위입니다.
NSArray<POXWord *> *words = [doc extractWords:0 error:&err];
for (POXWord *w in words) {
POXBbox box = w.bbox;
NSLog(@"'%@' at (%.1f, %.1f) %.1fx%.1f font=%@ size=%.1f bold=%d",
w.text, box.x, box.y, box.width, box.height,
w.fontName, w.fontSize, w.bold);
}
NSArray<POXTextLine *> *lines = [doc extractTextLines:0 error:&err];
for (POXTextLine *line in lines) {
NSLog(@"%@ (%ld words)", line.text, (long)line.wordCount);
}
POXChar(extractChars:에서 반환)는 문자 단위로 동일한 형태를 노출합니다 — character, bbox, fontName, fontSize.
Markdown과 HTML
페이지 하나 — 또는 문서 전체 — 를 Markdown이나 HTML로 변환하세요.
// Single page
NSString *md = [doc toMarkdown:0 error:&err];
NSString *html = [doc toHtml:0 error:&err];
// Whole document
NSString *mdAll = [doc toMarkdownAllWithError:&err];
NSString *htmlAll = [doc toHtmlAllWithError:&err];
검색
search:term:caseSensitive:error:로 단일 페이지를 검색하거나, searchAll:caseSensitive:error:로 문서 전체를 검색하세요. 둘 다 일치한 텍스트, 페이지 인덱스, 경계 상자를 담은 POXSearchResult 배열을 반환합니다.
NSArray<POXSearchResult *> *hits =
[doc searchAll:@"configuration" caseSensitive:NO error:&err];
for (POXSearchResult *r in hits) {
POXBbox b = r.bbox;
NSLog(@"page %ld: '%@' at (%.0f, %.0f)", (long)r.page, r.text, b.x, b.y);
}
// Single-page variant:
NSArray<POXSearchResult *> *pageHits =
[doc search:0 term:@"configuration" caseSensitive:NO error:&err];
PDF 생성
POXPdf 빌더는 Markdown, HTML 또는 일반 텍스트에서 PDF를 생성합니다. 경로에 저장하거나 바이트를 NSData로 되돌려 받으세요.
POXPdf *pdf = [POXPdf fromMarkdown:@"# Hello World\n\nThis is a PDF.\n"
error:&err];
[pdf saveToPath:@"output.pdf" error:&err];
// Or keep the bytes in memory
NSData *bytes = [pdf toBytesWithError:&err];
// HTML and plain text constructors exist too
POXPdf *invoice = [POXPdf fromHtml:@"<h1>Invoice</h1><p>Amount: $42</p>"
error:&err];
POXPdf *notes = [POXPdf fromText:@"Plain text content." error:&err];
빌더에서 곧바로 문서로 왕복하여 추출하세요:
POXPdf *pdf = [POXPdf fromMarkdown:@"# Report\n\nBody text.\n" error:&err];
POXDocument *doc = [POXDocument openFromBytes:[pdf toBytesWithError:&err]
error:&err];
NSLog(@"%@", [doc extractText:0 error:&err]);
오류 처리
실패할 수 있는 모든 메서드는 마지막 인자인 NSError**에 값을 기록하고, 실패 시 nil 또는 센티넬 값을 반환합니다. 오류는 POXErrorDomain에 속합니다.
NSError *err = nil;
POXDocument *doc = [POXDocument openPath:@"document.pdf" error:&err];
if (!doc) {
if ([err.domain isEqualToString:POXErrorDomain]) {
NSLog(@"PDF error: %@", err.localizedDescription);
}
return;
}
NSString *text = [doc extractText:0 error:&err];
if (!text) {
NSLog(@"extract failed: %@", err.localizedDescription);
}
핸들은 ARC 아래에서 스스로 해제되지만, -close(멱등적)로 네이티브 핸들을 즉시 해제할 수도 있습니다:
[doc close];
다음 단계
- Rust 시작하기 — Rust에서 PDF Oxide 사용하기
- Python 시작하기 — Python에서 PDF Oxide 사용하기
- 텍스트 추출 — 자세한 추출 옵션과 레시피
- PDF 생성 — 빌더 API를 활용한 고급 생성
- 편집 — 기존 PDF, 주석, 양식 필드 수정하기