Adaptador de DLL nativa de RapidOCR
HPDFRapidOCRRecognition expone un IHPDFOCREngine en proceso respaldado por HotPDFRapidOCR.dll, con la misma API pública en builds Win32 y Win64 de Delphi, C++Builder y FPC/Lazarus de Windows
La DLL realiza inferencia ONNX de CPU directamente sobre snapshots de memoria y mantiene los modelos inicializados hasta que se libera la interfaz del engine; el despliegue en runtime consiste en la DLL nativa correspondiente más modelos locales y diccionario compatibles
El adaptador de proceso de Python existente sigue disponible con sus overloads de factory originales
Factory y opciones
function HPDFCreateRapidOCRDLLOCREngine(const LibraryPath,
ModelDirectory: string): IHPDFOCREngine; overload;
function HPDFCreateRapidOCRDLLOCREngine(const LibraryPath,
ModelDirectory: string; const Options: THPDFRapidOCRDLLOptions): IHPDFOCREngine; overload;
THPDFRapidOCRDLLOptions = record
DetectionModel: string;
RecognitionModel: string;
ClassificationModel: string;
CharacterDictionary: string;
UseAngleClassifier: Boolean;
RightToLeft: Boolean;
Threads: Integer;
MaxPixels: Integer;
TimeoutMilliseconds: Cardinal;
class function Default: THPDFRapidOCRDLLOptions; static;
class function ForLanguage(const Language: string): THPDFRapidOCRDLLOptions; static;
end;
Inicialice las opciones con THPDFRapidOCRDLLOptions.Default; los valores por defecto usan los siguientes archivos locales
| Campo | Valor predeterminado | Significado |
|---|---|---|
DetectionModel | ch_PP-OCRv3_det_infer.onnx | Modelo de detección DB |
RecognitionModel | ch_PP-OCRv3_rec_infer.onnx | Modelo de reconocimiento CTC compatible con PP-OCRv3 o PP-OCRv4 |
ClassificationModel | ch_ppocr_mobile_v2.0_cls_infer.onnx | Modelo opcional de orientación del texto |
CharacterDictionary | ppocr_keys_v1.txt | Diccionario UTF-8 sin BOM, en el orden de caracteres del modelo |
UseAngleClassifier | True | Al deshabilitarlo no se requiere ni se inicializa ningún modelo de clasificación |
RightToLeft | False | Ordena las cajas detectadas de derecha a izquierda dentro de las filas horizontales; lo habilita el preset de árabe |
Threads | 1 | Cantidad de threads de CPU de ONNX de 1 a 64, con tope en la cantidad de procesadores lógicos |
MaxPixels | 16777216 | Límite de píxeles de entrada, de 1 a 67,108,864 |
TimeoutMilliseconds | 60000 | Plazo cooperativo del reconocimiento, de 1 a 3,600,000 milisegundos |
Los nombres de archivo relativos se resuelven contra ModelDirectory; las rutas absolutas pueden seleccionar archivos aprovisionados por separado
La factory comprueba la disponibilidad de archivos, las opciones, las exportaciones requeridas y la versión del ABI antes de inicializar los modelos; una configuración inválida lanza EArgumentException, y los fallos de carga de modelos lanzan EInvalidOperation con un diagnóstico nativo
La inicialización de modelos ocurre en la factory y queda fuera del plazo de reconocimiento; los conteos de clases del diccionario deben coincidir con el modelo de reconocimiento, y unos conteos de clases idénticos por sí solos no garantizan que el orden de caracteres o el preprocesamiento sean compatibles
El pipeline suministrado usa detección DB con un lado máximo de detección de 1,024 píxeles y 50 píxeles de relleno blanco; el reconocedor acepta modelos NCHW compatibles con altura de entrada fija de 32 o 48 y usa 48 para altura dinámica
El reconocimiento preserva la relación de aspecto para modelos de ancho dinámico y normaliza las entradas con relleno con un ancho mínimo de 320; un modelo de ancho fijo acota el ancho del crop redimensionado, lo que puede comprimir una línea de texto larga
La clasificación de ángulos preserva la relación de aspecto del crop dentro del ancho de entrada de su modelo y llena los píxeles no usados con ceros normalizados; un crop gira 180 grados solo cuando el puntaje de invertido supera 0.9, lo que evita que predicciones de dirección débiles inviertan texto corto
El diccionario debe coincidir con el orden de caracteres del modelo y con el conteo de clases de salida; se aceptan finales de línea CRLF en el diccionario, pero un BOM UTF-8 se rechaza
Cuando el modelo embebe metadatos de caracteres, la factory también verifica cada entrada del diccionario y su orden; el tamaño del diccionario por sí solo no alcanza
Chino, ruso y lenguas comunes
THPDFRapidOCRDLLOptions.ForLanguage selecciona un modelo de reconocimiento y su diccionario correspondiente bajo el directorio local de modelos, reteniendo los valores por defecto compartidos de detector, clasificador, threads, píxeles y timeout
El método acepta alias de idioma sin distinción de mayúsculas, cambia guiones bajos por guiones y recorta los espacios de los extremos; un tag vacío o no soportado lanza EArgumentException antes de cargar los modelos
| Directorio de perfil | Idiomas | Alias comunes aceptados |
|---|---|---|
ch | Chino simplificado e inglés | zh, zh-CN, zh-Hans, chi_sim |
chinese_cht | Chino tradicional | zh-TW, zh-HK, zh-Hant, chi_tra |
en | Inglés | en, en-US, en-GB, eng |
latin | Francés, alemán, español, portugués, italiano, neerlandés y turco | fr, de, es, pt-BR, it, nl, tr |
japan | Japonés | ja, ja-JP, jpn |
korean | Coreano | ko, ko-KR, kor |
cyrillic | Ruso, ucraniano, búlgaro y bielorruso | ru, ru-RU, rus, uk, bg, be |
arabic | Árabe, persa y urdu | ar, fa, ur, ara, fas, urd |
devanagari | Hindi, marati y nepalí | hi, mr, ne, hin, mar, nep |
Cada perfil usa <profile>/recognition.onnx y <profile>/dictionary.txt; los nombres de perfil se aceptan directamente, y los alias regionales reconocidos están definidos explícitamente en lugar de inferirse de un prefijo arbitrario
Instale los sets de modelos elegidos antes del despliegue con el helper de aprovisionamiento con SHA256 fijado
& tools/Install-RapidOCRModels.ps1 `
-Destination C:/OCR/models `
-Language ch,chinese_cht,en,latin,japan,korean,cyrillic,arabic,devanagari
-Language All instala los nueve perfiles; -SkipClassifier omite el clasificador opcional, en cuyo caso ponga UseAngleClassifier := False al crear un engine
El helper verifica los hashes SHA256 fijados e instala un detector y un clasificador multilingües compartidos bajo los nombres raíz que usa Default; el reconocimiento corre fuera de línea y nunca descarga modelos faltantes automáticamente
Elija el idioma del engine para cada página o región; un engine no detecta el idioma automáticamente ni combina reconocedores separados para scripts distintos
Los paquetes fijados usan modelos compatibles PP-OCRv3 y PP-OCRv4; la precisión del reconocimiento depende del modelo, la fuente, la resolución y el crop, y el modelo latino puede confundir tildes como ñ incluso con entrada limpia
Los modelos PP-OCRv5 más nuevos pueden requerir un ONNX Runtime más nuevo que las bibliotecas estáticas usadas para compilar la DLL; un formato de modelo no soportado falla la inicialización con un diagnóstico
Los modelos de detección deben aceptar un único tensor de imagen float32 y producir un mapa de probabilidades float32 con forma [1, 1, H, W] a la resolución de entrada redimensionada; los tipos, dimensiones o valores no finitos incompatibles, o probabilidades fuera de [0, 1] por más de cuatro epsilons de máquina float32 fallan con un diagnóstico antes de usar los resultados de detección
Los errores de redondeo sigmoidales diminutos dentro de esa tolerancia se recortan a [0, 1] antes del umbralizado y el puntaje de contornos, de modo que los modelos válidos conserven su comportamiento de detección normal
Ejemplo en chino
uses SysUtils, HPDFDoc, HPDFRapidOCRRecognition;
procedure AddNativeRapidOCRText(PDF: THotPDF);
var
Engine: IHPDFOCREngine;
Models: THPDFRapidOCRDLLOptions;
Layer: THPDFOCRTextLayerOptions;
Info: THPDFOCRTextLayerInfo;
begin
Models := THPDFRapidOCRDLLOptions.ForLanguage('zh-CN');
Models.UseAngleClassifier := False;
Engine := HPDFCreateRapidOCRDLLOCREngine(
'C:\OCR\Win64\HotPDFRapidOCR.dll', 'C:\OCR\models', Models);
Layer := THPDFOCRTextLayerOptions.Default;
if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Layer, Info) then
raise Exception.Create('Native RapidOCR text layer was not added');
end;
Retenga la interfaz del engine entre solicitudes para reutilizar sus modelos; use una DLL que coincida con la arquitectura de la aplicación que llama y suministre sus dependencias junto a ella o en los directorios estándar del loader de Windows
Ejemplo en ruso
procedure AddRussianRapidOCRText(PDF: THotPDF);
var
Engine: IHPDFOCREngine;
Models: THPDFRapidOCRDLLOptions;
Layer: THPDFOCRTextLayerOptions;
Info: THPDFOCRTextLayerInfo;
begin
Models := THPDFRapidOCRDLLOptions.ForLanguage('ru-RU');
Engine := HPDFCreateRapidOCRDLLOCREngine(
'C:\OCR\Win64\HotPDFRapidOCR.dll', 'C:\OCR\models', Models);
Layer := THPDFOCRTextLayerOptions.Default;
if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Layer, Info) then
raise Exception.Create('Russian RapidOCR text layer was not added');
end;
ru, ru-RU y rus seleccionan el mismo modelo de reconocimiento y diccionario cyrillic
Resultados y ciclo de vida
El adaptador copia el bitmap actual a un snapshot BGR top-down independiente; comprueba dimensiones y presupuesto de píxeles antes de asignar y no modifica el bitmap prestado
El pipeline nativo emite un resultado por línea de texto reconocida, con bounds en píxeles de la imagen original y la confianza media de caracteres; cada línea consume un slot de MaxWords, y no se suministra baseline nativa
Las cajas detectadas siguen el orden de lectura de filas horizontales, de izquierda a derecha por defecto y de derecha a izquierda cuando RightToLeft está habilitado; el preset de árabe habilita esta opción
La clasificación de ángulos corrige crops individuales de texto; no determina la orientación de toda la página ni reordena en un orden de lectura lógico las cajas de detección separadas de una página invertida
El texto reconocido permanece en el orden Unicode lógico del modelo; el adaptador no invierte strings de árabe automáticamente ni aplica shaping bidireccional
El adaptador valida UTF-8, caracteres de control Unicode, bounds, confianza y el límite de MaxTextCodeUnits de la solicitud, con un techo duro de texto de 1,048,576 unidades UTF-16; los caracteres suplementarios consumen dos unidades
Una página vacía tiene éxito con un arreglo de resultados vacío; un fallo limpia los resultados parciales, y la publicación del PDF buscable retiene el comportamiento transaccional atómico de páginas existente
Las llamadas sobre el mismo engine se serializan; la espera por el lock del engine comprueba la cancelación y el plazo de reconocimiento cada 25 milisegundos
Los callbacks nativos comprueban la cancelación y los plazos antes y después de la detección, la clasificación y cada línea reconocida; una llamada individual de inferencia ONNX no se puede interrumpir a la fuerza, así que la cancelación puede devolver después de que la etapa actual termine
Los límites de entrada y de texto acotan las asignaciones del adaptador y la salida aceptada, pero no imponen un tope duro a la memoria de modelo, detección, crop o inferencia
Compilación y ABI
Native/RapidOCR contiene el bridge de C++, el reconocedor de modelos compatible, el header C versionado, la definición de exportaciones y el proyecto CMake; aprovisione fuentes de redes de CPU compatibles que expongan DbNet, AngleNet y OcrUtils, más bibliotecas de ONNX Runtime y OpenCV correspondientes
Use MSVC de Windows con C++17, un Windows SDK y CMake 3.20 o posterior; la build por defecto usa el CRT de release estático, que debe coincidir con las bibliotecas aprovisionadas
& tools/Build-HotPDFRapidOCR.ps1 `
-NativeSourceDirectory C:/OCR/native-sources `
-OnnxRuntimeDirectory C:/OCR/onnxruntime/windows-x64 `
-OpenCVDirectory C:/OCR/opencv/x64/vc16/staticlib `
-Platform Win64
OnnxRuntimeDirectory debe contener OnnxRuntimeConfig.cmake, y OpenCVDirectory debe apuntar a la configuración de bibliotecas específica de la arquitectura; elija Win32 y bibliotecas x86 correspondientes para una DLL de 32 bits
El helper de build escribe Lib/Native/RapidOCR/<Platform>/HotPDFRapidOCR.dll; -BuildDirectory, -OutputDirectory y -Generator pueden sobrescribir la ubicación de la build y el generador de Visual Studio
El bridge contiene excepciones de C++ y expone la versión 1 del ABI a través de HPDFRapidOCRAbiVersion, HPDFRapidOCRCreate, HPDFRapidOCRRecognize y HPDFRapidOCRDestroy; todas usan cdecl, valores de estado de 32 bits y longitudes de bytes UTF-8 explícitas
La versión 1 del ABI también define la exportación opcional HPDFRapidOCRSetReadingDirection; el adaptador la requiere solo cuando RightToLeft está habilitado, así que DLLs existentes pueden seguir sirviendo solicitudes de izquierda a derecha
Los callbacks toman su texto en préstamo solo por la duración de la llamada; el adaptador copia el texto validado antes de devolver, y el destructor del engine destruye los modelos antes de descargar la DLL
Validación
Con el paquete onnx de Python y una build nativa con BUILD_TESTING, ejecute python tools/test_rapidocr_detector.py <build>/Release/NativeDetectorTests.exe para comprobar salida en blanco válida, ranks de tensores inválidos, canales y tipos, dimensiones espaciales que no coinciden y probabilidades inválidas a través del ABI de la DLL; varias rutas de runner pueden validar ambas arquitecturas en una sola invocación
Añada -RapidOCRLanguageModelDirectory y uno o ambos parámetros de biblioteca de DLL nativa al runner de adaptadores de Delphi o FPC para validar todos los presets instalados con muestras de chino, ruso, japonés, coreano, lenguas latinas comunes, árabe e hindi; el ruso y el chino tradicional también pasan por guardado de PDF buscable, recarga, extracción de texto y comparación de píxeles
Los runners de adaptadores de Delphi y FPC prueban el ciclo de vida persistente de modelos, el layout de filas BGR, los caracteres Unicode y suplementarios, las comprobaciones de ABI, los resultados inválidos, los presupuestos, la cancelación cooperativa, la espera serializada del lock y la limpieza
Suministre -RapidOCRNativeWin32Library, -RapidOCRNativeWin64Library y -RapidOCRNativeModelDirectory a Tests/Delphi/Run-TesseractRecognitionTests.ps1 o Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1 para validación real de modelos, páginas vacías, manejo de modelos dañados, reconocimiento de inglés y chino, y round-trips de PDF buscable con píxeles renderizados sin cambios
Consulte Capas de texto OCR buscables para el renderizado de páginas, el mapeo de texto Unicode a PDF, la agrupación de optional content y las restricciones de conformidad