Tesseract OCR-adaptrar

HPDFTesseractRecognition tillhandahåller valfria Windows-motorer som implementerar IHPDFOCREngine för sökbara OCR-textlager

Nativ DLL-fabrik

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

Ange en befintlig Tesseract-DLL som exponerar det Tesseract 5-kompatibla C-API:et, en tessdata-katalog och en ASCII-språkidentifierare eller kombination som eng, chi_sim eller chi_sim+eng

Biblioteksarkitekturen måste matcha applikationen: en Win32-applikation laddar en 32-bitars DLL, medan en Win64-applikation laddar en 64-bitars DLL

Lägg nödvändiga beroende-DLL:er bredvid det valda biblioteket eller i standardiserade Windows-loader-kataloger; adaptern laddar den explicita bibliotekssökvägen utan att ändra aktuell katalog eller processens dll-sökväg

Fabriken verifierar varje begärd .traineddata-fil, läser in biblioteket och löser de nödvändiga exporterna innan den returnerar; ogiltiga sökvägar, modeller, alternativ, saknade exporter, arkitekturmismatch och otillgängliga beroenden kastar ett undantag

Ingen OCR-runtime eller modeller följer med eller laddas ner automatiskt

Båda fabrikerna finns i Windows FPC/Lazarus-paketet liksom i Delphi- och C++Builder-byggen; bygg om Lib/FPC/HotPDFLaz.lpk för målarkitekturen innan HPDFTesseractRecognition används

Den nativa FPC-adaptern läser den aktuella LCL-råbilden, inklusive pixlar skrivna via skanlinjer, och bevarar Unicode-ord oberoende av systemets ANSI-kodsida

Alternativ

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

Anropa THPDFTesseractOptions.Default innan fälten åsidosätts; samma post kan konfigurera den nativa DLL-fabriken eller den lokala CLI-överlagringen med options-post

FältStandardBetydelse
PageSegModetpsAutoAutomatisk sidsegmentering utan orienteringsdetektering
EngineModetemDefaultDet motorläge som de valda språkmodellerna stöder
TimeoutMilliseconds60000En tidsgräns per begäran från 1 till 3 600 000 millisekunder; DLL:en samarbetar med avbrott, medan CLI-workern avslutas vid tidsgränsöverskridande
MaxPixels16777216Pixelbudgeten för indata, konfigurerbar från 1 till 67 108 864 pixlar
THPDFTesseractPageSegMode = (
  tpsOSDOnly, tpsAutoOSD, tpsAutoOnly, tpsAuto, tpsSingleColumn,
  tpsSingleBlockVertical, tpsSingleBlock, tpsSingleLine, tpsSingleWord,
  tpsCircleWord, tpsSingleCharacter, tpsSparseText, tpsSparseTextOSD,
  tpsRawLine);
THPDFTesseractEngineMode = (
  temLegacyOnly, temLSTMOnly, temLegacyAndLSTM, temDefault);

tpsOSDOnly och tpsAutoOnly gör ingen ordigenkänning och avvisas av adaptern; tpsAutoOSD och tpsSparseTextOSD kräver dessutom osd.traineddata

Använd tpsSingleLine för en enskild textrad, tpsSingleBlock för ett enhetligt block eller tpsSparseText för utspridd text; de här lägena reparerar inte skanningens perspektiv och ger ingen allmän layoutgaranti

temLSTMOnly kräver LSTM-modeller, medan legacy-lägen kräver motsvarande legacy-modelkomponenter; kombinationer som inte stöds misslyckas under nativ initiering

Exempel på sökbar PDF

PDF:en måste redan vara inläst, och DLL:en, beroendena och språkmodellerna måste vara installerade på de visade platserna

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;

Resultat och ägarskap

Adaptern kopierar den lånade bitmappen till en gråskalebuffert i topp-ner-ordning, vidarebefordrar begärd DPI och igenkänner genom en begärandelokal nativ API-instans

Orden behåller nativ läsordning, validerad UTF-8-Unicode-text, pixelgränser från övre vänstra hörnet och tillförlitlighet skalad från 0–100 till 0–1; supplerande tecken förbrukar två UTF-16-enheter

