IronOCRとAspose.OCRの比較
Asprise OCRは最初にJavaライブラリを提供し、.NETを二次的なターゲットとして扱うため、その設計上の決定が製品のすべての層に現れます。Javaの例で書かれたドキュメントから、プラットフォーム固有のDLLs(aocr.dll, aocr_x64.dll, libaocr.so, libaocr.dylib)を必要とするネイティブバイナリデプロイメントモデルまで、ソフトウェアを実行するすべてのマシンで必要です。 Liteモデルはこの問題をさらに悪化させます。LITEおよびSTANDARDライセンスは、契約上、シングルスレッド、シングルプロセスでの実行に制限されているため、これらのティアでAspriseを呼び出すすべてのASP.NET Coreエンドポイント、Windowsサービス、またはAzure Functionは、ライセンス契約に違反することになります。 .NETチームで本番システムを構築する場合、これらは理論上の懸念事項ではなく、導入を阻害する要因となります。導入前に高額なEnterpriseライセンスを取得するか、ライブラリを切り替えるかの選択を迫られるからです。
Asprise OCRの理解
Asprise OCRは、Asprise Inc.が提供する商用OCR製品です。この製品は当初Java OCRエンジンとして開発されました.NETサポートは、マネージドC#コードと基盤となるアンマネージドOCRバイナリを接続するネイティブライブラリラッパーを介して後から追加されました。 このブリッジアーキテクチャは、 .NET開発者向けライブラリの決定的な特徴です。
主な建築上の特徴:
- Java優先設計:主要なドキュメント、サンプルコード、SDKのサンプルはすべてJavaで記述されています。 .NET開発者は、Javaから頭の中で翻訳するか、あるいは乏しい二次的なドキュメントに頼るしかない。
-ネイティブバイナリの依存関係:プラットフォーム固有のアンマネージドDLLが、デプロイメントディレクトリまたはシステムパスに存在する必要があります。 正しいバイナリはプロセスのアーキテクチャに一致しなければなりません—32ビットプロセスでは
aocr_x64.dllが必要です。 - 手動のエンジンライフサイクル: ライブラリはそ for Java起源に由来するCスタイルの初期化パターン(
Ocr.SetUp(),ocr.StartEngine(),ocr.StopEngine())を公開します。IDisposable実装はありません。StopEngine()を忘れるとネイティブメモリがリークします。 -ライセンス階層のスレッド制限: Lite (約299ドル)およびSTANDARD(約699ドル)の階層では、シングルスレッド、シングルプロセスでの実行のみが許可されます。 マルチスレッド機能を利用するにはEnterpriseが必要となり、そのためには営業担当者への問い合わせが必要です。 - エラーコード、例外はなし: 認識失敗はnullリターンまたは
"ERROR:"で始まる文字列として表れ、C/Javaのエラーコードの慣例に従っています。.NETの例外パターンではありません。 - 20以上のOCR言語: .NETエコシステム向けに構築された代替製品と比べて大幅に少ない。
エンジンライフサイクル問題
AspriseのOCR呼び出しはすべて、明示的なエンジン管理を必要とします。 このパターンは、静的なグローバル設定、インスタンスの作成、言語文字列を使用したエンジンの起動、および完了後のエンジンの停止という、4つの必須ステップで構成されています。 エンジン停止をスキップすると、ガベージコレクタが管理されていないメモリを解放できないため、ネイティブリソースがリークします。
// Asprise: four required steps before reading a single image
Ocr.SetUp(); // Static global init
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST); // Allocates native engine
string text = ocr.Recognize(
imagePath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT);
return text;
}
finally
{
ocr.StopEngine(); // Must call — no IDisposable fallback
}
// Asprise: four required steps before reading a single image
Ocr.SetUp(); // Static global init
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST); // Allocates native engine
string text = ocr.Recognize(
imagePath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT);
return text;
}
finally
{
ocr.StopEngine(); // Must call — no IDisposable fallback
}
' Asprise: four required steps before reading a single image
Ocr.SetUp() ' Static global init
Dim ocr As New Ocr()
Try
ocr.StartEngine("eng", Ocr.SPEED_FAST) ' Allocates native engine
Dim text As String = ocr.Recognize( _
imagePath, _
Ocr.RECOGNIZE_TYPE_TEXT, _
Ocr.OUTPUT_FORMAT_PLAINTEXT)
Return text
Finally
ocr.StopEngine() ' Must call — no IDisposable fallback
End Try
このパターンは三つの一般的な状況で静かに失敗します:StopEngine()が呼ばれる前にキャッチされない例外、クリーンアップをスキップするリファクターされたコードパス、LITE/STANDARDで並列処理を許可しないライセンスの制限がある並行使用。 finallyブロックは最初の問題を軽減しますが、ライセンスの制限によりこのパターンはサーバーのワークロードには無意味です。
IronOCRを理解する
IronOCRは、 .NET向けにゼロから構築された商用OCRライブラリです。 これは、最適化されたTesseract 5エンジンをベースに、自動前処理、ネイティブPDFサポート、そして標準的な.NET規約に準拠したマネージドAPIを備えています。
主な特徴:
- 単一のNuGetパッケージ:
dotnet add package IronOcrはすべてをインストールします—ネイティブバイナリの管理、tessdataフォルダー、プラットフォーム固有の設定は不要です。 IDisposableリソース管理:IDisposableを実装します。usingステートメントはクリーンアップを自動で処理します。 -すべてのライセンスレベルでスレッドセーフ:人工的なスレッド制限はありません。 $999 Liteライセンスで並列に使用しても安全です。- 自動前処理: 組み込みの
EnhanceResolution()メソッドにより、外部の画像処理ライブラリは必要ありません。 -ネイティブPDF入力: PDFパスを直接渡すことができます。ページを画像に変換するための外部レンダリングライブラリは不要です。 - 125以上の言語: 別々のNuGetパッケージとして利用可能で(
IronOcr.Languages.Frenchなど)、必要に応じてのみインストールされます。 - 検索可能なPDF出力:
result.SaveAsSearchablePdf()はあらゆるOCR結果からPDF/A準拠の出力を生成します。 -構造化データへのアクセス:結果として、ピクセル座標と単語ごとの信頼度スコアとともに、単語レベル、行レベル、段落レベルのテキストが表示されます。
機能比較
| フィーチャー | Asprise OCR | IronOCR |
|---|---|---|
| 主要プラットフォーム | Java | .NET |
| NuGetデプロイメント | ラッパー+ネイティブDLL | 単一パッケージ、追加料金なし |
| スレッド処理(全ティア) | Enterprise版のみ | 全ティア |
| サーバー/Webアプリケーションでの使用 | Enterprise版のみ | 全ティア |
| ネイティブPDF入力 | なし | はい |
| 組み込みの前処理 | なし | はい |
| OCR言語 | 20歳以上 | 125+ |
| 検索可能なPDF出力 | なし | はい |
詳細な機能比較
| フィーチャー | Asprise OCR | IronOCR |
|---|---|---|
| アーキテクチャ | ||
| デザインの由来 | Java、.NET(二次) | .NETネイティブ |
| APIスタイル | 整数定数を用いたCスタイル | 流暢なC#言語 |
IDisposable / usingパターン |
未実装 | はい(OcrInput) |
| エラー処理 | null / エラー文字列が返されます | .NET の例外 |
| ネイティブからの例外伝播 | 相互運用性のギャップ | 例外管理 |
| スレッド処理とサーバーの使用 | ||
| マルチスレッド処理 - Liteティア | 禁止 | 許可されています |
| マルチスレッド処理 - 標準ティア | 禁止 | 許可されています |
| マルチスレッド処理 —Enterprise/上位層 | 許可されています | 許可されています |
| .NET Core Web API | Enterpriseが必要です | どのティアでも |
| Azure Functions / AWS Lambda | Enterpriseが必要です | どのティアでも |
| 並列処理。各バッチごとに | Enterpriseが必要です | どのティアでも |
| 入力サポート | ||
| 画像ファイル(JPG、PNG、TIFF) | はい | はい |
| ネイティブPDF入力 | いいえ(外部ライブラリが必要です) | はい |
| パスワードで保護されたPDF | なし | はい |
| バイト配列/ストリーム入力 | 制限的 | はい |
| 複数ページTIFF | 制限的 | はい |
| 前処理 | ||
| デスキュー | 手動/外部 | 内蔵 |
| ノイズ除去 | 手動/外部 | 内蔵 |
| コントラスト強調 | 手動/外部 | 内蔵 |
| 二値化 | 手動/外部 | 内蔵 |
| 解像度スケーリング(DPI) | 手動/外部 | 内蔵 |
| 出力 | ||
| プレーンテキスト | はい | はい |
| 検索可能なPDF出力 | なし | はい |
| 単語座標 | 制限的 | はい |
| 単語ごとの信頼度スコア | なし | はい |
| hOCRエクスポート | なし | はい |
| 言語 | ||
| 言語数 | 20歳以上 | 125+ |
| 言語のインストール | バンドル | NuGetパッケージ |
| 厳密な型付け言語列挙型 | いいえ(文字列コード) | はい(OcrLanguage) |
| デプロイメント | ||
| ネイティブバイナリが必要 | はい(プラットフォーム固有のDLL) | なし |
| Tessdataフォルダ管理 | なし | なし |
| Docker | 手動バイナリ設定 | 箱から出してすぐに使えます |
| Linux | libaocr.soが必要です |
NuGetハンドル |
| 価格について | ||
| エントリー価格 | 価格についてAspriseに問い合わせてください(LITE、シングルスレッドのみ) | $999(Lite、すべての機能) |
| サーバー利用料(エントリー価格) | Enterprise(営業担当までお問い合わせください) | $999(Lite) |
ネイティブ.NETとJavaブリッジアーキテクチャの比較
.NETチームにとって根本的な問題は、どちらのライブラリが仕様上より多くの機能を備えているかではなく、実際に使用する展開環境や運用環境において、どちらのライブラリが第一級 for .NETコンポーネントとして機能できるか、ということである。
驚きのアプローチ
Aspriseは、マネージド.NETコードとアンマネージドOCRエンジンとの間で、P/Invokeマーシャリングを介して通信を行います。 asprise-vs-ironocr-examples.csソースが基礎となるメカニズムを示します:
// Asprise interop layer — bridging managed C# to native OCR engine
[DllImport("aocr.dll")]
private static extern IntPtr OCR(string imagePath, int type);
public string ExtractText(string imagePath)
{
// P/Invoke call into unmanaged DLL
IntPtr result = OCR(imagePath, 0);
return Marshal.PtrToStringAnsi(result); // Manual string marshal
}
// Asprise interop layer — bridging managed C# to native OCR engine
[DllImport("aocr.dll")]
private static extern IntPtr OCR(string imagePath, int type);
public string ExtractText(string imagePath)
{
// P/Invoke call into unmanaged DLL
IntPtr result = OCR(imagePath, 0);
return Marshal.PtrToStringAnsi(result); // Manual string marshal
}
Imports System.Runtime.InteropServices
' Asprise interop layer — bridging managed VB.NET to native OCR engine
Private Class OCRInterop
<DllImport("aocr.dll")>
Private Shared Function OCR(imagePath As String, type As Integer) As IntPtr
End Function
Public Function ExtractText(imagePath As String) As String
' P/Invoke call into unmanaged DLL
Dim result As IntPtr = OCR(imagePath, 0)
Return Marshal.PtrToStringAnsi(result) ' Manual string marshal
End Function
End Class
上位レベルのAPIでは、開発者はクラスラッパーを介して同じブリッジを呼び出しますが、デプロイメント要件は変わりません。すべてのターゲットマシンには、正しいネイティブバイナリが正しいパスに配置され、正しいプロセスアーキテクチャに一致している必要があります。 BadImageFormatExceptionをスローします。Linux DockerコンテナでDllNotFoundExceptionをスローします。 どちらのエラーもビルド時には検出されません。
IronOCRのアプローチ
IronOCRは単一のNuGet参照としてインストールされます。 このパッケージは、NuGetのプラットフォーム固有のパッケージ選択メカニズムを通じて、すべてのネイティブ依存関係を内部的に処理します。
// Installation — one command, all platforms
// dotnet add package IronOcr
// License setup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Basic OCR — no native binary setup, no tessdata, no config files
var text = new IronTesseract().Read("document.jpg").Text;
// Installation — one command, all platforms
// dotnet add package IronOcr
// License setup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Basic OCR — no native binary setup, no tessdata, no config files
var text = new IronTesseract().Read("document.jpg").Text;
Imports IronOcr
' Installation — one command, all platforms
' dotnet add package IronOcr
' License setup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
' Basic OCR — no native binary setup, no tessdata, no config files
Dim text As String = New IronTesseract().Read("document.jpg").Text
OcrInputで手動エンジンライフサイクルコールを置き換えます。 呼び出すStopEngine()もありません。 ガベージコレクタとtry/finallyの足場を必要とせずに例外シナリオでクリーンアップを正しく処理します。
詳細な設定手順については、 IronTesseract のセットアップガイドを参照してください。
ねじ切りモデル
スレッド制限は、 .NETサーバー開発者にとって、Aspriseと他の代替製品との最も重要な違いである。 これはパフォーマンス上の問題ではなく、ライセンス遵守の問題です。
驚きのアプローチ
LiteライセンスおよびSTANDARDライセンスでは、マルチスレッドおよびマルチプロセス実行が明示的に禁止されています。 複数のスレッドから同時にAspriseを呼び出すコードは、該当するティアのライセンス契約に違反します。 ASP.NET Coreは、デフォルトではスレッドプール上でリクエストを処理します。 つまり、 Lite/STANDARD では、Asprise を呼び出すすべての標準 Web API コントローラーがライセンス違反となります。
// ASPRISE LITE/STANDARD — violates license in ASP.NET Core context
// Web server thread pool = multiple concurrent threads = prohibited
[ApiController]
public class OcrController : ControllerBase
{
[HttpPost("extract")]
public IActionResult ExtractText(IFormFile file)
{
// Two concurrent requests = two threads = license violation
var ocr = new Ocr();
ocr.StartEngine("eng", Ocr.SPEED_FAST);
var text = ocr.Recognize(tempPath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
ocr.StopEngine();
return Ok(text);
}
}
// ASPRISE LITE/STANDARD — violates license in ASP.NET Core context
// Web server thread pool = multiple concurrent threads = prohibited
[ApiController]
public class OcrController : ControllerBase
{
[HttpPost("extract")]
public IActionResult ExtractText(IFormFile file)
{
// Two concurrent requests = two threads = license violation
var ocr = new Ocr();
ocr.StartEngine("eng", Ocr.SPEED_FAST);
var text = ocr.Recognize(tempPath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
ocr.StopEngine();
return Ok(text);
}
}
Imports Microsoft.AspNetCore.Mvc
' ASPRISE LITE/STANDARD — violates license in ASP.NET Core context
' Web server thread pool = multiple concurrent threads = prohibited
<ApiController>
Public Class OcrController
Inherits ControllerBase
<HttpPost("extract")>
Public Function ExtractText(file As IFormFile) As IActionResult
' Two concurrent requests = two threads = license violation
Dim ocr As New Ocr()
ocr.StartEngine("eng", Ocr.SPEED_FAST)
Dim text As String = ocr.Recognize(tempPath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT)
ocr.StopEngine()
Return Ok(text)
End Function
End Class
Lite/STANDARD におけるバッチ処理は、利用可能な CPU コア数に関わらず、強制的に逐次処理されます。
// ASPRISE LITE/STANDARD — sequential only (100 docs at 2 sec each = 3+ minutes)
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
foreach (var path in imagePaths) // Cannot use Parallel.ForEach — license violation
{
string text = ocr.Recognize(path, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
results.Add(text);
}
}
finally
{
ocr.StopEngine();
}
// ASPRISE LITE/STANDARD — sequential only (100 docs at 2 sec each = 3+ minutes)
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
foreach (var path in imagePaths) // Cannot use Parallel.ForEach — license violation
{
string text = ocr.Recognize(path, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
results.Add(text);
}
}
finally
{
ocr.StopEngine();
}
' ASPRISE LITE/STANDARD — sequential only (100 docs at 2 sec each = 3+ minutes)
Ocr.SetUp()
Dim ocr As New Ocr()
Try
ocr.StartEngine("eng", Ocr.SPEED_FAST)
For Each path In imagePaths ' Cannot use Parallel.ForEach — license violation
Dim text As String = ocr.Recognize(path, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT)
results.Add(text)
Next
Finally
ocr.StopEngine()
End Try
ENTERPRISEはスレッド制限を解除しますが、ENTERPRISEは公開されていない価格でAspriseのセールスに連絡が必要です。
IronOCRのアプローチ
IronTesseractはスレッドセーフであり、いかなるライセンスタイアにもスレッド制限はありません。 $999 Liteライセンスでの並列バッチ処理は完全にサポートされています:
// IronOCR — parallel batch on any license tier
// 100 docs at 2 sec each, 8 cores = ~25 seconds vs 200 seconds sequential
var results = imagePaths
.AsParallel()
.Select(path => new IronTesseract().Read(path).Text)
.ToList();
// IronOCR — parallel batch on any license tier
// 100 docs at 2 sec each, 8 cores = ~25 seconds vs 200 seconds sequential
var results = imagePaths
.AsParallel()
.Select(path => new IronTesseract().Read(path).Text)
.ToList();
Imports System.Linq
' IronOCR — parallel batch on any license tier
' 100 docs at 2 sec each, 8 cores = ~25 seconds vs 200 seconds sequential
Dim results = imagePaths _
.AsParallel() _
.Select(Function(path) (New IronTesseract()).Read(path).Text) _
.ToList()
ASP.NET Coreのコントローラーは、特別な設定なしに動作します:
// IronOCR — concurrent requests on any license tier
[ApiController]
public class OcrController : ControllerBase
{
[HttpPost("extract")]
public IActionResult ExtractText(IFormFile file)
{
// Thread-safe on Lite, Plus, Professional, Unlimited — all tiers
var text = new IronTesseract().Read(tempPath).Text;
return Ok(text);
}
}
// IronOCR — concurrent requests on any license tier
[ApiController]
public class OcrController : ControllerBase
{
[HttpPost("extract")]
public IActionResult ExtractText(IFormFile file)
{
// Thread-safe on Lite, Plus, Professional, Unlimited — all tiers
var text = new IronTesseract().Read(tempPath).Text;
return Ok(text);
}
}
Imports Microsoft.AspNetCore.Mvc
<ApiController>
Public Class OcrController
Inherits ControllerBase
<HttpPost("extract")>
Public Function ExtractText(file As IFormFile) As IActionResult
' Thread-safe on Lite, Plus, Professional, Unlimited — all tiers
Dim text = New IronTesseract().Read(tempPath).Text
Return Ok(text)
End Function
End Class
バッチ処理ワークロードにおける並列スループットパターンについては、マルチスレッドの例を参照してください。
画像の前処理
Aspriseは、画像を前処理せずにネイティブエンジンに渡します。 スキャン品質が低い場合(ページの歪み、ノイズ、コントラスト不足など)は、認識処理の前に画像の欠陥を補正する前処理段階がないため、OCRの精度が直接低下します。
驚きのアプローチ
前処理には、外部の画像ライブラリが必要です。 Aspriseを使用する開発者は、ImageMagick、SkiaSharp、またはSystem.Drawingなどの依存関係を追加し、前処理操作を手動で実行して、処理済みの画像を一時ファイルに保存し、そのファイルをAspriseに渡します:
// Asprise preprocessing: external dependency required
// 1. Load with external library
// 2. Apply corrections (deskew, denoise, contrast) with external library
// 3. Save to temp file
// 4. Pass temp file to Asprise
var ocr = new Ocr();
ocr.StartEngine("eng", Ocr.SPEED_FAST);
// preprocessedImagePath comes from your external preprocessing pipeline
string text = ocr.Recognize(preprocessedImagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
ocr.StopEngine();
// Asprise preprocessing: external dependency required
// 1. Load with external library
// 2. Apply corrections (deskew, denoise, contrast) with external library
// 3. Save to temp file
// 4. Pass temp file to Asprise
var ocr = new Ocr();
ocr.StartEngine("eng", Ocr.SPEED_FAST);
// preprocessedImagePath comes from your external preprocessing pipeline
string text = ocr.Recognize(preprocessedImagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
ocr.StopEngine();
' Asprise preprocessing: external dependency required
' 1. Load with external library
' 2. Apply corrections (deskew, denoise, contrast) with external library
' 3. Save to temp file
' 4. Pass temp file to Asprise
Dim ocr As New Ocr()
ocr.StartEngine("eng", Ocr.SPEED_FAST)
' preprocessedImagePath comes from your external preprocessing pipeline
Dim text As String = ocr.Recognize(preprocessedImagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT)
ocr.StopEngine()
これにより、ビルドの依存関係が増え、追加のライブラリによる実行時のオーバーヘッドが発生し、開発者は効果的な補正を実装するために画像処理を十分に理解している必要があります。
IronOCRのアプローチ
前処理はOcrInputに組み込まれています。 外部ライブラリと入念なパラメータ調整で50~100行かかっていた処理が、5つのメソッド呼び出しで済むようになります:
// IronOCR — preprocessing built in, no external dependencies
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
input.Deskew(); // Correct page rotation
input.DeNoise(); // Remove scanner artifacts
input.Contrast(); // Improve text/background separation
input.Binarize(); // Convert to black/white for cleaner engine input
input.EnhanceResolution(300); // Scale to optimal DPI
var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
// IronOCR — preprocessing built in, no external dependencies
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
input.Deskew(); // Correct page rotation
input.DeNoise(); // Remove scanner artifacts
input.Contrast(); // Improve text/background separation
input.Binarize(); // Convert to black/white for cleaner engine input
input.EnhanceResolution(300); // Scale to optimal DPI
var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr
' IronOCR — preprocessing built in, no external dependencies
Using input As New OcrInput()
input.LoadImage("low-quality-scan.jpg")
input.Deskew() ' Correct page rotation
input.DeNoise() ' Remove scanner artifacts
input.Contrast() ' Improve text/background separation
input.Binarize() ' Convert to black/white for cleaner engine input
input.EnhanceResolution(300) ' Scale to optimal DPI
Dim result = New IronTesseract().Read(input)
Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
回転角度が予測できないスキャン画像の場合、自動傾き補正機能により、開発者が回転値を検知したり指定したりする必要なく、任意の角度に対応します。 画像品質補正ガイドでは、フィルターの全セットと、それぞれの適用タイミングについて解説しています。
PDF処理
PDFの入力は、ドキュメント処理パイプラインにおいて頻繁に求められる要件です。 AspriseはネイティブなPDFサポートを提供していません。このライブラリは画像ファイルを処理します。 AspriseでPDFを処理するには、まず外部ライブラリを使用して各ページを画像に変換し、その後、各画像ファイルを個別に処理する必要があります。
驚きのアプローチ
// Asprise PDF workaround — external library required to render PDF pages
var images = ExternalPdfLibrary.RenderPages("invoice.pdf");
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
var allText = new System.Text.StringBuilder();
foreach (var imagePath in images)
{
string pageText = ocr.Recognize(imagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
allText.Append(pageText);
}
return allText.ToString();
}
finally
{
ocr.StopEngine();
}
// Also: clean up temp image files
// Asprise PDF workaround — external library required to render PDF pages
var images = ExternalPdfLibrary.RenderPages("invoice.pdf");
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
var allText = new System.Text.StringBuilder();
foreach (var imagePath in images)
{
string pageText = ocr.Recognize(imagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
allText.Append(pageText);
}
return allText.ToString();
}
finally
{
ocr.StopEngine();
}
// Also: clean up temp image files
Imports System.Text
' Asprise PDF workaround — external library required to render PDF pages
Dim images = ExternalPdfLibrary.RenderPages("invoice.pdf")
Ocr.SetUp()
Dim ocr As New Ocr()
Try
ocr.StartEngine("eng", Ocr.SPEED_FAST)
Dim allText As New StringBuilder()
For Each imagePath In images
Dim pageText As String = ocr.Recognize(imagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT)
allText.Append(pageText)
Next
Return allText.ToString()
Finally
ocr.StopEngine()
End Try
' Also: clean up temp image files
このアプローチは、PDFレンダリングの依存関係(通常はiText、PDFSharp、または商用レンダラー)を追加し、一時ファイルの管理が必要になり、ネイティブPDFリーダーが保持するPDFメタデータと構造が失われます。 パスワードで保護されたPDFには、3つ目のコンポーネントが必要です。
IronOCRのアプローチ
IronOCRはPDFを直接読み込みます。 OcrInput.LoadPdf()メソッドは内部でレンダリングを処理し、複数ページの文書やパスワード保護されたファイルを含みます:
// IronOCR — native PDF input, no external rendering library
using var input = new OcrInput();
input.LoadPdf("invoice.pdf");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
// Password-protected PDFs — same API, one parameter
using var secureInput = new OcrInput();
secureInput.LoadPdf("confidential.pdf", Password: "secret");
var secureResult = new IronTesseract().Read(secureInput);
// Generate searchable PDF from a scanned document
var scanResult = new IronTesseract().Read("scanned-contract.pdf");
scanResult.SaveAsSearchablePdf("searchable-contract.pdf");
// IronOCR — native PDF input, no external rendering library
using var input = new OcrInput();
input.LoadPdf("invoice.pdf");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
// Password-protected PDFs — same API, one parameter
using var secureInput = new OcrInput();
secureInput.LoadPdf("confidential.pdf", Password: "secret");
var secureResult = new IronTesseract().Read(secureInput);
// Generate searchable PDF from a scanned document
var scanResult = new IronTesseract().Read("scanned-contract.pdf");
scanResult.SaveAsSearchablePdf("searchable-contract.pdf");
Imports IronOcr
' IronOCR — native PDF input, no external rendering library
Using input As New OcrInput()
input.LoadPdf("invoice.pdf")
Dim result = New IronTesseract().Read(input)
Console.WriteLine(result.Text)
End Using
' Password-protected PDFs — same API, one parameter
Using secureInput As New OcrInput()
secureInput.LoadPdf("confidential.pdf", Password:="secret")
Dim secureResult = New IronTesseract().Read(secureInput)
End Using
' Generate searchable PDF from a scanned document
Dim scanResult = New IronTesseract().Read("scanned-contract.pdf")
scanResult.SaveAsSearchablePdf("searchable-contract.pdf")
PDF OCRガイドでは、ページ範囲の選択、異なる種類のPDFの混在への対応、およびアーカイブワークフロー向けの検索可能なPDF出力について解説しています。
APIマッピングリファレンス
| Asprise OCR | IronOCR相当値 |
|---|---|
Ocr.SetUp() |
不要 |
new Ocr() |
new IronTesseract() |
ocr.StartEngine("eng", Ocr.SPEED_FAST) |
不要(初回使用時にエンジンが初期化されます) |
ocr.Recognize(path, type, format) |
ocr.Read(path) |
Ocr.RECOGNIZE_TYPE_TEXT |
デフォルトの動作 |
Ocr.RECOGNIZE_TYPE_BARCODE |
ocr.Configuration.ReadBarCodes = true |
Ocr.RECOGNIZE_TYPE_ALL |
ocr.Configuration.ReadBarCodes = true |
Ocr.OUTPUT_FORMAT_PLAINTEXT |
result.Text |
Ocr.OUTPUT_FORMAT_XML |
result.Words / 構造化結果 |
Ocr.OUTPUT_FORMAT_PDF |
result.SaveAsSearchablePdf() |
Ocr.SPEED_FASTEST |
ocr.Configuration速度設定 |
Ocr.SPEED_FAST |
デフォルト設定 |
Ocr.SPEED_SLOW |
高精度設定 |
ocr.StopEngine() |
必要ありません(usingがクリーンアップを処理します) |
言語文字列"eng+fra" |
`ocr.Language = OCRLanguage.English; ocr.AddSecondaryLanguage(OcrLanguage.French) |
| 手動による try/finally クリーンアップ | using var input = new OcrInput() |
| エラー文字列の戻り値 | .NET Standardの例外 |
チームが Asprise から IronOCR への移行を検討する際
本番環境への移行を阻む要因
スレッド数の制限は、ほとんどの本番環境における.NETワークロードにとって、重大な障害となっています。 開発チームがAsprise Liteを使用してOCR機能を構築している最中、シングルスレッドでのテストは成功し、すべて正常に動作している。 その後、その機能が ASP.NET Core API の背後にあるステージング環境にデプロイされると、テストリクエストが同時に到着し、アプリケーションはエラーをスローするか、技術的に準拠していない状態で動作します。 解決策としては、Enterpriseへのアップグレード(それに伴う費用および営業担当者の関与を含む)か、ライブラリの置き換えのいずれかとなります。 本番環境ではなく、ステージング環境でこの段階に達したチームは幸運だと言えます; リリース後にこの問題に気付いたユーザーは、より緊急性の高い移行を迫られることになります。 IronOCRはこの問題の全クラスを解決します—$999 Liteライセンスは、制限なしに並行要求処理、バッチ並列処理、Windowsサービス、クラウド機能のサポートを行います。
導入の複雑さによるコスト
Dockerコンテナ、Linux VM、Kubernetesポッドといった最新のデプロイ環境で運用するチームは、Aspriseを利用することで継続的なメンテナンスコストを負担することになりますが、これは純粋なNuGetパッケージでは発生しないコストです。 すべてのコンテナイメージのビルドには、ターゲットアーキテクチャに対応した正しいネイティブバイナリを含める必要があります。 複数のプラットフォームを対象とするすべてのCI/CDパイプラインは、プラットフォーム固有のファイルの組み込みを処理する必要があります。 本番環境のLinuxコンテナでネイティブライブラリが欠落している場合、これはビルド時のエラーではなく、実行時に検出される問題です。 64ビットプロセスにロードされた32ビットDLLのデバッグに何時間も費やした経験のあるチームなら、そのコストを具体的に理解しているはずです。 IronOCRのNuGet限定のデプロイメントにより、この種のデプロイメント失敗は完全に排除されます。
Javaドキュメントの問題
.NETアプリケーションを開発するチームには、Javaの例ではなく、C#の例が必要です。 Aspriseの主要なドキュメント、APIリファレンス、およびコミュニティリソースは、Java開発者を対象としています。 Aspriseのドキュメントを読む.NET開発者は、Javaの構文、Javaのパッケージ規約、およびJava固有のパターンをC#の対応する表現に変換します。ただし、.NETラッパーがJava側のすべての機能を公開しているわけではないため、その変換が必ずしも直訳とは限らない場合があります。 IronOCRのドキュメント、チュートリアル、およびコードサンプルは、C#開発者を対象に作成されています。 "画像からのテキスト読み取り"チュートリアルおよびチュートリアルハブ全体では、翻訳の手間をかけずに、各機能について動作するC#のサンプルコードを提供しています。
PDFパイプラインのギャップ
PDF形式のスキャン文書、請求書、契約書、またはフォームを処理するチームは、依存関係グラフにPDFレンダリングライブラリを追加しない限り、Aspriseを使用することはできません。 そのレンダリングライブラリには、独自のライセンス上の考慮事項、メンテナンスの負担、および潜在的な非互換性が伴います。 OCRとPDFを単一のスタックで必要とするチームにとって、IronOCRは両方をネイティブに処理します。 スキャンした入力データから検索可能なPDFを作成する機能(アーカイブやコンプライアンスのワークフローにおいて一般的な要件)は、Aspriseのどのライセンスレベルにも同等の機能はありません。
言語対応のギャップ
Aspriseは20以上のOCR言語に対応しています。 IronOCRは125以上の機能をサポートしており、それぞれを独立したNuGetパッケージとしてインストール可能です。 IronOCRではサポートされているものの、Aspriseではサポートされていないアラビア語、ヒンディー語、タイ語、その他数十の言語で文書を処理するチームは、Aspriseを通じて多言語サポートを利用する方法がありません。多言語ガイドでは、複数の言語パックのインストールと組み合わせ方、および複数の文字体系にわたる同時認識について解説しています。
一般的な移行の考慮事項
エンジンライフサイクルコードの置換
移行における最大の機械的変更は、Aspriseエンジンのライフサイクルパターンを削除し、直接IronTesseractインスタンス化と交換することです。 SetUp() / StartEngine() / Recognize() / Read()呼び出しに変わります:
// Before: Asprise lifecycle (15 lines, manual cleanup)
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
string text = ocr.Recognize(
imagePath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT);
return text;
}
finally
{
ocr.StopEngine();
}
// After: IronOCR (1 line)
return new IronTesseract().Read(imagePath).Text;
// Before: Asprise lifecycle (15 lines, manual cleanup)
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
string text = ocr.Recognize(
imagePath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT);
return text;
}
finally
{
ocr.StopEngine();
}
// After: IronOCR (1 line)
return new IronTesseract().Read(imagePath).Text;
' Before: Asprise lifecycle (15 lines, manual cleanup)
Ocr.SetUp()
Dim ocr As New Ocr()
Try
ocr.StartEngine("eng", Ocr.SPEED_FAST)
Dim text As String = ocr.Recognize( _
imagePath, _
Ocr.RECOGNIZE_TYPE_TEXT, _
Ocr.OUTPUT_FORMAT_PLAINTEXT)
Return text
Finally
ocr.StopEngine()
End Try
' After: IronOCR (1 line)
Return New IronTesseract().Read(imagePath).Text
多くの文書を連続的に処理するパフォーマンスに敏感なコードには、IronTesseractインスタンスを再利用し、新しいものを呼び出しごとに作成しないでください—エンジンの初期化にはオーバーヘッドがあり、連続的に使用される単一のインスタンスは、各文書ごとに作成および廃棄するよりも効率的です。
文字列ベースの言語コードの置換
Aspriseは言語選択に文字列パラメータを使用します("eng", "fra", "eng+fra")。 IronOCRは強く型付けされたOcrLanguage列挙型を使用し、二次言語APIを持っています。 多言語ガイドでは、利用可能な言語識別子と、それぞれに必要な NuGet パッケージについて解説しています:
// Before: Asprise string-based language
ocr.StartEngine("eng+fra", Ocr.SPEED_FAST);
// After: IronOCR strongly-typed language enum
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
ocr.AddSecondaryLanguage(OcrLanguage.French);
var result = ocr.Read(imagePath);
// Before: Asprise string-based language
ocr.StartEngine("eng+fra", Ocr.SPEED_FAST);
// After: IronOCR strongly-typed language enum
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
ocr.AddSecondaryLanguage(OcrLanguage.French);
var result = ocr.Read(imagePath);
Imports IronOcr
' Before: Asprise string-based language
ocr.StartEngine("eng+fra", Ocr.SPEED_FAST)
' After: IronOCR strongly-typed language enum
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.English
ocr.AddSecondaryLanguage(OcrLanguage.French)
Dim result = ocr.Read(imagePath)
エラー文字列のチェックの置換
Aspriseは、認識に失敗した場合、nullまたはエラー接頭辞が付いた文字列を返します。 IronOCRは.NET例外をスローします。 nullと文字列プレフィックスチェックを標準のtry/catchブロックで置き換えます。 これにより、OCRエラー処理が.NETの例外処理モデルと整合し、解析されたエラー文字列ではなく、完全なスタックトレースや例外型の階層構造にアクセスできるようになります。
並列処理の実現
移行後、既存のParallel.ForEachまたはPLINQに変換できます。 Lite/STANDARD では従来順次処理されていたドキュメントのバッチ処理において、並列処理はスループットを直接的に向上させます。 非同期OCRガイドでは、スレッドプールの飽和を避けるためにノンブロッキングOCRが推奨されるWebアプリケーションのコンテキストにおける非同期パターンについて解説しています。
IronOCRの追加機能
この比較で取り上げた分野以外にも、IronOCRにはAspriseにはない独自の機能があります:
- OCR中のバーコード読み取り: 文書から分割して条バーコードとQRコードを抽出する
ocr.Configuration.ReadBarCodes = trueを有効にします—二番目のライブラリは不要です。 - 領域ベースのOCR: 文書の特定の領域から
CropRectangleを使用してテキストを抽出します。請求書のヘッダー、フォームフィールド、および構造化データゾーンに便利です。 - 信頼度スコア:WORDごとの認識信頼度および全体的な認識信頼度値にアクセスし、信頼度の低い抽出結果を特定して、人間によるレビューに回すことができます。
- 構造化データの抽出:ページ、段落、行、WORD単位で結果オブジェクトをナビゲートでき、それぞれにピクセル座標が付与されるため、単なるテキスト出力にとどまらない、レイアウトを意識したドキュメント解析が可能になります。
- hOCR エクスポート: 認識結果を hOCR 形式でエクスポートし、下流の文書処理ツールと連携させます。
- 特殊な文書認識:一般的なTesseractの認識機能を超える、パスポート、MICR小切手、ナンバープレート、手書き文字に特化したワークフロー。
- 進捗の追跡: 長時間実行されるバッチ処理中に進捗イベントを購読し、UI フィードバックやモニタリングに活用します。
.NETの互換性と将来の準備
IronOCRは.NET Standard 2.0を対象としており、これには.NET Framework 4.6.1以降、.NET Core 2.0以降、および.NET 5から.NET 9以降のすべてのバージョンが含まれます。 このライブラリは、.NETのリリースサイクルに合わせて定期的に更新されており、Windows x64、Windows x86、Linux x64、macOS、Docker、Azure App Service、およびAWS Lambda上でテストされています。 Asprise for .NET互換性は、そのネイティブバイナリモデルによって制約されています。新しいプラットフォームターゲット(ARM64、WASM)にはAsprise Inc.による新しいネイティブビルドが必要であり、Java優先のリリースサイクルにより、.NETプラットフォームの更新が遅れる可能性があります。 現在.NET8 および.NET9 を対象とし、2026年に.NET10 への移行を計画しているチームにとって、IronOCR のマネージド NuGet アーキテクチャは、ネイティブバイナリに関する懸念を抱くことなく、シンプルな互換性パスを提供します。
結論
Asprise OCRは、.NETラッパーを備えたJava OCRライブラリです。 Javaの遺産は偶然のものではありません。それは、デプロイメントモデル(プラットフォーム固有のネイティブDLL)、APIのスタイル(整数定数を使用したCスタイルのライフサイクルメソッド)、ドキュメントの言語(翻訳が必要なJavaのサンプル)、およびスレッドに関する制限(ライセンス契約によるLite/STANDARDのシングルスレッド)を定義しています。 たまたま.NETプロジェクトを抱えているJavaチームにとって、Aspriseのクロス言語対応は理にかなっています。 本番システムを構築する.NETチームにとって、こうした特性はあらゆる段階で障害となります。
スレッドに関する制限については、特に注意を払う必要があります。 Aspriseの最も手頃な2つのプラン(製品の評価を行っているチームの大部分が利用しているプラン)では、マルチスレッドおよびマルチプロセスでの実行が禁止されています。 すべてのASP.NET Core Web API、すべての作業キューを持つWindowsサービス、すべての並行トリガーを処理するAzure Function:これらは標準 for .NETプロダクションパターンであり、すべてにAspriseのENTERPRISEライセンスが必要です。IronOCRの$999 Liteライセンスは、これらすべてを制限なしにカバーします。
導入の複雑さは、2番目に重要な実務上の懸念事項である。 Dockerコンテナを実行するチーム、Linuxビルド、またはプラットフォームをまたがるCI/CDパイプラインは、プラットフォーム固有のネイティブバイナリをAspriseで管理しなければなりません。それらの失敗—DllNotFoundException, BadImageFormatException—はターゲットインフラストラクチャでの実行時に発生し、ビルド時ではありません。IronOCRは標準のNuGetパッケージ管理を通じてデプロイされ、パッケージ選択メカニズムはプラットフォーム固有のバイナリを内部で処理します。 デプロイメントの対象となるのは、単一のNuGet参照です。
.NETチームが新しいOCR統合を開始する際の出発点は明確です:単一のnew IronTesseract().Read("document.jpg").Textです。 エンジン初期化なし、ネイティブバイナリソースなし、スレッドライセンス監査なし。
よくある質問
Asprise OCR SDKとは何ですか?
Asprise OCR SDKは、開発者や企業が画像や文書からテキストを抽出するために使用するOCRソリューションです。.NETアプリケーション開発のためにIronOCRとともに評価されるいくつかのOCRオプションの一つです。
IronOCRはAsprise OCR SDK for .NET開発者と比べてどうですか?
IronOCRはNuGetネイティブ for .NET OCRライブラリで、IronTesseractをコアエンジンとして使用しています。Asprise OCR SDKと比較して、よりシンプルなデプロイメント(SDKインストーラーなし)、定額価格、COMインターオプやクラウド依存のないクリーンなC# APIを提供します。
IronOCRはAsprise OCR SDKよりセットアップが簡単ですか?
IronOCRは単一のNuGetパッケージでインストールされます。SDKインストーラー、ライセンスファイルのコピー、COMコンポーネントの登録、ランタイムバイナリの管理は必要ありません。OCRエンジン全体がパッケージにバンドルされています。
Asprise OCR SDKとIronOCRにはどのような精度の違いがありますか?
IronOCRは、標準的なビジネス文書、請求書、領収書、スキャンしたフォームに対して高い認識精度を達成します。高度に劣化した文書や一般的でないスクリプトの場合、精度はソースの品質によって異なります。IronOCRは低品質入力の認識を向上させる画像前処理フィルターを含んでいます。
IronOCRはPDFテキスト抽出をサポートしていますか?
IronOCRは、ネイティブPDFとスキャンしたPDFイメージの両方から、一回の呼び出しでテキストを抽出します。また、複数ページのTIFFファイル、画像、ストリームもサポートします。スキャンしたPDFの場合、OCRはページごとに適用され、ページごとの結果オブジェクトを持ちます。
Asprise OCR SDKのライセンスはIronOCRと比較してどうですか?
IronOCRは、定額制の永久ライセンスで、ページ毎やスキャン毎の課金はありません。大量のドキュメントを処理する組織は、ボリュームに関係なく同じライセンス費用を支払います。詳しくはIronOCRライセンスページをご覧ください。
IronOCR はどの言語をサポートしていますか?
IronOCRは個別のNuGet言語パックにより127言語をサポートしています。言語を追加するには'dotnet add package IronOcr.Languages.{Language}'コマンドを実行するだけです。手動でのファイル配置やパス設定は必要ありません。
.NETプロジェクトにIronOCRをインストールするにはどうすればよいですか?
NuGet経由でインストールします:パッケージマネージャーコンソールで'Install-Package IronOcr'、またはCLIで'dotnet add package IronOcr'。追加の言語パックも同様にインストールされます。ネイティブSDKインストーラーは必要ありません。
IronOCRはAsprise OCRと違い、Dockerやコンテナでのデプロイに適していますか?
IronOCRはNuGetパッケージによってDockerコンテナで動作します。ライセンスキーは環境変数で設定します。OCRエンジン自体にはライセンスファイル、SDKパス、ボリュームマウントは必要ありません。
購入前にIronOCRをAsprise OCRと比較して試すことはできますか?
IronOCRのトライアルモードでは、ドキュメントを処理し、出力に透かしをオーバーレイしたOCR結果を返します。ライセンスを購入する前に、ご自身の文書で精度を確認することができます。
IronOCRはテキスト抽出とバーコード読み取りをサポートしていますか?
IronOCRはテキスト抽出とOCRに重点を置いています。バーコード読み取りについては、Iron SoftwareはIronBarcodeをコンパニオンライブラリとして提供しています。どちらも個別に、あるいはIron Suiteのバンドルとして提供されています。
Asprise OCR SDKからIronOCRへの移行は簡単ですか?
Asprise OCR SDKからIronOCRへの移行は通常、初期化シーケンスをIronTesseractのインスタンス化に置き換え、COMライフサイクル管理を削除し、APIコールを更新します。ほとんどの移行はコードの複雑さを大幅に軽減します。

