Aspose.OCRからIronOCRへの移行
このガイドでは、 .NET開発者が Aspose.OCR からIronOCRへ完全に移行する方法を説明します。 本書では、パッケージのスワップ、名前空間の変更、ライセンスの初期化、および実際のAspose.OCRの使用パターンから抽出した4つの具体的なコード移行例(認識設定の構成、領域検出モード、信頼度に基づくフィルタリングによるバッチ認識、構造化出力処理)について解説します。 各例では、Aspose.OCR のアプローチとIronOCR の同等のアプローチを並べて示しているので、推測に頼ることなく既存のコードを翻訳できます。
Aspose.OCRから移行する理由
チームがAspose.OCRから離れる理由は、主に2つの問題点に集中しています。それは、サブスクリプション型の課金モデルと、手動認識パイプラインによって課される設定の負担です。
サブスクリプション料金は上限なく加算されます。Aspose.OCRには永久ライセンスの選択肢はありません。 開発者向け小規模企業ライセンスは、開発者1人あたり年間999ドルです。 5人チームが3年間の契約を更新する場合、ビジネスロジックを1行も記述する前に14,985ドルを支払うことになる。 IronOCRのProfessionalプランは、2,999ドルの一括払いで、更新義務なしで永久に同じ補償内容が利用できます。 財務部門が、OCRへの依存がSaaSのサブスクリプションのように毎年更新される理由を問うとき、数学的な考察は避けられないものとなる。
すべての認識呼び出しには設定オブジェクトの儀式が必要です。 Aspose.OCRはその構成サーフェスをPreprocessingFilterコレクションに分けています。 RecognizeImageを呼び出す前に、設定オブジェクトを作成し、それを設定して明示的に渡す必要があります。 IronOCRはそれを.Read()に統合します。 通話ごとの差は小さい。 それはコードベース全体に蓄積される。
領域検出モードの選択は手動であり、重要です。 Aspose.OCRは、開発者が各文書タイプに対して選択しなければならないNONEを提供します。 構造化フォームでモードを誤ると、認識精度が低下します。 IronOCRは文書のレイアウトを自動的に分析し、事前のモード宣言を必要とせずに、段落、行、単語といった構造化された結果を表示します。
バッチ処理には結果リストを手動で管理する必要があります。 Aspose.OCRで検索可能なPDFまたは構造化データファイルとして認識されたページのバッチを保存するには、SaveMultipageDocumentに渡す必要があります。 リストのスレッド化はあなたの責任です。 IronOCRは単一のOcrResultを生成します。
出力フォーマットの切り替えは複数のAPIサーフェスに影響します。 Aspose.OCRでは、JSON、XML、またはプレーンテキストへのエクスポートにはそれぞれ別のSaveMultipageDocumentに渡す必要があります。 それらの結果を保存する前に確信度でフィルタリングするには、リストを反復して各RecognitionAreasConfidence配列を検査する必要があります。 IronOCRは単一の結果オブジェクトでresult.Pagesを公開しており、確信度フィルタリングは1行のLINQ式です。
IronOCRのライセンスモデルは、更新リスクを完全に排除します。購入したライセンスは永久にご利用いただけます。 アップデートは1年間含まれています。 その後、最後に受け取ったバージョンは、コンプライアンス上のリスクにさらされることなく、本番環境で引き続き動作します。 支払いが滞ったからといって、導入が中断されるような事態は一切発生しません。
基本的な問題
Aspose.OCRは、認識設定を、呼び出しのたびに構築、設定、および渡す必要がある設定オブジェクトに関連付けます。 モード、言語、フィルター、エリア戦略はすべて、そのオブジェクトのプロパティです。
// Aspose.OCR: build a settings object for every recognition call
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.DOCUMENT, // must choose the right mode
RecognizeSingleLine = false,
AutoSkew = true
};
var result = api.RecognizeImage("form.jpg", settings);
string text = result.RecognitionText;
// Aspose.OCR: build a settings object for every recognition call
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.DOCUMENT, // must choose the right mode
RecognizeSingleLine = false,
AutoSkew = true
};
var result = api.RecognizeImage("form.jpg", settings);
string text = result.RecognitionText;
Imports Aspose.OCR
' Aspose.OCR: build a settings object for every recognition call
Dim api As New AsposeOcr()
Dim settings As New RecognitionSettings With {
.Language = Language.Eng,
.DetectAreasMode = DetectAreasMode.DOCUMENT, ' must choose the right mode
.RecognizeSingleLine = False,
.AutoSkew = True
}
Dim result = api.RecognizeImage("form.jpg", settings)
Dim text As String = result.RecognitionText
IronOCRは、単一の.Read()呼び出しを使用します。 設定は必要に応じてIronTesseractインスタンスにあり、呼び出しごとにオブジェクトに付属しません:
// IronOCR: one call, no settings object required
var text = new IronTesseract().Read("form.jpg").Text;
// IronOCR: one call, no settings object required
var text = new IronTesseract().Read("form.jpg").Text;
Imports IronOcr
Dim text As String = New IronTesseract().Read("form.jpg").Text
IronOCRとAspose.OCR:機能比較
以下の表は、移行の意思決定において最も重要な要素に基づいて、2つのライブラリを比較したものです。
| フィーチャー | Aspose.OCR | IronOCR |
|---|---|---|
| ライセンスモデル | 年間購読(永久購読オプションはありません) | 永久一括購入 |
| 1-開発者コスト | 年間999ドル | $999 一度 |
| 開発者10人分の費用 | 年間4,995ドル(サイトライセンス) | 2,999ドル(Professional) |
| ライセンスの有効期限切れによる影響 | 新しいビルドをデプロイできません。セキュリティパッチもありません。 | なし — 購入版は無期限に使用可能 |
| 初級OCRクラス | AsposeOcr |
IronTesseract |
| 設定オブジェクトが必要です | はい(DocumentRecognitionSettings) |
いいえ - 高度なシナリオのためのオプションのOcrInput |
| 領域検出 | 手動のDetectAreasMode列挙の選択 |
自動レイアウト解析 |
| 前処理 | 手動のPreprocessingFilterコレクション |
自動(オプションで明示的なオーバーライドあり) |
| PDF入力 | RecognizePdf()による標準的なPDF |
OcrInput.LoadPdf()によるネイティブ |
| パスワードで保護されたPDF | Aspose.PDFが必要です(別途ライセンスが必要です)。 | 組み込みのPassword:パラメータ |
| 検索可能なPDF出力 | SaveMultipageDocument(path, SaveFormat.Pdf, list) |
result.SaveAsSearchablePdf(path) |
| 信頼度 | result.RecognitionAreasConfidence.Average()(配列) |
result.Confidence(単一のdouble、0–100) |
| 単語レベルの構造化データ | RecognitionAreasRectanglesによる領域レベルのジオメトリ |
X、Y、幅、高さ、信頼性を伴うresult.Words |
| ページレベルの構造化データ | 露出していない | 段落、行、単語、文字を伴うresult.Pages |
| 多言語同時通訳 | 通話ごとに単一言語 | OcrLanguage.French + OcrLanguage.German |
| 対応言語 | メインパッケージで130以上 | NuGet言語パック経由で125種類以上 |
| バーコード読み取り | 不可 | 組み込み(ocr.Configuration.ReadBarCodes = true) |
| スレッドセーフ。 | スレッドごとに新しいインスタンスを作成することをお勧めします | 完全にスレッドセーフな、単一の共有インスタンス |
| TIFFマルチフレーム | ネイティブではない | input.LoadImageFrames("file.tiff") |
| hOCRエクスポート | 制限的 | result.SaveAsHocrFile(path) |
| クロスプラットフォームのNuGet | はい | はい(Windows、Linux、macOS、Docker、Azure、AWS) |
| NuGetパッケージ数 | メイン言語パック1つ+オプション言語パック1つ | メイン言語パック1つ+オプション言語パック1つ |
クイックスタート:Aspose.OCRからIronOCRへの移行
ステップ 1: NuGet パッケージを置き換える
Aspose.OCR を削除します:
dotnet remove package Aspose.OCR
dotnet remove package Aspose.OCR
NuGetからIronOCRをインストールしてください。
dotnet add package IronOcr
ステップ 2: 名前空間の更新
すべてのAspose.OCR 名前空間のインポートを置き換える:
// Before (Aspose.OCR)
using Aspose.OCR;
using Aspose.OCR.Models;
using Aspose.OCR.Models.PreprocessingFilters;
// After (IronOCR)
using IronOcr;
// Before (Aspose.OCR)
using Aspose.OCR;
using Aspose.OCR.Models;
using Aspose.OCR.Models.PreprocessingFilters;
// After (IronOCR)
using IronOcr;
Imports IronOcr
ステップ 3: ライセンスの初期化
Asposeのファイルベースのライセンス呼び出しを削除し、 IronOCRの文字列キーに置き換えてください。 アプリケーション起動時にこれを配置してください。リクエストごとではなく、プロセスごとに1回配置してください。
// Remove Aspose license setup
// var license = new Aspose.OCR.License();
// license.SetLicense("Aspose.OCR.lic");
// Add IronOCR license at startup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Production pattern: read from environment variable
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
// Remove Aspose license setup
// var license = new Aspose.OCR.License();
// license.SetLicense("Aspose.OCR.lic");
// Add IronOCR license at startup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Production pattern: read from environment variable
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
' Remove Aspose license setup
' Dim license As New Aspose.OCR.License()
' license.SetLicense("Aspose.OCR.lic")
' Add IronOCR license at startup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
' Production pattern: read from environment variable
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
コード移行の例
認識設定構成
Aspose.OCRはすべての認識動作をRecognitionSettingsオブジェクトに集中化します。 言語、領域検出モード、単一行フラグ、しきい値はすべてプロパティとしてそこに存在します。 文書の種類や呼び出しパターンごとに、新たに構築する必要があります。
Aspose.OCR アプローチ:
// Configuring recognition settings for a structured form
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.DOCUMENT,
RecognizeSingleLine = false,
AutoSkew = true,
RecognitionAreas = new List<Rectangle>
{
new Rectangle(0, 0, 800, 100) // header zone
}
};
var result = api.RecognizeImage("structured-form.jpg", settings);
Console.WriteLine(result.RecognitionText);
// Configuring recognition settings for a structured form
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.DOCUMENT,
RecognizeSingleLine = false,
AutoSkew = true,
RecognitionAreas = new List<Rectangle>
{
new Rectangle(0, 0, 800, 100) // header zone
}
};
var result = api.RecognizeImage("structured-form.jpg", settings);
Console.WriteLine(result.RecognitionText);
Imports System
Imports System.Collections.Generic
Imports AsposeOcr
' Configuring recognition settings for a structured form
Dim api As New AsposeOcr()
Dim settings As New RecognitionSettings With {
.Language = Language.Eng,
.DetectAreasMode = DetectAreasMode.DOCUMENT,
.RecognizeSingleLine = False,
.AutoSkew = True,
.RecognitionAreas = New List(Of Rectangle) From {
New Rectangle(0, 0, 800, 100) ' header zone
}
}
Dim result = api.RecognizeImage("structured-form.jpg", settings)
Console.WriteLine(result.RecognitionText)
IronOCRのアプローチ:
// Recognition behavior configured once on the IronTesseract instance
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
// Region targeting replaces RecognitionAreas in RecognitionSettings
var headerRegion = new CropRectangle(0, 0, 800, 100);
using var input = new OcrInput();
input.LoadImage("structured-form.jpg", headerRegion);
var result = ocr.Read(input);
Console.WriteLine(result.Text);
// Recognition behavior configured once on the IronTesseract instance
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
// Region targeting replaces RecognitionAreas in RecognitionSettings
var headerRegion = new CropRectangle(0, 0, 800, 100);
using var input = new OcrInput();
input.LoadImage("structured-form.jpg", headerRegion);
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
' Recognition behavior configured once on the IronTesseract instance
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.English
' Region targeting replaces RecognitionAreas in RecognitionSettings
Dim headerRegion As New CropRectangle(0, 0, 800, 100)
Using input As New OcrInput()
input.LoadImage("structured-form.jpg", headerRegion)
Dim result = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
呼び出しごとに構築する設定オブジェクトはありません。 言語はIronTesseractインスタンスに配置されます; リージョンターゲティングは読み込み時にRecognizeSingleLineの決定は、エンジンによって自動的に処理されます。 領域ベースのOCRに関する詳細なガイダンスについては、領域ベースのOCR操作ガイドを参照してください。
エリア検出モードの移行
Aspose.OCRでは、各認識呼び出しの前にDetectAreasMode値を選択する必要があります。 TABLEはグリッドレイアウト向けに最適化します。 文書の種類に対して誤ったモードを選択すると、出力のずれや欠落が発生します。
Aspose.OCR アプローチ:
// Three separate calls with different modes for different document types
var api = new AsposeOcr();
// For a document with mixed prose and table content
var docSettings = new RecognitionSettings
{
DetectAreasMode = DetectAreasMode.COMBINE,
Language = Language.Eng
};
// For a pure tabular document
var tableSettings = new RecognitionSettings
{
DetectAreasMode = DetectAreasMode.TABLE,
Language = Language.Eng
};
// For a single-column text document
var linearSettings = new RecognitionSettings
{
DetectAreasMode = DetectAreasMode.DOCUMENT,
Language = Language.Eng
};
string mixedResult = api.RecognizeImage("mixed-layout.jpg", docSettings).RecognitionText;
string tableResult = api.RecognizeImage("data-table.jpg", tableSettings).RecognitionText;
string linearResult = api.RecognizeImage("text-document.jpg", linearSettings).RecognitionText;
// Three separate calls with different modes for different document types
var api = new AsposeOcr();
// For a document with mixed prose and table content
var docSettings = new RecognitionSettings
{
DetectAreasMode = DetectAreasMode.COMBINE,
Language = Language.Eng
};
// For a pure tabular document
var tableSettings = new RecognitionSettings
{
DetectAreasMode = DetectAreasMode.TABLE,
Language = Language.Eng
};
// For a single-column text document
var linearSettings = new RecognitionSettings
{
DetectAreasMode = DetectAreasMode.DOCUMENT,
Language = Language.Eng
};
string mixedResult = api.RecognizeImage("mixed-layout.jpg", docSettings).RecognitionText;
string tableResult = api.RecognizeImage("data-table.jpg", tableSettings).RecognitionText;
string linearResult = api.RecognizeImage("text-document.jpg", linearSettings).RecognitionText;
Imports AsposeOcr
' Three separate calls with different modes for different document types
Dim api As New AsposeOcr()
' For a document with mixed prose and table content
Dim docSettings As New RecognitionSettings With {
.DetectAreasMode = DetectAreasMode.COMBINE,
.Language = Language.Eng
}
' For a pure tabular document
Dim tableSettings As New RecognitionSettings With {
.DetectAreasMode = DetectAreasMode.TABLE,
.Language = Language.Eng
}
' For a single-column text document
Dim linearSettings As New RecognitionSettings With {
.DetectAreasMode = DetectAreasMode.DOCUMENT,
.Language = Language.Eng
}
Dim mixedResult As String = api.RecognizeImage("mixed-layout.jpg", docSettings).RecognitionText
Dim tableResult As String = api.RecognizeImage("data-table.jpg", tableSettings).RecognitionText
Dim linearResult As String = api.RecognizeImage("text-document.jpg", linearSettings).RecognitionText
IronOCRのアプローチ:
// Single API surface handles all layout types automatically
var ocr = new IronTesseract();
// Same code path for every document type
var mixedResult = ocr.Read("mixed-layout.jpg").Text;
var tableResult = ocr.Read("data-table.jpg").Text;
var linearResult = ocr.Read("text-document.jpg").Text;
// For table documents, structured data is immediately available
var result = ocr.Read("data-table.jpg");
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($"Block at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");
}
}
// Single API surface handles all layout types automatically
var ocr = new IronTesseract();
// Same code path for every document type
var mixedResult = ocr.Read("mixed-layout.jpg").Text;
var tableResult = ocr.Read("data-table.jpg").Text;
var linearResult = ocr.Read("text-document.jpg").Text;
// For table documents, structured data is immediately available
var result = ocr.Read("data-table.jpg");
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($"Block at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");
}
}
Imports System
' Single API surface handles all layout types automatically
Dim ocr As New IronTesseract()
' Same code path for every document type
Dim mixedResult As String = ocr.Read("mixed-layout.jpg").Text
Dim tableResult As String = ocr.Read("data-table.jpg").Text
Dim linearResult As String = ocr.Read("text-document.jpg").Text
' For table documents, structured data is immediately available
Dim result = ocr.Read("data-table.jpg")
For Each page In result.Pages
For Each paragraph In page.Paragraphs
Console.WriteLine($"Block at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}")
Next
Next
IronOCRはモード選択の判断を完全に不要にします。 エンジンはレイアウトを解析し、Words階層を通じて結果を公開します。 結果読み取りガイドでは、ドキュメントレイアウト解析のための完全な構造化結果モデルを操作する方法について説明しています。 テーブル固有の抽出パターンについては、テーブルの読み取り方法を参照してください。
信頼度に基づくフィルタリングによるバッチ認識
Aspose.OCRバッチワークフローは、リストの中でRecognitionResultオブジェクトを蓄積します。信頼性フィルタリングは、そのリストを繰り返して結果を受け入れる前に、領域ごとの平均を計算する必要があります。 複数のページを単一のファイルとして出力したい場合、そのリストは明示的に管理され、SaveMultipageDocumentに渡されなければなりません。
Aspose.OCR アプローチ:
// Batch recognition with confidence filtering before output
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.DOCUMENT
};
string[] documentPaths = Directory.GetFiles("invoice-archive", "*.jpg");
var acceptedResults = new List<RecognitionResult>();
var rejectedPaths = new List<string>();
foreach (var path in documentPaths)
{
var result = api.RecognizeImage(path, settings);
// Confidence is an array of per-region values — must average manually
float avgConfidence = result.RecognitionAreasConfidence != null
? result.RecognitionAreasConfidence.Average()
: 0f;
if (avgConfidence >= 0.70f)
{
acceptedResults.Add(result);
}
else
{
rejectedPaths.Add(path);
Console.WriteLine($"Rejected: {path} ({avgConfidence:P0} confidence)");
}
}
// Save accepted pages as a single searchable PDF
if (acceptedResults.Any())
{
api.SaveMultipageDocument("high-confidence-invoices.pdf",
SaveFormat.Pdf, acceptedResults);
}
Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}");
// Batch recognition with confidence filtering before output
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.DOCUMENT
};
string[] documentPaths = Directory.GetFiles("invoice-archive", "*.jpg");
var acceptedResults = new List<RecognitionResult>();
var rejectedPaths = new List<string>();
foreach (var path in documentPaths)
{
var result = api.RecognizeImage(path, settings);
// Confidence is an array of per-region values — must average manually
float avgConfidence = result.RecognitionAreasConfidence != null
? result.RecognitionAreasConfidence.Average()
: 0f;
if (avgConfidence >= 0.70f)
{
acceptedResults.Add(result);
}
else
{
rejectedPaths.Add(path);
Console.WriteLine($"Rejected: {path} ({avgConfidence:P0} confidence)");
}
}
// Save accepted pages as a single searchable PDF
if (acceptedResults.Any())
{
api.SaveMultipageDocument("high-confidence-invoices.pdf",
SaveFormat.Pdf, acceptedResults);
}
Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}");
Imports System
Imports System.IO
Imports System.Linq
Imports Aspose.OCR
' Batch recognition with confidence filtering before output
Dim api As New AsposeOcr()
Dim settings As New RecognitionSettings With {
.Language = Language.Eng,
.DetectAreasMode = DetectAreasMode.DOCUMENT
}
Dim documentPaths As String() = Directory.GetFiles("invoice-archive", "*.jpg")
Dim acceptedResults As New List(Of RecognitionResult)()
Dim rejectedPaths As New List(Of String)()
For Each path In documentPaths
Dim result = api.RecognizeImage(path, settings)
' Confidence is an array of per-region values — must average manually
Dim avgConfidence As Single = If(result.RecognitionAreasConfidence IsNot Nothing,
result.RecognitionAreasConfidence.Average(),
0.0F)
If avgConfidence >= 0.70F Then
acceptedResults.Add(result)
Else
rejectedPaths.Add(path)
Console.WriteLine($"Rejected: {path} ({avgConfidence:P0} confidence)")
End If
Next
' Save accepted pages as a single searchable PDF
If acceptedResults.Any() Then
api.SaveMultipageDocument("high-confidence-invoices.pdf",
SaveFormat.Pdf, acceptedResults)
End If
Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}")
IronOCRのアプローチ:
// Batch recognition with confidence filtering using unified result model
var ocr = new IronTesseract();
string[] documentPaths = Directory.GetFiles("invoice-archive", "*.jpg");
var acceptedResults = new List<OcrResult>();
var rejectedPaths = new List<string>();
foreach (var path in documentPaths)
{
var result = ocr.Read(path);
// Single confidence value — no averaging required
if (result.Confidence >= 70.0)
{
acceptedResults.Add(result);
}
else
{
rejectedPaths.Add(path);
Console.WriteLine($"Rejected: {path} ({result.Confidence:F1}% confidence)");
}
}
// Save accepted pages — each result becomes a page in the output PDF
if (acceptedResults.Any())
{
using var outputInput = new OcrInput();
foreach (var path in documentPaths
.Where(p => !rejectedPaths.Contains(p)))
{
outputInput.LoadImage(path);
}
var combined = ocr.Read(outputInput);
combined.SaveAsSearchablePdf("high-confidence-invoices.pdf");
}
Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}");
// Batch recognition with confidence filtering using unified result model
var ocr = new IronTesseract();
string[] documentPaths = Directory.GetFiles("invoice-archive", "*.jpg");
var acceptedResults = new List<OcrResult>();
var rejectedPaths = new List<string>();
foreach (var path in documentPaths)
{
var result = ocr.Read(path);
// Single confidence value — no averaging required
if (result.Confidence >= 70.0)
{
acceptedResults.Add(result);
}
else
{
rejectedPaths.Add(path);
Console.WriteLine($"Rejected: {path} ({result.Confidence:F1}% confidence)");
}
}
// Save accepted pages — each result becomes a page in the output PDF
if (acceptedResults.Any())
{
using var outputInput = new OcrInput();
foreach (var path in documentPaths
.Where(p => !rejectedPaths.Contains(p)))
{
outputInput.LoadImage(path);
}
var combined = ocr.Read(outputInput);
combined.SaveAsSearchablePdf("high-confidence-invoices.pdf");
}
Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}");
Imports IronTesseract
Imports System.IO
Imports System.Linq
' Batch recognition with confidence filtering using unified result model
Dim ocr As New IronTesseract()
Dim documentPaths As String() = Directory.GetFiles("invoice-archive", "*.jpg")
Dim acceptedResults As New List(Of OcrResult)()
Dim rejectedPaths As New List(Of String)()
For Each path In documentPaths
Dim result = ocr.Read(path)
' Single confidence value — no averaging required
If result.Confidence >= 70.0 Then
acceptedResults.Add(result)
Else
rejectedPaths.Add(path)
Console.WriteLine($"Rejected: {path} ({result.Confidence:F1}% confidence)")
End If
Next
' Save accepted pages — each result becomes a page in the output PDF
If acceptedResults.Any() Then
Using outputInput As New OcrInput()
For Each path In documentPaths.Where(Function(p) Not rejectedPaths.Contains(p))
outputInput.LoadImage(path)
Next
Dim combined = ocr.Read(outputInput)
combined.SaveAsSearchablePdf("high-confidence-invoices.pdf")
End Using
End If
Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}")
doubleです。Aspose floatを返します—比較のしきい値は移行中に調整が必要です。 信頼度スコアは、文書検証ワークフローにおける単語ごと、行ごと、ページごとの信頼度値を決定するための指標となります。 大量のバッチ処理パターンについては、 マルチスレッドの例を参照してください。
構造化出力処理
Aspose.OCRはSaveFormat列挙値を持っています。 JSONの出力は、機械可読なファイルを作成します;XMLの出力は注釈付きのドキュメントファイルを書きます。生の構造化データ—単語の位置、行の境界—にアクセスするには、RecognitionAreasRectanglesを繰り返し処理する必要があり、それは単語レベルではなく、リージョンレベルでジオメトリを返します。
Aspose.OCR アプローチ:
// Structured output: JSON and XML via SaveMultipageDocument
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.COMBINE
};
var results = new List<RecognitionResult>();
foreach (var path in new[] { "page1.jpg", "page2.jpg", "page3.jpg" })
{
results.Add(api.RecognizeImage(path, settings));
}
// Export as JSON
api.SaveMultipageDocument("output.json", SaveFormat.Json, results);
// Export as XML
api.SaveMultipageDocument("output.xml", SaveFormat.Xml, results);
// Accessing area-level geometry (not word-level)
foreach (var result in results)
{
var areas = result.RecognitionAreasRectangles;
if (areas != null)
{
foreach (var area in areas)
{
Console.WriteLine($"Area at ({area.X},{area.Y}): {area.Width}x{area.Height}");
}
}
// No direct word-level collection with individual confidence values
}
// Structured output: JSON and XML via SaveMultipageDocument
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.COMBINE
};
var results = new List<RecognitionResult>();
foreach (var path in new[] { "page1.jpg", "page2.jpg", "page3.jpg" })
{
results.Add(api.RecognizeImage(path, settings));
}
// Export as JSON
api.SaveMultipageDocument("output.json", SaveFormat.Json, results);
// Export as XML
api.SaveMultipageDocument("output.xml", SaveFormat.Xml, results);
// Accessing area-level geometry (not word-level)
foreach (var result in results)
{
var areas = result.RecognitionAreasRectangles;
if (areas != null)
{
foreach (var area in areas)
{
Console.WriteLine($"Area at ({area.X},{area.Y}): {area.Width}x{area.Height}");
}
}
// No direct word-level collection with individual confidence values
}
Imports System
Imports System.Collections.Generic
Imports AsposeOcr
' Structured output: JSON and XML via SaveMultipageDocument
Dim api As New AsposeOcr()
Dim settings As New RecognitionSettings With {
.Language = Language.Eng,
.DetectAreasMode = DetectAreasMode.COMBINE
}
Dim results As New List(Of RecognitionResult)()
For Each path In New String() {"page1.jpg", "page2.jpg", "page3.jpg"}
results.Add(api.RecognizeImage(path, settings))
Next
' Export as JSON
api.SaveMultipageDocument("output.json", SaveFormat.Json, results)
' Export as XML
api.SaveMultipageDocument("output.xml", SaveFormat.Xml, results)
' Accessing area-level geometry (not word-level)
For Each result In results
Dim areas = result.RecognitionAreasRectangles
If areas IsNot Nothing Then
For Each area In areas
Console.WriteLine($"Area at ({area.X},{area.Y}): {area.Width}x{area.Height}")
Next
End If
' No direct word-level collection with individual confidence values
Next
IronOCRのアプローチ:
// Structured output: navigate a rich result object model
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("page1.jpg");
input.LoadImage("page2.jpg");
input.LoadImage("page3.jpg");
var result = ocr.Read(input);
// Export as searchable PDF (preserves layout)
result.SaveAsSearchablePdf("output.pdf");
// Export as hOCR (XHTML with bounding box coordinates — feeds downstream tools)
result.SaveAsHocrFile("output.hocr");
// Word-level structured access — direct collection, no indirection
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words, " +
$"{page.Confidence:F1}% confidence");
foreach (var word in page.Words)
{
Console.WriteLine($" '{word.Text}' at ({word.X},{word.Y}) " +
$"size {word.Width}x{word.Height} — {word.Confidence:F1}%");
}
}
// Paragraph-level layout for document structure analysis
foreach (var paragraph in result.Pages[0].Paragraphs)
{
Console.WriteLine($"Paragraph at ({paragraph.X},{paragraph.Y}): {paragraph.Text}");
}
// Structured output: navigate a rich result object model
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("page1.jpg");
input.LoadImage("page2.jpg");
input.LoadImage("page3.jpg");
var result = ocr.Read(input);
// Export as searchable PDF (preserves layout)
result.SaveAsSearchablePdf("output.pdf");
// Export as hOCR (XHTML with bounding box coordinates — feeds downstream tools)
result.SaveAsHocrFile("output.hocr");
// Word-level structured access — direct collection, no indirection
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words, " +
$"{page.Confidence:F1}% confidence");
foreach (var word in page.Words)
{
Console.WriteLine($" '{word.Text}' at ({word.X},{word.Y}) " +
$"size {word.Width}x{word.Height} — {word.Confidence:F1}%");
}
}
// Paragraph-level layout for document structure analysis
foreach (var paragraph in result.Pages[0].Paragraphs)
{
Console.WriteLine($"Paragraph at ({paragraph.X},{paragraph.Y}): {paragraph.Text}");
}
Imports IronTesseract
' Structured output: navigate a rich result object model
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage("page1.jpg")
input.LoadImage("page2.jpg")
input.LoadImage("page3.jpg")
Dim result = ocr.Read(input)
' Export as searchable PDF (preserves layout)
result.SaveAsSearchablePdf("output.pdf")
' Export as hOCR (XHTML with bounding box coordinates — feeds downstream tools)
result.SaveAsHocrFile("output.hocr")
' Word-level structured access — direct collection, no indirection
For Each page In result.Pages
Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words, " &
$"{page.Confidence:F1}% confidence")
For Each word In page.Words
Console.WriteLine($" '{word.Text}' at ({word.X},{word.Y}) " &
$"size {word.Width}x{word.Height} — {word.Confidence:F1}%")
Next
Next
' Paragraph-level layout for document structure analysis
For Each paragraph In result.Pages(0).Paragraphs
Console.WriteLine($"Paragraph at ({paragraph.X},{paragraph.Y}): {paragraph.Text}")
Next
End Using
IronOCRは、各ページに対する直接のConfidence値を提供します。 Aspose.OCRのRecognitionAreasRectanglesは、単語レベルの信頼性の内訳なしにリージョンのジオメトリを提供します。 hOCRのエクスポートでは、境界ボックスが注釈付けされた出力を処理するツールと互換性のあるXHTMLが生成されます。フォーマットの詳細については、 hOCRエクスポートガイドを参照してください。 完全な構造化結果モデルについては、OcrResult.Word上のすべてのプロパティを文書化したOcrResult APIリファレンスがあります。
Aspose.OCR API からIronOCRへのマッピング リファレンス
| Aspose.OCR | IronOCR相当値 |
|---|---|
AsposeOcr |
IronTesseract |
RecognitionSettings |
IronTesseract + OcrInput上のプロパティ |
DocumentRecognitionSettings |
OcrInput with LoadPdf() / LoadPdfPages() |
api.RecognizeImage(path, settings) |
ocr.Read(path) または ocr.Read(input) |
api.RecognizePdf(path, settings) |
ocr.Read(path) または ocr.Read(input) |
result.RecognitionText |
result.Text |
result.RecognitionAreasConfidence.Average() |
result.Confidence(単一のdouble、0–100) |
result.RecognitionAreasRectangles |
result.Words(X、Y、幅、高さ、信頼性を伴う) |
RecognitionResult |
OcrResult |
Language.Eng |
OcrLanguage.English |
DetectAreasMode.COMBINE |
自動 — 列挙型は不要 |
DetectAreasMode.TABLE |
自動 - レイアウトにresult.Pages[n].Paragraphsを使用 |
DetectAreasMode.DOCUMENT |
自動 — エンジンがレイアウト解析を処理する |
settings.RecognizeSingleLine = true |
ocr.Configuration.WhiteListCharacters またはシングルリージョンの作物 |
settings.RecognitionAreas = new List<Rectangle> { r } |
input.LoadImage(path, cropRectangle) |
settings.AutoSkew = true |
自動、または明示的なinput.Deskew() |
PreprocessingFilter.AutoSkew() |
input.Deskew() |
PreprocessingFilter.AutoDenoising() |
input.DeNoise() |
PreprocessingFilter.ContrastCorrectionFilter() |
input.Contrast() |
PreprocessingFilter.Binarize() |
input.Binarize() |
PreprocessingFilter.Threshold(value) |
input.Binarize()(自動しきい値) |
PreprocessingFilter.Median() |
input.DeNoise() |
PreprocessingFilter.Scale(factor) |
input.Scale(percent) |
PreprocessingFilter.Invert() |
input.Invert() |
PreprocessingFilter.Rotate(angle) |
input.Rotate(angle) |
api.SaveMultipageDocument(path, SaveFormat.Pdf, list) |
result.SaveAsSearchablePdf(path) |
api.SaveMultipageDocument(path, SaveFormat.Docx, list) |
hOCRエクスポート経由:result.SaveAsHocrFile(path) |
api.SaveMultipageDocument(path, SaveFormat.Json, list) |
result.Pagesをナビゲートして直接シリアル化 |
api.PreprocessImage(path, filters) |
input.GetPages()[0].SaveAsImage(path) |
api.CalculateSkew(imagePath) |
input.Deskew()(検出された角度を自動適用) |
new Aspose.OCR.License().SetLicense("file.lic") |
IronOcr.License.LicenseKey = "key" |
settings.ThreadsCount = n |
デフォルトでスレッドセーフです。 Parallel.ForEach を使用 |
一般的な移行の問題と解決策
問題1:DetectAreasModeには直接的な同等の機能がない
Aspose.OCR: コードは特定のレイアウト動作を期待して、DetectAreasMode.COMBINEを設定します。 列挙型を削除すると、 IronOCRが同じレイアウトをどのように処理するかという問題が残る。
解決策:列挙型を完全に削除する。 IronOCRはレイアウト解析を自動的に実行します。 検出されたレイアウト構造を確認する必要がある場合は、result.Pages[n].Paragraphsをナビゲートしてください—各段落にはX、Y、幅、高さのバウンディングボックスとそれが含むテキストがあります。 明示的なテーブル抽出については、テーブル読み取り方法を参照してください。
// No mode to set — read directly and inspect the structure
var result = new IronTesseract().Read("data-table.jpg");
foreach (var paragraph in result.Pages[0].Paragraphs)
{
Console.WriteLine($"Block ({paragraph.X},{paragraph.Y}): {paragraph.Text}");
}
// No mode to set — read directly and inspect the structure
var result = new IronTesseract().Read("data-table.jpg");
foreach (var paragraph in result.Pages[0].Paragraphs)
{
Console.WriteLine($"Block ({paragraph.X},{paragraph.Y}): {paragraph.Text}");
}
Imports IronTesseract
Dim result = New IronTesseract().Read("data-table.jpg")
For Each paragraph In result.Pages(0).Paragraphs
Console.WriteLine($"Block ({paragraph.X},{paragraph.Y}): {paragraph.Text}")
Next
問題2:認識領域の信頼度閾値の不一致
Aspose.OCR: 既存のコードは0.75fのようなしきい値と比較します。 IronOCRのresult.Confidenceは異なるスケールです。
解決策: result.Confidenceは0–100のパーセンテージです。 あなたのAsposeしきい値を100倍して変換します:75.0になります。 次に、すべての比較ロジックを更新します。
// Aspose.OCR threshold pattern
// if (result.RecognitionAreasConfidence.Average() >= 0.75f)
// IronOCR equivalent — multiply old threshold by 100
var result = new IronTesseract().Read("document.jpg");
if (result.Confidence >= 75.0)
{
Console.WriteLine($"High confidence result: {result.Text}");
}
// Aspose.OCR threshold pattern
// if (result.RecognitionAreasConfidence.Average() >= 0.75f)
// IronOCR equivalent — multiply old threshold by 100
var result = new IronTesseract().Read("document.jpg");
if (result.Confidence >= 75.0)
{
Console.WriteLine($"High confidence result: {result.Text}");
}
Imports IronOcr
Dim result = New IronTesseract().Read("document.jpg")
If result.Confidence >= 75.0 Then
Console.WriteLine($"High confidence result: {result.Text}")
End If
問題3:SaveMultipageDocument JSON/XML出力に直接メソッドがない
Aspose.OCR: api.SaveMultipageDocument("out.json", SaveFormat.Json, results)は認識メタデータを含むJSONファイルを書き込みます。 この出力を下流で利用するチームは、同等のものを見つける必要がある。
解決策: IronOCRにはSaveFormat.Jsonに相当するメソッドがありません。 代替手段は、System.Text.Jsonでシリアル化することです。 これにより、スキーマを完全に制御できるようになります。
using var input = new OcrInput();
input.LoadImage("document.jpg");
var result = new IronTesseract().Read(input);
// Build your own structured JSON from the result model
var pageData = result.Pages.Select(p => new
{
PageNumber = p.PageNumber,
Confidence = p.Confidence,
Text = p.Text,
Words = p.Words.Select(w => new
{
Text = w.Text,
X = w.X,
Y = w.Y,
Width = w.Width,
Height = w.Height,
Confidence = w.Confidence
}).ToArray()
}).ToArray();
File.WriteAllText("output.json",
System.Text.Json.JsonSerializer.Serialize(pageData,
new System.Text.Json.JsonSerializerOptions { WriteIndented = true }));
using var input = new OcrInput();
input.LoadImage("document.jpg");
var result = new IronTesseract().Read(input);
// Build your own structured JSON from the result model
var pageData = result.Pages.Select(p => new
{
PageNumber = p.PageNumber,
Confidence = p.Confidence,
Text = p.Text,
Words = p.Words.Select(w => new
{
Text = w.Text,
X = w.X,
Y = w.Y,
Width = w.Width,
Height = w.Height,
Confidence = w.Confidence
}).ToArray()
}).ToArray();
File.WriteAllText("output.json",
System.Text.Json.JsonSerializer.Serialize(pageData,
new System.Text.Json.JsonSerializerOptions { WriteIndented = true }));
Imports IronOcr
Imports System.IO
Imports System.Text.Json
Using input As New OcrInput()
input.LoadImage("document.jpg")
Dim result = New IronTesseract().Read(input)
' Build your own structured JSON from the result model
Dim pageData = result.Pages.Select(Function(p) New With {
.PageNumber = p.PageNumber,
.Confidence = p.Confidence,
.Text = p.Text,
.Words = p.Words.Select(Function(w) New With {
.Text = w.Text,
.X = w.X,
.Y = w.Y,
.Width = w.Width,
.Height = w.Height,
.Confidence = w.Confidence
}).ToArray()
}).ToArray()
File.WriteAllText("output.json",
JsonSerializer.Serialize(pageData,
New JsonSerializerOptions With {.WriteIndented = True}))
End Using
埋め込み座標を持つXHTML出力をダウンストリームツールで解析できるようにするには、result.SaveAsHocrFile("output.hocr")がより近い意味上の等価です。
問題4:DocumentRecognitionSettings.StartPageが0ベースのインデックスを使用する
Aspose.OCR: DocumentRecognitionSettings.StartPage = 2は3ページ目(0ベース)を意味します。 これは、AsposeからIronOCRへの移行において最もよく発生するオフバイワンエラーです。
解決策: IronOCRは全体を通して1ベースのページインデックスを使用します。 すべてのStartPage値に1を加え、それに応じて終了ページを再計算します。 本番環境導入前にこの問題を検出するため、既知の複数ページPDFに対して的を絞ったテストを作成してください。
// Aspose.OCR: StartPage = 2 means the 3rd page (0-based)
// var settings = new DocumentRecognitionSettings { StartPage = 2, PagesNumber = 3 };
// IronOCR: page 3 is index 3 (1-based), range of 3 ends at page 5
using var input = new OcrInput();
input.LoadPdfPages("document.pdf", 3, 5);
var result = new IronTesseract().Read(input);
// Aspose.OCR: StartPage = 2 means the 3rd page (0-based)
// var settings = new DocumentRecognitionSettings { StartPage = 2, PagesNumber = 3 };
// IronOCR: page 3 is index 3 (1-based), range of 3 ends at page 5
using var input = new OcrInput();
input.LoadPdfPages("document.pdf", 3, 5);
var result = new IronTesseract().Read(input);
Imports IronOcr
' Aspose.OCR: StartPage = 2 means the 3rd page (0-based)
' Dim settings As New DocumentRecognitionSettings With {.StartPage = 2, .PagesNumber = 3}
' IronOCR: page 3 is index 3 (1-based), range of 3 ends at page 5
Using input As New OcrInput()
input.LoadPdfPages("document.pdf", 3, 5)
Dim result = New IronTesseract().Read(input)
End Using
問題5:RecognizeSingleLineには直接的なフラグがない
Aspose.OCR: settings.RecognizeSingleLine = trueは、画像全体を単一のテキスト行としてエンジンに扱わせます。これは、ラベル認識、フィールド抽出、その他の固定形式入力に使用されます。
解決策: CropRectangleを使用してテキスト行を正確に分離し、エンジンが単一行画像の完全なレイアウト検出を実行しないようにします。 機械読み取り可能なゾーンまたはラベル形式については、読み取り専用ドキュメントガイドに適切な手順が記載されています。
// Aspose.OCR: single-line flag
// var settings = new RecognitionSettings { RecognizeSingleLine = true };
// IronOCR: crop to the line region — layout detection skips automatically
var lineRegion = new CropRectangle(10, 45, 600, 30); // x, y, width, height
using var input = new OcrInput();
input.LoadImage("label.jpg", lineRegion);
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text.Trim());
// Aspose.OCR: single-line flag
// var settings = new RecognitionSettings { RecognizeSingleLine = true };
// IronOCR: crop to the line region — layout detection skips automatically
var lineRegion = new CropRectangle(10, 45, 600, 30); // x, y, width, height
using var input = new OcrInput();
input.LoadImage("label.jpg", lineRegion);
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text.Trim());
Imports IronOcr
Dim lineRegion As New CropRectangle(10, 45, 600, 30) ' x, y, width, height
Using input As New OcrInput()
input.LoadImage("label.jpg", lineRegion)
Dim result = New IronTesseract().Read(input)
Console.WriteLine(result.Text.Trim())
End Using
問題6: スレッドごとのAspose.OCRインスタンスは不要
Aspose.OCR: 並列処理でスレッドセーフの問題を回避するには、スレッドごとに新しいAsposeOcr()インスタンスを作成することをお勧めします。 既存のコードはParallel.ForEachラムダの中でインスタンスを作成します。
解決策: IronTesseractはスレッドセーフです。 単一のインスタンスが並列ワークロードを処理する。 スレッドごとのインスタンス化をなくし、1つのインスタンスを共有する。
// Aspose.OCR: per-thread instance due to thread-safety concerns
// Parallel.ForEach(paths, path => { var api = new AsposeOcr(); ... });
// IronOCR: single shared instance, fully thread-safe
var ocr = new IronTesseract();
Parallel.ForEach(documentPaths, path =>
{
var result = ocr.Read(path);
Console.WriteLine($"{Path.GetFileName(path)}: {result.Confidence:F1}%");
});
// Aspose.OCR: per-thread instance due to thread-safety concerns
// Parallel.ForEach(paths, path => { var api = new AsposeOcr(); ... });
// IronOCR: single shared instance, fully thread-safe
var ocr = new IronTesseract();
Parallel.ForEach(documentPaths, path =>
{
var result = ocr.Read(path);
Console.WriteLine($"{Path.GetFileName(path)}: {result.Confidence:F1}%");
});
Imports System.IO
Imports IronOcr
Imports System.Threading.Tasks
Dim ocr As New IronTesseract()
Parallel.ForEach(documentPaths, Sub(path)
Dim result = ocr.Read(path)
Console.WriteLine($"{Path.GetFileName(path)}: {result.Confidence:F1}%")
End Sub)
Aspose.OCR移行チェックリスト
マイグレーション前のタスク
コードベース内のすべての Aspose.OCR 参照を監査します。
grep -rn "using Aspose.OCR" --include="*.cs" .
grep -rn "AsposeOcr\|RecognitionSettings\|DocumentRecognitionSettings" --include="*.cs" .
grep -rn "DetectAreasMode\|SaveFormat\|RecognitionResult" --include="*.cs" .
grep -rn "RecognitionAreasConfidence\|RecognitionText\|RecognizePdf" --include="*.cs" .
grep -rn "PreprocessingFilter\|SaveMultipageDocument" --include="*.cs" .
grep -rn "Aspose.OCR.License\|SetLicense" --include="*.cs" .
grep -rn "using Aspose.OCR" --include="*.cs" .
grep -rn "AsposeOcr\|RecognitionSettings\|DocumentRecognitionSettings" --include="*.cs" .
grep -rn "DetectAreasMode\|SaveFormat\|RecognitionResult" --include="*.cs" .
grep -rn "RecognitionAreasConfidence\|RecognitionText\|RecognizePdf" --include="*.cs" .
grep -rn "PreprocessingFilter\|SaveMultipageDocument" --include="*.cs" .
grep -rn "Aspose.OCR.License\|SetLicense" --include="*.cs" .
各発生箇所を、認識呼び出し、設定オブジェクト、前処理パイプライン、出力呼び出し、ライセンス初期化といったカテゴリ別に文書化する。 使用中のすべてのDetectAreasMode値に注意してください—これらはどのレイアウト移行パスが適用されるかを決定します。 すべてのSaveFormat列挙値を記録してください—非PDFフォーマットごとに、上記の問題3からカスタムシリアル化アプローチが必要です。
コードの移行
- すべてのプロジェクトから
Aspose.OCRNuGetパッケージを削除します - すべてのプロジェクトに
IronOcrNuGetパッケージをインストールします using IronOcr;に置き換えます- アプリ起動時に
IronOcr.License.LicenseKey = "key"に置き換えます new IronTesseract()に置き換えます- すべての
DocumentRecognitionSettingsの構築ブロックを削除します - すべての
DetectAreasMode列挙参照を削除—等価なものは必要ありません ocr.Read(path)に置き換えますinput.LoadPdf()に置き換えますresult.Textに置き換えますresult.Confidenceに置き換え、古いしきい値を100倍しますresult.SaveAsSearchablePdf(path)に置き換えますresult.Pagesの直接シリアル化に置き換えます- すべての
OcrInputメソッド呼び出しに変換します(APIマッピング表を参照) DocumentRecognitionSettings.StartPageを0ベースから1ベースに更新する(すべての値に1を加えます)- スレッドごとの
IronTesseractインスタンスを共有します
移行後のテスト
- 実運用で使用されている各ドキュメントタイプの代表的なサンプルに対してOCRを実行し、文字数をベースラインのAspose.OCR出力と比較します。
- 信頼度値を確認します: IronOCR は0~100 を返します。 すべての閾値比較が新しい尺度を使用していることを確認してください。
- 1から始まるページ番号を使用して10ページ以上のPDFでページ範囲選択をテストし、正しいページが返されることを確認します。
- Aspose.PDFがインストールされていない状態でパスワード保護されたPDFの取り込みをテストし、依存関係の例外が発生しないことを確認します。
- 使用中の
result.Textが期待される出力と一致することを確認(COMBINE、TABLE、DOCUMENT) - JSON出力パスをテスト:
result.Pagesをシリアル化し、任意の下流コンシューマに対してスキーマを検証 - 並列バッチプロセッサーを実行し、スレッド例外がないことを確認(共有
IronTesseractインスタンス) 検索可能なPDF出力がPDFビューアで開き、正しい位置でテキストを選択できることを確認してください。 - 各デプロイ環境(ASP.NET起動、Azure Functions、Docker コンテナ)において、ライセンスキーがエラーなく初期化されることを確認する。
- 事前処理済みのTIFF入力が
input.LoadImageFrames()を通じて期待される出力をまだ生成することを確認
IronOCRへの移行の主なメリット
初日から総所有コストが予測可能。2,999ドルのProfessionalライセンスは、10のプロジェクトにわたる10人の開発者を対象とし、年間更新料は不要です。 財務部門はOCRの明細項目を一度締め切ります。 エンジニアの増員、新規プロジェクトの立ち上げ、製品ライフサイクルの延長による予算への影響はゼロです。ライセンス階層の計算も、更新日の追跡も、支払いの遅延によるコンプライアンスリスクもありません。 IronOCRのライセンスページには、各ティアでカバーされる内容が記載されています。
意図を表現する認識呼び出しで、インフラストラクチャではありません。 移行後、すべての認識呼び出しはocr.Read("document")です。 すべてのAspose.OCR呼び出しにプレフィックスされたPreprocessingFilterの人口は完全になくなります。 コードベースのOCRレイヤーを読む新人エンジニアは、実際の作業が始まる前に構成オブジェクトが組み立てられるのではなく、"このドキュメントを読んでください"というビジネス上の意図を理解する。 IronTesseract APIリファレンスには、利用可能なすべての設定プロパティが網羅されています。
別途製品を用意することなく、暗号化されたPDFをサポートします。Enterpriseの文書処理パイプラインでは、パスワードで保護されたPDFを日常的に処理しています。 移行後、input.LoadPdf("doc.pdf", Password: "secret")がそれらをネイティブに処理します。 Aspose.PDFのサブスクリプションを管理する必要も、復号化から画像へのパイプラインを維持する必要も、2回目の更新日を追跡する必要もありません。 パイプライン内のすべてのPDFフォーマットは、1つのパッケージ、1つのライセンス、および1つのコードパスを経由します。 PDF入力の手順では、ページ範囲、非連続選択、およびストリーム入力について説明します。
単語および文字レベルでの構造化結果データ。 result.Pages[n].Wordsは各単語にそのバウンディングボックス、テキスト、および個別の信頼スコアを持たせたコレクションを返します。 Aspose.OCRのエリアレベルのジオメトリは、個々のトークンではなく、領域を対象としています。 移行後、文書レイアウト解析器、フォームフィールド抽出器、および請求書処理パイプラインは、追加の処理手順なしに単語ごとの位置情報にアクセスできるようになります。 結果の階層構造全体については、 OCR結果機能のページをご覧ください。
すべてのプラットフォームで単一パッケージによる展開が可能。IronOCRは、Windows、Linux、macOS、Docker、Azure App Service、AWS Lambda上でプラットフォーム固有の設定なしで動作する単一のNuGetパッケージとして提供されます。 Aspose.OCRは様々なプラットフォームで動作しますが、コンテナ環境ではネイティブライブラリの調整が必要になる場合があります。 移行後、OCRサービスのDockerfileは、パッケージのインストール以外にOCR固有の設定手順を必要としない、標準的な.NETベースイメージになります。 導入ガイドでは、 Docker 、 Azure 、 AWS 、 Linuxについて解説しています。
OCRと同じパスでのバーコード読み取り。 ocr.Configuration.ReadBarCodes = trueを設定することで、同じ画像からバーコード、QRコード、およびCode 128シンボルを1つのエンジンパスで抽出します。 Aspose.OCRにはバーコード機能がありません。別途バーコードライブラリが必要になります。 移行後、印刷されたテキストとバーコード(配送ラベル、在庫フォーム、イベントチケット)が混在する文書は、result.Barcodesの結果で単一の呼び出しで処理されます。 サポートされているシンボル体系については、バーコードOCRの操作手順を参照してください。
よくある質問
なぜAspose.OCR for .NETからIronOCRに移行する必要があるのですか?
一般的な推進要因には、COM相互接続の複雑さの解消、ファイルベースのライセンス管理の置き換え、ページ単位の課金の回避、Docker/コンテナデプロイの有効化、標準的な.NETツールと統合するNuGetネイティブワークフローの採用などがあります。
Aspose.OCR for .NETからIronOCRに移行する際の主なコード変更は何ですか?
Aspose.OCRの初期化シーケンスをIronTesseractのインスタンス化に置き換え、COMのライフサイクル管理(明示的なCreate/Load/Closeパターン)を削除し、結果のプロパティ名を更新します。その結果、定型的な行が大幅に減りました。
IronOCRをインストールして移行を開始するにはどうすればいいですか?
パッケージマネージャーコンソールで'Install-Package IronOcr'を実行するか、CLIで'dotnet add package IronOcr'を実行してください。言語パックは別のパッケージです:例えばフランス語の場合は'dotnet add package IronOcr.Languages.French'となります。
IronOCRは、標準的なビジネス文書のAspose.OCR for .NETのOCR精度に匹敵しますか?
IronOCRは、請求書、契約書、領収書、入力フォームなどの標準的なビジネスコンテンツで高い精度を達成しています。画像前処理フィルター(傾き補正、ノイズ除去、コントラスト強調)により、劣化した入力の認識をさらに向上させます。
IronOCRはAspose.OCR for .NETが別途インストールする言語データをどのように扱うのですか?
IronOCRの言語データはNuGetパッケージとして配布されます。'dotnet add package IronOcr.Languages.German'でドイツ語のサポートがインストールされます。手動でのファイル配置やディレクトリパスは必要ありません。
Aspose.OCR for .NETからIronOCRに移行する場合、導入インフラの変更は必要ですか?
IronOCRはAspose.OCR for .NETよりもインフラストラクチャの変更が少なくて済みます。SDKのバイナリパス、ライセンスファイルの配置、ライセンスサーバーの設定は必要ありません。NuGetパッケージには完全なOCRエンジンが含まれており、ライセンスキーはアプリケーションコードに設定された文字列です。
移行後のIronOCRライセンスの設定方法は?
アプリケーションの起動コードでIronOcr.License.LicenseKey = "YOUR-KEY "を割り当てます。DockerまたはKubernetesでは、キーを環境変数として保存し、スタートアップで読み込む。License.IsValidLicenseを使用して、トラフィックを受け入れる前にバリデーションを行う。
IronOCRはAspose.OCRと同じようにPDFを処理できますか?
IronOCRはネイティブPDFもスキャンしたPDFも読み取ります。IronTesseractをインスタンス化し、ocr.Read(input)を呼び出し、入力はPDFパスまたはOcrPdfInputであり、OcrResultページを反復します。別のPDFレンダリングパイプラインは必要ありません。
IronOCRはどのように大量処理のスレッディングを処理するのですか?
IronTesseractはスレッド毎にインスタンス化しても安全です。Parallel.ForEachまたはタスクプールでスレッドごとにインスタンスを1つスピンアップし、OCRを同時に実行し、完了したら各インスタンスを破棄します。グローバルステートやロックは必要ありません。
IronOCRはテキスト抽出後、どのような出力形式をサポートしていますか?
IronOCRはテキスト、単語座標、信頼度スコア、ページ構造を含む構造化された結果を返します。エクスポートオプションには、プレーンテキスト、検索可能なPDF、下流処理用の構造化結果オブジェクトが含まれます。
IronOCRの価格はAspose.OCR for .NETよりもワークロードのスケーリングが予測できますか?
IronOCRは、定額制の永久ライセンスを採用しており、ページ単位やボリューム単位の料金はかかりません。10,000ページでも1,000万ページでも、ライセンスコストは一定です。ボリュームライセンスとチームライセンスのオプションはIronOCRの価格ページをご覧ください。
Aspose.OCR for .NETからIronOCRに移行した後、既存のテストはどうなりますか?
抽出されたテキストコンテンツをアサートするテストは、移行後もパスし続ける必要があります。APIコールパターンやCOMオブジェクトのライフサイクルを検証するテストは、IronOCRのシンプルな初期化と結果モデルを反映するように更新する必要があります。

