Адаптери Tesseract OCR
HPDFTesseractRecognition надає опційні рушії Windows, що реалізують IHPDFOCREngine для пошукових шарів тексту OCR
Фабрика нативного DLL
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string): IHPDFOCREngine; overload;
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
Подайте наявний DLL Tesseract, що відкриває сумісний з Tesseract 5 C API, каталог tessdata та ASCII-ідентифікатор мови чи комбінацію на кшталт eng, chi_sim або chi_sim+eng
Архітектура бібліотеки має збігатися із застосунком: 32-розрядний застосунок Win32 завантажує 32-бітовий DLL, а 64-розрядний застосунок Win64 — 64-бітовий DLL
Тримайте потрібні залежності-DLL поруч із обраною бібліотекою або в стандартних каталогах завантажувача Windows; адаптер завантажує явний шлях бібліотеки, не змінюючи поточний каталог чи шлях пошуку процесу
Фабрика звіряє кожен запитаний файл .traineddata, завантажує бібліотеку та розв'язує потрібні експорти перед поверненням; недійсні шляхи, моделі, опції, відсутні експорти, невідповідності архітектури та недоступні залежності викликають виняток
Жодне середовище виконання OCR чи моделі не постачається в комплекті і не завантажується автоматично
Обидві фабрики доступні в пакеті Windows FPC/Lazarus так само як у збірках Delphi та C++Builder; перебудуйте Lib/FPC/HotPDFLaz.lpk під цільову архітектуру перед використанням HPDFTesseractRecognition
Нативний адаптер FPC читає поточний сирий образ LCL, включно з пікселями, записаними крізь scanline, і зберігає слова Unicode незалежно від системної ANSI-кодової сторінки
Опції
THPDFTesseractOptions = record
PageSegMode: THPDFTesseractPageSegMode;
EngineMode: THPDFTesseractEngineMode;
TimeoutMilliseconds: Cardinal;
MaxPixels: Integer;
class function Default: THPDFTesseractOptions; static;
end;
Викличте THPDFTesseractOptions.Default перед перевизначенням полів; той самий запис може налаштовувати і нативну DLL-фабрику, і перевантаження опцій локального CLI
| Поле | Типово | Значення |
|---|---|---|
PageSegMode | tpsAuto | Автоматична сегментація сторінки без визначення орієнтації |
EngineMode | temDefault | Режим рушія, підтримуваний обраними мовними моделями |
TimeoutMilliseconds | 60000 | Дедлайн запиту від 1 до 3 600 000 мілісекунд; DLL співпрацює зі скасуванням, тоді як робочий процес CLI завершується за таймаутом |
MaxPixels | 16777216 | Бюджет пікселів входу, налаштовуваний від 1 до 67 108 864 пікселів |
THPDFTesseractPageSegMode = (
tpsOSDOnly, tpsAutoOSD, tpsAutoOnly, tpsAuto, tpsSingleColumn,
tpsSingleBlockVertical, tpsSingleBlock, tpsSingleLine, tpsSingleWord,
tpsCircleWord, tpsSingleCharacter, tpsSparseText, tpsSparseTextOSD,
tpsRawLine);
THPDFTesseractEngineMode = (
temLegacyOnly, temLSTMOnly, temLegacyAndLSTM, temDefault);
tpsOSDOnly і tpsAutoOnly не виконують розпізнавання слів і відхиляються адаптером; tpsAutoOSD і tpsSparseTextOSD додатково вимагають osd.traineddata
Використовуйте tpsSingleLine для одного текстового рядка, tpsSingleBlock для однорідного блоку або tpsSparseText для розсіяного тексту; ці режими не виправляють перспективу сканування і не дають загальної гарантії верстки
temLSTMOnly вимагає моделей LSTM, тоді як legacy-режими вимагають відповідних legacy-компонентів моделей; непідтримувані комбінації зазнають невдачі під час нативної ініціалізації
Приклад пошукового PDF
PDF має бути вже завантажений, а DLL, залежності та мовні моделі — встановлені за показаними розташуваннями
uses SysUtils, HPDFDoc, HPDFTesseractRecognition;
procedure AddNativeOCRText(PDF: THotPDF);
var
Engine: IHPDFOCREngine;
NativeOptions: THPDFTesseractOptions;
LayerOptions: THPDFOCRTextLayerOptions;
Info: THPDFOCRTextLayerInfo;
begin
NativeOptions := THPDFTesseractOptions.Default;
NativeOptions.EngineMode := temLSTMOnly;
NativeOptions.PageSegMode := tpsAuto;
Engine := HPDFCreateTesseractDLLOCREngine(
'C:\OCR\libtesseract-5.dll', 'C:\OCR\tessdata',
'chi_sim+eng', NativeOptions);
LayerOptions := THPDFOCRTextLayerOptions.Default;
if not PDF.ApplyLoadedOCRTextLayer([0], Engine, LayerOptions, Info) then
raise Exception.Create(string(Info.Diagnostic));
end;
Результати та володіння
Адаптер копіює позичений бітмап у звернений зверху вниз напівтоновий буфер, передає далі запитаний DPI та розпізнає через локальний для запиту примірник нативного API
Слова зберігають нативний порядок читання, валідований текст Unicode UTF-8, межі в пікселях від лівого верхнього кута та довіру, масштабовану з 0-100 у 0-1; додаткові символи витрачають дві одиниці UTF-16
Наявні базові лінії слів передаються далі з обома кінцевими точками; коли базової лінії немає, застосовується наявний геометричний резервний шлях текстового шару
Для переважно вертикальної базової лінії нативний адаптер використовує ширину рамки слова як TextHeightPixels; горизонтальні базові лінії використовують висоту рамки, зокрема обернені напрями читання, тож довжина вертикального слова не стає його розміром шрифту
Це оцінка за панівною віссю: сама по собі вирівняна за осями рамка слова та базова лінія не можуть відновити точну висоту тексту за довільних кутів перекосу
Порожня сторінка завершується успішно з порожнім масивом слів; пошкоджений UTF-8, вбудовані керуючі символи, недійсна геометрія чи довіра, вичерпані бюджети слів або тексту, скасування та збої розпізнавання повертають False, очищають усі часткові слова та заповнюють діагностику
Кожен запит звільняє свій ітератор, виділені нативні рядки, монітор і примірник API; звільнення адаптера вивантажує посилання на його бібліотеку
Ліміти та скасування
Кожен розмір входу має бути щонайбільше 32 767 пікселів і вміщуватися в MaxPixels; розпізнаний текст має вміщуватися в бюджет MaxTextCodeUnits запиту та ліміт адаптера в 1 048 576 одиниць UTF-16, а кількість слів — у MaxWords
Адаптер перевіряє скасування та минулий час під час конвертації бітмапа й ітерації результатів і подає нативний монітор із залишком дедлайну та колбеком скасування під час розпізнавання
Нативне скасування є кооперативним: монітор Tesseract охоплює розпізнавання слів і не перериває кожен крок ініціалізації чи аналізу верстки; ці виклики можуть завершитися до того, як буде повідомлено запитане скасування чи минулий дедлайн
Бюджети пікселів і виводу не накладають жорсткого ліміту на пам'ять моделей чи розпізнавання нативної бібліотеки; використовуйте процесний адаптер, коли застосунку потрібен окремо завершуваний робочий процес
ApplyLoadedOCRTextLayer валідує всі результати та атомарно публікує кожну вибрану сторінку, тож збій адаптера залишає завантажений документ незмінним
DLL-адаптер відхиляє недійсний UTF-8, обрізає декодований текст слів і відхиляє решту керуючих символів C0, DEL та C1 перед поверненням результатів, тож пошкоджений текст зазнає невдачі запиту замість мовчазного втрати в текстовому шарі PDF
Локальна фабрика CLI
function HPDFCreateTesseractOCREngine(const ExecutablePath,
TessDataDirectory, Language: string;
TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateTesseractOCREngine(const ExecutablePath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
Перевантаження з опціями передає PageSegMode як --psm, а EngineMode як --oem, використовує налаштований таймаут і перевіряє MaxPixels перед збереженням позиченого бітмапа чи запуском робочого процесу
Наявне перевантаження з таймаутом зберігає автоматичну сегментацію сторінок і режим рушія, обраний виконуваним файлом, не накладаючи нового ліміту пікселів адаптера; використовуйте перевантаження з опціями, коли потрібен явний ліміт входу
Обидва перевантаження зберігають запитаний DPI, вивід TSV, обмежені успадковані дескриптори, опитування скасування та завершення робочого процесу в разі збою; CLI не має нативної інформації про базові лінії, обмежує вивід TSV 64 MiB, а вивід файлу діагностики – 1 MiB
Недійсні режими сегментації, режими рушія, таймаути та ліміти пікселів викликають EArgumentException під час створення налаштованого рушія; наявність моделей, зокрема osd.traineddata для режимів орієнтації, і сумісність моделі з рушієм перевіряються виконуваним файлом під час розпізнавання
var
CLIOptions: THPDFTesseractOptions;
Engine: IHPDFOCREngine;
begin
CLIOptions := THPDFTesseractOptions.Default;
CLIOptions.PageSegMode := tpsSingleLine;
CLIOptions.EngineMode := temLSTMOnly;
CLIOptions.MaxPixels := 8000000;
Engine := HPDFCreateTesseractOCREngine(
'C:\OCR\tesseract.exe', 'C:\OCR\tessdata', 'eng', CLIOptions);
end;
Використовуйте tpsSingleWord для окремого слова, tpsSparseText для розсіяного тексту чи tpsSingleBlockVertical з відповідною моделлю вертикального тексту для одного вертикального блоку; фабрика не обрізає сторінки і не обирає моделі автоматично
CLI-адаптер суворо валідує UTF-8, відхиляє NUL-байти та керуючі символи C0/C1 усередині розпізнаних слів і очищає всі результати, якщо за іншим коректним словом слідує пошкоджений вивід
Дивіться Пошукові шари тексту OCR, щоб дізнатися про приклад CLI, опції рендерингу, групування за необов'язковим вмістом та межі конформності