Tillgängliga ordbaslinjer skickas vidare med båda ändpunkter; när en baslinje inte är tillgänglig tillämpas textlagrets befintliga reservlösning för geometri

För en huvudsakligen vertikal baslinje använder den nativa adaptern ordrutans bredd som TextHeightPixels; horisontella baslinjer använder rutans höjd, inklusive omvända läsriktningar, så att ett vertikalt ords längd inte blir dess teckenstorlek

Det här är en uppskattning längs dominantaxeln: en axeljusterad ordruta och baslinje räcker inte för att återfå den exakta texthöjden vid godtyckliga skevningsvinklar

En tom sida lyckas med en tom ordarray; felformad UTF-8, inbäddade kontrolltecken, ogiltig geometri eller tillförlitlighet, uttömda ord- eller textbudgetar, avbrott och igenkänningsfel returnerar False, rensar alla partiella ord och fyller diagnostiken

Varje begäran släpper sin iterator, allokerade nativa strängar, monitor och API-instans; när adaptern släpps laddas dess biblioteksreferens ur

Gränser och avbrott

Indatadimensionerna får var som störst vara 32 767 pixlar och måste rymmas inom MaxPixels; igenkänd text måste rymmas inom begärans MaxTextCodeUnits-budget och adapterns gräns på 1 048 576 UTF-16-enheter, och ordantalet måste rymmas inom MaxWords

Adaptern kontrollerar avbrott och förfluten tid under bitmapskonvertering och resultatiteration, och tillhandahåller en nativ monitor med återstående tidsgräns och ett avbrottsåteranrop under igenkänningen

Nativ avbrytning är kooperativ: Tesseracts monitor täcker ordigenkänning och avbryter inte varje initierings- eller layoutanalyssteg; de här anropen kan slutföras innan en begärd avbrytning eller en utgången tidsgräns rapporteras

Pixel- och utdatabudgetar sätter ingen hård gräns för det nativa bibliotekets modell- eller igenkänningsminne; använd processadaptern när applikationen behöver en worker som kan avslutas separat

ApplyLoadedOCRTextLayer validerar alla resultat och publicerar varje vald sida atomiskt, så ett adapterfel lämnar det inlästa dokumentet oförändrat

DLL-adaptern avvisar ogiltig UTF-8, trimmar avkodad ordtext och avvisar kvarvarande C0-, DEL- och C1-kontrolltecken innan resultaten returneras, så att felformaterad text misslyckar med begäran i stället för att tyst utelämnas av PDF-textlagret

Lokal CLI-fabrik

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

Options-överlagringen vidarebefordrar PageSegMode som --psm och EngineMode som --oem, använder den konfigurerade tidsgränsen och kontrollerar MaxPixels innan den lånade bitmappen sparas eller en worker startas

Den befintliga överlagringen med tidsgräns behåller automatisk sidsegmentering och exekverbarvals motorläge utan att införa någon ny pixelgräns i adaptern; använd options-överlagringen när en explicit indatagräns krävs

Båda överlagringarna behåller begärd DPI, TSV-utdata, begränsade ärvda handtag, avbrottspollning och workeravslut vid fel; CLI:en har ingen nativ baslinjeinformation, begränsar TSV-utdata till 64 MiB och diagnostikfilsutdata till 1 MiB

Ogiltiga segmenteringslägen, motorlägen, tidsgränser och pixelgränser kastar EArgumentException när den konfigurerade motorn skapas; modelltillgänglighet, inklusive osd.traineddata för orienteringslägen, och kompatibilitet mellan modell och motor kontrolleras av den exekverbara filen under igenkänningen

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;

Använd tpsSingleWord för ett isolerat ord, tpsSparseText för utspridd text eller tpsSingleBlockVertical med en lämplig modell för vertikal text för ett vertikalt block; fabriken beskär inte sidor och väljer inte modeller automatiskt

CLI-adaptern validerar UTF-8 strikt, avvisar NUL-byte och C0/C1-kontrolltecken inuti igenkända ord och rensar alla resultat om felformaterad utdata följer efter ett i övrigt giltigt ord

Se Sökbara OCR-textlager för CLI-exemplet, renderingsalternativ, gruppering i valfritt innehåll och regelefterlevnadsgränser