Capas de texto OCR buscables

HotPDF puede renderizar páginas cargadas seleccionadas para un motor OCR proporcionado por la aplicación y añadir de forma atómica texto Unicode invisible buscable alineado con cada palabra reconocida

El demo de consola SearchableOCR ofrece un flujo de trabajo ejecutable: genere una muestra de tres páginas solo con imágenes mediante --create-sample, elija reconocimiento OCR integrado, RapidOCR o Tesseract por DLL/CLI, seleccione páginas, configure la confianza y los límites de recursos, y guarde una copia buscable con estadísticas de conversión

Integración de motores

Implemente IHPDFOCREngine con cualquier proveedor OCR sincrónico disponible para la aplicación

El motor recibe un TBitmap prestado, el DPI solicitado, la rotación de página normalizada, las coordenadas del media box, los presupuestos restantes de palabras y UTF-16, y el token de cancelación efectivo a través de THPDFOCRRequest

Las cajas de palabras y las líneas base opcionales usan coordenadas de píxeles de bitmap con origen arriba a la izquierda, y el motor no debe retener ni liberar el bitmap prestado después de que Recognize devuelva

Motores locales opcionales

La versión 2.754.0 añade factorías explícitas de Tesseract y RapidOCR que devuelven IHPDFOCREngine en Windows; la sobrecarga sin motor sigue seleccionando el motor integrado existente

Instale y aprovisione localmente el motor elegido antes de crear su adaptador, y después pase ese adaptador a la sobrecarga de motor de ApplyLoadedOCRTextLayer; los ejecutables, los paquetes Python y los modelos de OCR son dependencias externas opcionales y no vienen incluidos con HotPDF

Tesseract

El adaptador nativo de DLL de Tesseract opcional añade segmentación de página y modos de motor configurables, reconocimiento multilingüe y líneas base de palabra nativas mediante HPDFCreateTesseractDLLOCREngine y 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 declaración está en HPDFTesseractRecognition; suministre un ejecutable Tesseract capaz de salida TSV y un directorio de datos con el modelo de idioma solicitado, como chi_sim.traineddata para chi_sim

La sobrecarga con opciones acepta THPDFTesseractOptions.Default con segmentación de página explícita, modo de motor de reconocimiento, timeout y límite de píxeles de entrada; seleccione tpsSingleLine, tpsSingleWord o tpsSparseText para ajustarse al layout de la entrada, como se muestra en Adaptadores OCR de Tesseract

Este ejemplo asume que el ejecutable y los datos ya están instalados en las rutas mostradas y que PDF es una instancia THotPDF cargada

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

El adaptador nativo de DLL de RapidOCR reconoce instantáneas de memoria con modelos ONNX de CPU persistentes en proceso mediante HPDFCreateRapidOCRDLLOCREngine, con clasificación de ángulo opcional y cancelación cooperativa en compilaciones Delphi, C++Builder y FPC/Lazarus para Windows

El adaptador de modelos locales de RapidOCR también proporciona una sobrecarga con THPDFRapidOCROptions para rutas de modelos ONNX explícitas, clasificación de ángulo opcional, diccionarios de caracteres y fuentes locales, límites de hilos de CPU y un presupuesto de píxeles de entrada en compilaciones Delphi, C++Builder y FPC/Lazarus

function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
  ModelDirectory: string; TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine;

La declaración está en HPDFRapidOCRRecognition; aprovisione Python con rapidocr y onnxruntime, el puente suministrado tools/OCR/rapidocr_tsv.py y estos tres modelos locales

El puente también requiere %WINDIR%\Fonts\arial.ttf para el contenedor de resultados de RapidOCR, deshabilita las descargas automáticas y usa un hilo ONNX por pool de ejecución configurado; los modelos, paquetes o la fuente local ausentes provocan que el reconocimiento falle

El puente actual usa la configuración del modelo de chino simplificado y preserva la puntuación reconocida sin sustitución a ancho completo o medio

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;

Ambas factorías validan las rutas existentes de ejecutable y datos y aceptan un timeout de 1 a 3.600.000 milisegundos, 60.000 por defecto; una configuración inválida lanza EArgumentException

El adaptador compartido lanza un proceso local oculto con rutas entre comillas y manejadores heredados restringidos, sondea cada 25 milisegundos la cancelación, el timeout y los tamaños de salida, y termina el proceso en caso de fallo antes de limpiar los archivos temporales

La salida TSV está limitada a 64 MiB y la de archivo de diagnóstico a 1 MiB, con los diagnósticos devueltos truncados a 4.096 caracteres; las palabras reconocidas también deben caber en los presupuestos de palabras y UTF-16 de la solicitud y dentro de límites de bitmap válidos

La salida TSV del reconocimiento debe ser UTF-8 válido y no contener bytes NUL ni caracteres de control C0/C1 dentro de las palabras reconocidas; una salida mal formada hace fallar toda la solicitud de reconocimiento incluso cuando hay palabras válidas antes del error

Son límites de salida y de solicitud, no un tope duro del uso de memoria del motor externo; la cancelación y los fallos del motor se devuelven por el estado de la capa de texto sin publicar páginas parciales

Evidencia y límites del reconocimiento

La línea base local RapidOCR 3.8.4 pasó las 15 repeticiones sobre cinco regiones fijas de escaneo en chino: dos regiones nítidas a 300 DPI y tres regiones de presión de baja resolución a 150 DPI, evaluadas contra las transcripciones de referencia actuales con tasa de error de caracteres de como máximo 5% y tasa de borrado de como máximo 2%

