Tesseract OCR-adapters

HPDFTesseractRecognition biedt optionele Windows-engines die IHPDFOCREngine implementeren voor doorzoekbare OCR-tekstlagen

Native DLL-fabriek

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

Lever een bestaande Tesseract-DLL aan die de aan Tesseract 5 compatibele C-API blootstelt, een tessdata-map en een ASCII-taalidentificator of combinatie zoals eng, chi_sim of chi_sim+eng

De libraryarchitectuur moet matchen met de applicatie: een Win32-applicatie laadt een 32-bits DLL, terwijl een Win64-applicatie een 64-bits DLL laadt

Zet vereiste dependency-DLL's naast de gekozen library of in de standaard Windows-loadermappen; de adapter laadt het expliciete librarypad zonder de huidige map of het process search path te veranderen

De fabriek verifieert elk gevraagd .traineddata-bestand, laadt de library en vindt alle vereiste exports voordat hij teruggeeft; ongeldige paden, modellen of opties, ontbrekende exports, architectuurmismatches en onbeschikbare dependencies geven een exception

Er wordt geen OCR-runtime of model meegeleverd of automatisch gedownload

Beide fabrieken zijn beschikbaar in het Windows FPC/Lazarus-pakket én in Delphi- en C++Builder-builds; bouw Lib/FPC/HotPDFLaz.lpk opnieuw voor de doelarchitectuur voordat je HPDFTesseractRecognition gebruikt

De native FPC-adapter leest de huidige LCL raw image, inclusief pixels die via scanlines zijn geschreven, en bewaart Unicode-woorden onafhankelijk van de ANSI-codepage van het systeem

Opties

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

Roep THPDFTesseractOptions.Default aan voordat je velden overschrijft; hetzelfde record kan de native DLL-fabriek of de lokale CLI-options-overload configureren

VeldDefaultBetekenis
PageSegModetpsAutoAutomatische paginasegmentatie zonder oriëntatiedetectie
EngineModetemDefaultDe engine-modus die de gekozen taalmodellen ondersteunen
TimeoutMilliseconds60000Een verzoekdeadline van 1 tot en met 3.600.000 milliseconden; de DLL werkt mee met annulering, terwijl de CLI-worker bij timeout wordt beëindigd
MaxPixels16777216Het invoerpixelbudget, instelbaar van 1 tot en met 67.108.864 pixels
THPDFTesseractPageSegMode = (
  tpsOSDOnly, tpsAutoOSD, tpsAutoOnly, tpsAuto, tpsSingleColumn,
  tpsSingleBlockVertical, tpsSingleBlock, tpsSingleLine, tpsSingleWord,
  tpsCircleWord, tpsSingleCharacter, tpsSparseText, tpsSparseTextOSD,
  tpsRawLine);
THPDFTesseractEngineMode = (
  temLegacyOnly, temLSTMOnly, temLegacyAndLSTM, temDefault);

tpsOSDOnly en tpsAutoOnly voeren geen woordherkenning uit en worden door de adapter geweigerd; tpsAutoOSD en tpsSparseTextOSD vereisen bovendien osd.traineddata

Gebruik tpsSingleLine voor één tekstregel, tpsSingleBlock voor een uniform blok of tpsSparseText voor verspreide tekst; deze modi repareren geen perspectief van een scan en bieden geen algemene layoutgarantie

temLSTMOnly vereist LSTM-modellen, terwijl legacy-modi de bijbehorende legacy-modelcomponenten vereisen; niet-ondersteunde combinaties mislukken tijdens de native initialisatie

Voorbeeld met doorzoekbare PDF

De PDF moet al geladen zijn en de DLL, dependencies en taalmodellen moeten op de getoonde locaties zijn geïnstalleerd

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;

Resultaten en eigendom

De adapter kopieert de uitgeleende bitmap naar een top-down grijswaardenbuffer, geeft de aangevraagde DPI door en herkent via een native API-instantie per verzoek

Woorden behouden de native leesvolgorde, gevalideerde UTF-8-Unicodetekst, pixelgrenzen vanaf linksboven en een confidence geschaald van 0 tot en met 100 naar 0 tot en met 1; aanvullende tekens verbruiken twee UTF-16-eenheden

Beschikbare woordbaselines worden met beide eindpunten doorgegeven; wanneer een baseline ontbreekt, geldt de bestaande geometrie-terugval van de tekstlaag

