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

CampoDefaultSignificato
PageSegModetpsAutoSegmentazione automatica della pagina senza rilevamento dell'orientamento
EngineModetemDefaultLa modalità engine supportata dai modelli linguistici selezionati
TimeoutMilliseconds60000Una deadline della richiesta da 1 a 3.600.000 millisecondi; la DLL coopera con la cancellazione, mentre il worker CLI viene terminato al timeout
MaxPixels16777216Il 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à