RapidOCR native DLL-adapter
HPDFRapidOCRRecognition stelt een in-process IHPDFOCREngine bloot die op HotPDFRapidOCR.dll draait, met dezelfde openbare API in Delphi, C++Builder en Windows FPC/Lazarus-builds voor Win32 en Win64
De DLL voert CPU-ONNX-inferentie rechtstreeks uit op geheugensnapshots en houdt geïnitialiseerde modellen vast totdat de engine-interface wordt vrijgegeven; runtime-deployment bestaat uit de bijpassende native DLL en compatibele lokale modellen en woordenboek
De bestaande Python-procesadapter blijft beschikbaar met zijn oorspronkelijke fabrieksoverloads
Fabriek en 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;
Initialiseer de opties met THPDFRapidOCRDLLOptions.Default; de defaults gebruiken de volgende lokale bestanden
| Veld | Default | Betekenis |
|---|---|---|
DetectionModel | ch_PP-OCRv3_det_infer.onnx | DB-detectiemodel |
RecognitionModel | ch_PP-OCRv3_rec_infer.onnx | Compatibel PP-OCRv3- of PP-OCRv4-CTC-herkenningsmodel |
ClassificationModel | ch_ppocr_mobile_v2.0_cls_infer.onnx | Optioneel tekstoriëntatiemodel |
CharacterDictionary | ppocr_keys_v1.txt | UTF-8-woordenboek zonder BOM, in de tekenvolgorde van het model |
UseAngleClassifier | True | Wanneer uitgeschakeld, wordt geen classificatiemodel vereist of geïnitialiseerd |
RightToLeft | False | Orden gedetecteerde boxes binnen horizontale rijen van rechts naar links; het Arabische preset zet dit aan |
Threads | 1 | Aantal ONNX CPU-threads van 1 tot en met 64, begrensd op het aantal logische processors |
MaxPixels | 16777216 | Invoerlimiet in pixels, van 1 tot en met 67.108.864 |
TimeoutMilliseconds | 60000 | Coöperatieve herkenningsdeadline, van 1 tot en met 3.600.000 milliseconden |
Relatieve filenamen worden opgelost ten opzichte van ModelDirectory; absolute paden mogen apart ingerichte bestanden kiezen
De fabriek controleert bestandsbeschikbaarheid, opties, vereiste exports en de ABI-versie voordat de modellen worden geïnitialiseerd; ongeldige configuratie geeft EArgumentException en fouten bij het laden van modellen geven EInvalidOperation met een native diagnostische melding
Modelinitialisatie gebeurt in de fabriek en valt buiten de herkenningsdeadline; het aantal klassen van het woordenboek moet matchen met het herkenningsmodel, en alleen gelijke klantaantallen bewijzen nog niet dat tekenvolgorde of preprocessing compatibel is
De meegeleverde pijplijn gebruikt DB-detectie met een maximale detectiezijde van 1.024 pixels en 50 pixels witte opvulling; de recognizer accepteert compatibele NCHW-modellen met een vaste invoerhoogte van 32 of 48 en gebruikt 48 bij een dynamische hoogte
Herkenning behoudt de aspect ratio voor modellen met dynamische breedte en normaliseert opgevulde invoer met een minimale breedte van 320; een model met vaste breedte plafonneert de geschaalde cropbreedte, waardoor een lange tekstregel kan worden samengeperst
Hoekclassificatie behoudt de aspect ratio van de crop binnen de modelinvoerbreedte en vult ongebruikte pixels met genormaliseerde nullen; een crop draait alleen 180 graden wanneer de onderstebovenscore boven 0.9 uitkomt, zodat zwakke richtingsvoorspellingen korte tekst niet omdraaien
Het woordenboek moet matchen met de tekenvolgorde en het aantal uitvoerklassen van het model; CRLF-regelovergangen in het woordenboek worden geaccepteerd, maar een UTF-8-BOM wordt geweigerd
Als het model teken-metadata bevat, verifieert de fabriek ook elke woordenboekinvoer en diens volgorde; alleen de woordenboekgrootte is onvoldoende
Chinees, Russisch en gangbare talen
THPDFRapidOCRDLLOptions.ForLanguage kiest een herkenningsmodel en bijpassend woordenboek onder de lokale modelmap en behoudt de gedeelde defaults voor detector, classifier, threads, pixels en timeout
De methode accepteert taaliassen ongeacht hoofdlettergebruik, vervangt underscores door koppeltekens en trimt witruimte rondom; een lege of niet-ondersteunde tag geeft EArgumentException voordat de modellen worden geladen
| Profielmap | Talen | Gangbare geaccepteerde aliassen |
|---|---|---|
ch | Vereenvoudigd Chinees en Engels | zh, zh-CN, zh-Hans, chi_sim |
chinese_cht | Traditioneel Chinees | zh-TW, zh-HK, zh-Hant, chi_tra |
en | Engels | en, en-US, en-GB, eng |
latin | Frans, Duits, Spaans, Portugees, Italiaans, Nederlands en Turks | fr, de, es, pt-BR, it, nl, tr |
japan | Japans | ja, ja-JP, jpn |
korean | Koreaans | ko, ko-KR, kor |
cyrillic | Russisch, Oekraïens, Bulgaars en Wit-Russisch | ru, ru-RU, rus, uk, bg, be |
arabic | Arabisch, Perzisch en Urdu | ar, fa, ur, ara, fas, urd |
devanagari | Hindi, Marathi en Nepalees | hi, mr, ne, hin, mar, nep |
Elk profiel gebruikt <profile>/recognition.onnx en <profile>/dictionary.txt; profielnamen worden rechtstreeks geaccepteerd en bekende regionale aliassen zijn expliciet gedefinieerd in plaats van afgeleid uit een willekeurige prefix
Installeer de gekozen modelsets vóór deployment met de SHA256-gepinde provisioning-helper
& tools/Install-RapidOCRModels.ps1 `
-Destination C:/OCR/models `
-Language ch,chinese_cht,en,latin,japan,korean,cyrillic,arabic,devanagari
-Language All installeert alle negen profielen; -SkipClassifier slaat de optionele classifier over, en zet in dat geval UseAngleClassifier := False wanneer je een engine aanmaakt
De helper verifieert vastgepinde SHA256-hashes en installeert een gedeelde meertalige detector en classifier onder de root-filienamen die Default gebruikt; herkenning draait offline en downloadt nooit automatisch ontbrekende modellen
Kies de taal van de engine per pagina of regio; één engine detecteert de taal niet automatisch en combineert ook geen aparte recognizers voor verschillende schriften
De vastgepinde packages gebruiken compatibele PP-OCRv3- en PP-OCRv4-modellen; de herkenningsnauwkeurigheid hangt af van model, font, resolutie en crop, en het Latijnse model kan accenten zoals ñ door de war halen, zelfs op schone invoer
Nieuwere PP-OCRv5-modellen kunnen een nieuwere ONNX Runtime vereisen dan de statische libraries waarmee de DLL is gebouwd; een niet-ondersteund modelformaat laat de initialisatie mislukken met een diagnostische melding
Detectiemodellen moeten één float32-beeldtensor accepteren en een float32-waarschijnlijkheidskaart met vorm [1, 1, H, W] produceren op de geschaalde invoerresolutie; incompatibele typen, afmetingen of niet-eindige waarden, of waarschijnlijkheden buiten [0, 1] met meer dan vier float32-machine-epsilon, falen met een diagnostische melding voordat de detectieresultaten worden gebruikt
Kleine sigmoid-afrondingsfouten binnen die tolerantie worden geclampt naar [0, 1] vóór thresholding en contourbepunkting, zodat geldige modellen hun normale detectiegedrag kunnen behouden
Chinees voorbeeld
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;
Houd de engine-interface vast over meerdere verzoeken om zijn modellen te hergebruiken; gebruik een DLL die matcht met de architectuur van de aanroepende applicatie en zet de afhankelijkheden ernaast of in de standaard Windows-loadermappen
Russisch voorbeeld
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 en rus kiezen hetzelfde cyrillic-herkenningsmodel en -woordenboek
Resultaten en levensduur
De adapter kopieert de huidige bitmap naar een onafhankelijke top-down BGR-snapshot; die controleert afmetingen en het pixelbudget vóór allocatie en wijzigt de uitgeleende bitmap niet
De native pijplijn levert één resultaat per herkende tekstregel, met pixelgrenzen in de originele afbeelding en de gemiddelde tekenconfidence; elke regel verbruikt één MaxWords-slot en er wordt geen native baseline meegeleverd
Gedetecteerde boxes volgen de leesvolgorde van horizontale rijen, default van links naar rechts en van rechts naar links wanneer RightToLeft is aangezet; het Arabische preset zet deze optie aan
Hoekclassificatie corrigeert individuele tekst-crops; die bepaalt niet de oriëntatie van de hele pagina en zet de apart gedetecteerde boxes van een ondersteboven pagina niet in logische leesvolgorde
Herkende tekst blijft in de logische Unicode-volgorde van het model; de adapter draait Arabische strings niet automatisch om en past geen bidirectionele shaping toe
De adapter valideert UTF-8, Unicode-controltekens, grenzen, confidence en de limiet MaxTextCodeUnits van het verzoek, met een hard tekstplafond van 1.048.576 UTF-16-eenheden; aanvullende tekens verbruiken twee eenheden
Een lege pagina slaagt met een lege resultaten-array; bij falen worden partiële resultaten gewist en behoudt publicatie van doorzoekbare PDF's het bestaande atomaire pagina-transactiegedrag
Aanroepen op dezelfde engine worden geserialiseerd; het wachten op de enginelock controleert annulering en de herkenningsdeadline elke 25 milliseconden
Native callbacks controleren annulering en deadlines vóór en na detectie, classificatie en elke herkende regel; een individuele ONNX-inferentieaanroep kan niet geforceerd worden onderbroken, dus annulering kan pas terugkomen nadat de huidige fase is afgerond
Invoer- en tekstlimieten begrensen adapterallocaties en geaccepteerde uitvoer, maar leggen geen hard plafond op het geheugen van model, detectie, crop of inferentie
Bouwen en ABI
Native/RapidOCR bevat de C++-brug, een compatibele modelrecognizer, een geversioneerde C-header, de exportdefinitie en het CMake-project; voorzie compatibele CPU-netwerksources met DbNet, AngleNet en OcrUtils, plus bijpassende ONNX Runtime- en OpenCV-libraries
Gebruik Windows MSVC met C++17, een Windows SDK en CMake 3.20 of nieuwer; de default build gebruikt de statische release-CRT, die moet matchen met de aangeleverde libraries
& 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 moet OnnxRuntimeConfig.cmake bevatten en OpenCVDirectory moet naar de architecturespecifieke libraryconfiguratie wijzen; kies Win32 en bijpassende x86-libraries voor een 32-bits DLL
De buildhelper schrijft Lib/Native/RapidOCR/<Platform>/HotPDFRapidOCR.dll; met -BuildDirectory, -OutputDirectory en -Generator kun je de buildplaatsing en de Visual Studio-generator overschrijven
De brug houdt C++-exceptions binnen en stelt ABI-versie 1 bloot via HPDFRapidOCRAbiVersion, HPDFRapidOCRCreate, HPDFRapidOCRRecognize en HPDFRapidOCRDestroy; alles gebruikt cdecl, 32-bits statuswaarden en expliciete UTF-8-bytelengtes
ABI-versie 1 definieert ook de optionele export HPDFRapidOCRSetReadingDirection; de adapter vereist die alleen wanneer RightToLeft is aangezet, dus bestaande DLL's kunnen nog steeds verzoeken van links naar rechts bedienen
Callbacks lenen hun tekst alleen voor de duur van de aanroep; de adapter kopieert gevalideerde tekst voordat hij terugkeert en de destructor van de engine vernietigt de modellen voordat de DLL wordt ontladen
Validatie
Met het Python-package onnx en een native BUILD_TESTING-build draait u python tools/test_rapidocr_detector.py <build>/Release/NativeDetectorTests.exe om geldige lege uitvoer, ongeldige tensor-ranks, kanalen en typen, niet-matchende ruimtelijke afmetingen en ongeldige waarschijnlijkheden via de DLL-ABI te controleren; meerdere runner-paden kunnen beide architecturen in één aanroep valideren
Voeg -RapidOCRLanguageModelDirectory en een of beide native-DLL-libraryparameters toe aan de Delphi- of FPC-adapterrunner om alle geïnstalleerde presets te valideren met Chinese, Russische, Japanse, Koreaanse, gangbare Latijnse, Arabische en Hindi-samples; Russisch en Traditioneel Chinees ondergaan ook een ronde met opslaan van doorzoekbare PDF's, herladen, tekstextractie en pixelvergelijking
De Delphi- en FPC-adapterrunners testen persistente modellevensduur, BGR-rijlayout, Unicode en aanvullende tekens, ABI-controles, ongeldige resultaten, budgetten, coöperatieve annulering, geserialiseerd wachten op de lock en opruiming
Geef -RapidOCRNativeWin32Library, -RapidOCRNativeWin64Library en -RapidOCRNativeModelDirectory mee aan Tests/Delphi/Run-TesseractRecognitionTests.ps1 of Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1 voor echte modelvalidatie, lege pagina's, omgang met beschadigde modellen, Engelse en Chinese herkenning en doorzoekbare PDF-roundtrips met ongewijzigde gerenderde pixels
Zie Zoekbare OCR-tekstlagen voor paginarendering, Unicode-PDF-tekstmapping, optional-content-groepering en conformance-beperkingen