Adaptery OCR Tesseract

HPDFTesseractRecognition dostarcza opcjonalne silniki dla Windows implementujące IHPDFOCREngine dla przeszukiwalnych warstw tekstu OCR

Fabryka natywnej biblioteki DLL

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

Dostarcz istniejącą bibliotekę DLL Tesseract wystawiającą kompatybilne z Tesseract 5 C API, katalog tessdata oraz identyfikator języka ASCII albo kombinację, np. eng, chi_sim czy chi_sim+eng

Architektura biblioteki musi pasować do aplikacji: aplikacja Win32 ładuje bibliotekę DLL 32-bit, a aplikacja Win64 — 64-bit

Wymagane biblioteki zależności trzymaj obok wybranej biblioteki albo w standardowych katalogach loadera Windows; adapter ładuje jawną ścieżkę biblioteki bez zmieniania katalogu bieżącego ani ścieżki przeszukiwania procesu

Fabryka weryfikuje każdy żądany plik .traineddata, ładuje bibliotekę i rozwiązuje wymagane eksporty przed zwróceniem; nieprawidłowe ścieżki, modele, opcje, brakujące eksporty, niedopasowania architektury i niedostępne zależności podnoszą wyjątek

Żadne środowisko uruchomieniowe OCR ani modele nie są dołączane ani pobierane automatycznie

Obie fabryki są dostępne w pakiecie Windows FPC/Lazarus, jak i w kompilacjach Delphi i C++Builder; przebuduj Lib/FPC/HotPDFLaz.lpk dla docelowej architektury, zanim użyjesz HPDFTesseractRecognition

Natywny adapter FPC czyta bieżący surowy obraz LCL, łącznie z pikselami zapisanymi przez scanline'y, i zachowuje słowa Unicode niezależnie od systemowej strony kodowej ANSI

Opcje

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

Wywołaj THPDFTesseractOptions.Default przed nadpisaniem pól; ten sam rekord konfiguruje natywną fabrykę DLL albo przeciążenie z opcjami lokalnego CLI

PoleDomyślnieZnaczenie
PageSegModetpsAutoAutomatyczna segmentacja strony bez detekcji orientacji
EngineModetemDefaultTryb silnika wspierany przez wybrane modele językowe
TimeoutMilliseconds60000Deadline żądania od 1 do 3 600 000 milisekund; DLL współpracuje przy anulowaniu, a worker CLI jest terminowany po jego przekroczeniu
MaxPixels16777216Budżet pikseli wejścia, konfigurowalny od 1 do 67 108 864 pikseli
THPDFTesseractPageSegMode = (
  tpsOSDOnly, tpsAutoOSD, tpsAutoOnly, tpsAuto, tpsSingleColumn,
  tpsSingleBlockVertical, tpsSingleBlock, tpsSingleLine, tpsSingleWord,
  tpsCircleWord, tpsSingleCharacter, tpsSparseText, tpsSparseTextOSD,
  tpsRawLine);
THPDFTesseractEngineMode = (
  temLegacyOnly, temLSTMOnly, temLegacyAndLSTM, temDefault);

tpsOSDOnly i tpsAutoOnly nie wykonują rozpoznawania słów i są odrzucane przez adapter; tpsAutoOSD i tpsSparseTextOSD dodatkowo wymagają osd.traineddata

tpsSingleLine użyj dla jednej linii tekstu, tpsSingleBlock dla jednolitego bloku, a tpsSparseText dla rozproszonego tekstu; te tryby nie naprawiają perspektywy skanu ani nie dają ogólnej gwarancji layoutu

temLSTMOnly wymaga modeli LSTM, a tryby legacy odpowiadających im komponentów modeli legacy; niewspierane kombinacje kończą się porażką podczas natywnej inicjalizacji

Przykład przeszukiwalnego PDF

PDF musi być już załadowany, a biblioteka DLL, zależności i modele językowe muszą być zainstalowane w pokazanych lokalizacjach

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;

Wyniki i własność

Adapter kopiuje pożyczoną bitmapę do bufora w skali szarości od góry do dołu, przekazuje żądane DPI i rozpoznaje przez natywną instancję API lokalną dla żądania

Słowa zachowują natywną kolejność czytania, zwalidowany tekst Unicode UTF-8, pikselowe granice z początkiem w lewym górnym rogu oraz pewność przeskalowaną z zakresu 0-100 do 0-1; znaki uzupełniające zużywają dwie jednostki UTF-16

Dostępne linie bazowe słów są przekazywane z oboma punktami końcowymi; gdy linia bazowa jest niedostępna, działa istniejący fallback geometryczny warstwy tekstu

