Adaptateur RapidOCR DLL natif

HPDFRapidOCRRecognition expose un IHPDFOCREngine en process adossé à HotPDFRapidOCR.dll, avec la même API publique dans les builds Delphi, C++Builder et FPC/Lazarus Windows Win32 et Win64

La DLL effectue l'inférence ONNX CPU directement sur des instantanés mémoire et conserve les modèles initialisés jusqu'à la libération de l'interface du moteur ; le déploiement à l'exécution se compose de la DLL native correspondante et de modèles et d'un dictionnaire locaux compatibles

L'adaptateur par processus Python existant reste disponible avec ses surcharges de fabrique d'origine

Fabrique et options

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;

Initialisez les options avec THPDFRapidOCRDLLOptions.Default ; les valeurs par défaut utilisent les fichiers locaux suivants

ChampDéfautSignification
DetectionModelch_PP-OCRv3_det_infer.onnxModèle de détection DB
RecognitionModelch_PP-OCRv3_rec_infer.onnxModèle de reconnaissance CTC compatible PP-OCRv3 ou PP-OCRv4
ClassificationModelch_ppocr_mobile_v2.0_cls_infer.onnxModèle d'orientation de texte optionnel
CharacterDictionaryppocr_keys_v1.txtDictionnaire UTF-8 sans BOM, dans l'ordre des caractères du modèle
UseAngleClassifierTrueLorsque désactivé, aucun modèle de classification n'est requis ni initialisé
RightToLeftFalseOrdonne les boîtes détectées de droite à gauche au sein des lignes horizontales ; activé par le préréglage arabe
Threads1Nombre de threads CPU ONNX de 1 à 64, plafonné au nombre de processeurs logiques
MaxPixels16777216Limite de pixels d'entrée, de 1 à 67 108 864
TimeoutMilliseconds60000Échéance coopérative de reconnaissance, de 1 à 3 600 000 millisecondes

Les noms de fichiers relatifs se résolvent par rapport à ModelDirectory ; les chemins absolus peuvent sélectionner des fichiers approvisionnés séparément

La fabrique vérifie la disponibilité des fichiers, les options, les exports requis et la version d'ABI avant d'initialiser les modèles ; une configuration invalide lève EArgumentException et les échecs de chargement de modèles lèvent EInvalidOperation avec un diagnostic natif

L'initialisation des modèles a lieu dans la fabrique et est hors de l'échéance de reconnaissance ; les nombres de classes du dictionnaire doivent correspondre au modèle de reconnaissance, et des nombres de classes identiques ne suffisent pas à établir que l'ordre des caractères ou le prétraitement est compatible

Le pipeline fourni utilise la détection DB avec un côté de détection maximal de 1 024 pixels et 50 pixels de marge blanche ; le module de reconnaissance accepte des modèles NCHW compatibles avec une hauteur d'entrée fixe de 32 ou 48 et utilise 48 pour une hauteur dynamique

La reconnaissance préserve le ratio d'aspect pour les modèles à largeur dynamique et normalise les entrées avec marge à une largeur minimale de 320 ; un modèle à largeur fixe plafonne la largeur du crop redimensionné, ce qui peut compresser une longue ligne de texte

La classification d'angle préserve le ratio d'aspect du crop dans la largeur d'entrée de son modèle et remplit les pixels inutilisés de zéros normalisés ; un crop n'est pivoté de 180 degrés que lorsque le score d'inversion dépasse 0,9, ce qui empêche les prédictions de direction faibles de retourner du texte court

Le dictionnaire doit correspondre à l'ordre des caractères du modèle et à son nombre de classes en sortie ; les fins de ligne CRLF du dictionnaire sont acceptées, mais un BOM UTF-8 est rejeté

Lorsque le modèle embarque des métadonnées de caractères, la fabrique vérifie aussi chaque entrée du dictionnaire et son ordre ; la taille du dictionnaire seule ne suffit pas

Chinois, russe et langues courantes

THPDFRapidOCRDLLOptions.ForLanguage sélectionne un modèle de reconnaissance et son dictionnaire correspondant sous le répertoire de modèles local tout en conservant les valeurs par défaut partagées de détecteur, de classifieur, de threads, de pixels et de délai d'attente

La méthode accepte des alias de langue insensibles à la casse, remplace les underscores par des tirets et supprime les espaces englobants ; un tag vide ou non pris en charge lève EArgumentException avant le chargement des modèles

