Tesseract OCR adapteriai

HPDFTesseractRecognition pateikia papildomąsias Windows varikles, įgyvendinančias IHPDFOCREngine ieškamiesiems OCR teksto sluoksniams

Savosios DLL gamykla

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

Pateikite esamąją Tesseract DLL, atskleidžiančią Tesseract 5 suderinamąją C API, tessdata aplanką ir ASCII kalbos identifikatorių arba jų junginį, pavyzdžiui, eng, chi_sim arba chi_sim+eng

Bibliotekos architektūra turi atitikti programą: Win32 programa įkelia 32 bitų DLL, o Win64 programa — 64 bitų DLL

Būtinosios priklausomosios DLL laikykite šalia pasirinktosios bibliotekos arba standartiniuose Windows įkėliklio aplankuose; adapteris įkelia aiškųjį bibliotekos kelią nekeisdamas nei dabartinio aplanko, nei proceso paieškos kelio

Gamykla patikrina kiekvieną pageidautąją .traineddata bylą, įkelia biblioteką ir išspręndžia būtinas eksporto funkcijas prieš grąžindama; netinkami keliai, modeliai, parinktys, trūkstamieji eksportai, architektūros neatitikimai ir neprieinamosios priklausomybės iškelia išimtį

Joks OCR vykdymo paketas arba modeliai nėra pridedami ir automatiškai nesisiunčia

Abi gamyklos prieinamos Windows FPC/Lazarus pakete, taip pat Delphi ir C++Builder sudarymuose; prieš naudodami HPDFTesseractRecognition, perkompiliuokite Lib/FPC/HotPDFLaz.lpk tikslinei architektūrai

Savasis FPC adapteris skaito dabartinį LCL neapdorotąjį vaizdą, įskaitant per scanlines įrašytuosius taškus, ir išlaiko Unicode žodžius nepriklausomai nuo sistemos ANSI kodo puslapio

Parinktys

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

Prieš perrašydami laukus kvieskite THPDFTesseractOptions.Default; tą patį įrašą galima naudoti ir savosios DLL gamyklos, ir vietinio CLI parinkčių perkravos konfigūravimui

LaukasNumatymasReikšmė
PageSegModetpsAutoAutomatinė puslapio segmentacija be orientacijos aptikimo
EngineModetemDefaultParinktųjų kalbų modelių palaikoma variklio veiksena
TimeoutMilliseconds60000Užklausos termino riba nuo 1 iki 3 600 000 milisekundžių; DLL atšaukimą vykdo bendradarbiaudama, o CLI darbuotojas pasibaigus terminui nutraukiamas
MaxPixels16777216Įvesties taškų biudžetas, konfigūruojamas nuo 1 iki 67 108 864 taškų
THPDFTesseractPageSegMode = (
  tpsOSDOnly, tpsAutoOSD, tpsAutoOnly, tpsAuto, tpsSingleColumn,
  tpsSingleBlockVertical, tpsSingleBlock, tpsSingleLine, tpsSingleWord,
  tpsCircleWord, tpsSingleCharacter, tpsSparseText, tpsSparseTextOSD,
  tpsRawLine);
THPDFTesseractEngineMode = (
  temLegacyOnly, temLSTMOnly, temLegacyAndLSTM, temDefault);

tpsOSDOnly ir tpsAutoOnly žodžių neatpažįsta ir yra adapterio atmetami; tpsAutoOSD ir tpsSparseTextOSD papildomai reikalauja osd.traineddata

tpsSingleLine naudokite vienai teksto eilutei, tpsSingleBlock — vienodajam blokui, o tpsSparseText — išsibarsčiusiam tekstui; šios veiksenos neištaiso skenavimo perspektyvos ir neduoda bendrosios išdėstymo garantijos

temLSTMOnly reikalauja LSTM modelių, o senosios veiksenos — atitinkamųjų senųjų modelio komponentų; nepalaikomieji junginiai žlunga savojo inicijavimo metu

Paieškamojo PDF pavyzdys

PDF jau turi būti įkeltas, o DLL, priklausomybės ir kalbų modeliai — įdiegti parodytuosiuose vietose

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;

Rezultatai ir nuosavybė

Adapteris skolintąjį bitmap nukopijuoja į iš viršaus žemyn einantįjį pilkio buferį, persiunčia užklausos DPI ir atpažįsta per užklausai lokaliąją savąją API egzemplioriaus atmainą

Žodžiai išlaiko savąją skaitymo tvarką, patikrintąjį UTF-8 Unicode tekstą, viršutinio kairiojo kampo taškų ribas ir pasitikėjimą, perskaičiuotąjį iš 0–100 į 0–1; papildomieji simboliai sunaudoja du UTF-16 vienetus

Prieinamosios žodžių pagrindo linijos perduodamos su abiem galiniais taškais; kai pagrindo linijos nėra, taikoma esamoji teksto sluoksnio geometrijos atsarginė priemonė

