Skip to content

Erste Schritte mit PDF Oxide (Objective-C)

PDF Oxide bringt idiomatische Objective-C-Bindings über seinem Rust-Kern mit — 0,8 ms mittlere Textextraktion, 100 % Erfolgsquote bei 3.830 PDFs. NSObject-Wrapper (POXDocument, POXPdf) besitzen die nativen Handles und geben sie unter ARC frei, zurückgelieferte Strings kommen als NSString zurück, und jeder C-ABI-Fehlercode erscheint als NSError in der POXErrorDomain. Neu in v0.3.69.

Installation

Das Objective-C-Binding bindet das cdylib mit Standard-Features ein und wird mit clang unter ARC gebaut. Bauen Sie zuerst die native Bibliothek und führen Sie dann make build dagegen aus:

# 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

Importieren Sie den einzigen öffentlichen Header in Ihren Quelldateien:

#import "POXPdfOxide.h"

Schnellstart

Öffnen Sie ein PDF, prüfen Sie seine Metadaten und extrahieren Sie Text aus der ersten Seite. Jeder fehleranfällige Aufruf nimmt ein abschließendes NSError** entgegen.

#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);

Sie können auch aus Bytes im Speicher öffnen — nützlich, wenn das PDF über das Netzwerk oder aus einer Datenbank eintrifft — sowie passwortgeschützte Dateien öffnen:

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];

Textextraktion

Reiner Text ist der schnelle Weg. Extrahieren Sie eine einzelne Seite über ihren nullbasierten Index oder ziehen Sie das gesamte Dokument auf einmal heraus.

// 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]);
}

Wörter und Zeilen

extractWords: und extractTextLines: liefern Arrays von Element-Objekten mit Bounding-Boxes und Schrift-Metadaten zurück, alles in PDF-Benutzerraum-Punkten.

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 (aus extractChars:) bietet dieselbe Struktur auf Zeichenebene — character, bbox, fontName und fontSize.

Markdown und HTML

Konvertieren Sie eine Seite — oder das gesamte Dokument — nach Markdown oder 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];

Suche

Durchsuchen Sie eine einzelne Seite mit search:term:caseSensitive:error: oder das gesamte Dokument mit searchAll:caseSensitive:error:. Beide liefern Arrays von POXSearchResult zurück, die den gefundenen Text, den Seitenindex und die Bounding-Box enthalten.

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];

PDFs erstellen

Der POXPdf-Builder erzeugt PDFs aus Markdown, HTML oder reinem Text. Speichern Sie in einen Pfad oder erhalten Sie die Bytes als NSData zurück.

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];

Vom Builder direkt in ein Dokument zur Extraktion durchschleifen:

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]);

Fehlerbehandlung

Jede fehleranfällige Methode schreibt in das abschließende NSError** und gibt bei einem Fehler nil / einen Sentinel-Wert zurück. Fehler landen in der 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);
}

Handles geben sich unter ARC selbst frei, aber Sie können den nativen Handle vorzeitig mit -close freigeben (idempotent):

[doc close];

Nächste Schritte