Початок роботи з PDF Oxide (Objective-C)
PDF Oxide постачає ідіоматичні прив’язки Objective-C над своїм ядром на Rust — середній час видобування тексту 0,8 мс, 100% успішних проходжень на 3830 PDF. Обгортки NSObject (POXDocument, POXPdf) володіють нативними дескрипторами та звільняють їх під ARC, повернуті рядки приходять як NSString, а будь-який код помилки C-ABI проявляється як NSError у домені POXErrorDomain. Нове у v0.3.69.
Встановлення
Прив’язка Objective-C лінкується з cdylib зі стандартним набором можливостей і збирається через clang під ARC. Спочатку зберіть нативну бібліотеку, а потім виконайте 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];
Видобування тексту
Звичайний текст — це найшвидший шлях. Видобудьте окрему сторінку за її індексом, що відлічується з нуля, або витягніть увесь документ одразу.
// 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 створює PDF із Markdown, HTML або звичайного тексту. Збережіть результат у файл або отримайте байти назад як 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 — використання PDF Oxide з Rust
- Початок роботи з Python — використання PDF Oxide з Python
- Видобування тексту — детальні параметри видобування та рецепти
- Створення PDF — розширене створення за допомогою API будівника
- Редагування — зміна наявних PDF, анотацій та полів форм