Todas las repeticiones pasaron las comprobaciones de orden de lectura, 5.190 comprobaciones de coordenadas de palabra o carácter en total, y la igualdad de píxeles visibles a 72 DPI; las dos regiones limpias tuvieron cero errores de carácter frente a esas referencias

Dos revisiones visuales con IA coinciden en el texto chino y los números, pero algunos codepoints de puntuación en el raster siguen siendo ambiguos y la adjudicación humana está pendiente; las diferencias de puntuación siguen contando como errores y estos resultados son evidencia de corpus, no una garantía general de precisión

Geometría y texto de búsqueda

HotPDF invierte la transformación de página del renderizador para que las líneas base de las palabras permanezcan alineadas en páginas rotadas 0, 90, 180 o 270 grados

Cada palabra aceptada se escribe con el modo de renderizado de texto 3 Tr, una escala de texto horizontal ajustada y una matriz de texto con reconocimiento de rotación, dejando el ráster de la página sin cambios y conservando el orden de contenido seleccionable

Una fuente compartida Type 0 Identity-H asigna CIDs locales al documento acotados a los escalares Unicode y escribe un mapa ToUnicode completo, incluidos los destinos suplentes UTF-16 para los caracteres suplementarios

Las palabras latinas y cirílicas adyacentes en la misma línea base reciben un espacio Unicode explícito cuando su geometría indica un hueco entre palabras; las palabras CJK adyacentes conservan su texto original sin espacios insertados

Procesado de un PDF escaneado

El ejemplo de consola Demo/Delphi/SearchableOCR/SearchableOCR.dpr carga un PDF escaneado, ejecuta RapidOCR nativo con un perfil de idioma local explícito, publica texto Unicode invisible en todas las páginas elegibles y guarda un PDF nuevo sin abrir ningún visor

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

Use --language ch para chino simplificado o --language chinese_cht para chino tradicional; la DLL debe coincidir con la arquitectura del ejecutable y el paquete de modelos local seleccionado debe estar instalado

El ejemplo se niega a sobrescribir un archivo de salida existente y acepta --replace-ocr al actualizar una capa OCR de HotPDF marcada

La decodificación de escaneos JPEG en FPC para Windows dibuja en el formato de píxel del bitmap final antes del reconocimiento, de modo que la conversión de formato del LCL retiene la imagen decodificada

Actualización de una capa OCR existente

Establezca THPDFOCRTextLayerOptions.ReplaceExistingOCRTextLayer en True para reemplazar, en la misma transacción que el texto nuevo, los flujos OCR de HotPDF marcados generados previamente en las páginas reconocidas

Esto omite SkipPagesWithText solo en las páginas marcadas y funciona después de guardar y recargar; THPDFOCRTextLayerInfo.ReplacedPageCount informa del número de páginas reemplazadas

Los fallos de reconocimiento y las páginas sin palabras aceptadas preservan la capa de texto antigua; los flujos no marcados, incluidos los OCR de terceros y las capas generadas por versiones anteriores de HotPDF, se preservan

El reemplazo desconecta los flujos de contenido OCR antiguos, pero no elimina los recursos de fuentes ni los grupos de contenido opcional que aún puedan estar referenciados en otro lugar; el guardado incremental puede retener objetos sustituidos de revisiones anteriores

El valor por defecto sigue siendo omitir cualquier página con texto extraíble, incluido un número de página o una cabecera sobre un escaneo; desactivar SkipPagesWithText reconoce la página completa y puede duplicar el texto nativo existente, así que las páginas mixtas requieren un procesamiento seleccionado por la aplicación

Límites, cancelación y atomicidad

THPDFOCRTextLayerOptions.Default habilita el reconocimiento a 300 DPI, omite las páginas que ya exponen texto y limita el recuento de páginas, los píxeles, las palabras, las unidades UTF-16 y los bytes de contenido generados

HotPDF valida cada resultado del motor y construye todo el contenido de la página antes de iniciar una única transacción de grafo de copia en escritura, por lo que los fallos del motor, la geometría no válida, los presupuestos agotados, la cancelación o los errores de confirmación dejan el grafo de objetos cargado sin cambios

Una matriz de índices de página vacía selecciona todas las páginas cargadas, mientras que los índices de página duplicados se reconocen una vez en orden de primera aparición

MaxTotalWords cuenta todas las palabras recibidas, incluidas las de baja confianza o inválidas que después se descartan, y cada solicitud de página recibe solo la asignación restante

Si el presupuesto de palabras o UTF-16 se agota y queda otra página elegible, el procesamiento devuelve otlsBudgetExceeded antes de renderizar o reconocer esa página y no publica ninguna de las capas de texto planificadas; las páginas omitidas por tener texto existente no requieren presupuesto de reconocimiento restante

Agrupación de contenido opcional

Establezca UseOptionalContentGroup para vincular todo el texto generado a una única capa con nombre mediante el diccionario Resources/Properties de cada página

Esta opción requiere PDF 1.5 y sigue StrictVersionLock; el valor predeterminado mantiene el texto invisible fuera de un grupo de contenido opcional para la máxima compatibilidad

Nota de conformidad

La capa buscable generada usa intencionadamente una fuente sintética sin incrustar porque el modo de renderizado 3 nunca pinta glifos

Esta API no produce por sí misma salida OCR conforme a PDF/A, por lo que un flujo de trabajo PDF/A debe usar una ruta de capa de texto con fuente incrustada y ejecutar la validación de conformidad solicitada antes de la publicación

APIs principales

Renderizado progresivo y cancelación · Método ExtractLoadedPageText