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
| Pole | Domyślnie | Znaczenie |
|---|---|---|
PageSegMode | tpsAuto | Automatyczna segmentacja strony bez detekcji orientacji |
EngineMode | temDefault | Tryb silnika wspierany przez wybrane modele językowe |
TimeoutMilliseconds | 60000 | Deadline żądania od 1 do 3 600 000 milisekund; DLL współpracuje przy anulowaniu, a worker CLI jest terminowany po jego przekroczeniu |
MaxPixels | 16777216 | Budż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