Adaptadores OCR de Tesseract
HPDFTesseractRecognition provee engines opcionales de Windows que implementan IHPDFOCREngine para las capas de texto OCR buscables
Factory de DLL nativa
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string): IHPDFOCREngine; overload;
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
Suministre una DLL de Tesseract existente que exponga la API C compatible con Tesseract 5, un directorio tessdata y un identificador de idioma ASCII o una combinación como eng, chi_sim o chi_sim+eng
La arquitectura de la biblioteca debe coincidir con la de la aplicación: una aplicación Win32 carga una DLL de 32 bits, mientras que una aplicación Win64 carga una DLL de 64 bits
Coloque las DLL de dependencias requeridas junto a la biblioteca elegida o en los directorios estándar del loader de Windows; el adaptador carga la ruta explícita de la biblioteca sin cambiar el directorio actual ni el search path del proceso
La factory verifica cada archivo .traineddata solicitado, carga la biblioteca y resuelve las exportaciones requeridas antes de devolver; rutas, modelos y opciones inválidos, exportaciones faltantes, diferencias de arquitectura y dependencias no disponibles lanzan una excepción
Ningún runtime ni modelos de OCR vienen incluidos ni se descargan automáticamente
Ambas factories están disponibles en el paquete FPC/Lazarus de Windows además de en las builds de Delphi y C++Builder; recompile Lib/FPC/HotPDFLaz.lpk para la arquitectura de destino antes de usar HPDFTesseractRecognition
El adaptador nativo de FPC lee la imagen raw LCL actual, incluidos los píxeles escritos vía scanlines, y preserva las palabras Unicode independientemente de la code page ANSI del sistema
Opciones
THPDFTesseractOptions = record
PageSegMode: THPDFTesseractPageSegMode;
EngineMode: THPDFTesseractEngineMode;
TimeoutMilliseconds: Cardinal;
MaxPixels: Integer;
class function Default: THPDFTesseractOptions; static;
end;
Llame a THPDFTesseractOptions.Default antes de sobrescribir campos; el mismo record puede configurar la factory de DLL nativa o el overload de opciones de la CLI local
| Campo | Valor predeterminado | Significado |
|---|---|---|
PageSegMode | tpsAuto | Segmentación de página automática sin detección de orientación |
EngineMode | temDefault | El modo de engine que soportan los modelos de idioma seleccionados |
TimeoutMilliseconds | 60000 | Un plazo de solicitud de 1 a 3,600,000 milisegundos; la DLL coopera con la cancelación, mientras que el worker de la CLI se termina al vencer el timeout |
MaxPixels | 16777216 | El presupuesto de píxeles de entrada, configurable de 1 a 67,108,864 píxeles |
THPDFTesseractPageSegMode = (
tpsOSDOnly, tpsAutoOSD, tpsAutoOnly, tpsAuto, tpsSingleColumn,
tpsSingleBlockVertical, tpsSingleBlock, tpsSingleLine, tpsSingleWord,
tpsCircleWord, tpsSingleCharacter, tpsSparseText, tpsSparseTextOSD,
tpsRawLine);
THPDFTesseractEngineMode = (
temLegacyOnly, temLSTMOnly, temLegacyAndLSTM, temDefault);
tpsOSDOnly y tpsAutoOnly no realizan reconocimiento de palabras y el adaptador los rechaza; tpsAutoOSD y tpsSparseTextOSD además requieren osd.traineddata
Use tpsSingleLine para una línea de texto, tpsSingleBlock para un bloque uniforme o tpsSparseText para texto disperso; estos modos no reparan la perspectiva de un scan ni dan una garantía general de layout
temLSTMOnly requiere modelos LSTM, mientras que los modos legacy requieren los componentes de modelo legacy correspondientes; las combinaciones no soportadas fallan durante la inicialización nativa
Ejemplo de PDF buscable
El PDF debe estar ya cargado, y la DLL, sus dependencias y los modelos de idioma deben estar instalados en las ubicaciones mostradas
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;
Resultados y propiedad
El adaptador copia el bitmap prestado a un buffer de escala de grises top-down, reenvía el DPI solicitado y reconoce a través de una instancia nativa de la API local a la solicitud
Las palabras conservan el orden de lectura nativo, texto Unicode UTF-8 validado, bounds de píxeles con origen arriba a la izquierda, y confianza escalada de 0 a 100 hacia 0 a 1; los caracteres suplementarios consumen dos unidades UTF-16
Las baselines de palabras disponibles se pasan tal cual con ambos extremos; cuando una baseline no está disponible, se aplica el fallback geométrico existente de la capa de texto
Para una baseline predominantemente vertical, el adaptador nativo usa el ancho de la caja de la palabra como TextHeightPixels; las baselines horizontales usan la altura de la caja, incluidas las direcciones de lectura invertidas, de modo que la longitud de una palabra vertical no se convierta en su tamaño de fuente
Esta es una estimación del eje dominante: una caja de palabra y una baseline alineadas a los ejes por sí solas no pueden recuperar la altura exacta del texto en ángulos de inclinación arbitrarios
Una página vacía tiene éxito con un arreglo de palabras vacío; UTF-8 mal formado, caracteres de control embebidos, geometría o confianza inválidas, presupuestos de palabras o de texto agotados, cancelación y fallos de reconocimiento devuelven False, limpian todas las palabras parciales y llenan el diagnóstico
Cada solicitud libera su iterador, los strings nativos asignados, el monitor y la instancia de la API; liberar el adaptador descarga su referencia a la biblioteca
Límites y cancelación
Cada dimensión de entrada debe ser de a lo más 32,767 píxeles y caber en MaxPixels; el texto reconocido debe caber en el presupuesto de MaxTextCodeUnits de la solicitud y en el límite de 1,048,576 unidades UTF-16 del adaptador, y el conteo de palabras debe caber en MaxWords
El adaptador comprueba la cancelación y el tiempo transcurrido durante la conversión del bitmap y la iteración de resultados, y suministra un monitor nativo con el plazo restante y un callback de cancelación durante el reconocimiento
La cancelación nativa es cooperativa: el monitor de Tesseract cubre el reconocimiento de palabras y no interrumpe cada paso de inicialización o de análisis de layout; esas llamadas pueden terminar antes de que se reporte una cancelación solicitada o un plazo vencido
Los presupuestos de píxeles y de salida no imponen un límite duro al uso de memoria de modelo o de reconocimiento de la biblioteca nativa; use el adaptador de proceso cuando la aplicación necesite un worker terminable por separado
ApplyLoadedOCRTextLayer valida todos los resultados y publica cada página seleccionada atómicamente, de modo que un fallo del adaptador deja el documento cargado sin cambios
El adaptador de DLL rechaza UTF-8 inválido, recorta el texto decodificado de las palabras y rechaza los caracteres de control C0, DEL y C1 restantes antes de devolver resultados, así que el texto malformado falla la solicitud en lugar de omitirse en silencio en la capa de texto del PDF
Factory de CLI local
function HPDFCreateTesseractOCREngine(const ExecutablePath,
TessDataDirectory, Language: string;
TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateTesseractOCREngine(const ExecutablePath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
El overload de opciones reenvía PageSegMode como --psm y EngineMode como --oem, usa el timeout configurado y verifica MaxPixels antes de guardar el bitmap prestado o iniciar un worker
El overload de timeout existente preserva la segmentación de página automática y el modo de engine seleccionado por el ejecutable sin imponer un nuevo límite de píxeles del adaptador; use el overload de opciones cuando se requiera un límite explícito de entrada
Ambos overloads conservan el DPI solicitado, la salida TSV, los handles heredados restringidos, el sondeo de cancelación y la terminación del worker en caso de fallo; la CLI no tiene información nativa de baseline, limita la salida TSV a 64 MiB y la salida de archivos de diagnóstico a 1 MiB
Los modos de segmentación, modos de engine, timeouts y límites de píxeles inválidos lanzan EArgumentException al crear el engine configurado; la disponibilidad de modelos, incluido osd.traineddata para los modos de orientación, y la compatibilidad modelo/engine las verifica el ejecutable durante el reconocimiento
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;
Use tpsSingleWord para una palabra aislada, tpsSparseText para texto disperso, o tpsSingleBlockVertical con un modelo de texto vertical adecuado para un bloque vertical; la factory no recorta páginas ni selecciona modelos automáticamente
El adaptador de CLI valida estrictamente UTF-8, rechaza bytes NUL y caracteres de control C0/C1 dentro de las palabras reconocidas, y limpia todos los resultados si una salida malformada sigue a una palabra que de lo contrario es válida
Consulte Capas de texto OCR buscables para el ejemplo de CLI, las opciones de renderizado, la agrupación de optional content y los límites de conformidad