Нативний DLL-адаптер RapidOCR

HPDFRapidOCRRecognition відкриває внутрішньопроцесний IHPDFOCREngine на основі HotPDFRapidOCR.dll з тим самим публічним API у збірках Delphi, C++Builder та Windows FPC/Lazarus Win32 і Win64

DLL виконує процесорний ONNX-вивід безпосередньо на знімках пам'яті та утримує ініціалізовані моделі, поки не звільнено інтерфейс рушія; розгортання під час виконання складається з відповідного нативного DLL і сумісних локальних моделей та словника

Наявний процесний адаптер Python залишається доступним зі своїми початковими перевантаженнями фабрики

Фабрика та опції

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;

Ініціалізуйте опції через THPDFRapidOCRDLLOptions.Default; усталені значення використовують такі локальні файли

ПолеТиповоЗначення
DetectionModelch_PP-OCRv3_det_infer.onnxМодель виявлення DB
RecognitionModelch_PP-OCRv3_rec_infer.onnxСумісна модель CTC-розпізнавання PP-OCRv3 або PP-OCRv4
ClassificationModelch_ppocr_mobile_v2.0_cls_infer.onnxОпційна модель орієнтації тексту
CharacterDictionaryppocr_keys_v1.txtСловник UTF-8 без BOM у порядку символів моделі
UseAngleClassifierTrueКоли вимкнено, модель класифікації не потрібна й не ініціалізується
RightToLeftFalseУпорядковує виявлені рамки справа наліво всередині горизонтальних рядків; вмикається пресетом для арабської
Threads1Кількість процесорних потоків ONNX від 1 до 64, обмежена кількістю логічних процесорів
MaxPixels16777216Ліміт пікселів входу, від 1 до 67 108 864
TimeoutMilliseconds60000Кооперативний дедлайн розпізнавання, від 1 до 3 600 000 мілісекунд

Відносні імена файлів розв'язуються відносно ModelDirectory; абсолютні шляхи можуть обирати окремо підготовлені файли

Фабрика перевіряє наявність файлів, опції, потрібні експорти та версію ABI перед ініціалізацією моделей; некоректна конфігурація викликає EArgumentException, а збої завантаження моделей — EInvalidOperation з нативною діагностикою

Ініціалізація моделей відбувається у фабриці та не входить у дедлайн розпізнавання; кількості класів словника мають збігатися з моделлю розпізнавання, і самі по собі однакові кількості класів ще не доводять сумісності порядку символів чи передобробки

Постачаний конвейєр використовує виявлення DB з максимальною стороною виявлення 1 024 пікселів та білим полем 50 пікселів; розпізнавач приймає сумісні моделі NCHW з фіксованою висотою входу 32 або 48 і використовує 48 для динамічної висоти

Розпізнавання зберігає пропорції для моделей динамічної ширини та нормалізує доповнені входи з мінімальною шириною 320; модель фіксованої ширини обмежує ширину масштабованого фрагмента, що може стиснути довгий текстовий рядок

Класифікація кутів зберігає пропорції фрагмента в межах ширини входу своєї моделі та заповнює невикористані пікселі нормалізованими нулями; фрагмент обертається на 180 градусів лише тоді, коли оцінка перевернутості перевищує 0,9, що не дає слабким передбаченням напрямку перегортати короткий текст

Словник має відповідати порядку символів моделі та кількості вихідних класів; закінчення рядків CRLF у словнику приймаються, але BOM UTF-8 відхиляється

Коли модель вбудовує метадані символів, фабрика також звіряє кожен запис словника та його порядок; одного лише розміру словника недостатньо

Китайська, російська та поширені мови

THPDFRapidOCRDLLOptions.ForLanguage обирає модель розпізнавання та відповідний словник під локальним каталогом моделей, зберігаючи спільні усталені значення детектора, класифікатора, потоків, пікселів і тайм-ауту

Метод приймає псевдоніми мов без урахування регістру, замінює підкреслення дефісами та обрізає навколишні пробіли; порожній або непідтримуваний тег викликає EArgumentException до завантаження моделей

