Адаптер локальных моделей RapidOCR

Для кэшированного внутрипроцессного ONNX-вывода используйте адаптер нативной DLL RapidOCR с HPDFCreateRapidOCRDLLOCREngine и THPDFRapidOCRDLLOptions

Нативный адаптер предоставляет пресеты THPDFRapidOCRDLLOptions.ForLanguage для упрощённого и традиционного китайского, английского, латинских языков, японского, корейского, кириллических языков, включая русский, арабского и деванагари

HPDFRapidOCRRecognition предоставляет процессный адаптер для Windows, реализующий IHPDFOCREngine в сборках Delphi, C++Builder и FPC/Lazarus Win32 и Win64

Подготовьте Python с пакетами rapidocr и onnxruntime, поставляемый мост tools/OCR/rapidocr_tsv.py и совместимые локальные ONNX-модели; адаптер сам не устанавливает пакеты и не скачивает модели, словари или шрифты

Python выполняется в отдельном скрытом процессе, поэтому его архитектура может отличаться от архитектуры вызывающего приложения; пакет ONNX Runtime должен соответствовать архитектуре самого Python

Перегрузки фабрики

function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
  ModelDirectory: string; TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateRapidOCREngine(const PythonExecutable, BridgeScript,
  ModelDirectory: string; const Options: THPDFRapidOCROptions): IHPDFOCREngine; overload;

Исходная перегрузка с таймаутом остаётся совместимой с существующим протоколом моста и использует три стандартных имени файлов моделей PP-OCRv4; она проверяет пути исполняемого файла, скрипта и каталога при создании, а доступность моделей — в рабочем процессе

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

Относительные пути моделей, словарей и шрифтов разрешаются относительно ModelDirectory; абсолютные пути могут указывать на отдельно подготовленные файлы

Используйте модели, совместимые с конвейером RapidOCR из детекции, классификации и CTC-распознавания; модель из другого OCR-конвейера может требовать иной предобработки, и выбирать её только из-за формата ONNX нельзя

Выбор моделей по языку

Процессный адаптер Python по-прежнему использует явные пути из THPDFRapidOCROptions; ForLanguage принадлежит записи опций нативной DLL и не является методом Python-адаптера

Подготовьте локальные языковые модели и словари с помощью tools/Install-RapidOCRModels.ps1 -Destination C:/OCR/models -Language ch,cyrillic или выберите -Language All для всех девяти языковых профилей

Помощник проверяет зафиксированные SHA256-хэши и кладёт каждый распознаватель в <profile>/recognition.onnx рядом с соответствующим <profile>/dictionary.txt; распознавание во время выполнения остаётся офлайн, без автоматических загрузок

Для русского возьмите cyrillic/recognition.onnx и cyrillic/dictionary.txt; упрощённый китайский использует профиль ch, традиционный — chinese_cht

Models := THPDFRapidOCROptions.Default;
Models.DetectionModel := 'ch_PP-OCRv3_det_infer.onnx';
Models.RecognitionModel := 'cyrillic/recognition.onnx';
Models.CharacterDictionary := 'cyrillic/dictionary.txt';
Models.ClassificationModel := 'ch_ppocr_mobile_v2.0_cls_infer.onnx';

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

Опции и значения по умолчанию

THPDFRapidOCROptions = record
  DetectionModel: string;
  RecognitionModel: string;
  ClassificationModel: string;
  CharacterDictionary: string;
  FontPath: string;
  UseAngleClassifier: Boolean;
  IntraOpThreads: Integer;
  InterOpThreads: Integer;
  MaxPixels: Integer;
  TimeoutMilliseconds: Cardinal;
  class function Default: THPDFRapidOCROptions; static;
end;

Инициализируйте запись через THPDFRapidOCROptions.Default, прежде чем переопределять поля

ПолеПо умолчаниюЗначение
DetectionModelch_PP-OCRv4_det_mobile.onnxЛокальная модель детекции
RecognitionModelch_PP-OCRv4_rec_mobile.onnxЛокальная модель распознавания
ClassificationModelch_ppocr_mobile_v2.0_cls_mobile.onnxНужна только при включённой классификации наклона
CharacterDictionaryПустоИспользуется встроенная в модель распознавания символьная метадата; если модели её не хватает, подключите локальный словарь
FontPathПустоРазрешается в %WINDIR%\Fonts\arial.ttf для контейнера результатов RapidOCR
UseAngleClassifierTrueВключает классификацию наклона текста; когда выключена, модель классификации не требуется и не передаётся
IntraOpThreads1Внутриоперационные потоки ONNX, от 1 до 64, с потолком по числу логических CPU рабочего процесса
InterOpThreads1Межоперационные потоки ONNX с теми же ограничениями
MaxPixels16777216Бюджет входных пикселей, от 1 до 67,108,864
TimeoutMilliseconds60000Суммарный дедлайн запроса, от 1 до 3,600,000 миллисекунд

