Adaptador nativo de DLL de RapidOCR

HPDFRapidOCRRecognition expone un IHPDFOCREngine en proceso respaldado por HotPDFRapidOCR.dll, con la misma API pública en Delphi, C++Builder y compilaciones Win32 y Win64 de FPC/Lazarus para Windows

La DLL realiza inferencia ONNX de CPU directamente sobre instantáneas de memoria y retiene los modelos inicializados hasta que se libera la interfaz del motor; el despliegue en tiempo de ejecución consiste en la DLL nativa correspondiente más modelos y diccionario locales compatibles

El adaptador de proceso de Python existente sigue disponible con sus sobrecargas de factoría originales

Factoría 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 por defectoSignificado
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 de texto
CharacterDictionaryppocr_keys_v1.txtDiccionario UTF-8 sin BOM, en el orden de caracteres del modelo
UseAngleClassifierTrueCuando está deshabilitado, no se requiere ni se inicializa ningún modelo de clasificación
RightToLeftFalseOrdena las cajas detectadas de derecha a izquierda dentro de filas horizontales; lo habilita el preestablecido árabe
Threads1Recuento de hilos de CPU ONNX de 1 a 64, limitado al recuento de procesadores lógicos
MaxPixels16777216Límite de píxeles de entrada, de 1 a 67.108.864
TimeoutMilliseconds60000Plazo de reconocimiento cooperativo, de 1 a 3.600.000 milisegundos

Los nombres de archivo relativos se resuelven contra ModelDirectory; las rutas absolutas pueden elegir archivos aprovisionados por separado

La factoría comprueba la disponibilidad de archivos, las opciones, las exportaciones requeridas y la versión de ABI antes de inicializar 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 factoría y queda fuera del plazo de reconocimiento; los recuentos de clases del diccionario deben coincidir con el modelo de reconocimiento, y recuentos de clases idénticos por sí solos no garantizan que el orden de caracteres o el preprocesado sean compatibles

La canalización suministrada usa detección DB con un lado máximo de detección de 1024 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 anchura dinámica y normaliza las entradas con relleno con una anchura mínima de 320; un modelo de anchura fija limita la anchura del recorte redimensionado, lo que puede comprimir una línea de texto larga

La clasificación de ángulo preserva la relación de aspecto del recorte dentro de la anchura de entrada de su modelo y rellena los píxeles no usados con ceros normalizados; un recorte solo gira 180 grados cuando su puntuación de texto boca abajo 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 recuento de clases de salida; se aceptan finales de línea CRLF en el diccionario, pero se rechaza un BOM UTF-8

Cuando el modelo incrusta metadatos de caracteres, la factoría también verifica cada entrada del diccionario y su orden; el tamaño del diccionario por sí solo es insuficiente

Chino, ruso e idiomas habituales

THPDFRapidOCRDLLOptions.ForLanguage selecciona un modelo de reconocimiento y su diccionario correspondiente bajo el directorio de modelos local, conservando los valores por defecto compartidos de detector, clasificador, hilos, 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 en blanco circundantes; una etiqueta vacía o no soportada lanza EArgumentException antes de cargar modelos

Directorio de perfilIdiomasAlias aceptados habituales
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, marathi 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 conjuntos de modelos elegidos antes del despliegue con el helper de aprovisionamiento con hashes SHA256 fijados

& 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 establezca UseAngleClassifier := False al crear un motor

El helper verifica los hashes SHA256 fijados e instala un detector y un clasificador multilingües compartidos bajo los nombres de archivo raíz que usa Default; el reconocimiento se ejecuta sin conexión y nunca descarga automáticamente los modelos ausentes

Elija el idioma del motor para cada página o región; un motor no detecta automáticamente el idioma ni combina reconocedores separados para distintos sistemas de escritura

Los paquetes fijados usan modelos PP-OCRv3 y PP-OCRv4 compatibles; la precisión del reconocimiento depende del modelo, la fuente, la resolución y el recorte, y el modelo latino puede confundir tildes como ñ incluso con entrada limpia

Los modelos PP-OCRv5 más recientes pueden requerir un ONNX Runtime más nuevo que las librerías estáticas usadas para compilar la DLL; un formato de modelo no soportado falla en 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] en la resolución de entrada redimensionada; tipos, dimensiones o valores no finitos incompatibles, o probabilidades fuera de [0, 1] por más de cuatro épsilon de máquina float32, fallan con un diagnóstico antes de usar los resultados de detección

