Tesseract OCR アダプタ
HPDFTesseractRecognition は、検索可能な OCR テキストレイヤー向けに IHPDFOCREngine を実装する Windows エンジンをオプションとして提供します
ネイティブ DLL ファクトリ
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string): IHPDFOCREngine; overload;
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
Tesseract 5 互換の C API を公開する既存の Tesseract DLL、tessdata ディレクトリ、および eng、chi_sim、chi_sim+eng のような ASCII 言語識別子かその組み合わせを用意してください
DLL のアーキテクチャはアプリケーションに一致させます。Win32 アプリケーションは 32 ビット DLL を、Win64 アプリケーションは 64 ビット DLL をロードします
必要な依存 DLL は、選択したライブラリの隣か標準の Windows ローダーディレクトリに置いてください。アダプタはカレントディレクトリやプロセスの検索パスを変更せずに、指定されたライブラリパスをロードします
ファクトリは、要求されたすべての .traineddata ファイルを検証し、ライブラリをロードし、必要なエクスポートを解決してから返ります。不正なパス・モデル・オプション、欠けたエクスポート、アーキテクチャの不一致、利用できない依存 DLL は例外を発生させます
OCR ランタイムもモデルも同梱されず、自動ダウンロードも行われません
どちらのファクトリも、Delphi / C++Builder ビルドに加えて Windows 版 FPC/Lazarus パッケージでも利用できます。HPDFTesseractRecognition を使う前に、ターゲットアーキテクチャ向けに Lib/FPC/HotPDFLaz.lpk を再ビルドしてください
ネイティブ FPC アダプタは、scanline 経由で書き込まれたピクセルを含む現在の LCL raw image を読み取り、システム ANSI コードページに依存せずに Unicode 単語を保持します
オプション
THPDFTesseractOptions = record
PageSegMode: THPDFTesseractPageSegMode;
EngineMode: THPDFTesseractEngineMode;
TimeoutMilliseconds: Cardinal;
MaxPixels: Integer;
class function Default: THPDFTesseractOptions; static;
end;
フィールドを上書きする前に THPDFTesseractOptions.Default を呼び出してください。同じ record で、ネイティブ DLL ファクトリとローカル CLI の options オーバーロードの両方を設定できます
| Field | Default | Meaning |
|---|---|---|
PageSegMode | tpsAuto | 向き検出なしの自動ページセグメンテーション |
EngineMode | temDefault | 選択した言語モデルが対応するエンジンモード |
TimeoutMilliseconds | 60000 | リクエストのデッドライン。1〜3,600,000 ミリ秒。DLL はキャンセルに協調的に応答し、CLI ワーカーはタイムアウト時に強制終了されます |
MaxPixels | 16777216 | 入力ピクセル予算。1〜67,108,864 ピクセルで設定可能 |
THPDFTesseractPageSegMode = (
tpsOSDOnly, tpsAutoOSD, tpsAutoOnly, tpsAuto, tpsSingleColumn,
tpsSingleBlockVertical, tpsSingleBlock, tpsSingleLine, tpsSingleWord,
tpsCircleWord, tpsSingleCharacter, tpsSparseText, tpsSparseTextOSD,
tpsRawLine);
THPDFTesseractEngineMode = (
temLegacyOnly, temLSTMOnly, temLegacyAndLSTM, temDefault);
tpsOSDOnly と tpsAutoOnly は単語認識を行わないためアダプタに拒否されます。tpsAutoOSD と tpsSparseTextOSD はさらに osd.traineddata を必要とします
1 行のテキストには tpsSingleLine、均一なブロックには tpsSingleBlock、散在するテキストには tpsSparseText を使用します。これらのモードはスキャンの perspective 歪みを補正したり、一般的なレイアウト保証を提供したりしません
temLSTMOnly は LSTM モデルを、legacy モードは対応する legacy モデル構成要素を必要とします。未対応の組み合わせはネイティブ初期化時に失敗します
検索可能 PDF の例
PDF は既に読み込み済みで、DLL・依存 DLL・言語モデルが示された場所にインストールされている必要があります
uses SysUtils, HPDFDoc, HPDFTesseractRecognition;
procedure AddNativeOCRText(PDF: THotPDF);
var
Engine: IHPDFOCREngine;
NativeOptions: THPDFTesseractOptions;
LayerOptions: THPDFOCRTextLayerOptions;
Info: THPDFOCRTextLayerInfo;
begin
NativeOptions := THPDFTesseractOptions.Default;
NativeOptions.EngineMode := temLSTMOnly;
NativeOptions.PageSegMode := tpsAuto;
Engine := HPDFCreateTesseractDLLOCREngine(
'C:\OCR\libtesseract-5.dll', 'C:\OCR\tessdata',
'chi_sim+eng', NativeOptions);
LayerOptions := THPDFOCRTextLayerOptions.Default;
if not PDF.ApplyLoadedOCRTextLayer([0], Engine, LayerOptions, Info) then
raise Exception.Create(string(Info.Diagnostic));
end;
結果と所有権
アダプタは借用したビットマップをトップダウンのグレースケールバッファにコピーし、要求された DPI を渡して、リクエストローカルのネイティブ API インスタンスで認識します
単語はネイティブの読み順・検証済み UTF-8 Unicode テキスト・左上原点のピクセル境界・0〜100 から 0〜1 にスケールされた confidence を保持します。サロゲート文字は UTF-16 単位を 2 つ消費します
利用可能な単語ベースラインは両端点の情報がそのまま渡されます。ベースラインが利用できない場合は、既存のテキストレイヤーのジオメトリフォールバックが適用されます
主に垂直方向のベースラインでは、ネイティブアダプタは単語ボックスの幅を TextHeightPixels として使います。水平方向のベースラインでは読み方向が逆でもボックスの高さを使うため、縦書き単語の長さがフォントサイズになることはありません
これは主軸による推定です。軸平行の単語ボックスとベースラインだけでは、任意の傾き角での正確なテキスト高さを復元できません
空のページは空の単語配列で成功します。不正な UTF-8・埋め込み制御文字・不正なジオメトリや confidence・単語またはテキスト予算の枯渇・キャンセル・認識失敗は False を返し、部分的な単語をすべてクリアして診断情報を設定します
リクエストごとに、イテレータ・割り当てられたネイティブ文字列・モニター・API インスタンスを解放します。アダプタを解放すると、ライブラリ参照のロードも解除されます
上限とキャンセル
入力の各寸法は 32,767 ピクセル以下で MaxPixels に収まらなければなりません。認識テキストはリクエストの MaxTextCodeUnits 予算とアダプタの 1,048,576 UTF-16 単位上限に、単語数は MaxWords に収まる必要があります
アダプタはビットマップ変換中と結果イテレーション中にキャンセルと経過時間を確認し、認識中は残りデッドライン付きのネイティブモニターとキャンセルコールバックを供給します
ネイティブのキャンセルは協調的です。Tesseract のモニターは単語認識をカバーしますが、初期化やレイアウト解析の各ステップをすべて中断するわけではありません。要求されたキャンセルや期限切れは、これらの呼び出しが完了した後に報告されることがあります
ピクセルと出力の予算は、ネイティブライブラリのモデルや認識メモリ使用量に対するハード上限ではありません。個別に終了できるワーカーが必要なアプリケーションでは、プロセスアダプタを使用してください
ApplyLoadedOCRTextLayer はすべての結果を検証し、選択された全ページを原子的に公開します。そのためアダプタが失敗しても、読み込まれたドキュメントは変更されません
DLL アダプタは不正な UTF-8 を拒否し、デコード済み単語テキストの前後を取り除き、結果を返す前に残りの C0、DEL、C1 制御文字を拒否します。不正なテキストは PDF テキストレイヤーに黙って欠落するのではなく、リクエスト自体を失敗させます
ローカル CLI ファクトリ
function HPDFCreateTesseractOCREngine(const ExecutablePath,
TessDataDirectory, Language: string;
TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateTesseractOCREngine(const ExecutablePath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
options オーバーロードは PageSegMode を --psm に、EngineMode を --oem に渡し、設定されたタイムアウトを使い、借用ビットマップの保存やワーカー起動の前に MaxPixels をチェックします
既存のタイムアウトオーバーロードは、自動ページセグメンテーションと実行ファイルが選択したエンジンモードのままで、新しいアダプタ側のピクセル上限を課しません。明示的な入力上限が必要なときは options オーバーロードを使ってください
どちらのオーバーロードも、要求 DPI・TSV 出力・制限された継承ハンドル・キャンセルポーリング・失敗時のワーカー終了を保持します。CLI にはネイティブのベースライン情報がなく、TSV 出力は 64 MiB、診断ファイル出力は 1 MiB に制限されます
不正なセグメンテーションモード、エンジンモード、タイムアウト、ピクセル上限は、設定されたエンジンの作成時に EArgumentException を発生させます。モデルの存在(向きモードに必要な osd.traineddata を含む)やモデル / エンジンの互換性は、認識時に実行ファイルがチェックします
var
CLIOptions: THPDFTesseractOptions;
Engine: IHPDFOCREngine;
begin
CLIOptions := THPDFTesseractOptions.Default;
CLIOptions.PageSegMode := tpsSingleLine;
CLIOptions.EngineMode := temLSTMOnly;
CLIOptions.MaxPixels := 8000000;
Engine := HPDFCreateTesseractOCREngine(
'C:\OCR\tesseract.exe', 'C:\OCR\tessdata', 'eng', CLIOptions);
end;
単語が 1 つだけなら tpsSingleWord、散在するテキストなら tpsSparseText、縦書き 1 ブロックなら適切な縦書きモデルと組み合わせて tpsSingleBlockVertical を使ってください。ファクトリがページをクロップしたりモデルを自動選択したりすることはありません
CLI アダプタは UTF-8 を厳密に検証し、認識された単語内の NUL バイトと C0 / C1 制御文字を拒否します。それ以外で有効な単語の後に不正な出力が続いた場合は、すべての結果をクリアします
CLI の例・レンダリングオプション・オプショナルコンテンツのグループ化・適合上の制限については、検索可能な OCR テキストレイヤーを参照してください