Мост явно выбирает CPU-бэкенд ONNX Runtime для всех стадий и запрещает автоматические загрузки; если встроенного символьного словаря в модели нет, требуется подготовленный локальный CharacterDictionary

Пример с явно выбранными моделями

uses SysUtils, HPDFDoc, HPDFRapidOCRRecognition;

procedure AddLocalRapidOCRText(PDF: THotPDF);
var
  Engine: IHPDFOCREngine;
  Models: THPDFRapidOCROptions;
  Layer: THPDFOCRTextLayerOptions;
  Info: THPDFOCRTextLayerInfo;
begin
  Models := THPDFRapidOCROptions.Default;
  Models.DetectionModel := 'PP-OCRv6_det_small.onnx';
  Models.RecognitionModel := 'PP-OCRv6_rec_small.onnx';
  Models.UseAngleClassifier := False;
  Engine := HPDFCreateRapidOCREngine(
    'C:\OCR\Python\python.exe',
    'C:\HotPDF\tools\OCR\rapidocr_tsv.py',
    'C:\OCR\models', Models);
  Layer := THPDFOCRTextLayerOptions.Default;
  if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Layer, Info) then
    raise Exception.Create('Local RapidOCR text layer was not added');
end;

Результаты, бюджеты и отмена

Каждый запрос сериализует одолженный bitmap в приватный временный каталог, запускает локальный Python-воркер и по завершении запроса прибирает его дескрипторы процесса и временные файлы

Перегрузка с опциями проверяет MaxPixels до сериализации bitmap; рабочий процесс также проверяет входные размеры перед загрузкой моделей и получает лимиты MaxWords и MaxTextCodeUnits запроса

Мост запрашивает координаты символов и валидирует геометрию, уверенность и текстовое покрытие каждого символа, а затем выдаёт каждую полную распознанную строку с её исходными внутренними пробелами и пунктуацией, охватывающими границами в пикселях исходного изображения и средней уверенностью в диапазоне от 0 до 1

Каждая выданная строка занимает один слот MaxWords; внутренние пробелы идут в зачёт MaxTextCodeUnits, а публикация строки целиком избавляет текстовый слой от путаницы между межбуквенным и межсловным интервалом

Интервалы сохраняются из текста строки распознавателя; текст, который детекция разбила на отдельные боксы, по-прежнему зависит от пространственного вывода межсловных зазоров, а внешние PDF-ридеры при извлечении могут восстанавливать или схлопывать повторяющиеся пробелы

Дополнительные символы расходуют по две единицы UTF-16; невалидные координаты, уверенность, управляющие символы или исчерпанные бюджеты приводят распознавание к сбою и очищают частичные результаты

Пустая страница завершается успешно с пустым массивом слов; нативная базовая линия не передаётся, поэтому текстовый слой использует свой обычный геометрический fallback

Отмена, таймаут и размеры вывода опрашиваются каждые 25 миллисекунд; воркер и дочерние процессы интерпретатора удерживаются Windows job-объектом, а завершение ждёт до пяти дополнительных секунд на очистку процессов

ApplyLoadedOCRTextLayer атомарно публикует все выбранные страницы после успешного распознавания

Вывод TSV ограничен 64 MiB, диагностический вывод — 1 MiB; бюджеты входа и вывода не накладывают жёсткого потолка на память моделей ONNX или инференса

Инициализация моделей происходит в новом Python-процессе для каждого запроса и входит в дедлайн

Валидация

Общие раннеры адаптеров для Delphi и FPC покрывают preflight моделей, пользовательские пути, опциональную классификацию, Unicode, бюджеты, сбой воркера, отмену и таймаут; их опциональные RapidOCR-параметры включают настоящий прогон распознавания и проверку полного цикла PDF с поддержкой поиска

Используйте Tests/Delphi/Run-TesseractRecognitionTests.ps1 или Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1 с параметрами -RapidOCRPython, -RapidOCRModelDirectory, -RapidOCRDetectionModel и -RapidOCRRecognitionModel

Параметры рендеринга, отображение Unicode-текста в PDF, группировку в optional content и ограничения соответствия смотрите в разделе Текстовые слои OCR с поддержкой поиска