フッターコンテンツにスキップ
ビデオ

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
SHELL

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
$vbLabelText   $csharpLabel

ステップ 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")
$vbLabelText   $csharpLabel

コード移行の例

認識設定構成

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)
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

呼び出しごとに構築する設定オブジェクトはありません。 言語は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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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}")
$vbLabelText   $csharpLabel

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}")
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

問題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
$vbLabelText   $csharpLabel

問題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
$vbLabelText   $csharpLabel

埋め込み座標を持つ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
$vbLabelText   $csharpLabel

問題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
$vbLabelText   $csharpLabel

問題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)
$vbLabelText   $csharpLabel

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" .
SHELL

各発生箇所を、認識呼び出し、設定オブジェクト、前処理パイプライン、出力呼び出し、ライセンス初期化といったカテゴリ別に文書化する。 使用中のすべてのDetectAreasMode値に注意してください—これらはどのレイアウト移行パスが適用されるかを決定します。 すべてのSaveFormat列挙値を記録してください—非PDFフォーマットごとに、上記の問題3からカスタムシリアル化アプローチが必要です。

コードの移行

  1. すべてのプロジェクトからAspose.OCR NuGetパッケージを削除します
  2. すべてのプロジェクトにIronOcr NuGetパッケージをインストールします
  3. using IronOcr;に置き換えます
  4. アプリ起動時にIronOcr.License.LicenseKey = "key"に置き換えます
  5. new IronTesseract()に置き換えます
  6. すべてのDocumentRecognitionSettingsの構築ブロックを削除します
  7. すべてのDetectAreasMode列挙参照を削除—等価なものは必要ありません
  8. ocr.Read(path)に置き換えます
  9. input.LoadPdf()に置き換えます
  10. result.Textに置き換えます
  11. result.Confidenceに置き換え、古いしきい値を100倍します
  12. result.SaveAsSearchablePdf(path)に置き換えます
  13. result.Pagesの直接シリアル化に置き換えます
  14. すべてのOcrInputメソッド呼び出しに変換します(APIマッピング表を参照)
  15. DocumentRecognitionSettings.StartPageを0ベースから1ベースに更新する(すべての値に1を加えます)
  16. スレッドごとの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ベースイメージになります。 導入ガイドでは、 DockerAzureAWSLinuxについて解説しています。

OCRと同じパスでのバーコード読み取り。 ocr.Configuration.ReadBarCodes = trueを設定することで、同じ画像からバーコード、QRコード、およびCode 128シンボルを1つのエンジンパスで抽出します。 Aspose.OCRにはバーコード機能がありません。別途バーコードライブラリが必要になります。 移行後、印刷されたテキストとバーコード(配送ラベル、在庫フォーム、イベントチケット)が混在する文書は、result.Barcodesの結果で単一の呼び出しで処理されます。 サポートされているシンボル体系については、バーコードOCRの操作手順を参照してください。

ご注意AsposeおよびTesseractは、それぞれの所有者の登録商標です。 このサイトは、Aspose Pty Ltd や Google とは提携していませんし、承認されていませんし、スポンサーされていません。 すべての製品名、ロゴ、およびブランドは各所有者の所有物です。 比較は情報提供のみを目的としており、執筆時点で公開されている情報を反映しています。

よくある質問

なぜ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のシンプルな初期化と結果モデルを反映するように更新する必要があります。

Kannaopat Udonpant
ソフトウェアエンジニア
ソフトウェアエンジニアになる前に、Kannapatは北海道大学で環境資源の博士号を修了しました。博士号を追求する間に、彼はバイオプロダクションエンジニアリング学科の一部である車両ロボティクスラボラトリーのメンバーになりました。2022年には、C#のスキルを活用してIron Softwareのエンジニアリングチームに参加し、IronPDFに注力しています。Kannapatは、IronPDFの多くのコードを執筆している開発者から直接学んでいるため、この仕事を大切にしています。同僚から学びながら、Iron Softwareでの働く社会的側面も楽しんでいます。コードやドキュメントを書いていない時は、KannapatはPS5でゲームをしたり、『The Last of Us』を再視聴したりしていることが多いです。

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね