Nativer RapidOCR-DLL-Adapter

HPDFRapidOCRRecognition stellt eine In-Process-IHPDFOCREngine auf Basis von HotPDFRapidOCR.dll bereit, mit derselben öffentlichen API in Delphi-, C++Builder- und Windows-FPC/Lazarus-Win32- und Win64-Builds

Die DLL führt CPU-ONNX-Inferenz direkt auf Speicher-Snapshots aus und behält initialisierte Modelle, bis die Engine-Schnittstelle freigegeben wird; die Laufzeitbereitstellung besteht aus der passenden nativen DLL sowie kompatiblen lokalen Modellen und Wörterbuch

Der vorhandene Python-Prozessadapter bleibt mit seinen ursprünglichen Fabrik-Überladungen verfügbar

Fabrik und Optionen

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;

Initialisieren Sie die Optionen mit THPDFRapidOCRDLLOptions.Default; die Standardwerte verwenden die folgenden lokalen Dateien

FeldStandardBedeutung
DetectionModelch_PP-OCRv3_det_infer.onnxDB-Detektionsmodell
RecognitionModelch_PP-OCRv3_rec_infer.onnxKompatibles PP-OCRv3- oder PP-OCRv4-CTC-Erkennungsmodell
ClassificationModelch_ppocr_mobile_v2.0_cls_infer.onnxOptionales Textorientierungsmodell
CharacterDictionaryppocr_keys_v1.txtUTF-8-Wörterbuch ohne BOM in der Zeichenreihenfolge des Modells
UseAngleClassifierTrueWenn deaktiviert, wird kein Klassifikationsmodell benötigt oder initialisiert
RightToLeftFalseOrdnet erkannte Boxen innerhalb horizontaler Zeilen von rechts nach links; aktiviert durch die arabische Voreinstellung
Threads1ONNX-CPU-Thread-Anzahl von 1 bis 64, begrenzt auf die logische Prozessoranzahl
MaxPixels16777216Eingabe-Pixellimit, von 1 bis 67.108.864
TimeoutMilliseconds60000Kooperative Erkennungsdeadline, von 1 bis 3.600.000 Millisekunden

Relative Dateinamen werden gegen ModelDirectory aufgelöst; absolute Pfade können separat bereitgestellte Dateien wählen

Die Fabrik prüft Dateiverfügbarkeit, Optionen, erforderliche Exporte und ABI-Version, bevor sie Modelle initialisiert; ungültige Konfiguration löst EArgumentException aus, Fehler beim Modellladen EInvalidOperation mit nativer Diagnose

Die Modellinitialisierung erfolgt in der Fabrik und liegt außerhalb der Erkennungsdeadline; die Klassenanzahlen des Wörterbuchs müssen zum Erkennungsmodell passen, und gleiche Klassenanzahlen allein belegen nicht, dass Zeichenreihenfolge oder Vorverarbeitung kompatibel sind

Die mitgelieferte Pipeline nutzt DB-Detektion mit maximal 1.024 Pixeln Detektionsseite und 50 Pixeln weißem Rand; der Erkennser akzeptiert kompatible NCHW-Modelle mit fester Eingabehöhe 32 oder 48 und verwendet 48 bei dynamischer Höhe

Die Erkennung bewahrt das Seitenverhältnis für Modelle mit dynamischer Breite und normalisiert Eingaben mit Rand auf eine Mindestbreite von 320; ein Modell mit fester Breite begrenzt die skalierte Crop-Breite, wodurch eine lange Textzeile gestaucht werden kann

Die Winkelklassifikation bewahrt das Seitenverhältnis des Crops innerhalb ihrer Modelleingabebreite und füllt ungenutzte Pixel mit normalisierten Nullen; ein Crop wird nur um 180 Grad gedreht, wenn die Auf-den-Kopf-Bewertung über 0,9 liegt, womit schwache Richtungsvorhersagen daran gehindert werden, kurzen Text umzudrehen

Das Wörterbuch muss zur Zeichenreihenfolge des Modells und zur Ausgabe-Klassenanzahl passen; CRLF-Zeilenenden im Wörterbuch werden akzeptiert, ein UTF-8-BOM hingegen abgelehnt

Bettet das Modell Zeichenmetadaten ein, verifiziert die Fabrik zusätzlich jeden Wörterbucheintrag und seine Reihenfolge; die Wörterbuchgröße allein genügt nicht

Chinesisch, Russisch und gängige Sprachen

THPDFRapidOCRDLLOptions.ForLanguage wählt ein Erkennungsmodell samt passendem Wörterbuch unter dem lokalen Modellverzeichnis und behält die gemeinsamen Standardwerte für Detektor, Klassifikator, Threads, Pixel und Timeout bei

Die Methode akzeptiert Groß-/Kleinschreibung-unabhängige Sprachaliase, wandelt Unterstriche in Bindestriche und entfernt umgebenden Leerraum; ein leeres oder nicht unterstütztes Tag löst vor dem Modellladen EArgumentException aus

