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

CampoValor por defectoSignificado
PageSegModetpsAutoSegmentación automática de página sin detección de orientación
EngineModetemDefaultEl modo de motor soportado por los modelos de idioma seleccionados
TimeoutMilliseconds60000Un 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
MaxPixels16777216El 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