Каталог профілюМовиПоширені прийнятні псевдоніми
chСпрощена китайська та англійськаzh, zh-CN, zh-Hans, chi_sim
chinese_chtТрадиційна китайськаzh-TW, zh-HK, zh-Hant, chi_tra
enАнглійськаen, en-US, en-GB, eng
latinФранцузька, німецька, іспанська, португальська, італійська, нідерландська та турецькаfr, de, es, pt-BR, it, nl, tr
japanЯпонськаja, ja-JP, jpn
koreanКорейськаko, ko-KR, kor
cyrillicРосійська, українська, болгарська та білоруськаru, ru-RU, rus, uk, bg, be
arabicАрабська, перська та урдуar, fa, ur, ara, fas, urd
devanagariГінді, маратхі та непальськаhi, mr, ne, hin, mar, nep

Кожен профіль використовує <profile>/recognition.onnx і <profile>/dictionary.txt; назви профілів приймаються безпосередньо, а відомі регіональні псевдоніми визначено явно, а не виведено з довільного префікса

Установіть обрані набори моделей перед розгортанням за допомогою помічника підготовки з закріпленими хешами SHA256

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

-Language All встановлює всі дев'ять профілів; -SkipClassifier пропускає опційний класифікатор — у такому разі встановіть UseAngleClassifier := False під час створення рушія

Помічник звіряє закріплені хеші SHA256 і встановлює спільний багатомовний детектор та класифікатор під кореневими іменами файлів, які використовує Default; розпізнавання працює офлайн і ніколи не завантажує відсутні моделі автоматично

Обирайте мову рушія для кожної сторінки чи регіону; один рушій не визначає мову автоматично і не поєднує окремі розпізнавачі для різних писемностей

Закріплені пакети використовують сумісні моделі PP-OCRv3 і PP-OCRv4; точність розпізнавання залежить від моделі, шрифту, роздільності та фрагмента, а латинська модель може сплутати діакритику на кшталт ñ навіть на чистому вході

Новіші моделі PP-OCRv5 можуть вимагати новішого ONNX Runtime, ніж статичні бібліотеки, якими будується DLL; непідтримуваний формат моделі зазнає невдачі ініціалізації з діагностикою

Моделі виявлення мають приймати один тензор зображення float32 і створювати карту ймовірностей float32 форми [1, 1, H, W] у масштабованій вхідній роздільній здатності; несумісні типи, розміри, нескінченні значення чи ймовірності поза [0, 1] понад чотири машинні епсилони float32 завершуються з діагностикою до використання результатів виявлення

Дрібні помилки округлення сигмоїди в межах цього допуску обмежуються до [0, 1] перед порогуванням та оцінюванням контурів, тож коректні моделі можуть зберегти свою звичайну поведінку виявлення

Приклад для китайської

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;

Утримуйте інтерфейс рушія між запитами, щоб повторно використовувати його моделі; використовуйте DLL, що відповідає архітектурі застосунку, що викликає, і подайте його залежності поруч із ним або в стандартних каталогах завантажувача Windows

Приклад для російської

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 та rus обирають той самий словник і модель розпізнавання cyrillic

Результати та час життя

Адаптер копіює поточний бітмап у незалежний знімок BGR зверху вниз; він перевіряє розміри та бюджет пікселів перед виділенням пам'яті і не змінює позичений бітмап

Нативний конвейєр видає один результат на кожен розпізнаний текстовий рядок, з межами в пікселях початкового зображення та середньою довірою символів; кожен рядок витрачає один слот MaxWords, а нативна базова лінія не подається

Виявлені рамки слідують порядку читання горизонтальних рядків: типово зліва направо, а за увімкненого RightToLeft — справа наліво; пресет для арабської вмикає цю опцію

Класифікація кутів виправляє окремі текстові фрагменти; вона не визначає орієнтацію цілої сторінки і не перебудовує окремі рамки виявлення перевернутої сторінки в логічний порядок читання

Розпізнаний текст залишається в логічному порядку Unicode моделі; адаптер не обертає арабські рядки автоматично і не застосовує двонаправлене формування

Адаптер валідує UTF-8, керуючі символи Unicode, межі, довіру та ліміт MaxTextCodeUnits запиту з жорсткою стелею тексту в 1 048 576 одиниць UTF-16; додаткові символи витрачають дві одиниці

