RapidOCR Native DLL-adapter

HPDFRapidOCRRecognition exponerar en IHPDFOCREngine i processen bakad av HotPDFRapidOCR.dll, med samma publika API i Delphi, C++Builder och Windows FPC/Lazarus-byggen för Win32 och Win64

DLL:en utför CPU-baserad ONNX-inferens direkt på minnesavbildningar och behåller initierade modeller tills motorgränssnittet släpps; distributionen vid körning består av den matchande nativa DLL:en plus kompatibla lokala modeller och ordlista

Den befintliga Python-processadaptern finns kvar med sina ursprungliga fabriksöverlagringar

Fabrik och alternativ

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;

Initiera alternativen med THPDFRapidOCRDLLOptions.Default; standardvärdena använder följande lokala filer

FältStandardBetydelse
DetectionModelch_PP-OCRv3_det_infer.onnxDB-detekteringsmodell
RecognitionModelch_PP-OCRv3_rec_infer.onnxKompatibel PP-OCRv3- eller PP-OCRv4-CTC-igenkänningsmodell
ClassificationModelch_ppocr_mobile_v2.0_cls_infer.onnxValfri modell för textorientering
CharacterDictionaryppocr_keys_v1.txtUTF-8-ordlista utan BOM, i modellens teckenordning
UseAngleClassifierTrueNär den är avstängd krävs och initieras ingen klassificeringsmodell
RightToLeftFalseOrdnar detekterade rutor från höger till vänster inom horisontella rader; aktiveras av arabiska-förinställningen
Threads1Antal ONNX-CPU-trådar från 1 till 64, taklagt vid antalet logiska processorer
MaxPixels16777216Pixelgräns för indata, från 1 till 67 108 864
TimeoutMilliseconds60000Kooperativ tidsgräns för igenkänning, från 1 till 3 600 000 millisekunder

Relativa filnamn löses mot ModelDirectory; absoluta sökvägar kan välja separat provisionerade filer

Fabriken kontrollerar filtillgänglighet, alternativ, nödvändiga exporter och ABI-version innan modellerna initieras; ogiltig konfiguration kastar EArgumentException och misslyckad modellinläsning kastar EInvalidOperation med nativ diagnostik

Modellinitiering sker i fabriken och ligger utanför igenkänningens tidsgräns; ordlistans klassantal måste matcha igenkänningsmodellen, och identiska klassantal bevisar inte ensamt att teckenordning eller förbehandling är kompatibel

Den medföljande pipelinen använder DB-detektering med maximalt 1 024 pixlar för detektionssidan och 50 pixlar vit utfyllnad; igenkännaren accepterar kompatibla NCHW-modeller med fast indatahöjd 32 eller 48 och använder 48 för dynamisk höjd

Igenkänningen bevarar proportioner för modeller med dynamisk bredd och normaliserar utfylld indata med en minimibredd på 320; en modell med fast bredd taklägger den skalade beskärningsbredden, vilket kan komprimera en lång textrad

Vinkelklassificering bevarar beskärningens proportioner inom modellens indatabredd och fyller oanvända pixlar med normaliserade nollor; en beskärning roteras 180 grader först när upp-och-ned-poängen överstiger 0,9, vilket hindrar svaga riktningsprognoser från att vända kort text

Ordlistan måste matcha modellens teckenordning och antal utdataklasser; CRLF-radslut i ordlistan accepteras, men en UTF-8-BOM avvisas

När modellen har inbäddad teckenmetadata verifierar fabriken också varje ordlistepost och dess ordning; ordlistans storlek räcker inte ensamt

Kinesiska, ryska och vanliga språk

THPDFRapidOCRDLLOptions.ForLanguage väljer en igenkänningsmodell och matchande ordlista under den lokala modellkatalogen samtidigt som de delade standardvärdena för detektor, klassificerare, trådar, pixlar och timeout behålls

Metoden accepterar språkalias oavsett skiftläge, byter understreck mot bindestreck och trimmar omgivande blanktecken; en tom eller ej stödd tagg kastar EArgumentException innan modellerna läses in

