Adaptadores OCR de Tesseract
HPDFTesseractRecognition proporciona motores opcionales de Windows que implementan IHPDFOCREngine para capas de texto OCR buscables
Factoría 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 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 librería 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
Mantenga las DLL de dependencia requeridas junto a la librería elegida o en los directorios estándar del cargador de Windows; el adaptador carga la ruta explícita de la librería sin cambiar el directorio actual ni la ruta de búsqueda del proceso
La factoría verifica cada archivo .traineddata solicitado, carga la librería y resuelve las exportaciones requeridas antes de devolver; rutas, modelos u opciones inválidas, exportaciones ausentes, discrepancias de arquitectura y dependencias no disponibles lanzan una excepción
No se incluye ningún runtime ni modelos de OCR, y no se descargan automáticamente
Ambas factorías están disponibles en el paquete FPC/Lazarus para Windows además de en las compilaciones Delphi y C++Builder; recompile Lib/FPC/HotPDFLaz.lpk para la arquitectura de destino antes de usar HPDFTesseractRecognition
El adaptador nativo FPC lee la imagen cruda LCL actual, incluidos los píxeles escritos mediante scanlines, y preserva las palabras Unicode con independencia de la página de códigos 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 registro puede configurar la factoría de DLL nativa o la sobrecarga local de CLI con opciones
| Campo | Valor por defecto | Significado |
|---|---|---|
PageSegMode | tpsAuto | Segmentación automática de página sin detección de orientación |
EngineMode | temDefault | El modo de motor soportado por 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 CLI se termina al vencer el plazo |
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 son rechazados por el adaptador; tpsAutoOSD y tpsSparseTextOSD requieren además 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 escaneo ni proporcionan 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, las 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 en un búfer de escala de grises de arriba abajo, reenvía el DPI de la solicitud y reconoce mediante una instancia nativa de la API local a la solicitud
Las palabras conservan el orden de lectura nativo, el texto Unicode UTF-8 validado, los límites en píxeles con origen arriba a la izquierda y la confianza escalada de 0 a 100 hacia 0 a 1; los caracteres suplementarios consumen dos unidades UTF-16
Las líneas base de palabra disponibles se pasan con ambos extremos; cuando una línea base no está disponible, se aplica el fallback de geometría existente de la capa de texto
Para una línea base predominantemente vertical, el adaptador nativo usa el ancho del cuadro de palabra como TextHeightPixels; las líneas base horizontales usan la altura del cuadro, incluidas las direcciones de lectura invertidas, de modo que la longitud de una palabra vertical no acaba convertida en su tamaño de fuente
Es una estimación del eje dominante: un cuadro de palabra y una línea base alineados con los ejes no bastan por sí solos para recuperar la altura exacta del texto en ángulos de inclinación arbitrarios
Una página vacía tiene éxito con un array de palabras vacío; UTF-8 malformado, caracteres de control incrustados, geometría o confianza inválidas, presupuestos de palabras o texto agotados, cancelación y fallos de reconocimiento devuelven False, limpian todas las palabras parciales y rellenan el diagnóstico
Cada solicitud libera su iterador, las cadenas nativas asignadas, el monitor y la instancia de la API; liberar el adaptador descarga su referencia de librería
Límites y cancelación
Cada dimensión de entrada debe ser de 32.767 píxeles como máximo y caber en MaxPixels; el texto reconocido debe caber en el presupuesto MaxTextCodeUnits de la solicitud y en el límite de 1.048.576 unidades UTF-16 del adaptador, y el recuento 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 todos los pasos de inicialización o de análisis de layout; estas llamadas pueden terminar antes de que se informe de una cancelación solicitada o de un plazo vencido
Los presupuestos de píxeles y de salida no imponen un límite duro al uso de memoria de modelo o reconocimiento de la librería 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 de forma atómica, así que un fallo del adaptador deja el documento cargado sin cambios
El adaptador de DLL rechaza el UTF-8 no válido, recorta el texto decodificado de las palabras y rechaza los caracteres de control C0, DEL y C1 restantes antes de devolver resultados, de modo que el texto malformado hace fallar la solicitud en lugar de omitirse en silencio en la capa de texto del PDF
Factoría 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;
La sobrecarga con opciones reenvía PageSegMode como --psm y EngineMode como --oem, usa el plazo configurado y comprueba MaxPixels antes de guardar el bitmap prestado o iniciar un worker
La sobrecarga de plazo existente conserva la segmentación automática de página y el modo de motor seleccionado por el ejecutable, sin imponer un nuevo límite de píxeles del adaptador; use la sobrecarga con opciones cuando se requiera un límite explícito de entrada
Ambas sobrecargas conservan el DPI solicitado, la salida TSV, los manejadores heredados restringidos, el sondeo de cancelación y la terminación del worker en caso de fallo; la CLI no tiene información de línea base nativa, limita la salida TSV a 64 MiB y la de archivo de diagnóstico a 1 MiB
Los modos de segmentación, modos de motor, plazos y límites de píxeles no válidos lanzan EArgumentException al crear el motor configurado; la disponibilidad de modelos, incluido osd.traineddata para los modos de orientación, y la compatibilidad modelo/motor las comprueba 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 factoría no recorta páginas ni selecciona modelos automáticamente
El adaptador de CLI valida estrictamente el UTF-8, rechaza los bytes NUL y los caracteres de control C0/C1 dentro de las palabras reconocidas, y limpia todos los resultados si una salida malformada sigue a una palabra válida
Véase Capas de texto OCR buscables para el ejemplo de CLI, opciones de renderizado, agrupación de contenido opcional y límites de conformidad