Адаптер локальных моделей 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, прежде чем переопределять поля
| Поле | По умолчанию | Значение |
|---|---|---|
DetectionModel | ch_PP-OCRv4_det_mobile.onnx | Локальная модель детекции |
RecognitionModel | ch_PP-OCRv4_rec_mobile.onnx | Локальная модель распознавания |
ClassificationModel | ch_ppocr_mobile_v2.0_cls_mobile.onnx | Нужна только при включённой классификации наклона |
CharacterDictionary | Пусто | Используется встроенная в модель распознавания символьная метадата; если модели её не хватает, подключите локальный словарь |
FontPath | Пусто | Разрешается в %WINDIR%\Fonts\arial.ttf для контейнера результатов RapidOCR |
UseAngleClassifier | True | Включает классификацию наклона текста; когда выключена, модель классификации не требуется и не передаётся |
IntraOpThreads | 1 | Внутриоперационные потоки ONNX, от 1 до 64, с потолком по числу логических CPU рабочего процесса |
InterOpThreads | 1 | Межоперационные потоки ONNX с теми же ограничениями |
MaxPixels | 16777216 | Бюджет входных пикселей, от 1 до 67,108,864 |
TimeoutMilliseconds | 60000 | Суммарный дедлайн запроса, от 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 с поддержкой поиска