Przy przeważnie pionowej linii bazowej natywny adapter używa szerokości boxa słowa jako TextHeightPixels; poziome linie bazowe używają wysokości boxa, w tym odwróconych kierunków czytania, dzięki czemu długość słowa pionowego nie staje się jego rozmiarem fontu

To szacowanie wzdłuż osi dominującej: sam wyrównany do osi box słowa i linia bazowa nie pozwalają odzyskać dokładnej wysokości tekstu przy dowolnych kątach pochylenia

Pusta strona kończy się sukcesem z pustą tablicą słów; zniekształcony UTF-8, osadzone znaki kontrolne, nieprawidłowa geometria albo pewność, wyczerpane budżety słów lub tekstu, anulowanie i porażki rozpoznawania zwracają False, czyszczą wszystkie częściowe słowa i wypełniają diagnostykę

Każde żądanie zwalnia swój iterator, zaalokowane natywne stringi, monitor i instancję API; zwolnienie adaptera zdejmuje referencję do jego biblioteki

Limity i anulowanie

Każdy wymiar wejścia musi mieć co najwyżej 32 767 pikseli i mieścić się w MaxPixels; rozpoznany tekst musi mieścić się w budżecie MaxTextCodeUnits żądania i limicie adaptera 1 048 576 jednostek UTF-16, a liczba słów — w MaxWords

Adapter sprawdza anulowanie i upływający czas podczas konwersji bitmapy i iteracji po wynikach, a podczas rozpoznawania dostarcza natywny monitor z pozostałym deadline'em i callbackiem anulowania

Natywne anulowanie jest kooperatywne: monitor Tesseracta obejmuje rozpoznawanie słów i nie przerywa każdego kroku inicjalizacji albo analizy layoutu; te wywołania mogą się zakończyć, zanim zgłoszone zostanie żądane anulowanie albo przekroczony deadline

Budżety pikseli i wyjścia nie nakładają twardego limitu na zużycie pamięci modeli albo rozpoznawania przez bibliotekę natywną; użyj adaptera procesowego, gdy aplikacja potrzebuje osobno terminowalnego workera

ApplyLoadedOCRTextLayer waliduje wszystkie wyniki i publikuje każdą wybraną stronę atomowo, więc porażka adaptera zostawia załadowany dokument bez zmian

Adapter DLL odrzuca nieprawidłowy UTF-8, przycina zdekodowany tekst słów i odrzuca pozostałe znaki kontrolne C0, DEL i C1 przed zwróceniem wyników, więc zniekształcony tekst kończy żądanie porażką, zamiast zostać po cichu pominięty przez warstwę tekstu PDF

Lokalna fabryka 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;

Przeciążenie z opcjami przekazuje PageSegMode jako --psm i EngineMode jako --oem, używa skonfigurowanego timeoutu i sprawdza MaxPixels przed zapisem pożyczonej bitmapy albo startem workera

Istniejące przeciążenie z timeoutem zachowuje automatyczną segmentację strony i tryb silnika wybrany przez plik wykonywalny bez narzucania nowego limitu pikseli adaptera; użyj przeciążenia z opcjami, gdy wymagany jest jawny limit wejścia

Oba przeciążenia zachowują żądane DPI, wyjście TSV, ograniczone dziedziczone uchwyty, odpytywanie anulowania i terminację workera przy porażce; CLI nie ma natywnych informacji o liniach bazowych, limituje wyjście TSV do 64 MiB, a wyjście pliku diagnostycznego do 1 MiB

Nieprawidłowe tryby segmentacji, tryby silnika, timeouty i limity pikseli podnoszą EArgumentException przy tworzeniu skonfigurowanego silnika; dostępność modeli, w tym osd.traineddata dla trybów orientacji, oraz zgodność modelu z silnikiem sprawdza plik wykonywalny podczas rozpoznawania

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 użyj dla izolowanego słowa, tpsSparseText dla rozproszonego tekstu, a tpsSingleBlockVertical z odpowiednim modelem tekstu pionowego dla jednego bloku pionowego; fabryka nie kadruje stron ani nie wybiera modeli automatycznie

Adapter CLI ściśle waliduje UTF-8, odrzuca bajty NUL i znaki kontrolne C0/C1 wewnątrz rozpoznanych słów oraz czyści wszystkie wyniki, gdy po innym poprawnym słowie pojawi się zniekształcone wyjście

Zobacz Przeszukiwalne warstwy tekstu OCR, żeby poznać przykład CLI, opcje renderowania, grupowanie w optional content i limity zgodności