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

CampoValor predeterminadoSignificado
DetectionModelch_PP-OCRv3_det_infer.onnxModelo de detección DB
RecognitionModelch_PP-OCRv3_rec_infer.onnxModelo de reconocimiento CTC compatible con PP-OCRv3 o PP-OCRv4
ClassificationModelch_ppocr_mobile_v2.0_cls_infer.onnxModelo opcional de orientación del texto
CharacterDictionaryppocr_keys_v1.txtDiccionario UTF-8 sin BOM, en el orden de caracteres del modelo
UseAngleClassifierTrueAl deshabilitarlo no se requiere ni se inicializa ningún modelo de clasificación
RightToLeftFalseOrdena las cajas detectadas de derecha a izquierda dentro de las filas horizontales; lo habilita el preset de árabe
Threads1Cantidad de threads de CPU de ONNX de 1 a 64, con tope en la cantidad de procesadores lógicos
MaxPixels16777216Límite de píxeles de entrada, de 1 a 67,108,864
TimeoutMilliseconds60000Plazo 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 perfilIdiomasAlias comunes aceptados
chChino simplificado e inglészh, zh-CN, zh-Hans, chi_sim
chinese_chtChino tradicionalzh-TW, zh-HK, zh-Hant, chi_tra
enInglésen, en-US, en-GB, eng
latinFrancés, alemán, español, portugués, italiano, neerlandés y turcofr, de, es, pt-BR, it, nl, tr
japanJaponésja, ja-JP, jpn
koreanCoreanoko, ko-KR, kor
cyrillicRuso, ucraniano, búlgaro y bielorrusoru, ru-RU, rus, uk, bg, be
arabicÁrabe, persa y urduar, fa, ur, ara, fas, urd
devanagariHindi, 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