検索可能な OCR テキストレイヤー

HotPDF は、アプリケーションが供給した OCR エンジン用に選択されたロード済みページをレンダリングし、認識された各単語に揃えた検索可能な非表示 Unicode テキストを原子的に追加できます

SearchableOCR コンソールデモは、そのまま動かせるワークフローを提供します。--create-sample で 3 ページの画像のみサンプルを生成し、組み込み OCR、RapidOCR、Tesseract DLL / CLI のいずれかの認識方式を選び、ページを指定して信頼度とリソース上限を設定すれば、変換統計付きの検索可能なコピーを保存できます

エンジン統合

アプリケーションで利用可能な任意の同期 OCR プロバイダーで IHPDFOCREngine を実装します

エンジンは、借用された TBitmap、要求された DPI、正規化されたページ回転、メディアボックス座標、残りの単語と UTF-16 予算、有効なキャンセルトークンを THPDFOCRRequest で受け取ります

単語ボックスとオプションのベースラインは左上ビットマップピクセル座標を使用し、エンジンは Recognize が戻った後に借用されたビットマップを保持または解放してはなりません

幾何と検索テキスト

Version 2.754.0 では、Windows で IHPDFOCREngine を返す明示的な Tesseract / RapidOCR ファクトリが追加されました。エンジンを指定しないオーバーロードは従来どおり内蔵エンジンを選択します

選択したエンジンは、アダプタを作成する前にローカルでインストールとセットアップを行い、そのアダプタを ApplyLoadedOCRTextLayer のエンジンオーバーロードに渡してください。実行ファイル・Python パッケージ・OCR モデルは省略可能な外部依存であり、HotPDF には同梱されていません

Tesseract

オプションの ネイティブ Tesseract DLL アダプタは、HPDFCreateTesseractDLLOCREngine と THPDFTesseractOptions によって、設定可能なページセグメンテーションとエンジンモード、多言語認識、ネイティブの単語ベースラインを追加します