Порожня сторінка завершується успішно з порожнім масивом результатів; збій очищає часткові результати, а публікація пошукового PDF зберігає наявну атомарну транзакційну поведінку сторінок

Виклики на одному рушії серіалізуються; очікування блокування рушія перевіряє скасування та дедлайн розпізнавання кожні 25 мілісекунд

Нативні колбеки перевіряють скасування та дедлайни до і після виявлення, класифікації та кожного розпізнаного рядка; окремий виклик ONNX-виводу не можна примусово перервати, тож скасування може повернутися після завершення поточної стадії

Ліміти входу та тексту обмежують виділення пам'яті адаптера та прийнятий вивід, але не накладають жорсткої межі на пам'ять моделей, виявлення, фрагментів чи виведення

Збирання та ABI

Native/RapidOCR містить місток C++, сумісний розпізнавач моделей, версійований C-заголовок, визначення експортів і проєкт CMake; підготуйте сумісні процесорні мережеві джерела, що відкривають DbNet, AngleNet і OcrUtils, плюс відповідні бібліотеки ONNX Runtime та OpenCV

Використовуйте Windows MSVC з C++17, Windows SDK і CMake 3.20 або новіший; типове збирання використовує статичну release CRT, яка має збігатися з підготовленими бібліотеками

& 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 має містити OnnxRuntimeConfig.cmake, а OpenCVDirectory — вказувати на конфігурацію бібліотек для конкретної архітектури; оберіть Win32 і відповідні бібліотеки x86 для 32-бітового DLL

Помічник збирання пише Lib/Native/RapidOCR/<Platform>/HotPDFRapidOCR.dll; -BuildDirectory, -OutputDirectory і -Generator можуть перевизначити розміщення збирання та генератор Visual Studio

Місток перехоплює винятки C++ і відкриває ABI версії 1 через HPDFRapidOCRAbiVersion, HPDFRapidOCRCreate, HPDFRapidOCRRecognize і HPDFRapidOCRDestroy; усі вони використовують cdecl, 32-бітові значення статусів та явні довжини байтів UTF-8

ABI версії 1 також визначає опційний експорт HPDFRapidOCRSetReadingDirection; адаптер вимагає його лише за увімкненого RightToLeft, тож наявні DLL досі можуть обслуговувати запити зліва направо

Колбеки позичають свій текст лише на час виклику; адаптер копіює валідований текст перед поверненням, а деструктор рушія знищує моделі перед вивантаженням DLL

Валідація

З Python-пакетом onnx і нативною збіркою BUILD_TESTING запустіть python tools/test_rapidocr_detector.py <build>/Release/NativeDetectorTests.exe, щоб перевірити крізь ABI DLL коректний порожній вивід, недійсні ранги тензорів, канали та типи, неспівпадіння просторових розмірів і недійсні ймовірності; кілька шляхів ранера можуть валідувати обидві архітектури за один виклик

Додайте -RapidOCRLanguageModelDirectory та один або обидва параметри нативної DLL-бібліотеки до ранера адаптерів Delphi чи FPC, щоб валідувати всі встановлені пресети на зразках китайської, російської, японської, корейської, поширених латинських мов, арабської та гінді; російська та традиційна китайська також проходять збереження пошукового PDF, перезавантаження, витягання тексту та порівняння пікселів

Ранери адаптерів Delphi та FPC перевіряють постійний час життя моделей, компонування рядків BGR, символи Unicode та додаткові, перевірки ABI, недійсні результати, бюджети, кооперативне скасування, серіалізоване очікування блокування та очищення

Подайте -RapidOCRNativeWin32Library, -RapidOCRNativeWin64Library і -RapidOCRNativeModelDirectory до Tests/Delphi/Run-TesseractRecognitionTests.ps1 або Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1 заради справжньої валідації моделей, порожніх сторінок, обробки пошкоджених моделей, розпізнавання англійської та китайської і циклів пошукового PDF з незмінними відрендереними пікселями

Дивіться Пошукові шари тексту OCR, щоб дізнатися про рендеринг сторінок, відображення тексту PDF у Unicode, групування за необов'язковим вмістом та обмеження конформності