RapidOCR 本地模型适配器

需要缓存的进程内 ONNX 推理时,请配合 HPDFCreateRapidOCRDLLOCREngine 与 THPDFRapidOCRDLLOptions 使用RapidOCR 原生 DLL 适配器

原生适配器为简体和繁体中文、英语、拉丁语系、日语、韩语、包括俄语在内的西里尔语系、阿拉伯语系以及天城文语系提供 THPDFRapidOCRDLLOptions.ForLanguage 预设

HPDFRapidOCRRecognition 提供一个 Windows 进程适配器,在 Delphi、C++Builder 和 FPC/Lazarus 的 Win32 与 Win64 构建中实现 IHPDFOCREngine

请为 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启用文本角度分类;禁用时不需要也不会传入任何分类模型
IntraOpThreads1ONNX 操作内线程,取值 1 到 64,上限为工作进程的逻辑 CPU 数
InterOpThreads1ONNX 操作间线程,限制相同
MaxPixels16777216输入像素预算,取值 1 到 67,108,864
TimeoutMilliseconds60000请求总时限,取值 1 到 3,600,000 毫秒

桥接脚本为所有阶段显式选择 ONNX Runtime CPU 后端,并禁用自动下载;缺少内嵌字符字典时,必须提供本地 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;

结果、预算与取消

每个请求把借用的位图序列化到私有临时目录,启动一个本地 Python 工作进程,并在请求结束时清理它的进程句柄与临时文件

选项重载在位图序列化之前检查 MaxPixels;工作进程在加载模型之前也检查输入尺寸,并接收该请求的 MaxWords 与 MaxTextCodeUnits 限制

桥接脚本请求字符坐标,并校验每个字符的几何、置信度与文本覆盖,然后输出每一条完整的识别行,保留其原有的内部空格与标点,给出原始图像像素中的外包围框以及 0 到 1 之间的平均置信度

每条输出的行占用一个 MaxWords 名额;内部空格计入 MaxTextCodeUnits,按整行发布可避免文本层把字母间距误当成单词间距

空格保留自识别器的行文本;被检测拆分成多个框的文本仍依赖空间上的词间隙推断,外部 PDF 阅读器在提取时也可能重构或合并重复空格

补充字符占用两个 UTF-16 单元;无效的坐标、置信度、控制字符或预算耗尽都会使识别失败并清除部分结果

空页面以空单词数组成功返回;适配器不提供原生基线,文本层沿用既有的几何回退

取消、超时和输出大小每 25 毫秒轮询一次;Windows job 对象会包含工作进程及其解释器子进程,终止时最多再等五秒完成进程清理

识别成功后,ApplyLoadedOCRTextLayer 原子地发布所有选定页面

TSV 输出上限 64 MiB,诊断输出上限 1 MiB;输入与输出预算不会对 ONNX 模型或推理内存使用施加硬性上限

模型初始化在每个请求的新 Python 进程中进行,计入该时限

验证

共享的 Delphi 与 FPC 适配器运行器覆盖模型预检、自定义路径、可选分类、Unicode、预算、工作进程失败、取消和超时;其可选的 RapidOCR 参数用于启用真实识别与可搜索 PDF 往返检查

配合 -RapidOCRPython、-RapidOCRModelDirectory、-RapidOCRDetectionModel 和 -RapidOCRRecognitionModel 使用 Tests/Delphi/Run-TesseractRecognitionTests.ps1 或 Tests/Delphi/Run-TesseractFPCRecognitionTests.ps1

渲染选项、Unicode PDF 文本映射、可选内容分组和一致性限制见可搜索 OCR 文本层