function HPDFCreateTesseractOCREngine(const ExecutablePath,
  TessDataDirectory, Language: string;
  TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateTesseractOCREngine(const ExecutablePath,
  TessDataDirectory, Language: string;
  const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;

宣言は HPDFTesseractRecognition にあります。TSV 出力に対応した Tesseract 実行ファイルと、要求された言語モデル(chi_sim なら chi_sim.traineddata など)を含むデータディレクトリを用意してください

options オーバーロードは、明示的なページセグメンテーション、認識エンジンモード、タイムアウト、入力ピクセル上限を備えた THPDFTesseractOptions.Default を受け付けます。入力レイアウトに合わせて tpsSingleLine、tpsSingleWord、tpsSparseText を選択してください。具体的な使い方は Tesseract OCR Adapters を参照してください

この例では、実行ファイルとデータがすでに示されたパスにインストールされており、PDF が読み込み済みの THotPDF インスタンスであることを前提とします

uses SysUtils, HPDFDoc, HPDFTesseractRecognition;

procedure AddTesseractText(PDF: THotPDF);
var
  Engine: IHPDFOCREngine;
  Options: THPDFOCRTextLayerOptions;
  Info: THPDFOCRTextLayerInfo;
begin
  Engine := HPDFCreateTesseractOCREngine(
    'C:\OCR\Tesseract\tesseract.exe',
    'C:\OCR\Tesseract\tessdata', 'chi_sim', 60000);
  Options := THPDFOCRTextLayerOptions.Default;
  if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Options, Info) then
    raise Exception.Create('OCR text layer was not added');
end;

RapidOCR

ネイティブ RapidOCR DLL アダプタは、HPDFCreateRapidOCRDLLOCREngine によって、永続的なインプロセス CPU ONNX モデルでメモリスナップショットを認識します。Delphi、C++Builder、Windows 版 FPC/Lazarus ビルドで、省略可能な角度分類と協調的キャンセルに対応します

RapidOCR ローカルモデルアダプタも、明示的な ONNX モデルパス・省略可能な角度分類・ローカル文字辞書とフォント・CPU スレッド上限・入力ピクセル予算のための THPDFRapidOCROptions オーバーロードを提供します。Delphi、C++Builder、FPC/Lazarus ビルドで利用できます

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

宣言は HPDFRapidOCRRecognition にあります。rapidocr と onnxruntime を備えた Python、提供される tools/OCR/rapidocr_tsv.py ブリッジ、およびこの 3 つのローカルモデルを用意してください

ブリッジは、RapidOCR の結果コンテナのために %WINDIR%\Fonts\arial.ttf も要求し、自動ダウンロードを無効化し、設定された実行プールごとに ONNX スレッドを 1 つ使います。モデル・パッケージ・ローカルフォントが欠けていると、認識は失敗します

現在のブリッジは簡体字中国語のモデル設定を使い、全角 / 半角の置き換えを行わずに、認識された句読点をそのまま保持します

uses SysUtils, HPDFDoc, HPDFRapidOCRRecognition;

procedure AddRapidOCRText(PDF: THotPDF);
var
  Engine: IHPDFOCREngine;
  Options: THPDFOCRTextLayerOptions;
  Info: THPDFOCRTextLayerInfo;
begin
  Engine := HPDFCreateRapidOCREngine(
    'C:\OCR\Python\python.exe',
    'C:\HotPDF\tools\OCR\rapidocr_tsv.py',
    'C:\OCR\RapidOCR\models', 60000);
  Options := THPDFOCRTextLayerOptions.Default;
  if not PDF.ApplyLoadedOCRTextLayer([0], Engine, Options, Info) then
    raise Exception.Create('OCR text layer was not added');
end;

どちらのファクトリも、既存の実行ファイル / データパスを検証し、1 〜 3,600,000 ミリ秒のタイムアウト(既定値 60,000)を受け入れます。無効な設定は EArgumentException を発生させます

共有アダプタは、引用符付きパスと制限された継承ハンドルで隠しローカルプロセスを起動し、25 ミリ秒ごとにキャンセル・タイムアウト・出力サイズをポーリングします。失敗時には一時ファイルの後始末の前にプロセスを終了します

TSV 出力は 64 MiB、診断ファイルの出力は 1 MiB に制限され、返される診断は 4,096 文字に切り詰められます。認識された単語は、リクエストの単語数と UTF-16 の予算、および有効なビットマップ境界にも収まらなければなりません

TSV 認識出力は有効な UTF-8 でなければならず、認識された単語内に NUL バイトや C0 / C1 制御文字を含んではなりません。不正な出力は、有効な単語がエラーより前にあったとしても、認識リクエスト全体を失敗させます

これらは出力とリクエストの上限であり、外部エンジンのメモリ使用量に対するハードリミットではありません。キャンセルやエンジンの失敗は、部分的なページを公開せずに、テキストレイヤーのステータス経由で返ります

境界、キャンセル、原子性

ローカルの RapidOCR 3.8.4 ベースラインは、固定した 5 つの中国語スキャン領域(300 DPI の明瞭な領域 2 つと 150 DPI の低解像度ストレス領域 3 つ)に対する全 15 反復に合格しました。現在のリファレンストランスクリプトと比較して、文字エラー率 5% 以内・削除率 2% 以内と評価されています

全反復が読み取り順チェック・合計 5,190 件の単語 / 文字座標チェック・72 DPI での可視ピクセル一致に合格しました。2 つの明瞭な領域は、これらのリファレンスに対して文字エラーゼロでした

2 回の AI ビジュアルレビューは中国語のテキストと数値について一致していますが、ラスタ内の一部の句読点コードポイントは依然として曖昧で、人間の判定は保留中です。句読点の差異も誤りとして数えられます。これらの結果はコーパスのエビデンスであり、一般的な精度保証ではありません

オプションコンテンツグループ化

HotPDF はレンダラのページ変換を逆算するため、0 / 90 / 180 / 270 度で回転したページでも単語のベースラインが揃ったままになります

採用された各単語は、テキストレンダリングモード 3 Tr・調整済みの水平テキストスケール・回転を考慮したテキストマトリックスで書き込まれます。ページのラスタは変えずに、選択可能なコンテンツ順を保ちます

共有される Type 0 Identity-H フォントは、Unicode スカラーに上限付きのドキュメントローカル CID を割り当て、完全な ToUnicode マップを書き込みます。追加文字の UTF-16 サロゲート Target も含みます

同じベースライン上で隣り合うラテン文字およびキリル文字の単語は、ジオメトリが単語の間隔を示していれば、明示的な Unicode 空白を受け取ります。隣接する CJK 単語は、空白を挿入されずに元のテキストのまま保たれます

スキャンした PDF の処理

Demo/Delphi/SearchableOCR/SearchableOCR.dpr のコンソール例は、スキャンされた PDF を読み込み、明示的なローカル言語プロファイルでネイティブ RapidOCR を実行し、対象となるすべてのページに不可視の Unicode テキストを公開して、ビューアを開かずに新しい PDF を保存します

SearchableOCR.exe scan.pdf searchable.pdf --dll C:\HotPDF\Lib\Native\RapidOCR\Win64\HotPDFRapidOCR.dll --models C:\HotPDF\Lib\Native\RapidOCR\Models --language ru --dpi 300

簡体字中国語には --language ch を、繁体字中国語には --language chinese_cht を指定します。DLL は実行ファイルのアーキテクチャと一致しなければならず、選択したローカルモデルパッケージがインストールされている必要があります

この例は既存の出力ファイルの上書きを拒否します。マーク済みの HotPDF OCR レイヤーを更新する場合には --replace-ocr を受け付けます

Windows FPC では、JPEG スキャンのデコード結果が認識の前に最終的なビットマップのピクセルフォーマットへ描画されるため、LCL のフォーマット変換でもデコード済みの画像が保持されます

既存の OCR レイヤーの更新

THPDFOCRTextLayerOptions.ReplaceExistingOCRTextLayer を True に設定すると、認識されたページ上の、過去に生成されたマーク済み HotPDF OCR ストリームを新しいテキストと同じトランザクションで置き換えます

これはマーク済みのページでのみ SkipPagesWithText をバイパスし、保存と再読み込みの後でも機能します。THPDFOCRTextLayerInfo.ReplacedPageCount が置き換えられたページ数を報告します

認識が失敗したページや、受け入れられた単語のないページでは、古いテキストレイヤーが保持されます。サードパーティ OCR や以前の HotPDF リリースが生成したレイヤーを含む、マークされていないストリームは保持されます

置き換えでは古い OCR コンテンツストリームを切り離しますが、他の場所からまだ参照されている可能性のあるフォントリソースやオプショナルコンテンツグループは削除しません。インクリメンタル保存では、以前のリビジョンの置き換えられたオブジェクトが残ることがあります

既定では、スキャン画像上のページ番号やヘッダーを含め、抽出可能なテキストのあるページはすべてスキップされます。SkipPagesWithText を無効にするとページ全体が認識されますが、既存のネイティブテキストが重複することがあるため、混在ページの処理はアプリケーションが選択する必要があります

適合ノート

THPDFOCRTextLayerOptions.Default は 300 DPI の認識を有効化し、既にテキストを持つページをスキップして、ページ数・ピクセル数・単語数・UTF-16 単位数・生成コンテンツバイト数に上限を設定します

HotPDF はエンジンの結果をすべて検証し、1 つのコピーオンライトグラフトランザクションを開始する前にページコンテンツ全体を構築します。そのため、エンジンの失敗・無効なジオメトリ・予算の枯渇・キャンセル・コミットエラーが発生しても、読み込まれたオブジェクトグラフは変更されません

空のページインデックス配列はすべての読み込み済みページを選択します。重複したページインデックスは、最初に出現した順で 1 回だけ認識されます

MaxTotalWords は受け取ったすべての単語を数えます。低信頼度などで後から破棄される単語も含まれ、各ページの要求には残りの許容量だけが渡されます

単語または UTF-16 予算が枯渇してまだ対象ページが残っている場合、そのページのレンダリングや認識の前に otlsBudgetExceeded が返り、計画されたテキストレイヤーは 1 つも公開されません。既存テキストがあるためにスキップされたページは、残りの認識予算を消費しません

オプショナルコンテンツのグループ化

生成されたすべてのテキストを、各ページの Resources/Properties ディクショナリを通じて 1 つの名前付きレイヤーに束縛するには UseOptionalContentGroup を設定します

このオプションは PDF 1.5 を要求し、StrictVersionLock に従います。既定では、最大限の互換性のために、不可視テキストをオプショナルコンテンツグループの外に置きます

適合性に関する注意

生成される検索可能レイヤーは、意図的に埋め込みなしの合成フォントを使用します。レンダリングモード 3 はグリフを描画しないためです

この API 単体では PDF/A 適合の OCR 出力は生成されません。PDF/A ワークフローでは、埋め込みフォントのテキストレイヤー経路を使い、公開前に要求された適合性検証を実行してください

主要 API

プログレッシブレンダリングとキャンセル · ExtractLoadedPageText メソッド