Layer di testo OCR cercabili
HotPDF può renderizzare le pagine caricate selezionate per un engine OCR fornito dall'applicazione e aggiungere atomicamente testo Unicode invisibile cercabile allineato a ogni parola riconosciuta
La demo console SearchableOCR offre un workflow eseguibile: genera un campione di tre pagine solo immagini con --create-sample, scegli il riconoscimento OCR incorporato, RapidOCR o Tesseract DLL/CLI, seleziona le pagine, configura confidenza e limiti di risorse e salva una copia cercabile con le statistiche di conversione
Integrazione dell'engine
Implementa IHPDFOCREngine con qualsiasi provider OCR sincrono disponibile per l'applicazione
L'engine riceve una TBitmap presa in prestito, il DPI richiesto, la rotazione normalizzata della pagina, le coordinate del media box, i budget residui di parole e UTF-16 e il token di cancellazione effettivo attraverso THPDFOCRRequest
I box delle parole e le baseline opzionali usano coordinate pixel della bitmap con origine in alto a sinistra, e l'engine non deve conservare né liberare la bitmap presa in prestito dopo che Recognize restituisce
Engine locali opzionali
La versione 2.754.0 aggiunge factory esplicite Tesseract e RapidOCR che restituiscono IHPDFOCREngine su Windows; l'overload senza engine seleziona ancora l'engine incorporato esistente
Installa e provisiona l'engine scelto localmente prima di creare il suo adapter, poi passa quell'adapter all'overload con engine di ApplyLoadedOCRTextLayer; eseguibili, pacchetti Python e modelli OCR sono dipendenze esterne opzionali e non sono inclusi nel bundle di HotPDF
Tesseract
L'opzionale adapter Tesseract con DLL nativa aggiunge page segmentation e modalità engine configurabili, riconoscimento multilingua e baseline native delle parole attraverso HPDFCreateTesseractDLLOCREngine e THPDFTesseractOptions
function HPDFCreateTesseractOCREngine(const ExecutablePath,
TessDataDirectory, Language: string;
TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateTesseractOCREngine(const ExecutablePath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
La dichiarazione è in HPDFTesseractRecognition; fornisci un eseguibile Tesseract capace di output TSV e una directory dati contenente il modello linguistico richiesto, come chi_sim.traineddata per chi_sim
L'overload con opzioni accetta THPDFTesseractOptions.Default con page segmentation esplicita, modalità dell'engine di riconoscimento, timeout e limite di pixel in ingresso; scegli tpsSingleLine, tpsSingleWord o tpsSparseText per adattarti al layout dell'input, come mostrato in Tesseract OCR Adapters
Questo esempio presuppone che eseguibile e dati siano già installati nei percorsi mostrati e che PDF sia un'istanza THotPDF caricata
uses SysUtils, HPDFDoc, HPDFTesseractRecognition;
procedure AddTesseractText(PDF: THotPDF);
var
Engine: IHPDFOCREngine;
Options: THPDFOCRTextLayerOptions;
Info: THPDFOCRTextLayerInfo;
begin
Engine := HPDFCreateTesseractOCREngine(
'C:\OCR\Tesseract\tesseract.exe',
'C:\OCR\Tesseract\tessdata', 'chi_sim', 60000);
Options := THPDFOCRTextLayerOptions.Default;
if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Options, Info) then
raise Exception.Create('OCR text layer was not added');
end;
RapidOCR
L'adapter RapidOCR con DLL nativa riconosce snapshot di memoria con modelli ONNX CPU in-process persistenti attraverso HPDFCreateRapidOCRDLLOCREngine, con classificazione opzionale dell'angolo e cancellazione cooperativa nelle build Delphi, C++Builder e FPC/Lazarus per Windows
L'adapter RapidOCR con modelli locali fornisce anche un overload THPDFRapidOCROptions per percorsi espliciti dei modelli ONNX, classificazione opzionale dell'angolo, dizionari e font locali dei caratteri, limiti di thread CPU e un budget di pixel in ingresso nelle build Delphi, C++Builder e FPC/Lazarus
function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
ModelDirectory: string; TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine;
La dichiarazione è in HPDFRapidOCRRecognition; provisiona Python con rapidocr e onnxruntime, il bridge tools/OCR/rapidocr_tsv.py fornito e questi tre modelli locali
ch_PP-OCRv4_det_mobile.onnxch_PP-OCRv4_rec_mobile.onnxch_ppocr_mobile_v2.0_cls_mobile.onnx
Il bridge richiede anche %WINDIR%\Fonts\arial.ttf per il contenitore dei risultati di RapidOCR, disabilita i download automatici e usa un thread ONNX per ogni pool di esecuzione configurato; modelli, pacchetti o il font locale mancanti fanno fallire il riconoscimento
Il bridge attuale usa la configurazione del modello cinese semplificato e preserva la punteggiatura riconosciuta senza sostituzione fullwidth o halfwidth
uses SysUtils, HPDFDoc, HPDFRapidOCRRecognition;
procedure AddRapidOCRText(PDF: THotPDF);
var
Engine: IHPDFOCREngine;
Options: THPDFOCRTextLayerOptions;
Info: THPDFOCRTextLayerInfo;
begin
Engine := HPDFCreateRapidOCREngine(
'C:\OCR\Python\python.exe',
'C:\HotPDF\tools\OCR\rapidocr_tsv.py',
'C:\OCR\RapidOCR\models', 60000);
Options := THPDFOCRTextLayerOptions.Default;
if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Options, Info) then
raise Exception.Create('OCR text layer was not added');
end;
Entrambe le factory validano i percorsi esistenti di eseguibile e dati e accettano un timeout da 1 a 3.600.000 millisecondi, con default 60.000; una configurazione non valida solleva EArgumentException
L'adapter condiviso lancia un processo locale nascosto con percorsi tra virgolette e handle ereditati ristretti, interroga cancellazione, timeout e dimensioni dell'output ogni 25 millisecondi e termina il processo in caso di fallimento prima di ripulire i file temporanei
L'output TSV è limitato a 64 MiB e l'output dei file diagnostici a 1 MiB, con le diagnostiche restituite troncate a 4.096 caratteri; le parole riconosciute devono anche stare nei budget di parole e UTF-16 della richiesta e nei bounds validi della bitmap
L'output TSV del riconoscimento deve essere UTF-8 valido e non contenere byte NUL né caratteri di controllo C0/C1 dentro le parole riconosciute; un output malformato fa fallire l'intera richiesta di riconoscimento anche quando parole valide precedono l'errore
Questi sono limiti di output e richiesta, non un tetto rigido sull'uso di memoria dell'engine esterno; cancellazione e fallimenti dell'engine tornano attraverso lo stato del text layer senza pubblicare pagine parziali
Evidenze e limiti del riconoscimento
La baseline locale RapidOCR 3.8.4 ha superato tutte le 15 ripetizioni su cinque regioni di scansione cinese fisse: due regioni nitide a 300 DPI e tre regioni di pressione a bassa risoluzione a 150 DPI, valutate contro le trascrizioni di riferimento correnti con tasso di errore dei caratteri al massimo 5% e tasso di cancellazione al massimo 2%
Tutte le ripetizioni hanno superato i controlli dell'ordine di lettura, 5.190 controlli di coordinate di parole o caratteri in totale e l'uguaglianza dei pixel visibili a 72 DPI; le due regioni nitide avevano zero errori di carattere contro quei riferimenti
Due revisioni visive AI concordano su testo e numeri cinesi, ma alcuni code point di punteggiatura nel raster restano ambigui e l'arbitraggio umano è pending; le differenze di punteggiatura contano comunque come errori e questi risultati sono evidenze di corpus, non una garanzia generale di accuratezza
Geometria e testo di ricerca
HotPDF inverte la trasformazione di pagina del renderer così le baseline delle parole restano allineate sulle pagine ruotate di 0, 90, 180 o 270 gradi
Ogni parola accettata viene scritta con la modalità di rendering del testo 3 Tr, una scala orizzontale del testo adattata e una matrice del testo consapevole della rotazione, lasciando il raster della pagina invariato e preservando l'ordine del contenuto selezionabile
Un font Type 0 Identity-H condiviso assegna CID limitati locali al documento agli scalari Unicode e scrive una mappa ToUnicode completa, inclusi i target surrogate UTF-16 per i caratteri supplementari
Le parole latine e cirilliche adiacenti sulla stessa baseline ricevono uno spazio Unicode esplicito quando la loro geometria indica un gap tra parole; le parole CJK adiacenti conservano il loro testo originale senza spazi inseriti
Elaborare un PDF scansionato
L'esempio console Demo/Delphi/SearchableOCR/SearchableOCR.dpr carica un PDF scansionato, esegue RapidOCR nativo con un profilo linguistico locale esplicito, pubblica testo Unicode invisibile su tutte le pagine idonee e salva un nuovo PDF senza aprire un viewer
SearchableOCR.exe scan.pdf searchable.pdf --dll C:\HotPDF\Lib\Native\RapidOCR\Win64\HotPDFRapidOCR.dll --models C:\HotPDF\Lib\Native\RapidOCR\Models --language ru --dpi 300
Usa --language ch per il cinese semplificato o --language chinese_cht per quello tradizionale; la DLL deve corrispondere all'architettura dell'eseguibile e il pacchetto locale di modelli selezionato deve essere installato
L'esempio rifiuta di sovrascrivere un file di output esistente e accetta --replace-ocr quando si aggiorna un layer OCR HotPDF maricato
La decodifica delle scansioni JPEG in FPC Windows disegna nel formato pixel finale della bitmap prima del riconoscimento, così la conversione di formato LCL conserva l'immagine decodificata
Aggiornare un layer OCR esistente
Imposta THPDFOCRTextLayerOptions.ReplaceExistingOCRTextLayer a True per sostituire gli stream OCR HotPDF maricati generati in precedenza sulle pagine riconosciute nella stessa transazione del nuovo testo
Questo bypassa SkipPagesWithText solo sulle pagine maricate e funziona dopo salvataggio e ricaricamento; THPDFOCRTextLayerInfo.ReplacedPageCount riporta il numero di pagine sostituite
Fallimenti del riconoscimento e pagine senza parole accettate preservano il vecchio text layer; gli stream non maricati, inclusi OCR di terze parti e layer generati da release HotPDF precedenti, vengono preservati
La sostituzione disconnette i vecchi content stream OCR ma non rimuove le risorse font né i gruppi optional-content che potrebbero essere ancora referenziati altrove; il salvataggio incrementale può trattenere oggetti superati dalle revisioni precedenti
Il default resta saltare qualsiasi pagina con testo estraibile, incluso un numero di pagina o un'intestazione sopra una scansione; disattivare SkipPagesWithText riconosce la pagina intera e può duplicare il testo nativo esistente, quindi le pagine miste richiedono un'elaborazione selezionata dall'applicazione
Limiti, cancellazione e atomicità
THPDFOCRTextLayerOptions.Default abilita il riconoscimento a 300 DPI, salta le pagine che espongono già testo e limita il conteggio di pagine, pixel, parole, unità UTF-16 e byte di contenuto generato
HotPDF valida ogni risultato dell'engine e costruisce tutto il contenuto della pagina prima di avviare un'unica transazione del grafo copy-on-write, quindi fallimenti dell'engine, geometria non valida, budget esauriti, cancellazione o errori di commit lasciano il grafo di oggetti caricato invariato
Un array di indici di pagina vuoto seleziona ogni pagina caricata, mentre gli indici di pagina duplicati vengono riconosciuti una sola volta in ordine di prima comparsa
MaxTotalWords conta tutte le parole ricevute, incluse le parole a bassa confidenza o non valide che vengono poi scartate, e ogni richiesta di pagina riceve solo la rimanente
Se il budget di parole o UTF-16 si esaurisce e resta un'altra pagina idonea, l'elaborazione restituisce otlsBudgetExceeded prima di renderizzare o riconoscere quella pagina e non pubblica nessuno dei text layer pianificati; le pagine saltate per testo esistente non richiedono budget di riconoscimento residuo
Raggruppamento optional-content
Imposta UseOptionalContentGroup per legare tutto il testo generato a un layer nominato attraverso il dizionario Resources/Properties di ogni pagina
Questa opzione richiede PDF 1.5 e segue StrictVersionLock; il default tiene il testo invisibile fuori da un gruppo di optional content per la massima compatibilità
Nota di conformità
Il layer cercabile generato usa intenzionalmente un font sintetico non incorporato perché la modalità di rendering 3 non dipinge mai i glifi
Questa API da sola non produce output OCR conforme a PDF/A, quindi un workflow PDF/A dovrebbe usare un percorso di text layer con font incorporato ed eseguire la validazione di conformità richiesta prima della pubblicazione
API principali
THotPDF.ApplyLoadedOCRTextLayerIHPDFOCREngineTHPDFOCRRequestTHPDFOCRWordTHPDFOCRTextLayerOptionsTHPDFOCRTextLayerInfoTHPDFOCRTextLayerStatus
Rendering progressivo e cancellazione · ExtractLoadedPageText Method