Adapter OCR Tesseract
HPDFTesseractRecognition fornisce engine Windows opzionali che implementano IHPDFOCREngine per i layer di testo OCR cercabili
Factory con DLL nativa
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string): IHPDFOCREngine; overload;
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
Fornisci una DLL Tesseract esistente che espone la API C compatibile Tesseract 5, una directory tessdata e un identificatore di lingua ASCII o una combinazione come eng, chi_sim oppure chi_sim+eng
L'architettura della libreria deve corrispondere all'applicazione: un'applicazione Win32 carica una DLL a 32 bit, mentre un'applicazione Win64 carica una DLL a 64 bit
Tieni le DLL di dipendenza richieste accanto alla libreria scelta o nelle directory standard del loader di Windows; l'adapter carica il percorso esplicito della libreria senza cambiare la directory corrente né il search path del processo
La factory verifica ogni file .traineddata richiesto, carica la libreria e risolve gli export necessari prima di restituire; percorsi, modelli o opzioni non validi, export mancanti, architettura non corrispondente e dipendenze non disponibili sollevano un'eccezione
Nessun runtime OCR o modello viene incluso nel bundle o scaricato automaticamente
Entrambe le factory sono disponibili nel pacchetto FPC/Lazarus per Windows oltre che nelle build Delphi e C++Builder; ricompila Lib/FPC/HotPDFLaz.lpk per l'architettura target prima di usare HPDFTesseractRecognition
L'adapter FPC nativo legge l'immagine raw LCL corrente, inclusi i pixel scritti attraverso le scanline, e preserva le parole Unicode indipendentemente dalla code page ANSI di sistema
Opzioni
THPDFTesseractOptions = record
PageSegMode: THPDFTesseractPageSegMode;
EngineMode: THPDFTesseractEngineMode;
TimeoutMilliseconds: Cardinal;
MaxPixels: Integer;
class function Default: THPDFTesseractOptions; static;
end;
Chiama THPDFTesseractOptions.Default prima di sovrascrivere i campi; lo stesso record può configurare la factory con DLL nativa o l'overload CLI con opzioni
| Campo | Default | Significato |
|---|---|---|
PageSegMode | tpsAuto | Segmentazione automatica della pagina senza rilevamento dell'orientamento |
EngineMode | temDefault | La modalità engine supportata dai modelli linguistici selezionati |
TimeoutMilliseconds | 60000 | Una deadline della richiesta da 1 a 3.600.000 millisecondi; la DLL coopera con la cancellazione, mentre il worker CLI viene terminato al timeout |
MaxPixels | 16777216 | Il budget di pixel in ingresso, configurabile da 1 a 67.108.864 pixel |
THPDFTesseractPageSegMode = (
tpsOSDOnly, tpsAutoOSD, tpsAutoOnly, tpsAuto, tpsSingleColumn,
tpsSingleBlockVertical, tpsSingleBlock, tpsSingleLine, tpsSingleWord,
tpsCircleWord, tpsSingleCharacter, tpsSparseText, tpsSparseTextOSD,
tpsRawLine);
THPDFTesseractEngineMode = (
temLegacyOnly, temLSTMOnly, temLegacyAndLSTM, temDefault);
tpsOSDOnly e tpsAutoOnly non eseguono riconoscimento di parole e vengono rifiutati dall'adapter; tpsAutoOSD e tpsSparseTextOSD richiedono inoltre osd.traineddata
Usa tpsSingleLine per una riga di testo, tpsSingleBlock per un blocco uniforme oppure tpsSparseText per testo sparso; queste modalità non correggono la prospettiva di una scansione né forniscono una garanzia generale sul layout
temLSTMOnly richiede modelli LSTM, mentre le modalità legacy richiedono i corrispondenti componenti di modello legacy; le combinazioni non supportate falliscono durante l'inizializzazione nativa
Esempio di PDF cercabile
Il PDF deve essere già caricato, e DLL, dipendenze e modelli linguistici devono essere installati nei percorsi mostrati
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;
Risultati e ownership
L'adapter copia la bitmap presa in prestito in un buffer grayscale top-down, inoltra il DPI richiesto e riconosce attraverso un'istanza dell'API nativa locale alla richiesta
Le parole conservano l'ordine di lettura nativo, il testo Unicode UTF-8 validato, i bounds in pixel con origine in alto a sinistra e la confidenza scalata da 0-100 a 0-1; i caratteri supplementari consumano due unità UTF-16
Le baseline delle parole disponibili vengono passate attraverso con entrambi gli endpoint; quando una baseline non è disponibile si applica il fallback geometrico esistente del text layer
Per una baseline prevalentemente verticale, l'adapter nativo usa la larghezza del box della parola come TextHeightPixels; le baseline orizzontali usano l'altezza del box, comprese le direzioni di lettura invertite, così la lunghezza di una parola verticale non diventa la sua dimensione del font
È una stima sull'asse dominante: un box e una baseline allineati agli assi, da soli, non possono ricostruire l'altezza esatta del testo a angoli di inclinazione arbitrari
Una pagina vuota va a buon fine con un array di parole vuoto; UTF-8 malformato, caratteri di controllo incorporati, geometria o confidenza non valide, budget di parole o testo esauriti, cancellazione e fallimenti del riconoscimento restituiscono False, cancellano tutte le parole parziali e popolano la diagnostica
Ogni richiesta rilascia il proprio iteratore, le stringhe native allocate, il monitor e l'istanza dell'API; il rilascio dell'adapter scarica il suo riferimento alla libreria
Limiti e cancellazione
Ogni dimensione dell'input deve essere al massimo 32.767 pixel ed entrare in MaxPixels; il testo riconosciuto deve entrare nel budget MaxTextCodeUnits della richiesta e nel limite di 1.048.576 unità UTF-16 dell'adapter, e il numero di parole deve entrare in MaxWords
L'adapter controlla cancellazione e tempo trascorso durante la conversione della bitmap e l'iterazione dei risultati, e fornisce un monitor nativo con la deadline residua e un callback di cancellazione durante il riconoscimento
La cancellazione nativa è cooperativa: il monitor di Tesseract copre il riconoscimento delle parole e non interrompe ogni passo di inizializzazione o analisi del layout; queste chiamate possono concludersi prima che una cancellazione richiesta o una deadline scaduta venga riportata
I budget di pixel e output non impongono un limite rigido all'uso di memoria di modelli o riconoscimento della libreria nativa; usa l'adapter a processo quando l'applicazione serve un worker terminabile separatamente
ApplyLoadedOCRTextLayer valida tutti i risultati e pubblica ogni pagina selezionata atomicamente, quindi un fallimento dell'adapter lascia il documento caricato invariato
L'adapter DLL rifiuta UTF-8 non valido, taglia gli spazi dal testo decodificato delle parole e rifiuta i caratteri di controllo C0, DEL e C1 residui prima di restituire i risultati, così il testo malformato fa fallire la richiesta invece di essere omesso silenziosamente dal text layer del PDF
Factory CLI locale
function HPDFCreateTesseractOCREngine(const ExecutablePath,
TessDataDirectory, Language: string;
TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateTesseractOCREngine(const ExecutablePath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
L'overload con opzioni inoltra PageSegMode come --psm e EngineMode come --oem, usa il timeout configurato e controlla MaxPixels prima di salvare la bitmap presa in prestito o avviare un worker
L'overload con timeout esistente preserva la segmentazione automatica della pagina e la modalità engine scelta dall'eseguibile senza imporre un nuovo limite di pixel dell'adapter; usa l'overload con opzioni quando serve un limite esplicito dell'input
Entrambi gli overload conservano il DPI richiesto, l'output TSV, gli handle ereditati ristretti, il polling di cancellazione e la terminazione del worker in caso di fallimento; la CLI non ha informazioni di baseline native, limita l'output TSV a 64 MiB e l'output dei file diagnostici a 1 MiB
Modalità di segmentazione, modalità engine, timeout e limiti di pixel non validi sollevano EArgumentException alla creazione dell'engine configurato; la disponibilità dei modelli, incluso osd.traineddata per le modalità di orientamento, e la compatibilità modello/engine vengono verificate dall'eseguibile durante il riconoscimento
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;
Usa tpsSingleWord per una parola isolata, tpsSparseText per testo sparso o tpsSingleBlockVertical con un modello adatto al testo verticale per un blocco verticale; la factory non ritaglia le pagine né seleziona i modelli automaticamente
L'adapter CLI valida UTF-8 in modo rigoroso, rifiuta byte NUL e caratteri di controllo C0/C1 dentro le parole riconosciute e cancella tutti i risultati se un output malformato segue una parola altrimenti valida
Vedi Layer di testo OCR cercabili per l'esempio CLI, le opzioni di rendering, il raggruppamento optional-content e i limiti di conformità