Adaptéry OCR Tesseract

HPDFTesseractRecognition poskytuje na Windows volitelné enginy implementující IHPDFOCREngine pro prohledávatelné OCR textové vrstvy

Továrna nativní DLL

function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
  TessDataDirectory, Language: string): IHPDFOCREngine; overload;
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
  TessDataDirectory, Language: string;
  const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;

Dodáte existující DLL Tesseractu zpřístupňující C API kompatibilní s Tesseract 5, adresář tessdata a ASCII identifikátor jazyka nebo jeho kombinaci, například eng, chi_sim nebo chi_sim+eng

Architektura knihovny musí odpovídat aplikaci: Win32 aplikace načítá 32bitovou DLL a Win64 aplikace 64bitovou DLL

Vyžadované závislé DLL uchovávejte vedle zvolené knihovny nebo ve standardních adresářích Windows loaderu; adaptér načítá explicitní cestu knihovny bez změny aktuálního adresáře nebo process search path

Továrna ověří každý požadovaný soubor .traineddata, načte knihovnu a resolveuje vyžadované exporty před vrácením; neplatné cesty, modely, volby, chybějící exporty, neshoda architektur a nedostupné závislosti vyvolají výjimku

Žádné OCR runtime ani modely se nedodávají ani nestahují automaticky

Obě továrny jsou dostupné v balíčku Windows FPC/Lazarus stejně jako v buildách Delphi a C++Builder; před použitím HPDFTesseractRecognition proveďte rebuild Lib/FPC/HotPDFLaz.lpk pro cílovou architekturu

Nativní FPC adaptér čte aktuální raw image LCL, včetně pixelů zapsaných přes scanlines, a uchovává Unicode slova nezávisle na systémové ANSI kódové stránce

Volby

THPDFTesseractOptions = record
  PageSegMode: THPDFTesseractPageSegMode;
  EngineMode: THPDFTesseractEngineMode;
  TimeoutMilliseconds: Cardinal;
  MaxPixels: Integer;
  class function Default: THPDFTesseractOptions; static;
end;

Před přepsáním polí zavolejte THPDFTesseractOptions.Default; tentýž record nastavuje nativní DLL továrnu i přetížení lokálních CLI voleb

PoleVýchozíVýznam
PageSegModetpsAutoAutomatická segmentace stránky bez detekce orientace
EngineModetemDefaultEngine mode podporovaný zvolenými jazykovými modely
TimeoutMilliseconds60000Deadline požadavku od 1 do 3,600,000 milisekund; DLL kooperuje se zrušením, zatímco CLI worker se po vypršení timeoutu ukončí
MaxPixels16777216Rozpočet vstupních pixelů, konfigurovatelný od 1 do 67,108,864 pixelů
THPDFTesseractPageSegMode = (
  tpsOSDOnly, tpsAutoOSD, tpsAutoOnly, tpsAuto, tpsSingleColumn,
  tpsSingleBlockVertical, tpsSingleBlock, tpsSingleLine, tpsSingleWord,
  tpsCircleWord, tpsSingleCharacter, tpsSparseText, tpsSparseTextOSD,
  tpsRawLine);
THPDFTesseractEngineMode = (
  temLegacyOnly, temLSTMOnly, temLegacyAndLSTM, temDefault);

tpsOSDOnly a tpsAutoOnly neprovádějí žádné rozpoznávání slov a adaptér je odmítá; tpsAutoOSD a tpsSparseTextOSD navíc vyžadují osd.traineddata

tpsSingleLine použijte pro jednu textovou řádku, tpsSingleBlock pro souvislý blok a tpsSparseText pro roztříštěný text; tyto režimy nijak nenapraví perspektivu skenu ani negarantují obecné rozvržení

temLSTMOnly vyžaduje LSTM modely a legacy režimy odpovídající komponenty legacy modelů; nepodporované kombinace selžou při nativní inicializaci

Příklad prohledávatelného PDF

PDF už musí být načtené a DLL, závislosti i jazykové modely musí být nainstalované na uvedených místech

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;

Výsledky a vlastnictví

Adaptér zkopíruje vypůjčenou bitmapu do top-down grayscale bufferu, přepošle požadované DPI a rozpoznává přes instanci nativního API vázanou na požadavek