Vyraujančiai vertikaliai pagrindo linijai savasis adapteris kaip TextHeightPixels naudoja žodžio langelio plotį; horizontaliosios pagrindo linijos naudoja langelio aukštį, įskaitant atvirkštines skaitymo kryptis, kad vertikaliojo žodžio ilgis netaptų jo šrifto dydžiu

Tai vyraujančios ašies įvertis: vien ašims lygiagretus žodžio langelis ir pagrindo linija negali atkurti tiksliojo teksto aukščio bet kuriuo pasvirimo kampu

Tuščiasis puslapis baigiasi sėkmingai su tuščiuoju žodžių masyvu; iškraipytoji UTF-8, įterptinieji valdymo simboliai, netinkamoji geometrija arba pasitikėjimas, išsestieji žodžių arba teksto biudžetai, atšaukimas ir atpažinimo nesėkmės grąžina False, išvalo visus daliniuosius žodžius ir užpildo diagnostiką

Kiekviena užklausa atlaisvina savąjį iteratorių, išskirtąsias savąsias eilutes, monitorių ir API egzempliorių; atlaisvinus adapterį, nuimama ir jo bibliotekos nuoroda

Ribos ir atšaukimas

Kiekvienasis įvesties matmuo turi būti ne didesnis kaip 32 767 taškų ir tilpti į MaxPixels; atpažintasis tekstas turi tilpti į užklausos MaxTextCodeUnits biudžetą ir adapterio 1 048 576 UTF-16 vienetų ribą, o žodžių skaičius — į MaxWords

Adapteris bitmap konversijos ir rezultatų iteracijos metu tikrina atšaukimą ir praėjusįjį laiką, o atpažinimo metu pateikia savąjį monitorių su likusiuoju terminu ir atšaukimo atgaliniu kvietimu

Savasis atšaukimas veikia bendradarbiavimu: Tesseract monitorius dengia žodžių atpažinimą ir nepertraukia kiekvieno inicijavimo arba išdėstymo analizės žingsnio; šie kviečimai gali užbaigtis dar prieš pranešant pageidautąjį atšaukimą arba pasibaigusįjį terminą

Taškų ir išvesties biudžetai nesudaro kietosios savosios bibliotekos modelio arba atpažinimo atminties naudojimo ribos; proceso adapterį naudokite, kai programai reikia atskirai nutraukiamo darbuotojo

ApplyLoadedOCRTextLayer patikrina visus rezultatus ir kiekvieną atrinktąjį puslapį paskelbia atomiškai, tad adapterio nesėkmė įkeltąjį dokumentą palieka nepakitę

DLL adapteris atmeta netinkamąją UTF-8, nukerpa iškoduotąjį žodžių tekstą ir prieš grąžindamas rezultatus atmeta likusiuosius C0, DEL ir C1 valdymo simbolius, tad iškraipytasis tekstas sužlugdo užklausą, vietoj to, kad PDF teksto sluoksnis jį tyliai praleistų

Vietinė CLI gamykla

function HPDFCreateTesseractOCREngine(const ExecutablePath,
  TessDataDirectory, Language: string;
  TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateTesseractOCREngine(const ExecutablePath,
  TessDataDirectory, Language: string;
  const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;

Parinkčių perkrova PageSegMode persiunčia kaip --psm, EngineMode — kaip --oem, naudoja sukonfigūruotąjį laiko limitą ir patikrina MaxPixels dar prieš įrašydama skolintąjį bitmap arba paleisdama darbuotoją

Esamoji laiko limito perkrova išlaiko automatinę puslapio segmentaciją ir vykdomojo failo parinktąją variklio veikseną neįvesdama naujos adapterio taškų ribos; kai reikia aiškios įvesties ribos, naudokite parinkčių perkravą

Abi perkravos išlaiko pageidaujamąją DPI, TSV išvestį, apribotąsias paveldėtąsias rankenas, atšaukimo apklausą ir darbuotojo nutraukimą nesėkmės atveju; CLI neturi savosios pagrindo linijų informacijos, riboja TSV išvestį iki 64 MiB, o diagnostinės bylos išvestį — iki 1 MiB

Negalimosios segmentacijos veiksenos, variklio veiksenos, laiko limitai ir taškų ribos kuriant sukonfigūruotąjį variklį iškelia EArgumentException; modelių prieinamumą, įskaitant osd.traineddata orientacijos veiksenoms, ir modelio bei variklio suderinamumą atpažinimo metu patikrina pats vykdomasis failas

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 naudokite vienam izoliuotam žodžiui, tpsSparseText — išsibarsčiusiam tekstui, o tpsSingleBlockVertical su tinkamu vertikaliojo teksto modeliu — vienam vertikaliajam blokui; gamykla automatiškai neiškarpo puslapių ir nepasirenka modelių

CLI adapteris griežtai tikrina UTF-8, atmeta NUL baitus ir C0/C1 valdymo simbolius atpažintųjų žodžių viduje, o kai po kitaip tinkamo žodžio seka netinkama išvestis, išvalo visus rezultatus

Apie CLI pavyzdį, atvaizdavimo parinktis, papildomojo turinio grupavimą ir atitikties ribas žr. ieškomuosius OCR teksto sluoksnius