Capas de texto OCR buscables
HotPDF puede renderizar páginas cargadas seleccionadas para un motor OCR suministrado por la aplicación y añadir atómicamente texto Unicode invisible y buscable alineado con cada palabra reconocida
El demo de consola SearchableOCR proporciona un flujo de trabajo ejecutable: genere una muestra de tres páginas solo de imágenes con --create-sample, elija reconocimiento OCR integrado, RapidOCR o Tesseract 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 síncrono disponible para la aplicación
El motor recibe un TBitmap prestado, el DPI solicitado, la rotación normalizada de la página, 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 baselines opcionales usan coordenadas de píxeles del 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 factories explícitas de Tesseract y RapidOCR que devuelven IHPDFOCREngine en Windows; el overload sin motor sigue seleccionando el motor incorporado existente
Instale y aprovisione el motor elegido localmente antes de crear su adaptador, y luego pase ese adaptador al overload con motor de ApplyLoadedOCRTextLayer; los ejecutables, los paquetes de Python y los modelos de OCR son dependencias externas opcionales y no vienen incluidos con HotPDF
Tesseract
El adaptador opcional de DLL nativa de Tesseract añade modos configurables de segmentación de página y de engine, reconocimiento multilingüe y baselines de palabras 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 de Tesseract capaz de producir salida TSV y un directorio de datos que contenga el modelo de idioma solicitado, como chi_sim.traineddata para chi_sim
El overload de opciones acepta THPDFTesseractOptions.Default con segmentación de página explícita, modo de engine de reconocimiento, timeout y límite de píxeles de entrada; seleccione tpsSingleLine, tpsSingleWord o tpsSparseText para que coincida con el layout de la entrada, como se muestra en Adaptadores de Tesseract OCR
Este ejemplo asume que el ejecutable y los datos ya están instalados en las rutas mostradas y que PDF es una instancia cargada de THotPDF
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 de DLL nativa de RapidOCR reconoce snapshots de memoria con modelos ONNX de CPU persistentes en proceso mediante HPDFCreateRapidOCRDLLOCREngine, con clasificación de ángulo opcional y cancelación cooperativa en las builds de Delphi, C++Builder y FPC/Lazarus de Windows
El adaptador de modelos locales de RapidOCR también ofrece un overload de THPDFRapidOCROptions para rutas explícitas de modelos ONNX, clasificación de ángulo opcional, diccionarios de caracteres y fuentes locales, límites de threads de CPU y un presupuesto de píxeles de entrada en las builds de 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 bridge tools/OCR/rapidocr_tsv.py suministrado, y estos tres modelos locales
ch_PP-OCRv4_det_mobile.onnxch_PP-OCRv4_rec_mobile.onnxch_ppocr_mobile_v2.0_cls_mobile.onnx
El bridge también requiere %WINDIR%\Fonts\arial.ttf para el contenedor de resultados de RapidOCR, deshabilita las descargas automáticas y usa un thread de ONNX por pool de ejecución configurado; los modelos, paquetes o la fuente local faltantes hacen que el reconocimiento falle
El bridge actual usa la configuración del modelo de chino simplificado y preserva la puntuación reconocida sin sustitución entre fullwidth y 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;
Ambas factories validan las rutas existentes del ejecutable y de los datos, y aceptan un timeout de 1 a 3,600,000 milisegundos, con 60,000 por defecto; una configuración inválida lanza EArgumentException
El adaptador compartido lanza un proceso local oculto con rutas entre comillas y handles 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 se limita a 64 MiB y la de archivos 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 los límites válidos del bitmap
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 malformada falla toda la solicitud de reconocimiento incluso cuando hay palabras válidas antes del error
Estos 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 reportan a través del estado de la capa de texto sin publicar páginas parciales
Evidencia de reconocimiento y límites
La baseline local de RapidOCR 3.8.4 pasó las 15 repeticiones en cinco regiones fijas de escaneos 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 una tasa de error de caracteres de a lo más 5% y una tasa de borrado de a lo más 2%
Todas las repeticiones pasaron las comprobaciones de orden de lectura, 5,190 comprobaciones de coordenadas de palabras o caracteres en total, y la igualdad de píxeles visibles a 72 DPI; las dos regiones nítidas tuvieron cero errores de caracteres contra esas referencias
Dos revisiones visuales con IA coinciden en el texto y los números en chino, pero algunos code points de puntuación en el raster siguen siendo ambiguos y la adjudicación humana está pendiente; las diferencias de puntuación aún cuentan 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 baselines 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 horizontal de texto ajustada y una matriz de texto consciente de la rotación, dejando el raster de la página sin cambios mientras se preserva el orden del contenido seleccionable
Una fuente Type 0 Identity-H compartida asigna CIDs acotados locales del documento a los escalares Unicode y escribe un mapa ToUnicode completo, incluidos los targets surrogate UTF-16 para caracteres suplementarios
Las palabras latinas y cirílicas adyacentes en la misma baseline reciben un espacio Unicode explícito cuando su geometría indica un hueco entre palabras; las palabras CJK adyacentes retienen su texto original sin espacios insertados
Procesamiento 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 nuevo PDF sin abrir un 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 cuando actualiza una capa OCR de HotPDF marcada
La decodificación de escaneos JPEG en Windows FPC dibuja en el formato de píxeles final del bitmap 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 streams OCR de HotPDF marcados generados previamente en las páginas reconocidas, en la misma transacción que el nuevo texto
Esto hace bypass de SkipPagesWithText solo en las páginas marcadas y funciona después de guardar y recargar; THPDFOCRTextLayerInfo.ReplacedPageCount reporta el número de páginas reemplazadas
Los fallos de reconocimiento y las páginas sin palabras aceptadas preservan la capa de texto antigua; los streams no marcados, incluidos el 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 optional content que aún puedan estar referenciados en otro lugar; el guardado incremental puede retener objetos sustituidos de revisiones anteriores
De forma predeterminada se sigue omitiendo cualquier página con texto extraíble, incluido un número de página o un encabezado 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, salta las páginas que ya exponen texto, y limita el conteo de páginas, píxeles, palabras, unidades UTF-16 y 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 copy-on-write del grafo, de modo que los fallos del motor, la geometría inválida, los presupuestos agotados, la cancelación o los errores de commit dejan el grafo de objetos cargado sin cambios
Un arreglo vacío de índices de página selecciona todas las páginas cargadas, mientras que los índices de página duplicados se reconocen una sola vez en orden de primera aparición
MaxTotalWords cuenta todas las palabras recibidas, incluidas las de baja confianza o inválidas que luego se descartan, y cada solicitud de página recibe solo la asignación restante
Si el presupuesto de palabras o de 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 saltadas por texto existente no requieren presupuesto de reconocimiento restante
Agrupación de optional content
Active UseOptionalContentGroup para vincular todo el texto generado a una capa nombrada a través del diccionario Resources/Properties de cada página
Esta opción requiere PDF 1.5 y respeta StrictVersionLock; el valor por defecto mantiene el texto invisible fuera de un grupo de optional content para la máxima compatibilidad
Nota de conformidad
La capa buscable generada usa deliberadamente una fuente sintética no incrustada porque el modo de renderizado 3 nunca pinta glifos
Esta API no produce por sí sola salida OCR conforme a PDF/A, así 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 publicar
APIs principales
THotPDF.ApplyLoadedOCRTextLayerIHPDFOCREngineTHPDFOCRRequestTHPDFOCRWordTHPDFOCRTextLayerOptionsTHPDFOCRTextLayerInfoTHPDFOCRTextLayerStatus
Renderizado progresivo y cancelación · ExtractLoadedPageText Method