Répertoire de profilLanguesAlias courants acceptés
chChinois simplifié et anglaiszh, zh-CN, zh-Hans, chi_sim
chinese_chtChinois traditionnelzh-TW, zh-HK, zh-Hant, chi_tra
enAnglaisen, en-US, en-GB, eng
latinFrançais, allemand, espagnol, portugais, italien, néerlandais et turcfr, de, es, pt-BR, it, nl, tr
japanJaponaisja, ja-JP, jpn
koreanCoréenko, ko-KR, kor
cyrillicRusse, ukrainien, bulgare et biélorusseru, ru-RU, rus, uk, bg, be
arabicArabe, persan et ourdouar, fa, ur, ara, fas, urd
devanagariHindi, marathi et népalaishi, mr, ne, hin, mar, nep

Chaque profil utilise <profile>/recognition.onnx et <profile>/dictionary.txt ; les noms de profils sont acceptés directement, et les alias régionaux reconnus sont définis explicitement plutôt qu'inférés d'un préfixe arbitraire

Installez les jeux de modèles sélectionnés avant le déploiement avec le helper d'approvisionnement épinglé par SHA256

& tools/Install-RapidOCRModels.ps1 `
  -Destination C:/OCR/models `
  -Language ch,chinese_cht,en,latin,japan,korean,cyrillic,arabic,devanagari

-Language All installe les neuf profils ; -SkipClassifier omet le classifieur optionnel, auquel cas définissez UseAngleClassifier := False lors de la création d'un moteur

Le helper vérifie les hachages SHA256 épinglés et installe un détecteur et un classifieur multilingues partagés sous les noms de fichiers racine utilisés par Default ; la reconnaissance s'exécute hors ligne et ne télécharge jamais automatiquement les modèles manquants

Choisissez la langue du moteur pour chaque page ou région ; un moteur ne détecte pas automatiquement la langue et ne combine pas des modules de reconnaissance séparés pour différentes écritures

Les paquets épinglés utilisent des modèles PP-OCRv3 et PP-OCRv4 compatibles ; la précision de la reconnaissance dépend du modèle, de la police, de la résolution et du crop, et le modèle latin peut confondre des accents comme ñ même sur une entrée propre

Les modèles PP-OCRv5 plus récents peuvent exiger un ONNX Runtime plus récent que les bibliothèques statiques utilisées pour compiler la DLL ; un format de modèle non pris en charge fait échouer l'initialisation avec un diagnostic

Les modèles de détection doivent accepter un unique tensor d'image float32 et produire une carte de probabilités float32 de forme [1, 1, H, W] à la résolution d'entrée redimensionnée ; des types, dimensions, valeurs non finies ou probabilités hors de [0, 1] de plus de quatre epsilons machine float32 incompatibles font échouer avec un diagnostic avant l'utilisation des résultats de détection

Les minuscules erreurs d'arrondi sigmoïde dans cette tolérance sont ramenées à [0, 1] avant le seuillage et le scoring de contours, afin que les modèles valides conservent leur comportement de détection normal

Exemple chinois

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;

Conservez l'interface du moteur entre les requêtes pour réutiliser ses modèles ; utilisez une DLL correspondant à l'architecture de l'application appelante et placez ses dépendances à côté d'elle ou dans les répertoires standard du loader Windows

Exemple russe

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 et rus sélectionnent le même modèle et dictionnaire de reconnaissance cyrillic

Résultats et durée de vie

L'adaptateur copie le bitmap courant dans un instantané BGR indépendant de haut en bas ; il vérifie les dimensions et le budget de pixels avant l'allocation et ne modifie pas le bitmap emprunté

Le pipeline natif émet un résultat par ligne de texte reconnue, avec des bornes en pixels de l'image d'origine et la confiance moyenne des caractères ; chaque ligne consomme un créneau MaxWords et aucune ligne de base native n'est fournie

Les boîtes détectées suivent l'ordre de lecture des lignes horizontales, de gauche à droite par défaut et de droite à gauche lorsque RightToLeft est activé ; le préréglage arabe active cette option

La classification d'angle corrige des crops de texte individuels ; elle ne détermine pas l'orientation de la page entière et ne réordonne pas les boîtes de détection séparées d'une page à l'envers en ordre de lecture logique

Le texte reconnu reste dans l'ordre Unicode logique du modèle ; l'adaptateur n'inverse pas automatiquement les chaînes arabes et n'applique pas de façonnage bidirectionnel

L'adaptateur valide l'UTF-8, les caractères de contrôle Unicode, les bornes, la confiance et la limite MaxTextCodeUnits de la requête, avec un plafond strict de texte de 1 048 576 unités UTF-16 ; les caractères supplémentaires consomment deux unités