ProfilkatalogSpråkVanliga accepterade alias
chFörenklad kinesiska och engelskazh, zh-CN, zh-Hans, chi_sim
chinese_chtTraditionell kinesiskazh-TW, zh-HK, zh-Hant, chi_tra
enEngelskaen, en-US, en-GB, eng
latinFranska, tyska, spanska, portugisiska, italienska, nederländska och turkiskafr, de, es, pt-BR, it, nl, tr
japanJapanskaja, ja-JP, jpn
koreanKoreanskako, ko-KR, kor
cyrillicRyska, ukrainska, bulgariska och vitryskaru, ru-RU, rus, uk, bg, be
arabicArabiska, persiska och urduar, fa, ur, ara, fas, urd
devanagariHindi, marathi och nepalihi, mr, ne, hin, mar, nep

Varje profil använder <profile>/recognition.onnx och <profile>/dictionary.txt; profilnamn accepteras direkt, och igenkända regionala alias är explicit definierade i stället för härledda från ett godtyckligt prefix

Installera de valda modelluppsättningarna före driftsättning med den SHA256-förankrade provisioneringshjälpen

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

-Language All installerar alla nio profiler; -SkipClassifier utelämnar den valfria klassificeraren, och i så fall sätt UseAngleClassifier := False när en motor skapas

Hjälpen verifierar låsta SHA256-hashar och installerar en gemensam flerspråkig detektor och klassificerare under de rotfilnamn som Default använder; igenkänningen körs offline och laddar aldrig ner saknade modeller automatiskt

Välj motorns språk för varje sida eller region; en motor detekterar inte språket automatiskt och kombinerar inte separata igenkännare för olika skriftsystem

De låsta paketen använder kompatibla PP-OCRv3- och PP-OCRv4-modeller; igenkänningsnoggrannheten beror på modell, typsnitt, upplösning och beskärning, och den latinska modellen kan förväxla diakritiska tecken som ñ även på ren indata

Nyare PP-OCRv5-modeller kan kräva en nyare ONNX Runtime än de statiska bibliotek som DLL:en byggdes med; ett modelformat som inte stöds gör att initieringen misslyckas med ett diagnostikmeddelande

Detekteringsmodeller måste acceptera en enda float32-bildtensor och producera en float32-sannolikhetskarta med formen [1, 1, H, W] vid den skalade indataupplösningen; inkompatibla typer, dimensioner eller icke-ändliga värden, eller sannolikheter utanför [0, 1] med mer än fyra float32-maskinepsilon, misslyckas med en diagnostik innan detekteringsresultaten används

Små sigmoid-avrundningsfel inom den toleransen begränsas till [0, 1] före tröskelvärdesättning och konturpoängsättning, så att giltiga modeller kan behålla sitt normala detekteringsbeteende

Kinesiskt exempel

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;

Behåll motorgränssnittet över flera begäranden för att återanvända dess modeller; använd en DLL som matchar anroparapplikationens arkitektur och placera dess beroenden bredvid den eller i standardiserade Windows-loader-kataloger

Ryskt exempel

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 och rus väljer samma cyrillic-igenkänningsmodell och ordlista

Resultat och livstid

Adaptern kopierar den aktuella bitmappen till en oberoende BGR-avbildning i topp-ner-ordning; den kontrollerar dimensioner och pixelbudget före allokering och ändrar inte den lånade bitmappen

Den nativa pipelinen avger ett resultat per igenkänd textrad, med pixelgränser i originalbilden och medelvärdet av teckentillförlitligheten; varje rad förbrukar en MaxWords-plats och ingen nativ baslinje levereras

Detekterade rutor följer läsordningen i horisontella rader, från vänster till höger som standard och från höger till vänster när RightToLeft är aktiverat; arabiska-förinställningen aktiverar detta alternativ

Vinkelklassificering korrigerar enskilda textbeskärningar; den avgör inte hela sidans orientering och ordnar inte om en upp-och-nedvänd sidas separata detekterade rutor i logisk läsordning

Igenkänd text förblir i modellens logiska Unicode-ordning; adaptern vänder inte arabiska strängar automatiskt och tillämpar ingen automatisk dubbelriktad formning

Adaptern validerar UTF-8, Unicode-kontrolltecken, gränser, tillförlitlighet och begärans gräns MaxTextCodeUnits, med ett hårt texttak på 1 048 576 UTF-16-enheter; supplerande tecken förbrukar två enheter