Los pequeños errores de redondeo del sigmoide dentro de esa tolerancia se recortan a [0, 1] antes del umbralizado y la puntuación de contornos, de modo que los modelos válidos pueden conservar 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;

Conserve la interfaz del motor 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 cargador 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 y diccionario de reconocimiento cyrillic

Resultados y tiempo de vida

El adaptador copia el bitmap actual en una instantánea BGR independiente con origen arriba abajo; comprueba las dimensiones y el presupuesto de píxeles antes de la asignación y no modifica el bitmap prestado

La canalización nativa emite un resultado por línea de texto reconocida, con límites en píxeles de la imagen original y la confianza media de carácter; cada línea consume una plaza de MaxWords, y no se suministra línea base 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 preestablecido árabe habilita esta opción

La clasificación de ángulo corrige recortes de texto individuales; no determina la orientación de la página completa ni reordena en orden de lectura lógico las cajas de detección separadas de una página boca abajo

El texto reconocido permanece en el orden Unicode lógico del modelo; el adaptador no invierte automáticamente cadenas árabes ni aplica shaping bidireccional

El adaptador valida UTF-8, caracteres de control Unicode, límites, confianza y el límite 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 array de resultados vacío; un fallo limpia los resultados parciales, y la publicación de PDF buscable conserva el comportamiento atómico de transacción de páginas existente

Las llamadas sobre el mismo motor se serializan; la espera del lock del motor 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 puede interrumpirse a la fuerza, así que la cancelación puede devolver cuando 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, recorte o inferencia

Compilación y ABI

Native/RapidOCR contiene el puente C++, el reconocedor de modelos compatible, la cabecera C versionada, la definición de exportaciones y el proyecto CMake; aprovisione fuentes de red de CPU compatibles que expongan DbNet, AngleNet y OcrUtils, más librerías ONNX Runtime y OpenCV correspondientes

Use MSVC de Windows con C++17, un Windows SDK y CMake 3.20 o posterior; la compilación por defecto usa el CRT de release estático, que debe coincidir con las librerías 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 librerías específica de la arquitectura; seleccione Win32 y librerías x86 correspondientes para una DLL de 32 bits

El helper de compilación escribe Lib/Native/RapidOCR/<Platform>/HotPDFRapidOCR.dll; -BuildDirectory, -OutputDirectory y -Generator pueden sobrescribir la ubicación de compilación y el generador de Visual Studio

El puente contiene las excepciones de C++ y expone la versión 1 de ABI mediante HPDFRapidOCRAbiVersion, HPDFRapidOCRCreate, HPDFRapidOCRRecognize y HPDFRapidOCRDestroy; todas usan cdecl, valores de estado de 32 bits y longitudes de byte UTF-8 explícitas

La versión 1 de ABI también define la exportación opcional HPDFRapidOCRSetReadingDirection; el adaptador la exige solo cuando RightToLeft está habilitado, así que las DLL existentes pueden seguir sirviendo solicitudes de izquierda a derecha

Los callbacks toman prestado su texto solo durante la llamada; el adaptador copia el texto validado antes de devolver, y el destructor del motor destruye los modelos antes de descargar la DLL

Validación

Con el paquete onnx de Python y una compilación nativa con BUILD_TESTING, ejecute python tools/test_rapidocr_detector.py <build>/Release/NativeDetectorTests.exe para comprobar la salida en blanco válida, los rangos de tensor inválidos, los canales y tipos, las dimensiones espaciales no coincidentes y las probabilidades inválidas a través de la 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 librería de DLL nativa al runner de adaptadores Delphi o FPC para validar todos los preestablecidos instalados con muestras en chino, ruso, japonés, coreano, idiomas latinos habituales, árabe e hindi; el ruso y el chino tradicional pasan además guardado de PDF buscable, recarga, extracción de texto y comparación de píxeles

Los runners de adaptadores Delphi y FPC prueban el tiempo de vida persistente de los 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 de lock serializada y la limpieza

Suministre -RapidOCRNativeWin32Library, -RapidOCRNativeWin64Library y -RapidOCRNativeModelDirectory a Tests/Delphi/Run-TesseractRecognitionTests.ps1 o Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1 para validación con modelos reales, páginas vacías, manejo de modelos dañados, reconocimiento de inglés y chino, e idas y vueltas de PDF buscable con píxeles renderizados sin cambios

Véase Capas de texto OCR buscables para renderizado de páginas, mapeo de texto PDF Unicode, agrupación de contenido opcional y restricciones de conformidad