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 опции

FieldDefaultMeaning
PageSegModetpsAutoАвтоматично page segmentation без разпознаване на ориентация
EngineModetemDefaultEngine режимът, поддържан от избраните езикови модели
TimeoutMilliseconds60000Краен срок на заявката, от 1 до 3,600,000 милисекунди; DLL-ът съдейства с отмяната, докато CLI worker-ът се терминира при изтичане на срока
MaxPixels16777216Бюджет на входните пиксели, настраиваем от 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 и лимити на съответствието