ProfilverzeichnisSprachenGebräuchliche akzeptierte Aliasse
chVereinfachtes Chinesisch und Englischzh, zh-CN, zh-Hans, chi_sim
chinese_chtTraditionelles Chinesischzh-TW, zh-HK, zh-Hant, chi_tra
enEnglischen, en-US, en-GB, eng
latinFranzösisch, Deutsch, Spanisch, Portugiesisch, Italienisch, Niederländisch und Türkischfr, de, es, pt-BR, it, nl, tr
japanJapanischja, ja-JP, jpn
koreanKoreanischko, ko-KR, kor
cyrillicRussisch, Ukrainisch, Bulgarisch und Belarussischru, ru-RU, rus, uk, bg, be
arabicArabisch, Persisch und Urduar, fa, ur, ara, fas, urd
devanagariHindi, Marathi und Nepalihi, mr, ne, hin, mar, nep

Jedes Profil verwendet <profile>/recognition.onnx und <profile>/dictionary.txt; Profilnamen werden direkt akzeptiert, und erkannte regionale Aliasse sind explizit definiert statt aus einem beliebigen Präfix abgeleitet

Installieren Sie die gewählten Modellsets vor der Bereitstellung mit dem SHA256-fixierten Provisionierungs-Helfer

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

-Language All installiert alle neun Profile; -SkipClassifier lässt den optionalen Klassifikator weg, in welchem Fall Sie UseAngleClassifier := False setzen, wenn Sie eine Engine erstellen

Der Helfer verifiziert fixierte SHA256-Hashes und installiert einen gemeinsamen mehrsprachigen Detektor und Klassifikator unter den von Default verwendeten Basisdateinamen; die Erkennung läuft offline und lädt fehlende Modelle niemals automatisch herunter

Wählen Sie die Sprache der Engine je Seite oder Region; eine Engine erkennt die Sprache nicht automatisch und kombiniert keine getrennten Erkennser für verschiedene Schriften

Die fixierten Pakete verwenden kompatible PP-OCRv3- und PP-OCRv4-Modelle; die Erkennungsgenauigkeit hängt von Modell, Schriftart, Auflösung und Crop ab, und das lateinische Modell kann Akzente wie ñ selbst bei sauberer Eingabe verwechseln

Neuere PP-OCRv5-Modelle können eine neuere ONNX Runtime benötigen als die statischen Bibliotheken, mit denen die DLL gebaut wurde; ein nicht unterstütztes Modellformat lässt die Initialisierung mit Diagnose fehlschlagen

Detektionsmodelle müssen einen einzelnen float32-Bildtensor akzeptieren und eine float32-Wahrscheinlichkeitskarte mit der Form [1, 1, H, W] an der skalierten Eingabeauflösung liefern; inkompatible Typen, Abmessungen, nicht endliche Werte oder Wahrscheinlichkeiten außerhalb von [0, 1] um mehr als vier float32-Maschinen-Epsilons schlagen mit einer Diagnose fehl, bevor Detektionsergebnisse verwendet werden

Winzige Sigmoid-Rundungsfehler innerhalb dieser Toleranz werden vor Schwellenwertbildung und Konturbewertung auf [0, 1] geklemmt, damit gültige Modelle ihr normales Detektionsverhalten behalten

Chinesisches Beispiel

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;

Behalten Sie die Engine-Schnittstelle über mehrere Anfragen hinweg, um ihre Modelle wiederzuverwenden; verwenden Sie eine DLL, die zur Architektur der aufrufenden Anwendung passt, und legen Sie ihre Abhängigkeiten daneben oder in standardmäßigen Windows-Loader-Verzeichnissen ab

Russisches Beispiel

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 und rus wählen dasselbe cyrillic-Erkennungsmodell und -Wörterbuch

Ergebnisse und Lebensdauer

Der Adapter kopiert die aktuelle Bitmap in einen unabhängigen Top-down-BGR-Snapshot; er prüft Abmessungen und Pixelbudget vor der Allokation und verändert die geliehene Bitmap nicht

Die native Pipeline liefert ein Ergebnis je erkannter Textzeile, mit Pixelgrenzen im Originalbild und der mittleren Zeichenkonfidenz; jede Zeile verbraucht einen MaxWords-Platz, und keine native Baseline wird geliefert

Erkannte Boxen folgen der horizontalen Zeilen-Lesereihenfolge, standardmäßig von links nach rechts und bei aktiviertem RightToLeft von rechts nach links; die arabische Voreinstellung aktiviert diese Option

Die Winkelklassifikation korrigiert einzelne Text-Crops; sie bestimmt nicht die Ausrichtung der ganzen Seite und ordnet die getrennten Erkennungsboxen einer auf dem Kopf stehenden Seite nicht in die logische Lesereihenfolge um

Erkannter Text bleibt in der logischen Unicode-Reihenfolge des Modells; der Adapter kehrt arabische Zeichenfolgen nicht automatisch um und wendet keine bidirektionale Formung an

