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
| Pole | Výchozí | Význam |
|---|---|---|
PageSegMode | tpsAuto | Automatická segmentace stránky bez detekce orientace |
EngineMode | temDefault | Engine mode podporovaný zvolenými jazykovými modely |
TimeoutMilliseconds | 60000 | Deadline 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čí |
MaxPixels | 16777216 | Rozpoč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