En tom sida lyckas med en tom resultatarray; ett fel rensar partiella resultat, och publicering av sökbar PDF behåller det befintliga atomiska sidtransaktionsbeteendet

Anrop på samma motor serialiseras; väntan på motorlåset kontrollerar avbrott och igenkänningens tidsgräns var 25:e millisekund

Nativa återanrop kontrollerar avbrott och tidsgränser före och efter detektering, klassificering och varje igenkänd rad; ett enskilt ONNX-inferensanrop kan inte tvingas avbrytas, så avbrott kan rapporteras först efter att det aktuella steget har avslutats

Indata- och textgränser avgränsar adapterns allokeringar och accepterade utdata, men de sätter inget hårt tak för minnesanvändningen i modell, detektering, beskärning eller inferens

Bygge och ABI

Native/RapidOCR innehåller C++-bryggan, en kompatibel modelligenkännare, ett versionshanterat C-huvud, exportdefinition och CMake-projekt; provisionera kompatibla CPU-nätverkskällor som exponerar DbNet, AngleNet och OcrUtils, plus matchande ONNX Runtime- och OpenCV-bibliotek

Använd Windows MSVC med C++17, ett Windows SDK och CMake 3.20 eller senare; standardbygget använder den statiska release-CRT:en, som måste matcha de provisionerade biblioteken

& 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 måste innehålla OnnxRuntimeConfig.cmake, och OpenCVDirectory måste peka på den arkitekturspecifika bibliotekskonfigurationen; välj Win32 och matchande x86-bibliotek för en 32-bitars DLL

Bygghjälpen skriver Lib/Native/RapidOCR/<Platform>/HotPDFRapidOCR.dll; -BuildDirectory, -OutputDirectory och -Generator kan åsidosätta byggplacering och Visual Studio-generator

Bryggan fångar C++-undantag och exponerar ABI version 1 genom HPDFRapidOCRAbiVersion, HPDFRapidOCRCreate, HPDFRapidOCRRecognize och HPDFRapidOCRDestroy; alla använder cdecl, 32-bitars statusvärden och explicita UTF-8-bylängder

ABI version 1 definierar också den valfria exporten HPDFRapidOCRSetReadingDirection; adaptern kräver den bara när RightToLeft är aktiverat, så befintliga DLL:er kan fortfarande servra vänster-till-höger-begäranden

Återanrop lånar sin text bara under anropets livstid; adaptern kopierar validerad text innan den returnerar, och motorns destruktor förstör modellerna innan DLL:en laddas ur

Validering

Med Python-paketet onnx och en nativ BUILD_TESTING-bygge kör du python tools/test_rapidocr_detector.py <build>/Release/NativeDetectorTests.exe för att kontrollera giltig tom utdata, ogiltiga tensarranker, kanaler och typer, felmatchade spatiala dimensioner samt ogiltiga sannolikheter via DLL:ens ABI; flera runner-vägar kan validera båda arkitekturerna i ett anrop

Lägg till -RapidOCRLanguageModelDirectory och en eller båda nativa DLL-biblioteksparametrarna till Delphi- eller FPC-adapterrunnern för att validera alla installerade förinställningar med kinesiska, ryska, japanska, koreanska, vanliga latinska språk, arabiska och hindi-prover; ryska och traditionell kinesiska genomgår också sparande av sökbar PDF, återinläsning, textextraktion och pixeljämförelse

Delphi- och FPC-adapterrunnarna testar beständig modelllivstid, BGR-radlayout, Unicode- och supplerande tecken, ABI-kontroller, ogiltiga resultat, budgetar, kooperativ avbrytning, serialiserad låsväntan och städning

Ange -RapidOCRNativeWin32Library, -RapidOCRNativeWin64Library och -RapidOCRNativeModelDirectory till Tests/Delphi/Run-TesseractRecognitionTests.ps1 eller Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1 för riktig modellvalidering, tomma sidor, hantering av skadade modeller, engelsk och kinesisk igenkänning samt sökbara PDF-rundturer med oförändrade renderade pixlar

Se Sökbara OCR-textlager för sidrendering, Unicode-mappning av PDF-text, gruppering i valfritt innehåll och regelefterlevnadsrestriktioner