Der Adapter validiert UTF-8, Unicode-Steuerzeichen, Grenzen, Konfidenz und das MaxTextCodeUnits-Limit der Anfrage, mit einer harten Textobergrenze von 1.048.576 UTF-16-Einheiten; ergänzende Zeichen verbrauchen zwei Einheiten

Eine leere Seite gilt mit einem leeren Ergebnis-Array als erfolgreich; ein Fehler verwirft partielle Ergebnisse, und die Veröffentlichung durchsuchbarer PDFs behält das vorhandene atomare Seiten-Transaktionsverhalten bei

Aufrufe derselben Engine werden serialisiert; das Warten auf die Engine-Sperre prüft Abbruch und Erkennungsdeadline alle 25 Millisekunden

Native Callbacks prüfen Abbruch und Deadlines vor und nach Detektion, Klassifikation und jeder erkannten Zeile; ein einzelner ONNX-Inferenzaufruf lässt sich nicht forciert unterbrechen, sodass ein Abbruch erst nach Abschluss der aktuellen Stufe zurückkehren kann

Eingabe- und Textgrenzen begrenzen Adapter-Allokationen und akzeptierte Ausgabe, setzen aber keine harte Obergrenze für den Speicherverbrauch von Modell, Detektion, Crop oder Inferenz

Build und ABI

Native/RapidOCR enthält die C++-Brücke, den kompatiblen Modellerkennser, den versionierten C-Header, die Exportdefinition und das CMake-Projekt; provisionieren Sie kompatible CPU-Netzwerkquellen mit DbNet, AngleNet und OcrUtils sowie passende ONNX-Runtime- und OpenCV-Bibliotheken

Verwenden Sie Windows MSVC mit C++17, ein Windows SDK und CMake 3.20 oder neuer; der Standard-Build nutzt die statische Release-CRT, die zu den bereitgestellten Bibliotheken passen muss

& 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 muss OnnxRuntimeConfig.cmake enthalten, und OpenCVDirectory muss auf die architekturspezifische Bibliothekskonfiguration zeigen; wählen Sie Win32 und passende x86-Bibliotheken für eine 32-Bit-DLL

Der Build-Helfer schreibt Lib/Native/RapidOCR/<Platform>/HotPDFRapidOCR.dll; -BuildDirectory, -OutputDirectory und -Generator können Build-Ablageort und Visual-Studio-Generator überschreiben

Die Brücke fängt C++-Ausnahmen ab und legt die ABI-Version 1 über HPDFRapidOCRAbiVersion, HPDFRapidOCRCreate, HPDFRapidOCRRecognize und HPDFRapidOCRDestroy offen; alle verwenden cdecl, 32-Bit-Statuswerte und explizite UTF-8-Bytelängen

ABI-Version 1 definiert zusätzlich den optionalen Export HPDFRapidOCRSetReadingDirection; der Adapter fordert ihn nur bei aktiviertem RightToLeft, sodass vorhandene DLLs weiterhin Left-to-Right-Anfragen bedienen können

Callbacks leihen ihren Text nur für die Dauer des Aufrufs; der Adapter kopiert validierten Text vor der Rückkehr, und der Engine-Destruktor zerstört die Modelle, bevor er die DLL entlädt

Validierung

Mit dem Python-Paket onnx und einem nativen BUILD_TESTING-Build führen Sie python tools/test_rapidocr_detector.py <build>/Release/NativeDetectorTests.exe aus, um gültige leere Ausgabe, ungültige Tensor-Ränge, Kanäle und Typen, nicht passende räumliche Abmessungen und ungültige Wahrscheinlichkeiten über die DLL-ABI zu prüfen; mehrere Runner-Pfade können beide Architekturen in einem einzigen Aufruf validieren

Ergänzen Sie den Delphi- oder FPC-Adapter-Runner um -RapidOCRLanguageModelDirectory und einen oder beide native-DLL-Bibliotheksparameter, um alle installierten Voreinstellungen mit chinesischen, russischen, japanischen, koreanischen, gängigen lateinischen, arabischen und Hindi-Sprachproben zu validieren; Russisch und Traditionelles Chinesisch durchlaufen zusätzlich das Speichern durchsuchbarer PDFs, Neuladen, Textextraktion und Pixelvergleich

Die Delphi- und FPC-Adapter-Runner testen persistente Modell-Lebensdauer, BGR-Zeilenlayout, Unicode und ergänzende Zeichen, ABI-Prüfungen, ungültige Ergebnisse, Budgets, kooperativen Abbruch, serialisiertes Warten auf die Sperre und Bereinigung

Übergeben Sie -RapidOCRNativeWin32Library, -RapidOCRNativeWin64Library und -RapidOCRNativeModelDirectory an Tests/Delphi/Run-TesseractRecognitionTests.ps1 oder Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1 für echte Modellvalidierung, leere Seiten, Umgang mit beschädigten Modellen, englische und chinesische Erkennung sowie Round-Trips durchsuchbarer PDFs mit unveränderten gerenderten Pixeln

Siehe Durchsuchbare OCR-Textschichten für Seitenrendering, Unicode-PDF-Textabbildung, Gruppierung optionaler Inhalte und Konformitätsbedingungen