Bij een overwegend verticale baseline gebruikt de native adapter de breedte van de woordbox als TextHeightPixels; horizontale baselines gebruiken de boxhoogte, ook bij omgekeerde leesrichtingen, zodat de lengte van een verticaal woord niet diens fontgrootte wordt

Dit is een dominant-as-schatting: alleen een as-uitgelijnde woordbox en baseline kunnen de exacte texthoogte bij willekeurige schuine hoeken niet terugwinnen

Een lege pagina slaagt met een lege woorden-array; misvormde UTF-8, ingesloten controltekens, ongeldige geometrie of confidence, uitgeputte woord- of tekstbudgetten, annulering en herkenningsfalen geven False terug, wissen alle partiële woorden en vullen de diagnostiek

Elk verzoek geeft zijn iterator, toegewezen native strings, monitor en API-instantie vrij; bij het vrijgeven van de adapter wordt diens libraryverwijzing ontladen

Limieten en annulering

Elke invoerafmeting mag hooguit 32.767 pixels zijn en moet binnen MaxPixels passen; herkende tekst moet binnen het MaxTextCodeUnits-budget van het verzoek en de UTF-16-limiet van 1.048.576 eenheden van de adapter passen, en het woordaantal moet binnen MaxWords passen

De adapter controleert annulering en verstreken tijd tijdens bitmapconversie en het itereren over de resultaten, en levert tijdens de herkenning een native monitor aan met de resterende deadline en een annuleringscallback

Native annulering is coöperatief: de monitor van Tesseract dekt woordherkenning en onderbreekt niet elke initialisatie- of layoutanalysestap; deze aanroepen kunnen afgerond zijn voordat een gevraagde annulering of verlopen deadline wordt gemeld

Pixel- en uitvoerbudgetten leggen geen harde limiet op het model- of herkenningsgeheugengebruik van de native library; gebruik de procesadapter wanneer de applicatie een apart beëindigbare worker nodig heeft

ApplyLoadedOCRTextLayer valideert alle resultaten en publiceert elke geselecteerde pagina atoomisch, dus adapterfalen laat het geladen document ongewijzigd

De DLL-adapter wijst ongeldige UTF-8 af, trimt gedecodeerde woordtekst en wijst resterende C0-, DEL- en C1-controltekens af voordat resultaten worden teruggegeven, zodat misvormde tekst het verzoek laat falen in plaats van stilletjos door de PDF-tekstlaag te worden weggelaten

Lokale CLI-fabriek

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

De options-overload stuurt PageSegMode door als --psm en EngineMode als --oem, gebruikt de geconfigureerde timeout en controleert MaxPixels vóór het opslaan van de uitgeleende bitmap of het starten van een worker

De bestaande timeout-overload behoudt automatische paginasegmentatie en de door de executable gekozen engine-modus zonder een nieuwe adapterpixellimiet op te leggen; gebruik de options-overload wanneer een expliciete invoerlimiet vereist is

Beide overloads behouden aangevraagde DPI, TSV-uitvoer, beperkte overgeërfde handles, annuleringspolling en workerbeëindiging bij falen; de CLI heeft geen native baseline-informatie, begrenst TSV-uitvoer op 64 MiB en diagnostiekbestanduitvoer op 1 MiB

Ongeldige segmentatiemodi, enginemodi, timeouts en pixellimieten geven een EArgumentException bij het aanmaken van de geconfigureerde engine; modelbeschikbaarheid, inclusief osd.traineddata voor oriëntatiemodi, en model/engine-compatibiliteit worden door de executable gecontroleerd tijdens de herkenning

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;

Gebruik tpsSingleWord voor een geïsoleerd woord, tpsSparseText voor verspreide tekst of tpsSingleBlockVertical met een geschikt verticaal-tekstmodel voor één verticaal blok; de fabriek snijdt geen pagina's bij en selecteert geen modellen automatisch

De CLI-adapter valideert UTF-8 strikt, wijst NUL-bytes en C0/C1-controltekens binnen herkende woorden af en wist alle resultaten wanneer misvormde uitvoer op een verder geldig woord volgt

Zie Zoekbare OCR-tekstlagen voor het CLI-voorbeeld, renderingopties, optional-content-groepering en conformance-limieten