Patagames Tesseract.NET SDKからIronOCRへの移行
このガイドでは、.NET開発者がPatagames Tesseract.NET SDKからIronOCRへ完全に移行する手順を解説します。 これには、APIの機械的な翻訳、多くの移行を推進するクロスプラットフォーム展開の実現、および本番環境のOCRパイプラインを、Windows専用の商用ラッパーから、Windows、Linux、macOS、Docker、Azure、AWS上で修正なしで動作するライブラリへ移行するために必要な実用的なコード変更が含まれます。
Patagames Tesseract .NET SDK から移行する理由
Patagamesへの切り替えを検討しているチームの大半は、OCRの精度に不満を抱いていません。 彼らはデプロイメントの壁に直面します。Linuxコンテナへの展開、クラウド移行プロジェクト、あるいはUbuntu上のCIパイプラインなどにおいて、Windows専用のネイティブバイナリでは、そのプラットフォーム上で先へ進む道が全くないことに気づくのです。 この単一の制約が、移行評価の残りの部分を左右します。
**Windows限定の展開は、最新 for .NETスタックの導入を妨げます。**Patagamesは、Tesseractエンジンラッパー用のWindowsネイティブバイナリを提供しています。 Linux x64、macOS、およびARM用のランタイムパッケージは提供されていません。 Windows DLLを実行時にロードするOcrApiクラス; 他のオペレーティングシステムでは、アプリケーションは起動に失敗します。 Microsoftが新しいクロスプラットフォーム開発での非推奨として正式にマークしたSystem.Drawing.Bitmap依存関係を追加すると、ライブラリはすべてのクラウドプロバイダとコンテナオーケストレーターのデフォルト配信モデルと互換性がなくなります。
**クロスプラットフォーム対応がないにもかかわらず、無料のエンジンに対して商用レベルの料金を支払う。**Patagamesの基盤となっているTesseractエンジンはオープンソースかつ無料です。 現在、tesseractocrのような無料コミュニティラッパーも事前構築されたWindowsのバイナリを出荷しており、Patagamesが歴史的に提供していた主要な利便性の主張を取り除いています。 Patagamesの商用ライセンスを購入すると、生のTesseractよりもわずかに洗練されたAPIインターフェースが利用可能になりますが、前処理、PDFサポート、検索可能なPDF出力、クロスプラットフォーム展開といった、2026年の完全なOCRライブラリを定義する4つの機能は追加されません。
**不透明な価格設定により、予算計画が不可能になります。**Patagamesはライセンス価格を公開していません。 ライブラリの評価を行うには、コスト比較を行う前に営業担当者に連絡する必要があります。 IronOCRの価格は1年分の更新が含まれる永続的な単一開発者用Liteライセンスで$999からです。 チームは、営業プロセスを経ることなく、コストと機能性を比較検討できます。 各ティアの詳細については、 IronOCRのライセンスページをご覧ください。
APIを介した生のTesseract変数の漏洩。 Patagamesでのページ分割モードの設定は、IntelliSenseなし、コンパイル時チェックなし、発見可能性なしの生の文字列ベースのTesseract変数割り当てであるapi.SetVariable("tessedit_pageseg_mode", "3")の呼び出しが必要です。 変数名のスペルを間違えると、呼び出しは黙って何もしません。 IronOCRはIronTesseract.Configurationに型強化されたプロパティで全てのTesseract設定オプションをラップしています。
フラットな文字列以外の構造化出力がありません。 Patagames GetTextFromImageは1つの文字列を返します。 単語の境界、行のグループ分け、段落構造、または単語ごとの信頼度スコアへのアクセスはできません。 フォームから特定のフィールドを抽出したり、単語単位でOCRの精度を検証したりする必要があるアプリケーションについては、Patagames APIでは対応できません。
**CI/CDパイプラインがLinuxの段階で停止してしまう。**現代 for .NET開発チームはLinux上でCIを実行しています。GitHub Actions、GitLab CI、Azure DevOpsはいずれも、デフォルトでLinuxベースのランナーを使用しています。 Tesseract.Net.SDKを参照するプロジェクトは、ネイティブバイナリ参照をビルドできないか、インテグレーションテスト中の実行時に失敗します。 すべてのテスト実行には、Windows専用のCIランナー、またはOCRレイヤーを完全にモックする回避策が必要です。
基本的な問題
PatagamesはWindowsのみを対象としています。 デプロイ先が変更された場合、ライブラリはそれに追従できません:
// Patagames: Windows DLL loads; fails on Linux container or macOS developer machine
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng"); // tessdata path — must be manually managed in every environment
using var bitmap = new Bitmap(imagePath); // System.Drawing — unsupported on non-Windows targets
return api.GetTextFromImage(bitmap);
// IronOCR: same code runs on Windows, Linux, macOS, Docker, Azure, AWS
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read(imagePath).Text;
tessdataディレクトリはありません。 ネイティブDLLパスはありません。 プラットフォーム固有の条件記述は含めないでください。 NuGetの依存関係グラフにより、各ターゲット向けの適切なランタイムが自動的に解決されます。
IronOCR 対 Patagames Tesseract.NET SDK:機能比較
以下の表は、現在本番環境でPatagamesを運用しているチームに関連する機能についてまとめたものです。
| フィーチャー | Patagames Tesseract .NET SDK | IronOCR |
|---|---|---|
| Windows 対応 | はい | はい |
| Linuxサポート | なし | はい |
| macOS対応 | なし | はい |
| Dockerデプロイメント | なし | はい |
| Azureアプリサービス | なし | はい |
| AWSラムダ | なし | はい |
| NuGetパッケージ | Tesseract.Net.SDK | IronOcr |
| ライセンスモデル | 商用(価格についてはお問い合わせください) | 永続的 ( $999–$2,399、公開 ) |
| OCRエンジン | Tesseract(オープンソース) | 最適化された Tesseract 5(同梱) |
| Tessdata管理 | .traineddataファイルの手動ディレクトリ | NuGet言語パッケージ |
| 自動前処理 | None | Deskew、DeNoise、Contrast、Binarize、Sharpen、Scale、Dilate、Erode |
| 深い背景ノイズの除去 | None | はい ( DeepCleanBackgroundNoise() ) |
| ネイティブPDF入力 | いいえ(外部レンダラーが必要) | はい |
| 複数ページのTIFF入力 | 制限的 | はい ( input.LoadImageFrames() ) |
| 検索可能なPDF出力 | なし | はい ( result.SaveAsSearchablePdf() ) |
| hOCRエクスポート | なし | はい |
| 対応言語 | Tesseractのtessdataファイル | NuGetパッケージ経由で125以上 |
| 多言語同時通訳 | はい(文字列連結) | はい ( 型強化されたOcrLanguage列挙 ) |
| 地域ベースのOCR | なし | はい ( CropRectangle ) |
| バーコード読み取り | なし | はい |
| 構造化された出力 | プレーンテキストのみ | 座標付きのページ、段落、行、単語、文字 |
| 単語ごとの信頼度スコア | なし | はい |
| ページ分割の設定 | 生のSetVariable文字列呼び出し | 型強化Configuration.PageSegmentationMode |
| System.Drawing の依存関係 | 必須 | オプション |
| スレッドセーフ。 | 標準的なテセラクトの制限 | 完全 ( スレッドごとにIronTesseractを作成 ) |
| 商業サポート | はい | はい |
| NuGetのダウンロード | 制限的 | 530万以上 |
クイックスタート:Patagames Tesseract.NET SDK から IronOCR への移行
ステップ 1: NuGet パッケージを置き換える
Patagames Tesseract.NET SDK を削除してください:
dotnet remove package Tesseract.Net.SDK
NuGetからIronOCRをインストールしてください。
英語以外の言語に対応するには、対応する言語パッケージをインストールしてください:
ステップ 2: 名前空間の更新
PatagamesのネームスペースをIronOCRのネームスペースに置き換えてください:
// Before (Patagames)
using Patagames.Ocr;
using Patagames.Ocr.Enums;
using System.Drawing;
// After (IronOCR)
using IronOcr;
ステップ 3: ライセンスの初期化
アプリケーションの起動時にライセンスの初期化を追加します(最初のIronTesseract呼び出しの前に):
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"ironsoftware.com/C#/ocr/で無料トライアルライセンスを利用して、購入することなく移行テストを開始できます。
コード移行の例
フォルダーの一括処理
フェーズ1では、単一画像の抽出が示されました。 通常のPatagamesのデプロイメントでは、ループ内でapi.Init()を呼び出します。これにより、各ファイルのためにtessdataをリロードし、Tesseractエンジンを再初期化します。そのパターンは何百ものドキュメントにわたって初期化コストを累積します。
Patagamesのアプローチ:
// NuGet: Tesseract.Net.SDK
using Patagames.Ocr;
using System.Drawing;
using System.IO;
public class PatagamesBatchProcessor
{
private const string TessDataPath = @"./tessdata";
public Dictionary<string, string> ProcessFolder(string folderPath)
{
var results = new Dictionary<string, string>();
foreach (var file in Directory.GetFiles(folderPath, "*.jpg"))
{
// OcrApi re-initialized per file — tessdata loaded each time
using var api = OcrApi.Create();
api.Init(TessDataPath, "eng");
using var bitmap = new Bitmap(file);
var text = api.GetTextFromImage(bitmap);
results[Path.GetFileName(file)] = text;
}
return results;
}
}
IronOCRのアプローチ:
// NuGet: IronOcr
using IronOcr;
using System.IO;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public class IronOcrBatchProcessor
{
public Dictionary<string, string> ProcessFolder(string folderPath)
{
var results = new Dictionary<string, string>();
// Single engine instance — initialized once, reused across all files
var ocr = new IronTesseract();
foreach (var file in Directory.GetFiles(folderPath, "*.jpg"))
{
var result = ocr.Read(file);
results[Path.GetFileName(file)] = result.Text;
}
return results;
}
}
IronOCRのIronTesseractインスタンスは、呼び出し間でエンジンの状態を保持します。 バッチ全体で 1 つのインスタンスを再利用することで、ファイルごとの初期化オーバーヘッドが解消され、tessdata パスへの依存関係が完全に排除されます。 複数のCPUコアにまたがる並列バッチ処理のためには、マルチスレッドの例を参照してください。単一のインスタンスを共有するのではなく、スレッドごとに1つのIronTesseractを作成します。
ページ分割モードの移行
Patagamesは文字列キーと整数値(文字列にキャスト)を使用した生のSetVariable呼び出しを通じてページ分割モードを公開します。 IntelliSenseも、列挙型の検証も、呼び出し箇所でのドキュメントのヒントも表示されません。たった1桁の数字で、Tesseractが入力を単一のテキストブロック、列、WORD、または単一の文字として扱うかが決まります。また、変数名を誤って入力してもフィードバックは得られません。
Patagamesのアプローチ:
// NuGet: Tesseract.Net.SDK
using Patagames.Ocr;
using Patagames.Ocr.Enums;
using System.Drawing;
public string OcrSingleLineField(string imagePath)
{
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng");
// Raw variable string — no IntelliSense, no validation
// PageSegmentationMode.SingleLine == 7
api.SetVariable("tessedit_pageseg_mode", "7");
// Additional variable to suppress dictionary output
api.SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -.:/");
using var bitmap = new Bitmap(imagePath);
return api.GetTextFromImage(bitmap);
}
IronOCRのアプローチ:
// NuGet: IronOcr
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public string OcrSingleLineField(string imagePath)
{
var ocr = new IronTesseract();
// Strongly typed enum — discoverable through IntelliSense
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.SingleLine;
var result = ocr.Read(imagePath);
return result.Text;
}
PatagamesがIronTesseract.Configurationで直接型強化された同等物を持っています。 移行とは、名前付き列挙型の値に対する文字列リテラルを機械的に置換することです。 完全な設定項目については、IronTesseract API リファレンスを参照してください。 特定のドキュメントに関するガイドでは、さまざまなドキュメントタイプに対して各ページ分割モードをいつ適用すべきかについて解説しています。
結果 イテレータパターンの置換
PatagamesはGetTextFromImageからフラットな文字列を返します。 Patagamesの出力から個々のWORD、そのバウンディングボックス、または信頼度スコアを抽出するには、返された文字列の上にパーサーを記述するか、または相互運用性を通じて基盤となるTesseractの結果イテレータAPIに直接アクセスする必要があります。どちらのアプローチも信頼性が低く、保守性が悪いです。 IronOCRはドキュメント階層のすべてのレベルにネイティブでアクセスできる完全に構造化されたOcrResultを公開します。
Patagamesのアプローチ:
// NuGet: Tesseract.Net.SDK
using Patagames.Ocr;
using System.Drawing;
public void ExtractWordsWithPositions(string imagePath)
{
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng");
using var bitmap = new Bitmap(imagePath);
// プレーンテキストのみ — no word positions, no confidence, no line grouping
var text = api.GetTextFromImage(bitmap);
// Only option: split on whitespace and hope line breaks survive
var words = text.Split(new[] { ' ', '\n', '\r' },
StringSplitOptions.RemoveEmptyEntries);
foreach (var word in words)
{
// なし X, Y, Width, Height — position information is lost
Console.WriteLine(word);
}
}
IronOCRのアプローチ:
// NuGet: IronOcr
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public void ExtractWordsWithPositions(string imagePath)
{
var result = new IronTesseract().Read(imagePath);
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Width}x{page.Height}px");
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($" Paragraph at ({paragraph.X}, {paragraph.Y})");
Console.WriteLine($" Text: {paragraph.Text}");
}
foreach (var word in page.Words)
{
// Bounding box, confidence, and text for every word
Console.WriteLine($" Word: '{word.Text}' at ({word.X},{word.Y}) " +
$"size {word.Width}x{word.Height} " +
$"confidence {word.Confidence:F1}%");
}
}
Console.WriteLine($"Overall confidence: {result.Confidence:F1}%");
}
完全なOcrResult構造 - ページ、段落、行、単語、文字 - はすべての後処理パーサーの必要性を排除します。 WORD座標を使用すると、位置情報に基づいたフィールド抽出が可能になります。これは、請求書処理、フォームOCR、および表の抽出の基礎となります。 完全な階層構造については"構造化結果ガイド"を、信頼度の低いWORDをフィルタリングするには"信頼度スコアガイド"を参照してください。
複数ページTIFFの処理
PatagamesはSystem.Drawing.Bitmapを受け入れます。 複数の埋め込み画像を含むマルチフレームTIFFが、GetTextFromImageに渡す必要があります。フレーム列挙APIは明確ではなく、それが失敗した場合のエラーメッセージは説明的ではありません。
Patagamesのアプローチ:
// NuGet: Tesseract.Net.SDK
using Patagames.Ocr;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;
public string ProcessMultiPageTiff(string tiffPath)
{
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng");
var sb = new StringBuilder();
using var tiffImage = Image.FromFile(tiffPath);
var frameCount = tiffImage.GetFrameCount(FrameDimension.Page);
for (int i = 0; i < frameCount; i++)
{
// Manual frame selection — FrameDimension.Page required
tiffImage.SelectActiveFrame(FrameDimension.Page, i);
using var frameBitmap = new Bitmap(tiffImage);
var pageText = api.GetTextFromImage(frameBitmap);
sb.AppendLine(pageText);
}
return sb.ToString();
}
IronOCRのアプローチ:
// NuGet: IronOcr
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public string ProcessMultiPageTiff(string tiffPath)
{
using var input = new OcrInput();
// LoadImageFrames handles all frames automatically
input.LoadImageFrames(tiffPath);
// Optional: apply preprocessing to all frames at once
input.Deskew();
input.DeNoise();
var result = new IronTesseract().Read(input);
// Per-page access if needed
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words");
}
return result.Text;
}
内部でフレーム列挙を処理し、パイプライン内の各フレームに前処理を適用するOcrInput.LoadImageFrames(). System.Drawingフレーム選択の手続きは完全に消えます。 特定のページのみが必要な場合の単一フレーム選択など、その他のオプションについては、TIFFおよびGIFの入力ガイドを参照してください。
外部レンダラーを必要としないPDF入力
Patagamesには、ネイティブなPDFサポートはありません。 PatagamesベースのPDF OCRパイプラインには、PDFiumViewer、iText、またはPDFSharpのような外部PDFレンダリングライブラリが必要で、各ページをGetTextFromImageに渡します。 その外部依存関係は、パッケージ管理のオーバーヘッド、別途のライセンスに関する考慮事項、および二次的な障害点を追加することになります。 また、ライブラリによってレンダリング品質が異なり、これはTesseractエンジンとは独立してOCRの精度に影響を与えます。
Patagamesのアプローチ:
// NuGet: Tesseract.Net.SDK + PdfiumViewer (external dependency)
using Patagames.Ocr;
using PdfiumViewer; // separate NuGet package required
using System.Drawing;
using System.Text;
public string OcrPdfDocument(string pdfPath)
{
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng");
var sb = new StringBuilder();
// External renderer required — Patagames has no PDF support
using var pdfDoc = PdfDocument.Load(pdfPath);
for (int page = 0; page < pdfDoc.PageCount; page++)
{
// Render at 300 DPI for acceptable OCR accuracy
using var img = pdfDoc.Render(page, 300, 300, false);
using var bitmap = new Bitmap(img);
var pageText = api.GetTextFromImage(bitmap);
sb.AppendLine(pageText);
}
return sb.ToString();
}
IronOCRのアプローチ:
// NuGet: IronOcr only — no external PDF renderer
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public string OcrPdfDocument(string pdfPath)
{
using var input = new OcrInput();
input.LoadPdf(pdfPath);
// Preprocessing applies to every page in one call
input.Deskew();
var ocr = new IronTesseract();
var result = ocr.Read(input);
// Full per-page structured access
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Paragraphs.Length} paragraphs");
}
return result.Text;
}
1つのNuGetパッケージで2つを置き換えます。 レンダリングステップが削除されます。 PDF入力ガイドでは、単一ページ、複数ページ、およびパスワードで保護されたPDFについて説明しています。 スキャンしたPDFからCtrl+Fで検索可能なドキュメントを生成する"検索可能なPDF出力ワークフロー"については、検索可能なPDFガイドおよび検索可能なPDFの例で、5行で構成される完全なパイプラインが示されています。
Patagames Tesseract .NET SDK API から IronOCR へのマッピングリファレンス
| Patagames Tesseract .NET SDK | IronOCR相当値 |
|---|---|
Tesseract.Net.SDK (NuGetパッケージ) | IronOcr (NuGetパッケージ) |
Patagames.Ocr (名前空間) | IronOcr (名前空間) |
Patagames.Ocr.Enums (名前空間) | IronOcr (名前空間) |
OcrApi.Create() | new IronTesseract() |
api.Init(tessDataPath, "eng") | ocr.Language = OcrLanguage.English (パスなし) |
api.Init(path, "eng+fra+deu") | ocr.Language = OcrLanguage.English + OcrLanguage.French + OcrLanguage.German |
api.GetTextFromImage(bitmap) | ocr.Read(imagePath).Text |
api.SetVariable("tessedit_pageseg_mode", "7") | ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.SingleLine |
api.SetVariable(key, value) (任意の生変数) | ocr.Configuration.[TypedProperty] |
new Bitmap(imagePath) (入力準備) | input.LoadImage(imagePath) |
OcrBitmap.FromFile(path) | input.LoadImage(path) |
| マルチフレームTIFFには対応していません | input.LoadImageFrames(tiffPath) |
| PDF入力なし | ocr.Read(pdfPath) |
| 検索可能なPDFはありません | result.SaveAsSearchablePdf("output.pdf") |
| 前処理なし | input.Deskew(), input.DeNoise(), input.Contrast(), input.Binarize() |
| リージョンOCRなし | input.LoadImage(path, new CropRectangle(x, y, w, h)) |
| バーコードが読み取れません | ocr.Configuration.ReadBarCodes = true |
| 文字列のみの平文結果 | result.Pages, result.Lines, result.Words, result.Paragraphs |
| 単語ごとの信頼度 | result.Words[i].Confidence, result.Confidence |
PageSegmentationMode列挙 | TesseractPageSegmentationMode列挙 |
| hOCRエクスポートなし | 結果.ToHOcrString()出力 |
| Windows x64/x86 のみ | Windows、Linux、macOS、Docker、Azure、AWS |
一般的な移行の問題と解決策
課題 1: 新しい環境で Tessdata ディレクトリが見つからない
Patagames: eng.traineddataファイルが欠落していると実行時に失敗します。 コンテナ化された環境では、これはビルド時の警告は発生せず、デプロイ時に発生する障害となります。 Dockerにデプロイするチームは、イメージがすでにプッシュされた後にこの問題に気づくことがよくあります。
**解決策:**IronOCRでは、tessdataディレクトリの概念を完全に廃止しました。 言語データを NuGet パッケージとしてインストールする:
言語データはビルド時に解決され、dotnet publish出力に自動的に含まれます。 言語ファイルに関しては、間違った手順やデプロイメントチェックリストの項目は存在しません。
問題 2: Linux 環境で System.Drawing.Bitmap が動作しない
Patagames: PlatformNotSupportedExceptionをスローします。 libgdiplusが存在していても、分布間での動作は一貫していません。 Microsoftは、新しい開発での非WindowsプラットフォームでのSystem.Drawingの使用を明示的に推奨していません。
**解決策:**IronOCRは、ファイルパス、バイト配列、およびストリームを直接受け付けます。 System.Drawing依存関係は必要ありません:
// Replace this pattern:
using var bitmap = new Bitmap(imagePath); // fails without libgdiplus on Linux
api.GetTextFromImage(bitmap);
// With:
var result = new IronTesseract().Read(imagePath); // no System.Drawing required
バイト配列やストリームを含む、サポートされているすべての入力タイプについては、画像入力ガイドを参照してください。
課題 3: SetVariable の静的な失敗
Patagames: boolを返しますが、ほとんどの呼び出し側は戻り値を破棄します。 変数名のスペルが間違っていたり、サポートされていない値が渡されたりした場合、Tesseractは黙ってデフォルト値を適用し、処理を続行します。 その結果生じる精度の低下は、設定呼び出しまで遡って特定することが困難です。
**解決策:**IronOCRの設定プロパティは強型です。 無効な代入は、コンパイル時にエラーとなり、実行時に黙ってデフォルト値が代入されることはありません:
// Compile-time safety — no silent failures
var ocr = new IronTesseract();
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.SingleBlock;
ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5; // also strongly typed
課題 4: ループ内で OcrApi が初期化される
Patagames: 処理ループ内でOcrApiを初期化するチームは、各反復でtessdataの読み込みオーバーヘッドを負担します。 スレッド隔離の観点からは正しくても、api.Init()を使う典型的なパターンは、数百のドキュメントを処理する際には高価です。
解決策: スレッドごとに1つのIronTesseractを作成し、そのスレッドに割り当てられたすべてのドキュメントでそれを再利用します。 インスタンスは.Read()呼び出し間でステートレスです:
// One instance, many reads — engine initialized once
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
foreach (var file in imageFiles)
{
var text = ocr.Read(file).Text;
ProcessText(text);
}
並列バッチ処理の場合、タスクごとに1つのインスタンスを作成してください。 スループット調整オプションを含むIronTesseract.Configuration.TesseractVersionと読み取り速度プリセットのための速度最適化ガイドを参照してください。
課題 5: Linux Docker ベースイメージが動作しない
Patagames: Linux 対応の Patagames バイナリは存在しません。 PatagamesベースのアプリケーションをLinuxのDockerコンテナで実行しようとすると、失敗します。 唯一の回避策は、Windowsベースのコンテナ(FROM mcr.microsoft.com/windows/servercore)であり、これはかなり大きく、取得が遅く、Linuxノードプールを使用するほとんどのKubernetes構成と互換性がありません。
**解決策:**IronOCRは標準的なLinuxベースイメージに対応しています。 Docker デプロイメントガイドでは、具体的な Dockerfile の設定について解説しています:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /app/publish .
# IronOCR resolves the Linux native runtime from NuGet automatically
ENTRYPOINT ["dotnet", "MyApp.dll"]
Windowsコンテナは不要です。 個別のバイナリ配布はありません。 同じ Docker イメージは、あらゆる Linux ベースのコンテナホスト上で実行可能です。
課題 6: PDF OCR には 2 つの NuGet パッケージが必要です
Patagames: PatagamesアプリケーションにPDF OCR機能を追加するには、PDFレンダリング用の別のNuGetパッケージ(PdfiumViewer、iTextSharp.LGPLv2.Core、または類似のパッケージ)が必要です。 それぞれに独自のライセンス条件、更新頻度、および潜在的な互換性の問題があります。 PDFレンダラーのバージョンとPatagamesのバージョンに矛盾が生じた場合は、両チームが協力して解決する必要があります。
**解決策:**IronOCRは、追加のパッケージを必要とせず、PDF入力をネイティブに処理します。 PDFレンダラーへの依存関係を完全に排除する:
# Remove the PDF rendering shim
dotnet remove package PdfiumViewer
# IronOCR handles PDF natively
var result = new IronTesseract().Read("document.pdf");
Patagames Tesseract .NET SDK 移行チェックリスト
移行前
作業を開始する前に、コードベースを監査して、Patagamesに関するすべての参照を特定してください:
# Find all files using Patagames namespaces
grep -r "Patagames.Ocr" --include="*.cs" . -l
# Find all OcrApi usage patterns
grep -r "OcrApi\|GetTextFromImage\|api\.Init\|SetVariable" --include="*.cs" .
# Find tessdata path references
grep -r "tessdata\|TessDataPath\|traineddata" --include="*.cs" .
# Find System.Drawing.Bitmap usage tied to OCR
grep -r "new Bitmap\|System\.Drawing" --include="*.cs" . -l
# Find any PDF rendering libraries used to feed Patagames
grep -r "PdfiumViewer\|iTextSharp\|PdfSharp" --include="*.csproj" .
ドキュメント: ImageSharpで書かれた任意の前処理コードおよびPatagames呼び出しをラップするコード。
コードの移行
- すべてのプロジェクトから
Tesseract.Net.SDKNuGetパッケージ参照を削除します。 - Patagamesにのみ使用されるPDFレンダリングNuGetパッケージ(PdfiumViewer、iTextなど)を削除します。
IronOcrNuGetパッケージをインストールします。IronOcr.Languages.Englishおよびその他の必要な言語パッケージをインストールします。- アプリケーションのスタートアップ時に
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"を追加します。 using IronOcr;に置き換えます。- 各
OcrApi.Create()+new IronTesseract()+ocr.Language = OcrLanguage.[Language]に置き換えます。 - 各
Bitmapコンストラクタを削除)します。 - 各
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.[Value]に置き換えます。 - Patagamesに画像を渡すためだけに存在していたすべての
System.Drawing.Bitmapインスタンスを削除します。 - PDFレンダリングループ(存在する場合)を
input.LoadPdf(pdfPath)に置き換えます。 input.LoadImageFrames(tiffPath)に置き換えます。- 任意のカスタム前処理コード(System.Drawingのリサイズ、コントラスト、しきい値)を同等の
OcrInputフィルター呼び出しに置き換えます。 - すべてのデプロイメントマニフェスト、Dockerfile、およびCIのコピー手順からtessdataディレクトリを削除してください。
- クロスプラットフォームでの動作を検証するため、Linux CIランナー(GitHub Actionsのubuntu-latestなど)で実行できるよう統合テストを更新する。
移行後
- クロスプラットフォーム展開のロック解除が機能していることを確認するため、WindowsだけでなくLinuxでもSuite全体を実行してください。
- 同一のテスト画像セットにおいて、OCRの精度がPatagamesのベースラインと同等か、それ以上であることを確認してください。
- マルチランゲージドキュメントが
OcrLanguage列挙アプローチを使用して正しい出力を生成することを確認します。 - 外部のレンダリングライブラリを使用せずにPDF入力を直接テストし、出力精度を従来のレンダリング済みビットマップ処理と比較してください。
- マルチフレーム TIFF 処理の結果が、以前のフレーム列挙ループと同じページ数およびテキストコンテンツになることを検証します。
- デプロイメントアーティファクトに tessdata ディレクトリが含まれていないこと、およびランタイムパスエラーが発生しないことを確認してください。
linux/amd64を対象とするDockerビルドを実行し、コンテナ内で少なくとも1回のOCR呼び出しを実行します。- CIパイプライン(GitHub Actions、GitLab CI、Azure DevOps)が、デフォルトのLinuxランナー上で正常に完了することを確認してください。
- 結果に信頼度スコアが表示されていること、および信頼度に基づくフィルタリングロジックが期待通りに動作することを確認してください。
- ライセンスキーの初期化が最初の
IronTesseractインスタンスが本番起動コードで作成される前に実行されることを確認します。
IronOCRへの移行の主なメリット
**コード変更なしのクロスプラットフォーム展開。**移行後、同じバイナリが Windows Server、Ubuntu Docker コンテナ、macOS 開発マシン、Linux 上の Azure App Service、および AWS Lambda で実行されます。 プラットフォーム固有の条件、ランタイム識別子フラグ、およびOSごとの個別のデプロイメントアーティファクトは存在しません。 以前はWindows専用のOCRライブラリによって阻まれていたクラウド移行が、標準的なコンテナ展開となります。 Linux、Docker、Azure、およびAWSのデプロイメントガイドでは、各ターゲット環境における本番環境の設定について解説しています。
**Tessdataの管理業務が不要になります。**tessdataディレクトリ(その場所、内容、あらゆる環境における存在)は、運用上の課題として存在しなくなります。 言語データはビルド時に解決されるNuGet依存関係です。それはdotnet publish出力に自動的に現れます。 新しい言語を追加する際に更新すべきデプロイメント・ランブックはなく、tessdataファイルが変更された際に無効化する必要のあるDockerレイヤーもなく、tessdataの欠落による本番環境のインシデントを調査する必要もありません。
構造化出力が文字列解析に代わります。 フィールドの抽出、内容の検証、信頼度の計算のために以前にOcrResultから直接そのデータにアクセスします。 WORDの座標、行の境界、段落のグループ化、およびWORDごとの信頼度スコアは、第一級プロパティです。 フィールド抽出は、請求書処理とフォームOCRの基盤であるバウンディングボックスによるものであり、脆弱なサブストリング検索ではなく、直接的なCropRectangle呼び出しです。
ビルトイン前処理はカスタム画像パイプラインに代わります。 Patagamesのビルトインフィルターの欠如を補うために書かれた任意の前処理コードは、OcrInputメソッド呼び出しに置き換えることができます。 スキュー補正、ノイズ除去、コントラスト強調、二値化、および解像度正規化は、1行で実行できる操作です。 20〜40時間かけてSystem.Drawing前処理パイプラインを構築および調整していたチームは、5つのメソッド呼び出しでそれを置き換え、その保守作業を他のところに振り向けることができます。 フィルタの完全なカタログについては、前処理機能の概要をご覧ください。
**ネイティブPDFサポートにより、依存クラスが不要になります。**PatagamesのPDF機能の不足を補うためだけに追加されていたPDFレンダリングライブラリは排除されます。 以前はSystem.Drawing依存関係を調整する必要があった生産OCRシステムが、一つのOCRパッケージでブリッジ依存関係なしです。 パスワードで保護された文書や複数ページの文書を含むPDF入力は、主要な入力形式の一つです。 コンプライアンスと記録管理のユースケースでは、result.SaveAsSearchablePdf()が追加のライブラリなしで単一の呼び出しでテキストレイヤーPDF出力を生成します。
透明な価格設定と商業サポート。 IronOCRの$999永続的Liteライセンスは、1人の開発者と1つのデプロイメント場所をカバーし、1年間の更新が含まれます。 価格は公開されており、料金体系は明確で、Enterprise契約なしでも商用サポートが利用可能です。 これまでWindows専用のTesseractラッパーに対してPatagamesの料金を支払っていたチームは、クロスプラットフォーム展開、前処理、PDFサポート、125以上の言語対応といった機能を利用できるようになります。さらに、評価が完了する前にコストが明確になる料金体系に移行します。 各プランの詳細についてはIronOCRのライセンス情報をご参照ください。無料トライアルライセンスについては、IronOCRの製品ページをご覧ください。
