Tesseract OCR адаптери
HPDFTesseractRecognition предлага опционални Windows engine-и, имплементиращи IHPDFOCREngine за търсими OCR текстови слоеве
Native DLL фабрика
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string): IHPDFOCREngine; overload;
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
Подгответе съществуващ Tesseract DLL, излагащ Tesseract 5 съвместимия C API, tessdata директория и ASCII езиков идентификатор или комбинация като eng, chi_sim или chi_sim+eng
Архитектурата на библиотеката трябва да съответства на приложението: Win32 приложение зарежда 32-битов DLL, а Win64 приложение — 64-битов DLL
Държайте нужните dependency DLL-и до избраната библиотека или в стандартните директории на Windows loader-а; адаптерът зарежда изричния път на библиотеката, без да променя текущата директория или process search path
Фабриката проверява всеки искан .traineddata файл, зарежда библиотеката и resolve-ва нужните export-и, преди да се върне; невалидни пътища, модели, options, липсващи export-и, несъответстваща архитектура и недостъпни зависимости хвърлят изключение
Нито OCR runtime, нито модели се доставят или теглят автоматично
И двете фабрики са налични и в Windows FPC/Lazarus пакета, както и в Delphi и C++Builder компилациите; прекомпилирайте Lib/FPC/HotPDFLaz.lpk за целевата архитектура, преди да използвате HPDFTesseractRecognition
Нативният FPC адаптер чете текущия LCL raw image, включително пиксели, записани през scanline-и, и запазва Unicode думите независимо от системната ANSI code page
Options
THPDFTesseractOptions = record
PageSegMode: THPDFTesseractPageSegMode;
EngineMode: THPDFTesseractEngineMode;
TimeoutMilliseconds: Cardinal;
MaxPixels: Integer;
class function Default: THPDFTesseractOptions; static;
end;
Извикайте THPDFTesseractOptions.Default, преди да презапишете полетата; същият record конфигурира и native DLL фабриката, и претоварването с локални CLI опции
| Field | Default | Meaning |
|---|---|---|
PageSegMode | tpsAuto | Автоматично page segmentation без разпознаване на ориентация |
EngineMode | temDefault | Engine режимът, поддържан от избраните езикови модели |
TimeoutMilliseconds | 60000 | Краен срок на заявката, от 1 до 3,600,000 милисекунди; DLL-ът съдейства с отмяната, докато CLI worker-ът се терминира при изтичане на срока |
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;
Резултати и собственост
Адаптерът копира заетия bitmap в top-down grayscale буфер, препраща исканото DPI и разпознава през request-локална native API инстанция
Думите запазват native реда на четене, валидиран UTF-8 Unicode текст, граници в пиксели с начало горе вляво и confidence, мащабиран от 0 до 100 в 0 до 1; допълнителните знаци консумират по две UTF-16 единици
Наличните baseline-и на думите се пропускат нататък с двата си края; когато baseline липсва, се прилага съществуващият geometry fallback на текстовия layer
При преобладаващо вертикална baseline нативният адаптер ползва ширината на box-а на думата като TextHeightPixels; хоризонталните baseline-и ползват височината на box-а, включително при обърнат посока на четене, така че дължината на вертикална дума не става неин размер на шрифт
Това е оценка по доминиращата ос: axis-подравнен box на думата и baseline сами по себе си не могат да възстановят точната височина на текста при произволни наклони
Празна страница приключва успешно с празен масив от думи; повреден UTF-8, вградени control знаци, невалидна геометрия или confidence, изчерпани бюджети за думи или текст, отмяна и провали на разпознаването връщат False, изчистват всички частични думи и попълват диагностиката
Всяка заявка освобождава своя iterator, заделените native низове, monitor-а и API инстанцията; освобождаването на адаптера разтоварва референцията му към библиотеката
Лимити и отмяна
Всяка от входните размерности трябва да е най-много 32,767 пиксела и да се побира в MaxPixels; разпознатият текст трябва да се побира в бюджета MaxTextCodeUnits на заявката и в лимита на адаптера от 1,048,576 UTF-16 единици, а броят думи — в MaxWords
Адаптерът проверява отмяната и изтеклото време по време на конверсията на bitmap-а и итерацията на резултатите, и подава native monitor с оставащия краен срок и callback за отмяна по време на разпознаването
Нативната отмяна е кооперативна: monitor-ът на Tesseract обхваща разпознаването на думи и не прекъсва всяка инициализация или стъпка от анализа на оформлението; тези извиквания могат да приключат, преди искана отмяна или изтекъл срок да бъдат докладвани
Пикселните и изходните бюджети не налагат твърд лимит върху паметта на нативната библиотека за модели или разпознаване; използвайте process адаптера, когато приложението има нужда от отделно терминируем worker
ApplyLoadedOCRTextLayer валидира всички резултати и публикува всяка избрана страница атомично, така че провал на адаптера оставя заредения документ непроменен
DLL адаптерът отхвърля невалиден UTF-8, отрязва декодирания текст на думите и отхвърля останалите C0, DEL и C1 control знаци, преди да върне резултатите, така че повреден текст проваля заявката, вместо да бъде тихо пропуснат от PDF текстовия layer
Локална 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, ползва конфигурирания timeout и проверява MaxPixels, преди да запише заетия bitmap или да стартира worker
Съществуващото претоварение с timeout запазва автоматичното page segmentation и engine режима, избран от изпълнимия файл, без да налага нов пикслов лимит на адаптера; ползвайте претоварението с опции, когато е нужен изричен входен лимит
И двете претоварения запазват исканото DPI, TSV изхода, ограничените наследени handles, анкетирането на отмяната и терминирането на worker-а при провал; CLI-ят няма native baseline информация, ограничава TSV изхода до 64 MiB, а изхода в диагностични файлове до 1 MiB
Невалидни segmentation режими, engine режими, timeout-и и пикселни лимити хвърлят EArgumentException при създаването на конфигурирания engine; наличността на моделите, включително osd.traineddata за ориентационните режими, и съвместимостта модел/engine се проверяват от изпълнимия файл по време на разпознаването
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 control знаци вътре в разпознатите думи и изчиства всички резултати, ако повреден изход последва иначе валидна дума
Вижте Searchable OCR Text Layers за CLI примера, options на рендирането, групиране в optional content и лимити на съответствието