Skip to content

PDF Oxide 시작하기 (Objective-C)

PDF Oxide는 Rust 코어 위에 자연스러운 Objective-C 바인딩을 제공합니다 — 텍스트 추출 평균 0.8ms, PDF 3,830개에서 통과율 100%. NSObject 래퍼(POXDocument, POXPdf)가 네이티브 핸들을 소유하고 ARC 아래에서 이를 해제하며, 반환되는 문자열은 NSString으로 돌아오고, C-ABI 오류 코드는 모두 POXErrorDomainNSError로 표면화됩니다. 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];

다음 단계