RapidOCR.NETからIronOCRへの移行|IronOCR
このガイドでは、RapidOCR.NET (RapidOcrNet) から IronOCR への完全な移行パスについて説明します。これは、開発者がOCRパイプラインからONNXモデルファイル管理を排除する必要がある場合に役立ちます。パッケージの置き換え、コードの翻訳、および外部モデル依存が完全に削除された後の操作上の変更を説明します。
RapidOCR.NETからの移行理由
RapidOCR.NETは、モデル配布の問題がすでに解決されている管理された環境において、限られたユースケースに対して機能します。 これらの条件のいずれかが変化すると、ライブラリのアーキテクチャ上の制約がエンジニアリングコストとなります。
ONNXモデルファイルはデプロイメントの成果物であり、パッケージではありません。 RapidOCR.NETは、単一の文字が認識される前に、rec.onnx、および文字辞書という四つの外部ファイルを必要とします。 これらのファイルは NuGet パッケージには含まれていません。 これらは GitHub のリリースページに公開されており、手動でのダウンロードが必要で、コード内で明示的なパス設定が必要であり、ビルド時にコピーするためのカスタム MSBuild ルールが必要です。 新しい開発者、CIパイプライン、デプロイ環境のすべてが、その儀式を繰り返します。
**言語の切り替えは設定変更ではなく、ファイルの置き換えを意味します。**RapidOCR.NETで英語のOCRから中国語のOCRに変更するには、別の認識モデルと別の文字辞書をダウンロードし、エンジンインスタンスを再構築する必要があります。 スペイン語、フランス語、ドイツ語、ロシア語、アラビア語、およびその他100以上の言語については、RapidOCRのモデルカタログに利用可能なモデルが一切ありません。 複数の言語が混在する文書を処理する必要があるアプリケーションの場合、RapidOCR.NET内では未対応の言語に対しては有効な処理方法がありません。
**モデルバージョン更新には手動での作業が必要です。**上流の RapidOCR プロジェクトが改良されたモデル重みをリリースした場合、チームは新しいファイルをダウンロードし、すべての環境で置き換え、パスを検証し、再デプロイする必要があります。 これを自動的に処理するパッケージの復元手順はありません。 開発、ステージング、本番環境からなるマルチ環境構成では、その反映は毎回手動で行わなければなりません。
ONNXランタイムの依存性はプラットフォームの複雑性を増加させます。 RapidOCR.NETは、プラットフォーム固有のネイティブバイナリを含むMicrosoft.ML.OnnxRuntimeに依存しています。 CPU版とGPU版では、必要なパッケージが異なります。 linux/arm64用にビルドされたものとは異なるバイナリを必要とします。 各デプロイ先では、正しいランタイムバリアントが存在し、インストールされたモデルファイルと互換性があることを検証する必要があります。
**コールドスタート時のレイテンシとメモリ使用量は固定コストです。**起動時に3つのONNXモデルを読み込むには2~5秒かかり、処理中は300~500 MBのメモリを占有します。 このコストはOCRの処理量に関係なく発生するため、このライブラリは、起動時のオーバーヘッドがスループットに対して不釣り合いになるサーバーレス関数、軽量コンテナ、またはトラフィックの少ないサービスには適していません。
**商用サポートは提供されていません。**RapidOCR.NETは、Apache 2.0ライセンスの下で、1人のコミュニティ開発者によってメンテナンスされています。 運用上のインシデント(ONNX Runtimeのバージョン競合、特殊な画像形式での推論失敗、持続的な負荷下でのメモリ増加など)は、GitHubのイシューキューに報告されますが、対応のタイムラインは保証されず、SLAも適用されません。
基本的な問題
3つのONNXモデルファイルと文字辞書(いずれも個別にダウンロードし、すべてパスで指定して設定します):Plus:
// RapidOcrNet: 4 external files required before any OCR can execute
var engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = "./models/det.onnx", // ~3 MB — downloaded from GitHub
ClsModelPath = "./models/cls.onnx", // ~1 MB — downloaded from GitHub
RecModelPath = "./models/rec_en.onnx", // ~2-10 MB — language-specific download
KeysPath = "./models/en_keys.txt" // character dictionary — language-specific
});
IronOCRには、モデルファイルもパス設定もダウンロード手順も一切ありません:
// IronOCR: install the NuGet package, write one line
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read("document.jpg").Text;
IronOCR 対 RapidOCR.NET:機能比較
IronOCRとRapidOCR.NETは、基本的な画像OCR機能において重複しています。 周囲の懸念事項ごとに、そのギャップが浮き彫りになります。
| フィーチャー | RapidOCR.NET | IronOCR |
|---|---|---|
| NuGetのインストール | はい (RapidOcrNet) | はい (IronOcr) |
| 外部モデルファイルが必要 | はい(4ファイル、手動ダウンロード) | なし |
| パス構成が必要です | はい | なし |
| MSBuild のコピー ルールが必要です | はい | なし |
| NuGetインストール後すぐに動作します | なし | はい |
| ONNX Runtimeの依存関係 | はい(約30~50 MB) | なし |
| 対応言語 | ~5 (CJK + 英語のみ) | NuGet言語パック経由で125種類以上 |
| 言語の切り替え | ファイルの入れ替え + エンジンの再構築 | プロパティの代入 |
| 欧州言語のサポート | なし | はい(30歳以上) |
| アラビア語 / ヘブライ語対応 | なし | はい |
| キリル文字(ロシア語、ウクライナ語)のサポート | なし | はい |
| ネイティブPDF入力 | なし | はい |
| パスワードで保護されたPDFファイルの入力 | なし | はい |
| 検索可能なPDF出力 | なし | はい |
| 複数ページTIFF入力 | なし | はい |
| ストリームとバイト配列の入力 | 制限的 | はい |
| 内蔵画像前処理機能 | なし | はい(自動フィルター+手動フィルター) |
| スキュー補正 / ノイズ除去 / コントラストフィルター | なし | はい |
| 構造化された出力(段落、行、単語) | 部分的(ブロックのみ) | はい、座標付きで |
| 単語ごとの信頼度スコア | はい(ブロックごと) | はい |
| OCR中のバーコード読み取り | なし | はい |
| hOCRエクスポート | なし | はい |
| スレッドセーフな並列処理 | 制限的 | はい(スレッドごとに1回) |
| クロスプラットフォーム展開 | プラットフォームごとの ONNX Runtime バイナリが必要です | はい(Windows、Linux、macOS、Docker) |
| Dockerデプロイメント | 手動モデル COPY 指示が必要 | すぐに使える |
| コールドスタートのオーバーヘッド | 2~5秒(モデルの読み込み) | 最小 |
| 商用サポート | なし | はい |
| ライセンス | アパッチ2.0(無料) | 永続 ($999 Lite, $1,499 Pro, $2,999 Enterprise) |
クイックスタート:RapidOCR.NET から IronOCR への移行
ステップ 1: NuGet パッケージを置き換える
RapidOCR.NET および ONNX Runtime の依存関係を削除してください:
dotnet remove package RapidOcrNet
dotnet remove package Microsoft.ML.OnnxRuntime
NuGetからIronOCRをインストールしてください。
ステップ 2: 名前空間の更新
RapidOCR.NET ネームスペースを IronOCR ネームスペースに置き換えてください:
// Before (RapidOCR.NET)
using RapidOcrNet;
// After (IronOCR)
using IronOcr;
ステップ 3: ライセンスの初期化
アプリケーションの起動時に、すべてのIronTesseract呼び出しの前にライセンス初期化を追加してください。
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"IronOCRのライセンスページから無料トライアルキーを入手できます。
コード移行の例
ONNXモデルパスの設定削除
この移行で最も機械的な変更は、RapidOcrOptions 設定ブロックを削除し、引数なしのコンストラクタに置き換えることです。
RapidOCR.NETのアプローチ:
using RapidOcrNet;
// Startup validation — written because a missing model crashes at runtime, not at install
private static void EnsureModelsPresent(string modelDir)
{
var required = new[]
{
Path.Combine(modelDir, "det.onnx"),
Path.Combine(modelDir, "cls.onnx"),
Path.Combine(modelDir, "rec_en.onnx"),
Path.Combine(modelDir, "en_keys.txt")
};
var missing = required.Where(f => !File.Exists(f)).ToList();
if (missing.Any())
throw new FileNotFoundException(
$"Missing model files: {string.Join(", ", missing)}\n" +
"Download from: https://github.com/RapidAI/RapidOCR/releases");
}
// Engine factory — called once at startup, held for lifetime of service
public RapidOcrEngine CreateEngine(string modelDir)
{
EnsureModelsPresent(modelDir);
return new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(modelDir, "det.onnx"),
ClsModelPath = Path.Combine(modelDir, "cls.onnx"),
RecModelPath = Path.Combine(modelDir, "rec_en.onnx"),
KeysPath = Path.Combine(modelDir, "en_keys.txt"),
UseGpu = false,
NumThreads = Environment.ProcessorCount
});
}
IronOCRのアプローチ:
using IronOcr;
// なし model validation, no path configuration, no GPU flags
// IronTesseract is thread-safe; create one per thread or on demand
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
完全な EnsureModelsPresent 検証メソッド、RapidOcrOptions 設定オブジェクト、およびエンジンファクトリクラスを削除できます。 IronOCRはNuGetパッケージの一部としてエンジンを内部的に同梱しているため、検証用のモデルファイルはありません。 IronTesseractのセットアップガイドでは、初期化オプションやライセンスキーの配置について詳しく説明しています。
検出、分類、および認識パイプラインの統合
RapidOCR.NETは、検出、方向分類、認識という3段階のONNXパイプラインを実行し、呼び出し元がソートして組み立てる必要がある、順序のないフラットなテキストブロックのリストを返します。 IronOCRは、内部Tesseract 5エンジンに支持されている単一の.Read()呼び出しを公開し、既に読み順が適用された構造化された出力を返します。
RapidOCR.NETのアプローチ:
using RapidOcrNet;
public class InvoiceTextExtractor
{
private readonly RapidOcrEngine _engine;
public InvoiceTextExtractor(string modelDir)
{
// Three separate ONNX models run in sequence on every call
_engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(modelDir, "det.onnx"), // Stage 1: detect text regions
ClsModelPath = Path.Combine(modelDir, "cls.onnx"), // Stage 2: classify direction
RecModelPath = Path.Combine(modelDir, "rec_en.onnx"),// Stage 3: recognize characters
KeysPath = Path.Combine(modelDir, "en_keys.txt")
});
}
public string ExtractInvoiceText(string imagePath)
{
var result = _engine.Run(imagePath);
// Blocks are unordered — must sort by vertical position, then horizontal
var orderedBlocks = result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.ThenBy(b => b.BoundingBox.Left)
.ToList();
// Manual assembly — no paragraph or line structure
return string.Join(Environment.NewLine,
orderedBlocks.Select(b => b.Text));
}
}
IronOCRのアプローチ:
using IronOcr;
public class InvoiceTextExtractor
{
private readonly IronTesseract _ocr = new IronTesseract();
public string ExtractInvoiceText(string imagePath)
{
// Single call — detection, recognition, reading order all internal
var result = _ocr.Read(imagePath);
return result.Text; // Already in reading order
}
public IEnumerable<string> ExtractInvoiceParagraphs(string imagePath)
{
var result = _ocr.Read(imagePath);
// Structured paragraphs with coordinates — no sorting or assembly needed
foreach (var page in result.Pages)
foreach (var paragraph in page.Paragraphs)
yield return paragraph.Text;
}
}
この3段階のパイプラインは、すべてIronOCR内部で処理されます。 マニュアルのresult.Textに収束します。 .Wordsのコレクションが構造化されたAPIを介して同等の座標を提供します。 "読み取り結果の操作方法"および"OCR結果"の機能ページには、構造化された出力モデル全体が記載されています。
カスタムモデル読み込みの代替
実行時にOCRの設定を切り替える必要があるアプリケーション — 例えば、文書タイプに基づく異なる認識パラメータを持つ文書をルーティングする場合 — は、RapidOCR.NETで設定がコンストラクタにバインドされているため、完全なRapidOcrEngineを再構築する必要があります。 IronOCRは、エンジン設定をプロパティとして公開しており、単一のインスタンス上で読み取りごとに調整可能です。
RapidOCR.NETのアプローチ:
using RapidOcrNet;
public class DocumentRouter
{
private readonly string _modelDir;
public DocumentRouter(string modelDir) => _modelDir = modelDir;
// Must create separate engine instances per configuration
// Each engine holds ~300-500 MB of loaded model weights
private RapidOcrEngine BuildEnglishEngine() =>
new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(_modelDir, "det.onnx"),
ClsModelPath = Path.Combine(_modelDir, "cls.onnx"),
RecModelPath = Path.Combine(_modelDir, "en_rec.onnx"),
KeysPath = Path.Combine(_modelDir, "en_keys.txt")
});
private RapidOcrEngine BuildChineseEngine() =>
new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(_modelDir, "det.onnx"),
ClsModelPath = Path.Combine(_modelDir, "cls.onnx"),
RecModelPath = Path.Combine(_modelDir, "ch_rec.onnx"), // separate download
KeysPath = Path.Combine(_modelDir, "ch_keys.txt") // separate download
});
public string ProcessDocument(string imagePath, string language)
{
// Rebuild engine for each language — model reload cost on every switch
using var engine = language == "chinese"
? BuildChineseEngine()
: BuildEnglishEngine();
var result = engine.Run(imagePath);
return string.Join("\n", result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.Select(b => b.Text));
}
}
IronOCRのアプローチ:
using IronOcr;
public class DocumentRouter
{
// One instance handles all languages — language is a property, not a constructor param
private readonly IronTesseract _ocr = new IronTesseract();
public string ProcessDocument(string imagePath, string language)
{
// Language switch requires no model reload, no rebuild
_ocr.Language = language switch
{
"chinese" => OcrLanguage.ChineseSimplified,
"japanese" => OcrLanguage.Japanese,
"arabic" => OcrLanguage.Arabic,
"russian" => OcrLanguage.Russian,
_ => OcrLanguage.English
};
return _ocr.Read(imagePath).Text;
}
}
エンジンの再構築、モデルの再読み込み、言語ごとの個別ダウンロードは不要です。 英語以外のターゲットの言語パックはNuGet経由でインストールされ、dotnet add package IronOcr.Languages.ChineseSimplified — 復元ステップが自動的にデプロイメントを処理します。 多言語対応の"ハウツー"では言語パックのインストール方法について解説しており、言語インデックスには利用可能な125以上のパックがすべて一覧されています。
バッチ処理の移行
RapidOCR.NETは単一のRapidOcrEngineインスタンスに対してスレッドセーフ保証がありません。 バッチ処理には、シングルスレッドのキュー、またはスレッドごとのエンジンインスタンス化のいずれかが必要であり、それぞれが300~500 MBのモデルフットプリントを占有します。 IronOCRは明示的にスレッドセーフです:スレッドごとに1つのIronTesseractを作成し、ロックせずに同時に実行してください。
RapidOCR.NETのアプローチ:
using RapidOcrNet;
public class BatchOcrProcessor
{
private readonly string _modelDir;
public BatchOcrProcessor(string modelDir) => _modelDir = modelDir;
// Thread-pool processing — each thread needs its own engine copy
// 4 threads × 300-500 MB model footprint = 1.2-2 GB RAM minimum
public Dictionary<string, string> ProcessBatch(IReadOnlyList<string> imagePaths)
{
var results = new System.Collections.Concurrent.ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, new ParallelOptions { MaxDegreeOfParallelism = 4 },
imagePath =>
{
// Each thread must create its own engine — not safe to share
using var engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(_modelDir, "det.onnx"),
ClsModelPath = Path.Combine(_modelDir, "cls.onnx"),
RecModelPath = Path.Combine(_modelDir, "rec_en.onnx"),
KeysPath = Path.Combine(_modelDir, "en_keys.txt")
});
var result = engine.Run(imagePath);
results[imagePath] = string.Join("\n",
result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.Select(b => b.Text));
});
return new Dictionary<string, string>(results);
}
}
IronOCRのアプローチ:
using IronOcr;
public class BatchOcrProcessor
{
// Thread-safe: create IronTesseract per thread, no shared state required
public Dictionary<string, string> ProcessBatch(IReadOnlyList<string> imagePaths)
{
var results = new System.Collections.Concurrent.ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, imagePath =>
{
// Lightweight construction — no model loading overhead per thread
var ocr = new IronTesseract();
var result = ocr.Read(imagePath);
results[imagePath] = result.Text;
});
return new Dictionary<string, string>(results);
}
}
スレッドごとのRapidOcrEngine インスタンス化が消えます。 IronOCRのスレッドインスタンスは軽量であり、生成時に外部モデルを読み込む必要はありません。 このマルチスレッドの例は、高スループットパイプラインのための並行処理パターンを示しています。
マルチフレームTIFF処理
RapidOCR.NETは、単一の画像ファイルのみを受け付けます。 マルチページのTIFFを処理するには — ファックスで受信した文書やスキャンされたアーカイブの標準形式 — 個別のイメージングライブラリで個別のフレームに分割し、それらのフレームを一時ファイルに保存し、それぞれにengine.Run() を実行し、後でクリーンアップします。 IronOCR は OcrInput.LoadImageFrames を通じてネイティブにマルチフレームのTIFFを処理します。
RapidOCR.NETのアプローチ:
using RapidOcrNet;
// Also requires: SixLabors.ImageSharp or System.Drawing for TIFF frame extraction
public class TiffOcrProcessor
{
private readonly RapidOcrEngine _engine;
public TiffOcrProcessor(string modelDir)
{
_engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(modelDir, "det.onnx"),
ClsModelPath = Path.Combine(modelDir, "cls.onnx"),
RecModelPath = Path.Combine(modelDir, "rec_en.onnx"),
KeysPath = Path.Combine(modelDir, "en_keys.txt")
});
}
public string ProcessMultiPageTiff(string tiffPath)
{
var pageTexts = new List<string>();
var tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
Directory.CreateDirectory(tempDir);
try
{
// External library required to split TIFF frames
var framePaths = SplitTiffIntoFrames(tiffPath, tempDir); // not in RapidOcrNet
foreach (var framePath in framePaths)
{
var result = _engine.Run(framePath);
pageTexts.Add(string.Join("\n",
result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.Select(b => b.Text)));
}
}
finally
{
// Clean up temp frame files
Directory.Delete(tempDir, recursive: true);
}
return string.Join("\n\n", pageTexts);
}
private IEnumerable<string> SplitTiffIntoFrames(string tiffPath, string outputDir)
{
// Requires external library — implementation depends on what is installed
throw new NotImplementedException("Add SixLabors.ImageSharp or similar");
}
}
IronOCRのアプローチ:
using IronOcr;
public class TiffOcrProcessor
{
private readonly IronTesseract _ocr = new IronTesseract();
public string ProcessMultiPageTiff(string tiffPath)
{
using var input = new OcrInput();
input.LoadImageFrames(tiffPath); // All frames loaded — no external library needed
var result = _ocr.Read(input);
return result.Text; // Pages assembled in order automatically
}
public IEnumerable<(int PageNumber, string Text, double Confidence)> ProcessTiffWithPageData(string tiffPath)
{
using var input = new OcrInput();
input.LoadImageFrames(tiffPath);
var result = _ocr.Read(input);
foreach (var page in result.Pages)
yield return (page.PageNumber, page.Text, page.Confidence);
}
}
外部の画像ライブラリ、一時ファイル、クリーンアップロジックは不要です。 LoadImageFrames はすべてのTIFFフレームをOcrInput パイプラインに1回の呼び出しで読み込みます。 TIFFおよびGIFの入力に関する手順書では、フレームの選択、ページ範囲のフィルタリング、および大規模なマルチフレーム文書をメモリ効率良く処理する方法について解説しています。
スキャンされたフォームからの構造化データの抽出
RapidOCR.NETは、バウンディングボックス付きのテキストブロックを返しますが、段落、行、単語といった概念を含む、より高レベルのドキュメント構造は提供しません。 スキャンされたフォームから個々のフィールドを抽出するには、生のブロックリストに対して座標の交差ロジックを実装する必要があります。IronOCRは、各レベルに座標情報を付加した、文字レベルまで詳細な構造化された結果ツリーを提供します。
RapidOCR.NETのアプローチ:
using RapidOcrNet;
public class FormFieldExtractor
{
private readonly RapidOcrEngine _engine;
public FormFieldExtractor(string modelDir)
{
_engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(modelDir, "det.onnx"),
ClsModelPath = Path.Combine(modelDir, "cls.onnx"),
RecModelPath = Path.Combine(modelDir, "rec_en.onnx"),
KeysPath = Path.Combine(modelDir, "en_keys.txt")
});
}
// Extract text within a defined region by filtering block coordinates manually
public string ExtractFieldByRegion(string imagePath, float regionLeft, float regionTop,
float regionRight, float regionBottom)
{
var result = _engine.Run(imagePath);
// Filter blocks whose bounding box intersects the target region
var blocksInRegion = result.TextBlocks
.Where(b =>
b.BoundingBox.Left < regionRight &&
b.BoundingBox.Right > regionLeft &&
b.BoundingBox.Top < regionBottom &&
b.BoundingBox.Bottom > regionTop)
.OrderBy(b => b.BoundingBox.Top)
.ThenBy(b => b.BoundingBox.Left);
return string.Join(" ", blocksInRegion.Select(b => b.Text));
}
}
IronOCRのアプローチ:
using IronOcr;
public class FormFieldExtractor
{
private readonly IronTesseract _ocr = new IronTesseract();
// Use CropRectangle to OCR only the target region — no post-filter needed
public string ExtractFieldByRegion(string imagePath, int x, int y, int width, int height)
{
var region = new CropRectangle(x, y, width, height);
using var input = new OcrInput();
input.LoadImage(imagePath, region);
return _ocr.Read(input).Text;
}
// Extract all fields with their coordinates from a full-page scan
public IEnumerable<(string Text, int X, int Y, double Confidence)> ExtractAllWords(string imagePath)
{
var result = _ocr.Read(imagePath);
foreach (var page in result.Pages)
foreach (var word in page.Words)
yield return (word.Text, word.X, word.Y, word.Confidence);
}
}
CropRectangle は、関心領域にOCRを限定し、完全なページOCRを実行し、結果を後でフィルタリングするよりも速く、正確です。 単語ごとの座標と信頼度は、手動バウンディングボックス交差コードなしで、直接result.Pages[i].Wordsで利用可能です。 地域別のOCR操作ガイドと切り抜き矩形の例では、このパターンについて詳しく解説しています。
RapidOCR.NET API から IronOCR へのマッピングリファレンス
| RapidOCR.NET | IronOCR相当値 |
|---|---|
using RapidOcrNet | using IronOcr |
new RapidOcrEngine(new RapidOcrOptions { ... }) | new IronTesseract() |
RapidOcrOptions.DetModelPath | 不要 — 内部でバンドル済み |
RapidOcrOptions.ClsModelPath | 不要 — 内部でバンドル済み |
RapidOcrOptions.RecModelPath | 不要 — 内部でバンドル済み |
RapidOcrOptions.KeysPath | 不要 — 内部でバンドル済み |
RapidOcrOptions.UseGpu | 該当なし — 内部でCPU最適化済み |
RapidOcrOptions.NumThreads | スレッドごとに1つのParallel.ForEachを使用してください。 |
engine.Run(imagePath) | ocr.Read(imagePath) |
engine.Dispose() | using var ocr = new IronTesseract() |
result.TextBlocks | result.Pages[i].Words / .Lines / .Paragraphs |
result.TextBlocks[i].Text | result.Words[i].Text |
result.TextBlocks[i].Confidence | result.Words[i].Confidence |
result.TextBlocks[i].BoundingBox.Top | result.Words[i].Y |
result.TextBlocks[i].BoundingBox.Left | result.Words[i].X |
手動OrderBy(b => b.BoundingBox.Top)ソート | 不要—result.Textは読み順にあります |
string.Join("\n", result.TextBlocks.Select(b => b.Text)) | result.Text |
| 言語ファイルの切り替え(別のモデルをダウンロード) | ocr.Language = OcrLanguage.French |
| 言語変更に伴うエンジンの再構築 | 不要—コールごとにocr.Languageを設定します |
PDF-to-image + engine.Run()ループ | ocr.Read("document.pdf") |
| マルチフレーム TIFF の手動フレーム分割 | input.LoadImageFrames("document.tiff") |
| 検索可能なPDF機能はありません | result.SaveAsSearchablePdf("output.pdf") |
| BARCODE機能なし | ocr.Configuration.ReadBarCodes = true |
一般的な移行の問題と解決策
課題 1: 移行後も Models ディレクトリが残っている
RapidOCR.NET: プロジェクト内のmodels/ ディレクトリには、en_keys.txtが含まれており、これらをビルド時にコピーするMSBuild <Content> エントリも含まれています。 IronOCRに切り替えた後も、このディレクトリおよびそれらのエントリは残っており、依然としてビルド出力を肥大化させています。
Solution: <ItemGroup>を削除し、欠落ファイルをチェックするスタートアップバリデーションロジックを削除してください。 また、別にインストールされた場合は、Microsoft.ML.OnnxRuntime NuGet参照も削除してください。 IronOCR を使用した .NET アプリケーションの公開出力には、外部モデルファイルは含まれません。
<!-- Remove this entire block from .csproj -->
<ItemGroup>
<Content Include="models\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
課題 2: スレッドごとのエンジン構築パターン
RapidOCR.NET: スレッドごとに新規のRapidOcrEngineを作成する並列処理コードは、共有状態の問題を回避するために多大なメモリコストを伴いました:各エンジンインスタンスが300–500 MBのONNXモデル重みを個別にロードしました。
Solution: IronOCR IronTesseractインスタンスは、スレッドセーフで軽量です。 スレッドごとに1つずつRapidOcrEngineインスタンスごとにかかっていた300–500MBのモデルロードコストはありません。 マルチスレッドの例は、高スループットパイプラインの標準的なパターンを示しています。
問題 3: サポートされていない言語の例外
RapidOCR.NET: RapidOCR.NET を経由して非CJK文書を処理するコード、あるいは存在しないスペイン語/フランス語/ドイツ語モデルを使用してエンジンを構築しようとするコードは、実行時にファイルが見つからないエラーが発生するか、空の結果が生成されます。
Solution: 適切な言語パックNuGetパッケージをインストールし、OcrLanguage列挙値に設定してください。 モデルのダウンロード、エンジンの再構築、各言語ごとの追加のコードパスは不要です:
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.Spanish;
var result = ocr.Read("spanish-document.jpg");
カスタム言語パックガイドでは、標準の125以上のパックを超える高度な言語設定について解説しています。
課題 4: 移行後にテキストブロックのソートロジックが機能しなくなる
RapidOCR.NET: .OrderBy(b => b.BoundingBox.Top).ThenBy(b => b.BoundingBox.Left)チェーンが結果処理コード全体に散在していました。
**解決策:**このソートロジックを完全に削除してください。 IronOCRのresult.Textはすでに自然な読み順で組み立てられています。 並べ替えたブロックからバウンディングボックスの座標を消費するコードの場合、ブロック参照をresult.Pages[i].Words[j]に置き換えてください。
// Before: manual sort + coordinate extraction
var sorted = result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.ThenBy(b => b.BoundingBox.Left);
foreach (var block in sorted)
Console.WriteLine($"{block.Text} at ({block.BoundingBox.Left}, {block.BoundingBox.Top})");
// After: structured access, already in order
foreach (var page in result.Pages)
foreach (var word in page.Words)
Console.WriteLine($"{word.Text} at ({word.X}, {word.Y})");
課題 5: モデルファイルが削除された後に CI/CD パイプラインが失敗する
RapidOCR.NET: models/ディレクトリをキャッシュまたは取得するビルドパイプラインが — アーティファクトストア、共有S3バケット、またはGit LFSリポジトリからのいずれでも — そのステップが何も復元するものが見つからないときに失敗します。
**解決策:**CIパイプラインからモデルファイルの取得およびキャッシュのステップを完全に削除します。 IronOCRのエンジンは、標準のdotnet restoreステップの一環として復元されます。追加のパイプラインステージは必要ありません。 コンテナ化されたデプロイメントの場合は、任意のCOPY models/ ./models/ Docker指示を削除してください - IronOCRのDockerデプロイメントガイドは、1つの必要なシステムパッケージ(Debian/Ubuntuイメージでのlibgdiplus)だけをドキュメント化しています。
課題 6: 部分的な移行後の ONNX Runtime のバージョン競合
RapidOCR.NET: 他のONNXベースのMLパッケージ(ML.NET、ONNXオブジェクト検出など)を使用しているアプリケーションは、RapidOCR.NETの互換性のために特定バージョンにMicrosoft.ML.OnnxRuntimeを固定していたかもしれません。 RapidOCR.NET を削除すると、他のパッケージでバージョン間の競合が発生する可能性があります。
Solution: 明示的なパッケージリストからMicrosoft.ML.OnnxRuntimeを削除してください。IronOCRは、ONNXランタイムの依存性がないため、RapidOCR.NETの参照を削除すると、バージョンの固定が完全に解除されます。 ONNX Runtimeを真に必要とする他のMLパッケージは、RapidOCR.NETの制約なしに、標準的なNuGet依存関係解決を通じて、互換性のあるバージョンを独自に解決できます。
RapidOCR.NET 移行チェックリスト
マイグレーション前のタスク
変更を加える前に、コードベース内の RapidOCR.NET の使用箇所をすべて確認してください:
# Find all files that reference RapidOcrNet
grep -r "RapidOcrNet\|RapidOcrEngine\|RapidOcrOptions" --include="*.cs" .
# Find model path configuration
grep -r "DetModelPath\|ClsModelPath\|RecModelPath\|KeysPath" --include="*.cs" .
# Find MSBuild model copy entries
grep -r "det\.onnx\|cls\.onnx\|rec.*\.onnx\|keys\.txt" --include="*.csproj" .
# Find model validation logic
grep -r "ValidateModel\|models/" --include="*.cs" .
# Find ONNX Runtime references
grep -r "OnnxRuntime\|Microsoft\.ML" --include="*.csproj" .
# Find language-switching patterns (multiple engine instances per language)
grep -r "CreateEnglishEngine\|CreateChineseEngine\|rec_en\|ch_rec\|en_keys\|ch_keys" --include="*.cs" .
結果をインベントリーしてください:エンジンが作成されるすべての場所、モデルパスが構成されるすべての場所、テキストブロックがソートされるすべての場所、およびPDF-to-image変換がengine.Run()に供給されるすべての場所をメモします。
コード更新タスク
- すべての
RapidOcrNetNuGetパッケージ参照を削除してください。 - すべての
Microsoft.ML.OnnxRuntimeNuGetパッケージ参照を削除してください。 IronOcrNuGetパッケージをインストールしてください。- アプリケーションで必要となる英語以外の言語用の言語パック NuGet パッケージをインストールします。
- プロジェクトおよびリポジトリから
models/ディレクトリを削除してください。 - すべての
<Content Include="models\**\*.*">MSBuildエントリを削除してください。 - スタートアップモデルバリデーションメソッド(
EnsureModelsPresentスタイルのメソッド)を削除してください。 - すべてのソースファイルで
using IronOcrに置き換えてください。 9.new RapidOcrEngine(new RapidOcrOptions { ...を置き換えてください。 })withnew IronTesseract()`. ocr.Read(imagePath)に置き換えてください。result.Textに置き換えてください。- 座標フィルタフィールド抽出を
CropRectangle領域入力に置き換えてください。 - スレッドごとのエンジン構築をスレッドごとの
IronTesseract構築に置き換えてください。 - 言語固有のエンジンファクトリメソッドを
ocr.Language = OcrLanguage.Xの割り当てに置き換えてください。 - PDF-to-image変換コードを削除し、直接
ocr.Read("file.pdf")呼び出しに置き換えてください。 - マルチフレームTIFFフレーム分割コードを削除し、
input.LoadImageFrames("file.tiff")に置き換えてください。 - アプリケーション起動時に
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"を追加してください。 - CI/CDパイプラインの定義から、モデルファイルの取得およびキャッシュのステップを削除する。
- DockerfileからONNXモデル
COPY指示を削除してください。
移行後のテスト
- 既存のすべての画像OCRパスが、RapidOCR.NETの出力と同等かそれ以上の精度でテキストを返すことを確認してください。
- 各文書タイプの期待されるフィールド順序と
result.Text読み順が一致していることを確認してください。 - アプリケーションが使用するすべての
OcrLanguage値で言語切り替えされた読取りをテストしてください。 - 並列バッチプロセッサを実行し、スレッド競合エラーや結果の古さによる問題が発生しないことを確認してください。
- マルチフレーム TIFF の処理において、正しいページ数と各ページごとの正しいテキストが返されることを確認してください。
- 期待される座標領域に対して
CropRectangleを使用したフォームフィールド抽出をテストしてください。 - ビルド出力とデプロイメントパッケージから
models/ディレクトリが欠落していることを確認してください。 - CIパイプラインをエンドツーエンドで実行し、モデルフェッチのステップが残っていないことを確認してください。
- Dockerコンテナをビルドし実行し、起動時に
COPY models/レイヤーやファイルが見つからないエラーがないことを確認してください。 - 起動時間の測定テストを行い、コールドスタートのレイテンシが減少したことを確認します。
IronOCRへの移行の主なメリット
デプロイメントは今や決定的です。 dotnet restore と dotnet publish は、外部ファイルの依存なしで、完全かつ動作するOCRデプロイメントを生産します。 パッケージのバージョンをインストールするNuGetのrestoreコマンドを実行するだけで、エンジンの実行に必要なすべてのものがインストールされます。 個別にバージョン管理するモデルファイルはなく、設定が必要なCIキャッシュのステップもなく、維持管理すべきデプロイ検証スクリプトもありません。 その導入手順は、他の .NET パッケージの依存関係と同様に簡単です。
言語カバレッジはビジネス要件に応じてスケールします。 新しい文書言語をサポートに追加するには、ocr.Languageを設定することを意味します。 アップストリームモデルの可用性チェック、モデルのダウンロード、およびエンジンのリファクタリングは行われません。 当初は英語のOCRから開始し、後にドイツ語の契約書、アラビア語の請求書、またはロシア語の発注書を処理する必要が生じた場合でも、アプリケーションのアーキテクチャを変更することなく対応範囲を拡大できます。 125以上の言語パックはすべて、同じインストール手順に従います。
構造化出力は座標組立コードを排除します。 TextBlocksリストとその構造の欠如を回避する為の並べ替えロジックを置き換えます。 ブロックの座標をソートして読み順のテキストを抽出していたコードは削除されました。 単語ごとのバウンディングボックスを必要とするコードは、word.Heightから交差フィルタリングなしでそれを取得します。 OCR結果の機能ページには、出力モデルの全容が記載されています。
**PDFおよびTIFFの処理には外部ライブラリが不要です。**単一画像のJPG以外に最も一般的な2つのドキュメント形式である、複数ページのPDFと複数フレームのTIFFは、IronOCRによってネイティブに処理されます。 PDFまたはTIFF入力でengine.Run()をサポートするために依存関係ツリーに追加されたすべての外部ライブラリを削除できます。 結果として、更新が必要なパッケージが減り、バージョン間の互換性に関する課題が少なくなり、プロジェクトファイルが簡素化されます。 PDF入力の手順とTIFF入力の手順では、両方の形式について詳しく解説しています。
**運用上のインシデントにはサポート体制が整っています。**商用ライセンスには、GitHubのイシューへの対応を待てない問題について、担当窓口への直接メールサポートが含まれています。 SLAの義務を負っているチームや、ビジネス上重要なドキュメント処理パイプラインを運用しているチームは、コミュニティからの回答を待つのではなく、ライブラリのメンテナンスを担当するエンジニアにインシデントをエスカレーションすることができます。 IronOCRのドキュメントハブでは、このサポートパスに関連するリファレンスドキュメントを提供しています。
$999 永続ライセンスは一回限りのコストです。 ページごとの料金やトランザクションごとの請求はなく、年間更新によって費用について再び議論することはありません。 モデル管理、PDF変換の回避策、CIパイプラインのメンテナンス、および非対応言語に関するエスカレーションに費やされるエンジニアリング工数を算出した開発チームは、ライセンス費用との比較において常に有利な結果を得ています。