Une page vide réussit avec un tableau de résultats vide ; un échec efface les résultats partiels, et la publication de PDF consultable conserve le comportement transactionnel de pages atomique existant

Les appels sur un même moteur sont sérialisés ; l'attente du verrou du moteur vérifie l'annulation et l'échéance de reconnaissance toutes les 25 millisecondes

Les callbacks natifs vérifient l'annulation et les échéances avant et après la détection, la classification et chaque ligne reconnue ; un appel d'inférence ONNX individuel ne peut pas être interrompu de force, si bien que l'annulation peut revenir après la fin de l'étape courante

Les limites d'entrée et de texte bornent les allocations de l'adaptateur et la sortie acceptée, mais elles n'imposent aucun plafond strict à la mémoire des modèles, de la détection, du crop ou de l'inférence

Compilation et ABI

Native/RapidOCR contient le pont C++, le module de reconnaissance de modèles compatible, l'en-tête C versionné, la définition d'exports et le projet CMake ; provisionnez des sources de réseaux CPU compatibles exposant DbNet, AngleNet et OcrUtils, plus les bibliothèques ONNX Runtime et OpenCV correspondantes

Utilisez MSVC Windows avec C++17, un Windows SDK et CMake 3.20 ou ultérieur ; la compilation par défaut utilise le CRT release statique, qui doit correspondre aux bibliothèques provisionnées

& 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 doit contenir OnnxRuntimeConfig.cmake, et OpenCVDirectory doit pointer vers la configuration de bibliothèques spécifique à l'architecture ; sélectionnez Win32 et des bibliothèques x86 correspondantes pour une DLL 32 bits

Le helper de compilation écrit Lib/Native/RapidOCR/<Platform>/HotPDFRapidOCR.dll ; -BuildDirectory, -OutputDirectory et -Generator peuvent surcharger l'emplacement de compilation et le générateur Visual Studio

Le pont contient les exceptions C++ et expose la version d'ABI 1 via HPDFRapidOCRAbiVersion, HPDFRapidOCRCreate, HPDFRapidOCRRecognize et HPDFRapidOCRDestroy ; tous utilisent cdecl, des valeurs de statut 32 bits et des longueurs d'octets UTF-8 explicites

La version d'ABI 1 définit aussi l'export optionnel HPDFRapidOCRSetReadingDirection ; l'adaptateur ne l'exige que lorsque RightToLeft est activé, si bien que les DLL existantes peuvent toujours servir des requêtes de gauche à droite

Les callbacks n'empruntent leur texte que pour la durée de l'appel ; l'adaptateur copie le texte validé avant de retourner, et le destructeur du moteur détruit les modèles avant de décharger la DLL

Validation

Avec le paquet Python onnx et une compilation native BUILD_TESTING, exécutez python tools/test_rapidocr_detector.py <build>/Release/NativeDetectorTests.exe pour vérifier via l'ABI DLL la sortie blanche valide, les rangs de tensors invalides, les canaux et types, les dimensions spatiales incompatibles et les probabilités invalides ; plusieurs chemins de runner peuvent valider les deux architectures en une seule invocation

Ajoutez -RapidOCRLanguageModelDirectory et un ou les deux paramètres de bibliothèque DLL native au runner d'adaptateurs Delphi ou FPC pour valider tous les préréglages installés avec des échantillons de chinois, de russe, de japonais, de coréen, de langues latines courantes, d'arabe et d'hindi ; le russe et le chinois traditionnel subissent aussi l'enregistrement d'un PDF consultable, son rechargement, l'extraction de texte et la comparaison de pixels

Les runners d'adaptateurs Delphi et FPC testent la durée de vie persistante des modèles, la disposition des lignes BGR, les caractères Unicode et supplémentaires, les contrôles d'ABI, les résultats invalides, les budgets, l'annulation coopérative, l'attente sérialisée du verrou et le nettoyage

Fournissez -RapidOCRNativeWin32Library, -RapidOCRNativeWin64Library et -RapidOCRNativeModelDirectory à Tests/Delphi/Run-TesseractRecognitionTests.ps1 ou Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1 pour la validation réelle de modèles, les pages vides, la gestion des modèles endommagés, la reconnaissance d'anglais et de chinois et les aller-retours de PDF consultable avec des pixels rendus inchangés

Voir Couches de texte OCR consultables pour le rendu de pages, le mapping de texte PDF Unicode, le regroupement de contenu optionnel et les contraintes de conformité