Slova si zachovávají nativní pořadí čtení, zvalidovaný Unicode text UTF-8, hranice v pixelech zleva nahoře a confidence škálovanou z rozsahu 0 až 100 na 0 až 1; doplňkové znaky spotřebují dvě jednotky UTF-16

Dostupné baselines slov se přepouštějí s oběma koncovými body; když baseline není k dispozici, použije se stávající geometrický fallback textové vrstvy

Při převažujícím svislé baseline použije nativní adaptér šířku boxu slova jako TextHeightPixels; vodorovné baselines použijí výšku boxu, včetně obrácených směrů čtení, takže délka svislého slova se nestane jeho velikostí fontu

Jde o odhad podle dominantní osy: z boxu slova a baseline zarovnaných s osami nelze pod libovolným zkosením zjistit přesnou výšku textu

Prázdná stránka projde úspěšně s prázdným polem slov; poškozené UTF-8, vložené řídicí znaky, neplatná geometrie nebo confidence, vyčerpané rozpočty slov či textu, zrušení a selhání rozpoznávání vrátí False, vymažou všechna částečná slova a naplní diagnostiku

Každý požadavek uvolní svůj iterátor, alokované nativní řetězce, monitor a instanci API; uvolnění adaptéru odebere referenci na jeho knihovnu

Limity a zrušení

Vstupní rozměry musí být každý nejvýše 32,767 pixelů a vejít se do MaxPixels; rozpoznaný text se musí vejít do rozpočtu MaxTextCodeUnits požadavku a do limitu adaptéru 1,048,576 jednotek UTF-16 a počet slov do MaxWords

Adaptér kontroluje zrušení a uplynulý čas během konverze bitmapy i iterace výsledků a při rozpoznávání dodává nativní monitor se zbývající deadline a callbackem zrušení

Nativní zrušení je kooperativní: monitor Tesseractu pokrývá rozpoznávání slov a nepřerušuje každý krok inicializace nebo analýzy rozvržení; tato volání se mohou dokončit dřív, než se nahlásí požadované zrušení nebo propadnutá deadline

Pixelové a výstupní rozpočty nekladou tvrdý limit na využití paměti modelu nebo rozpoznávání v nativní knihovně; když aplikace potřebuje samostatně ukončitelný worker, použijte procesní adaptér

ApplyLoadedOCRTextLayer zvaliduje všechny výsledky a publikuje každou vybranou stránku atomicky, takže selhání adaptéru nenechá načtený dokument změněný

Adaptér nativní DLL odmítá neplatné UTF-8, ořeže dekódovaný text slov a před vrácením výsledků odmítne zbývající řídicí znaky C0, DEL a C1, takže poškozený text selže v celém požadavku místo toho, aby ho textová vrstva PDF tiše vynechala

Lokální tovární funkce 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;

Přetížení s volbami přeposílá PageSegMode jako --psm a EngineMode jako --oem, použije nastavený timeout a zkontroluje MaxPixels, než uloží vypůjčenou bitmapu nebo spustí workera

Stávající přetížení s timeoutem zachovává automatickou segmentaci stránky a engine mode zvolený spustitelným souborem, aniž by nastavovalo nový pixelový limit adaptéru; když potřebujete explicitní limit vstupu, použijte přetížení s volbami

Obě přetížení si ponechávají požadované DPI, TSV výstup, omezené děděné handly, polling zrušení a ukončení workera při selhání; CLI nemá nativní informace o baseline, omezuje TSV výstup na 64 MiB a výstup diagnostického souboru na 1 MiB

Neplatné režimy segmentace, engine modes, timeouty a pixelové limity vyvolají při vytváření nakonfigurovaného enginu EArgumentException; dostupnost modelů, včetně osd.traineddata pro režimy orientace, a kompatibilita modelu s enginem se kontrolují spustitelným souborem při rozpoznávání

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;

Pro izolované slovo použijte tpsSingleWord, pro roztříštěný text tpsSparseText a pro jeden svislý blok tpsSingleBlockVertical s vhodným modelem svislého textu; továrna stránky sama neořezává a modely automaticky nevybírá

Adaptér CLI přísně validuje UTF-8, odmítá NUL bajty a řídicí znaky C0/C1 uvnitř rozpoznaných slov a vymaže všechny výsledky, když za jinak platným slovem přijde poškozený výstup

Příklad CLI, volby vykreslování, seskupování optional content a limity shody najdete na stránce Searchable OCR Text Layers