XImage.OCRからIronOCRへの移行|IronOCR
このガイドは、既存の XImage.OCR 統合を IronOCR に移行する .NET 開発者を対象としています。 これには、パッケージの統合プロセス、名前空間およびAPIの変更、ならびにXImage.OCRの断片化されたアーキテクチャが最大の障害となるシナリオにおける具体的なコード移行例が含まれます。 比較記事を事前に読む必要はありません。
XImage.OCRからの移行理由
XImage.OCRは、RasterEdgeが提供する商用Tesseractラッパーであり、その機能は連携した一連のNuGetパッケージを通じて提供されます。 このアーキテクチャは小規模な環境では機能しますが、アプリケーションが拡大するにつれて、メンテナンスコストが累積していきます。
**言語が増えるごとにパッケージ数も増加します。**言語を追加することは、NuGet パッケージを追加することを意味します。 五言語のアプリケーションはその.csprojで6つのパッケージを持っています。 10言語対応のアプリケーションは、11の言語に対応します。 すべてのパッケージはコアと同じバージョンに固定する必要があります。この制約により、開発者がチェーンの一部のみを更新した場合、ランタイムで静かにエラーが発生します。 IronOCRは、125以上の言語すべてに対応した単一のパッケージを提供します。
バージョン同期は常にリスクがあります。 dotnet outdated は貪欲にパッケージを更新します。 XImage.OCR.Language.Frenchが12.4.0に留まると、エラーはビルド時ではなく実行時に発生し、メッセージはバージョン同期が原因であることを示すことはめったにありません。 CI/CDパイプラインを運用するチームは、すべてのXImage.OCRパッケージに対して明示的なバージョン固定を追加する方法を学んでいます。これは、断片化されたモデルを補う以外の目的を持たないオーバーヘッドです。
**組み込みの前処理機能はありません。実際の文書に対する精度。**XImage.OCRは、画像を基盤となるTesseractエンジンに直接渡します。150 DPIでスキャンされ、2度のスキューがある画像も、変更されることなくTesseractに渡されます。 使用しているTesseractラッパーの種類にかかわらず、このような入力に対する精度の上限は60~75%です。 IronOCRは、Sharpen() を含む前処理パイプラインを提供し、認識実行前にこれらの問題を修正します。
**構造化された出力には手動での解析が必要です。**XImage.OCRはプレーンな文字列を返します。 単語の位置、行の境界、またはWORDごとの信頼度を抽出するには、その文字列を自分で解析する必要があります。 IronOCRは、OcrResultオブジェクトを返します。
**出力形式はプレーンテキストまでです。**XImage.OCRの結果から検索可能なPDFを作成するには、RasterEdge PDF SDKが必要となります。これは別途購入が必要な商用ソフトウェアです。 IronOCRは、追加の依存関係なしでresult.SaveAsSearchablePdf()を介して検索可能なPDFを生成します。
**クロスプラットフォームでの展開はサポートされていません。**XImage.OCRはWindowsを対象としています。 Linuxコンテナ、macOS開発環境、およびAzureやAWS上のクラウドネイティブ展開には、別のライブラリが必要です。 IronOCRは、Windows、Linux、macOS、Docker、Azure App Service、およびAWS Lambda上で、同一のパッケージから実行可能です。
基本的な問題
XImage.OCR では、言語ごとに 1 つの NuGet パッケージが必要です。 十言語は十一パッケージを意味し、すべてが相互にバージョン固定されています:
<!-- XImage.OCR: 11 packages to support 10 languages — every version must match -->
<PackageReference Include="RasterEdge.XImage.OCR" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.English" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.German" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.French" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Spanish" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Italian" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Portuguese" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.ChineseSimplified" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Japanese" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Korean" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Arabic" Version="12.4.0" />
IronOCRは、ブロック全体を1行に置き換えます:
<!-- IronOCR: One package. 125+ languages. なし version coordination. -->
<PackageReference Include="IronOcr" Version="2024.x.x" />
IronOCR 対 XImage.OCR:機能比較
以下の表は、移行の判断に最も関連性の高い機能についてまとめたものです。
| フィーチャー | XImage.OCR | IronOCR |
|---|---|---|
| 英語版のみの NuGet パッケージ | 2 (コア + 言語パック) | 1 |
| 10言語対応のNuGetパッケージ | 11 | 1 |
| バージョンの同期が必要です | はい — すべてのパッケージ名が一致している必要があります | なし |
| 対応言語 | ~15個の個別パッケージ | 125以上のバンドル |
| 組み込みの前処理 | None | 傾き補正、ノイズ除去、コントラスト補正、二値化、シャープ化、拡大縮小、膨張、収縮、反転 |
| 深いノイズ除去 | None | はい (DeepCleanBackgroundNoise()) |
| ネイティブPDF入力 | RasterEdge PDF SDKが必要です | はい (input.LoadPdf()) |
| 検索可能なPDF出力 | RasterEdge PDF SDKが必要です | はい (result.SaveAsSearchablePdf()) |
| 複数ページのTIFF入力 | 制限的 | はい (input.LoadImageFrames()) |
| バイト配列の入力 | MemoryStream 経由のマニュアル | はい (input.LoadImage(bytes)) |
| ストリーム入力 | マニュアル | はい (input.LoadImage(stream)) |
| 構造化された出力 | プレーン文字列 | 座標付きのページ、段落、行、単語、文字 |
| 単語ごとの信頼度スコア | 不可 | はい |
| バーコード読み取り | 不可 | はい (ocr.Configuration.ReadBarCodes = true) |
| hOCRエクスポート | 不可 | はい |
| スレッドセーフ。 | スレッドセーフではありません | 完全なスレッドセーフ |
| メモリモデル(並列) | スレッドごとに1つのハンドラインスタンス | 単一の共有インスタンス |
| クロスプラットフォーム | 主にWindows | Windows、Linux、macOS、Docker、Azure、AWS |
| .NET互換性 | .NET Standard 2.0、.NET Framework 4.5 以降 | .NET Framework 4.6.2 以降、.NET Core、.NET 5/6/7/8/9 |
| ライセンスの種類 | 商用(RasterEdge) | 永続 (Lite $999、Pro $1,499、Enterprise $2,999) |
| 商業サポート | RasterEdge サポート | はい、ライセンスごとに階層化されています |
クイックスタート:XImage.OCR から IronOCR への移行
ステップ 1: NuGet パッケージを置き換える
すべての XImage.OCR パッケージを削除してください。 コマンドの数は、インストールした言語パックの数と一致します:
dotnet remove package RasterEdge.XImage.OCR
dotnet remove package XImage.OCR.Language.English
dotnet remove package XImage.OCR.Language.German
dotnet remove package XImage.OCR.Language.French
# Repeat for every language pack in your project
NuGetからIronOCRをインストールしてください。
ステップ 2: 名前空間の更新
RasterEdge ネームスペースのインポートを、単一の IronOCR ネームスペースに置き換えてください:
// Before (XImage.OCR)
using RasterEdge.XImage.OCR;
using RasterEdge.Imaging.Basic;
// After (IronOCR)
using IronOcr;
ステップ 3: ライセンスの初期化
アプリケーションの起動時、OCR呼び出しの前に一度、ライセンスの初期化を追加してください:
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"キーはハードコーディングせず、環境変数またはシークレットマネージャーに保存してください:
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY");Imports System
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY")コード移行の例
マルチパッケージ初期化の統合
最初の移行タスクは、XImage.OCRの初期化ブロック(ライセンスの有効化、ハンドラの作成、および文字列ベースの言語割り当て)を、IronOCRの同等の処理に統合することです。
XImage.OCRのアプローチ:
// Requires: RasterEdge.XImage.OCR + one XImage.OCR.Language.* package per language
// Language strings must exactly match installed package names or OCR fails at runtime
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("your-ximage-license-key");
var ocrHandler = new OCRHandler();
// String codes — typo "enh" instead of "eng" silently fails or throws at runtime
ocrHandler.Languages = new[] { "eng", "deu", "fra", "spa", "ita" };
// Process returns a plain string — no structure, no confidence
string extractedText = ocrHandler.Process("document.png");
Console.WriteLine(extractedText);
IronOCRのアプローチ:
// Requires: IronOcr (single package — all languages included)
IronOcr.License.LicenseKey = "YOUR-IRONOCR-LICENSE-KEY";
var ocr = new IronTesseract();
// Type-safe enum — compiler catches typos, no runtime surprises
ocr.Language = OcrLanguage.English + OcrLanguage.German +
OcrLanguage.French + OcrLanguage.Spanish + OcrLanguage.Italian;
using var input = new OcrInput();
input.LoadImage("document.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
XImage.OCR の文字列ベースの言語コード("deu")は、対応するNuGetパッケージがないか、間違ったバージョンにあると、実行時に失敗します。 IronOCR の OcrLanguage enum は、無効な言語の組み合わせをコンパイルできなくします。 IronTesseract のセットアップガイドでは、エンジンの設定オプションを完全にカバーし、複数言語のハウツーでは、混合言語文書のための主言語と副言語の組み合わせがどのように機能するかを説明しています。
画像形式の取り扱い統一
XImage.OCRは、画像ソースの形式に応じて異なる処理を行います。 バイト配列、ストリーム、ファイルパスについては、それぞれ若干異なる処理手順が必要です。 IronOCR は、同じOcrInputメソッドを通じてそれらをすべて受け入れます。
XImage.OCRのアプローチ:
// XImage.OCR: different handling per image source type
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
// File path — works directly
string resultFromFile = ocrHandler.Process("invoice.jpg");
// Byte array — must write to temp file first, then process
byte[] imageBytes = File.ReadAllBytes("invoice.jpg");
string tempPath = Path.GetTempFileName() + ".jpg";
File.WriteAllBytes(tempPath, imageBytes);
try
{
string resultFromBytes = ocrHandler.Process(tempPath);
Console.WriteLine(resultFromBytes);
}
finally
{
File.Delete(tempPath); // マニュアル cleanup — easy to forget
}
// Multi-page TIFF — must split frames manually
// なし built-in TIFF frame iteration in base XImage.OCR
IronOCRのアプローチ:
// IronOCR: unified OcrInput accepts all source types identically
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
// File path
using (var input = new OcrInput())
{
input.LoadImage("invoice.jpg");
var result = ocr.Read(input);
Console.WriteLine($"From file: {result.Text}");
}
// Byte array — no temp file needed
byte[] imageBytes = File.ReadAllBytes("invoice.jpg");
using (var input = new OcrInput())
{
input.LoadImage(imageBytes);
var result = ocr.Read(input);
Console.WriteLine($"From bytes: {result.Text}");
}
// Multi-page TIFF — all frames processed in one call
using (var input = new OcrInput())
{
input.LoadImageFrames("scanned-archive.tiff");
var result = ocr.Read(input);
Console.WriteLine($"TIFF pages: {result.Pages.Count}");
foreach (var page in result.Pages)
Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
}
XImage.OCRにおけるバイト配列のテンポラリファイルの扱いは、ディスク容量の肥大化やエラー発生時のファイル漏洩の一般的な原因となっています。 IronOCR の LoadImage(byte[]) は、中間ファイルを完全に排除します。 画像入力ガイドおよびTIFF/GIF入力ガイドでは、ストリームやマルチフレーム処理を含め、サポートされているすべてのソースタイプについて解説しています。
出力形式の最適化
XImage.OCRはプレーンな文字列を返します。 検索可能なPDFを生成するには、別のRasterEdge製品が必要です。 IronOCRは、追加のパッケージを必要とせず、単一の結果オブジェクトからプレーンテキスト、検索可能なPDF、および構造化データを生成します。
XImage.OCRのアプローチ:
// XImage.OCR: plain text output only
// Searchable PDF requires purchasing the RasterEdge PDF SDK separately
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
string plainText = ocrHandler.Process("scanned-contract.jpg");
// To produce a searchable PDF from this text, you would need:
// 1. Purchase RasterEdge PDF SDK (separate commercial license)
// 2. Create a PDF document programmatically
// 3. Embed the extracted text as invisible text layer over the image
// 4. Manage the PDF document lifecycle manually
// なし built-in path from OCR result to searchable PDF in XImage.OCR alone
Console.WriteLine(plainText);
IronOCRのアプローチ:
// IronOCR: plain text, searchable PDF, and structured data from one result
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("scanned-contract.jpg");
var result = ocr.Read(input);
// Plain text
Console.WriteLine(result.Text);
// Searchable PDF — no extra package required
result.SaveAsSearchablePdf("searchable-contract.pdf");
// Structured data: paragraphs with bounding box coordinates
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($"Paragraph at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");
}
}
// Per-word confidence for quality gating
var lowConfidenceWords = result.Pages
.SelectMany(p => p.Words)
.Where(w => w.Confidence < 70)
.ToList();
Console.WriteLine($"Words below 70% confidence: {lowConfidenceWords.Count}");
認識されたテキストを元の画像の下に隠しレイヤーとして埋め込むSaveAsSearchablePdf()呼び出しは、視覚的な外観を変更することなく文書を完全にテキスト検索可能にします。 検索可能なPDF形式のハウツーガイドでは、ページ範囲の指定オプションやDPI設定について解説しています。 構造化データ抽出パターンについては、結果読み取りガイドが完全なOcrResult 階層を含むワード座標と信頼度アクセスを文書化しています。 検索可能なPDFのサンプルには、完全に動作する実装例が記載されています。
バッチ文書処理
XImage.OCRはスレッドセーフではありません。 各同時実行作業スレッドは独自のOCRHandlerインスタンスを作成する必要があり、スレッド数に応じてメモリ消費量が増加します。 IronOCRは、すべてのスレッドで単一の共有インスタンスを使用します。
XImage.OCRのアプローチ:
// XImage.OCR: one handler per thread — memory multiplies with concurrency
// 4 threads processing English documents: 4 x ~100MB = ~400MB for OCR alone
// 4 threads processing 5 languages: 4 x ~250MB = ~1GB just for OCR handlers
var results = new ConcurrentDictionary<string, string>();
string[] documentPaths = Directory.GetFiles("./incoming", "*.png");
Parallel.ForEach(documentPaths,
new ParallelOptions { MaxDegreeOfParallelism = 4 },
documentPath =>
{
// Each thread must create and dispose its own handler
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
try
{
string text = ocrHandler.Process(documentPath);
results[documentPath] = text;
}
finally
{
// マニュアル disposal required — no using statement support shown
ocrHandler.Dispose();
}
});
foreach (var kvp in results)
Console.WriteLine($"{Path.GetFileName(kvp.Key)}: {kvp.Value.Length} chars");
IronOCRのアプローチ:
// IronOCR: single IronTesseract instance shared across all threads
// Memory stays flat regardless of thread count
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract(); // Create once outside the parallel loop
var results = new ConcurrentDictionary<string, string>();
string[] documentPaths = Directory.GetFiles("./incoming", "*.png");
Parallel.ForEach(documentPaths, documentPath =>
{
// OcrInput is created per thread — IronTesseract instance is shared
using var input = new OcrInput();
input.LoadImage(documentPath);
input.Deskew(); // Preprocessing runs per-document, not per-thread engine
input.DeNoise();
var result = ocr.Read(input);
results[documentPath] = result.Text;
});
foreach (var kvp in results)
Console.WriteLine($"{Path.GetFileName(kvp.Key)}: {kvp.Value.Length} chars");
XImage.OCRのスレッドごとのハンドラー方式では、5つの言語を読み込む4スレッドのバッチジョブの場合、1つのドキュメントを処理する前に約1GBのOCRハンドラーメモリを消費することになります。 IronOCRの共有インスタンスは、並列処理の有無にかかわらず、メモリ使用量を単一インスタンス分の範囲内に抑えます。 マルチスレッドの例ではこのパターンを完全に実演しており、速度最適化ガイドではスループット重視のバッチワークロードに向けた構成のチューニングについて解説しています。
BarCodeとテキストの複合抽出
XImage.OCRにはBarCode読み取り機能はありません。 テキストとBARCODEの両方を含むドキュメントには、2つの別々のライブラリと2回の処理工程が必要です。 IronOCRは、1回の読み取り操作で両方を抽出します。
XImage.OCRのアプローチ:
// XImage.OCR: text only — barcodes require a separate library and second pass
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
// Pass 1: text extraction with XImage.OCR
string documentText = ocrHandler.Process("warehouse-label.png");
Console.WriteLine($"Text: {documentText}");
// Pass 2: barcode reading requires a completely separate library
// e.g., ZXing.Net, Dynamsoft Barcode Reader, or another commercial SDK
// - Additional NuGet package required
// - Additional license required
// - Additional code for result merging
// なし combined text + barcode result object exists in XImage.OCR
IronOCRのアプローチ:
// IronOCR: text and barcodes from a single Read() call
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true; // Enable barcode extraction
using var input = new OcrInput();
input.LoadImage("warehouse-label.png");
var result = ocr.Read(input);
// Text and barcodes in one result object
Console.WriteLine($"Document text:\n{result.Text}");
if (result.Barcodes.Any())
{
Console.WriteLine($"\nBarcodes found: {result.Barcodes.Count}");
foreach (var barcode in result.Barcodes)
Console.WriteLine($" [{barcode.BarcodeType}] {barcode.Value}");
}
ReadBarCodes = true を設定すると、バーコード検出が認識パスに追加され、第2のライブラリや第2の読み取りを必要としません。 BARCODE読み取りの手順とBARCODE OCRの例では、サポートされているBARCODE形式や、混合コンテンツ文書向けの設定オプションについて解説しています。
XImage.OCR API から IronOCR へのマッピングリファレンス
| XImage.OCR | IronOCR相当値 |
|---|---|
new OCRHandler() | new IronTesseract() |
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("key") | IronOcr.License.LicenseKey = "key" |
ocrHandler.Language = "eng" | ocr.Language = OcrLanguage.English |
ocrHandler.Languages = new[] { "eng", "deu" } | ocr.Language = OcrLanguage.English + OcrLanguage.German |
ocrHandler.Process(imagePath) | ocr.Read(input).Text (after input.LoadImage(path)) |
ocrHandler.Process(image) (from object) | input.LoadImage(bytes) or input.LoadImage(stream) |
ocrHandler.ProcessRegion(path, rect) | input.LoadImage(path, new CropRectangle(x, y, w, h)) |
ocrHandler.SetVariable("tessedit_char_whitelist", "0-9") | ocr.Configuration.WhiteListCharacters = "0123456789" |
result (plain string) | result.Text |
result.MeanConfidence | result.Confidence |
| 同等のものはありません | result.Pages / result.Paragraphs / result.Lines |
| 同等のものはありません | result.Words (with .X, .Y, .Confidence) |
| 同等のものはありません | result.SaveAsSearchablePdf("output.pdf") |
| 同等のものはありません | input.Deskew() |
| 同等のものはありません | input.DeNoise() |
| 同等のものはありません | input.Contrast() |
| 同等のものはありません | input.Binarize() |
| 同等のものはありません | input.Sharpen() |
| 同等のものはありません | input.LoadImageFrames("file.tiff") (multi-frame) |
| RasterEdge PDF SDKが必要です | input.LoadPdf(pdfPath) |
| RasterEdge PDF SDKが必要です | result.SaveAsSearchablePdf("output.pdf") |
| 不可 | ocr.Configuration.ReadBarCodes = true |
スレッドごとのOCRHandlerインスタンス | 単一の共有IronTesseractインスタンス |
一般的な移行の問題と解決策
課題 1: パッケージの一部更新後の実行時エラー
XImage.OCR: 古いパッケージキャッシュでRasterEdge.XImage.OCRを新バージョンに進めることができます。 この不具合は、実行時に最初の OCR 呼び出し中に発生し、バージョン不一致が根本原因であることを明確に特定できないエラーメッセージが表示されます。 不一致を見つけるには、すべてのPackageReferenceエントリを手動で確認する必要があります。
**解決策:**XImage.OCR パッケージを削除し、IronOCR をインストールした後、バージョン同期を維持する必要はなくなります。 単一のIronOcrパッケージがすべてを運びます。 デフォルトのバンドルにない言語パックが必要な場合は、IronOcr.Languages.*パッケージを独立してインストールしてください - コアとバージョンを一致させる必要はありません:
課題 2: 文字列の言語コードが、目に見えない OCR エラーを引き起こす
XImage.OCR: 言語コードは文字列です("fra")。 言語コードのタイプミス — "ger" の代わりに "deu" — は、XImage.OCR バージョンによっては、デフォルト言語に静かにフォールバックするか、実行時に例外をスローします。 どちらの結果もコンパイル時には検出されません。
解決策: IronOCR はOcrLanguage enum を使用します。 無効な値はコンパイルエラーであり、実行時の予期せぬ動作ではありません。 文字列配列を列挙式に変換する:
// Before (XImage.OCR) — typos compile fine, fail at runtime
ocrHandler.Languages = new[] { "eng", "deu", "fra" };
// After (IronOCR) — typos are compile errors
ocr.Language = OcrLanguage.English + OcrLanguage.German + OcrLanguage.French;
多言語コンテンツを含む文書において、主要言語と副次言語を組み合わせる方法については、多言語ガイドを参照してください。
課題 3: バイト配列の処理後にディスクに残る一時ファイル
XImage.OCR: バイト配列から画像を処理するには、一時ファイルを作成する必要があります。なぜなら、OCRHandler.Process() がバッファではなくファイルパスを受け入れるからです。 finallyブロックをスキップする例外パスは、それらの一時ファイルをディスクに残します。 高スループットのアプリケーションでは、これが急速に蓄積されます。
解決策: OcrInput.LoadImage() はbyte[]を直接受け入れます。 一時ファイルは作成されません:
// Before (XImage.OCR) — temp file required
string tempPath = Path.GetTempFileName() + ".png";
File.WriteAllBytes(tempPath, imageBytes);
try { text = ocrHandler.Process(tempPath); }
finally { File.Delete(tempPath); }
// After (IronOCR) — direct byte array loading, no disk I/O
using var input = new OcrInput();
input.LoadImage(imageBytes);
var result = ocr.Read(input);
string text = result.Text;
課題 4: 並列負荷下でのメモリ枯渇
XImage.OCR: 並列処理にはスレッドごとにOCRHandlerが必要です。 5つの言語でドキュメントを処理する8つのスレッドは、それぞれ5つの言語パックすべてを含む8つの独立したエンジンインスタンスをロードします。 1インスタンスあたり1言語につき約50MBのメモリを消費するため、ドキュメントデータが処理される前に、8つのスレッドだけでOCRエンジンのメモリを約2GB消費します。
解決策: 単一のIronTesseractインスタンスですべてのスレッドを処理します。 ドキュメントごとにIronTesseractを再利用します:
// Single instance — shared safely across all threads
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English + OcrLanguage.German +
OcrLanguage.French + OcrLanguage.Spanish + OcrLanguage.Italian;
Parallel.ForEach(documentPaths, path =>
{
using var input = new OcrInput(); // Per-document, lightweight
input.LoadImage(path);
var result = ocr.Read(input); // Thread-safe call on shared instance
ProcessResult(result.Text);
});
課題 5: 部分的な復元後に CI/CD パイプラインが停止する
XImage.OCR: パッケージキャッシュが温存されているCI/CDエージェントでは、XImage.OCRのOCR言語パックの一部が古いバージョンでキャッシュされていることがよくあります。 プロジェクトファイルでコアパッケージのみが更新された場合、復元は成功しますが、ランタイムは不一致のアセンブリをロードします。 ビルドは成功しました; デプロイに失敗します。
**解決策:**IronOCRへの移行後、CI/CDパイプラインは1つのパッケージを復元します。 期待されるバージョンが存在することを確認するための検証ステップを追加してください:
# In your CI pipeline — verify single package restore
dotnet restore
dotnet list package | grep IronOcr
# なし version coordination logic needed — only one package to check
課題 6: 下流の解析に必要な構造化データの欠落
XImage.OCR: プレーンな文字列を返します。 単語の位置、行のグループ分け、または単語ごとの信頼度を必要とするアプリケーションは、空白文字のヒューリスティックまたはカスタムロジックを使用して文字列を解析する必要があります。 この解析の精度は、複数列レイアウト、表、または回転したテキストを含む文書では低下します。
解決策: IronOCR のOcrResultは、完全な文書階層を直接公開します。 文字列解析は不要です。
var result = ocr.Read(input);
// Direct access to structured data — no string manipulation
foreach (var page in result.Pages)
{
foreach (var line in page.Lines)
{
// Line text, bounding box, and per-word data all available
Console.WriteLine($"Line [{line.X},{line.Y}]: {line.Text}");
foreach (var word in line.Words)
Console.WriteLine($" Word '{word.Text}' confidence: {word.Confidence}%");
}
}
構造化データAPIの完全な使用方法については、読み取り結果の使い方とOCR結果機能のページを参照してください。
XImage.OCR移行チェックリスト
移行前
変更を加える前に、コードベースを監査して、XImage.OCRに関連するすべての箇所を特定してください。
# Find all XImage.OCR namespace imports
grep -r "RasterEdge.XImage.OCR\|Yiigo.Image.Ocr\|XImage.OCR" --include="*.cs" .
# Find all OCRHandler usages
grep -r "OCRHandler\|ocrHandler" --include="*.cs" .
# Find all string-based language assignments
grep -r "\.Language\s*=\s*\"" --include="*.cs" .
grep -r "\.Languages\s*=\s*new\[\]" --include="*.cs" .
# Find all XImage.OCR package references in project files
grep -r "RasterEdge.XImage.OCR\|XImage.OCR.Language" --include="*.csproj" .
# Count distinct language packs installed
grep "XImage.OCR.Language" --include="*.csproj" -r . | wc -l
使用されている画像ソースの種類(ファイルパス、バイト配列、ストリーム、TIFF)を記録し、バイト配列処理に一時ファイルを使用している箇所を特定してください。 これらは優先度の高い浄化対象です。
コードの移行
- すべての
XImage.OCR.Language.*パッケージ参照を削除します。 IronOcrパッケージリファレンスを追加します(dotnet add package IronOcr)。- すべてのファイルで
using IronOcrに置き換えます。 - アプリケーションの起動時に
IronOcr.License.LicenseKey = ...を追加します(プロセスごとに一度)。 new IronTesseract()に置き換えます。- 文字列言語の割り当て (
"deu") をOcrLanguageenum値に置き換えます。 input.LoadImage(path)+ocr.Read(input).Textに置き換えます。- バイト配列から一時ファイルへのパターンを
input.LoadImage(byte[])に置き換えます。 - 複数ページのTIFFの手動フレーム分割を
input.LoadImageFrames("file.tiff")に置き換えます。 OCRHandlerインスタンス化を削除します - 単一の共有IronTesseractインスタンスを使用します。- 可変品質のソースからのドキュメントごとに、各
LoadImage()の後に前処理呼び出し (input.DeNoise()) を追加します。 - 単純な文字列結果の処理を
result.SaveAsSearchablePdf()でPDF出力します。 ocr.Configuration.WhiteListCharacters = ...に置き換えます。- CI/CD パイプラインを更新します: マルチパッケージの復元ステップを削除し、バージョン同期ロジックを削除し、単一の
IronOcrパッケージ復元を確認します。
移行後
- 基本的なテキスト抽出が、既知の正常なテスト画像から正しい出力を生成することを確認する
- 多言語文書が、設定されているすべての言語のテキストを返すことを確認する
- テスト用バイト配列入力パスは、ディスク上に一時ファイルを作成せずに正しい出力を生成します
result.Pagesで正しいページ数が返ることを確認します。- 負荷をかけた状態で並列バッチ処理を実行し、最大メモリ使用量を測定する。これはXImage.OCRのベースライン値よりも大幅に低い値になるはずである。
- 検索可能なPDF出力がAdobe AcrobatまたはPDFビューアで正しく開き、テキストが選択可能であることを確認します。
- 低品質または歪んだスキャンで前処理をテストし、抽出されたテキストの精度をXImage.OCRのベースラインと比較します。
- ライセンスキーの初期化が最初の OCR 呼び出しの前に実行され、エラーが発生しないことを確認します。
- キャッシュされたパッケージのないクリーンな環境で、CI/CD リストアが成功することを確認する
- 構造化データ出力 (
result.Paragraphs) が期待される文書レイアウトと一致するか確認します。
IronOCRへの移行の主なメリット
単一パッケージが依存グラフ全体を置き換えます。 すべてのdotnet add package IronOcrコマンドに収束します。 .csprojエントリー数が11から1に減少します。 CI/CDの復元手順は、11個の独立した障害ポイントを持つ複数パッケージの操作から、単一パッケージの復元へと移行します。 その簡素化は、セキュリティ脆弱性を監査するパッケージの削減、 .NET互換性の変更時に更新するエントリの削減、自動更新パイプラインで維持するバージョン調整ロジックの不要化など、多くのメリットをもたらします。 IronOCRの製品ページとドキュメントハブには、すべての機能と導入に関するリファレンスが掲載されています。
**前処理の精度向上は即座に実感できます。**今回の移行は単なる既存システムの置き換えではなく、精度の向上を意味します。 スキュー、ノイズ、または低解像度のためにXImage.OCRで処理された文書が不正確であった場合、input.Contrast()を使用して改善への直接的な道があります。 外部画像処理ライブラリは不要、開発チームに画像処理の専門知識を持つ人材も不要、ライセンス取得やメンテナンスが必要な別の依存関係も不要。 LoadImage() の後に3行追加することで、以前は"十分良い"とされていたスキャン文書の精度が20〜35ポイント回復します。 画像品質補正ガイドと前処理機能ページでは、異なる文書品質のシナリオにおける各フィルターの効果を説明しています。
検索可能なPDFと構造化データにより、セカンドSDKのコストが不要になります。XImage.OCRユーザーから最も多く寄せられる2つの要望、検索可能なPDF出力と座標付きワードレベルデータは、いずれも別途商用ライセンスが必要となるRasterEdge製品の追加を必要とします。 移行後、result.Wordsはバウンディングボックスと信頼度スコアを提供する構造化データを提供します。 これまで2つのライセンスが必要だった機能が、1つのライセンスで利用できるようになりました。 出力フォーマットに関する詳細なドキュメントは、 OCR結果機能のページに掲載されています。
並列処理はメモリ使用量の増加なしにスケーリングできます。XImage.OCRのスレッドごとのハンドラモデルでは、スケーリングにコストがかかります。スレッド数を2倍にすると、OCRエンジンインスタンスが消費するメモリも2倍になります。 IronOCRの共有インスタンスモデルでは、並列処理の有無に関わらず、メモリ使用量は単一インスタンスのフットプリント内に収まります。 8つの同時スレッドで文書をバッチ処理するサーバーは、一度に1つの文書を処理するサーバーと同じOCRエンジンメモリを消費します。これは、固定インフラストラクチャにおけるホスティングコストの削減とスループットの余裕向上に直接つながります。
コード変更なしでクロスプラットフォーム展開が可能になります。 同じIronOcrパッケージと同じアプリケーションコードがWindows、Linux、macOS、Docker、Azure App Service、AWS Lambdaで動作します。 プラットフォーム依存のコードも、プラットフォーム固有のパッケージバリアントも、OCRレイヤーの環境ごとの展開テストも不要です。 ワークロードをコンテナ化するチーム、macOS開発環境を実行するチーム、またはLinuxベースのクラウドインフラストラクチャにデプロイするチームは、即座に互換性を享受できます。 Dockerデプロイガイド、 Azureデプロイガイド、およびLinuxデプロイガイドには、それぞれの対象環境におけるセットアップ手順が記載されています。
125以上の言語に対応し、言語対応の上限を撤廃。XImage.OCRの商用パッケージでは、対応言語は約15言語が上限となっています。 標準のtessdataディストリビューションには100以上の言語が無料で含まれています。IronOCRは125以上の言語をバンドルし、バージョンロックの制約なしでクリーンなインストールパターンに従うオプションのIronOcr.Languages.*パッケージを通じてそれらを公開します。 EUの24の公用語、主要なCJK言語、アラビア語、ヘブライ語、および特殊な文字体系がすべて利用可能です。 言語一覧には、サポートされているすべての言語とその対応するパッケージ名が一覧表示されます。
