OCRソフトウェアの試用:トップオプションを探索
Kofax OmniPage SDKでOCRを動作させるには、Tungsten Automationの営業チームに連絡を取り、4~12週間にわたるヒアリング、概念実証セッション、契約交渉、調達承認といったプロセスを乗り越えなければならず、その後ようやく一行のコードを書くことができる。 このSDKはNuGetに存在しません。 カスタムインストーラーとして到着し、特定のマシンまたはネットワークライセンスサーバーにライセンスファイルを添付し、起動時に100MB以上の言語辞書とニューラルネットワークモデルをロードし、明示的なengine.Shutdown()呼び出しを必要とします。また、このサーバー上の他のすべてのプロセスに対してライセンスをロックしたままにするリスクを伴います。 .NET OCR ワークロードの大部分(請求書、契約書、スキャンされた PDF、身分証明書など)においては、調達と展開にかかるオーバーヘッドは、30 秒でインストールできるライブラリと比較して、測定可能な精度上の利点をもたらしません。
Kofax OmniPageについて理解する
Kofax OmniPage(2024年のブランド変更後、現在はTungsten Automationとして販売)は、30年の歴史を持つEnterprise文書キャプチャおよびOCRSuiteです。 その所有権の連鎖は次の通りです: Caere Corporation → Nuance Communications (2001) → Kofax (2019) → Tungsten Automation (2024)。 所有権の履歴は、長期的なプラットフォームの安定性を評価するチームにとって重要です。
OmniPageは、最高レベルの精度を誇り、大量のEnterprise文書処理をターゲットとしています。具体的には、数百万ページを処理するフォーム処理センター、政府文書のデジタル化プログラム、手書き欄のICR(インテリジェント文字認識)を必要とする財務ワークフローなどが挙げられます。 .NET開発者向けにOCR機能を提供するCapture SDKは、デスクトップ版のOmniPage Ultimate製品(小売価格499ドル)とは別の製品です。 SDKは、別途調達が必要で、企業向け価格設定です — 見積もりについてはKofax/Tungsten Automationにお問い合わせください。 ライセンスコストに加えて、年間のメンテナンス料金が必要です。
OmniPage Capture SDKの主なアーキテクチャ特性:
- NuGetによる配布なし: SDK は、販売後の取引完了後にカスタムインストーラーを介して提供されます。 プロジェクトに手動で追加されたDLL参照
- エンジンのライフサイクル管理: 使用する前に
OmniPageEngineを初期化し、使用後に明示的にシャットダウンする必要があります。Shutdown()を呼び出さないとライセンスがロックされたままになる可能性があります。 - ライセンスファイルのデプロイ: SDKを実行するすべてのマシンに特定のパスに
.licファイルが存在する必要があります。 ネットワーク/フローティングライセンス構成では、ファイアウォールポートを開放した別のライセンスサーバーのインストールが必要です。 -ハードウェアフィンガープリンティング:アクティベーションはハードウェアに紐付けられます。 ハードウェアの変更には再アクティベーションが必要です。 -マルチコンポーネントネイティブインストール: OCRエンジンDLL、ICR手書き認識モジュール、OMRマーク認識モジュール、および120以上の言語辞書がエンジンの初期化時にロードされます。 -複数の出力形式と認識モード: OCR、ICR(手書き)、OMR(チェックボックス)、バーコード、MRZ認識をサポート。 各モードは、ドキュメントごとにゾーンごとに設定可能です。 - 2025.3でLinuxを追加: 2026年1月のSDKリリースでLinuxサーバーのサポートが追加されました。 macOSは引き続きサポート対象外です。
エンジン初期化パターン
OmniPageとのあらゆる統合は、アプリケーションのドキュメント処理ウィンドウ全体にわたるエンジンライフサイクルから始まります。
// OmniPage: Engine must be initialized before any operations
// License file must exist at this path on every target machine
using var engine = new OmniPageEngine();
engine.SetLicenseFile(@"C:\Program Files\OmniPage\license.lic");
engine.Initialize(); // Contacts license server; loads 100MB+ of native components
// Configure recognition settings for the document
var settings = new RecognitionSettings
{
PrimaryLanguage = "English",
SecondaryLanguages = new[] { "German", "French" },
AccuracyMode = "Maximum",
PreserveLayout = true,
DetectTables = true,
DespeckleLevel = 2,
ContrastEnhancement = true,
AutoRotate = true,
DeskewImage = true
};
// Document-centric workflow
var document = engine.CreateDocument();
document.AddPage(imagePath);
document.Recognize(settings);
string text = document.GetText();
// Explicit cleanup — omitting this can lock the license
document.Dispose();
engine.Shutdown();
// OmniPage: Engine must be initialized before any operations
// License file must exist at this path on every target machine
using var engine = new OmniPageEngine();
engine.SetLicenseFile(@"C:\Program Files\OmniPage\license.lic");
engine.Initialize(); // Contacts license server; loads 100MB+ of native components
// Configure recognition settings for the document
var settings = new RecognitionSettings
{
PrimaryLanguage = "English",
SecondaryLanguages = new[] { "German", "French" },
AccuracyMode = "Maximum",
PreserveLayout = true,
DetectTables = true,
DespeckleLevel = 2,
ContrastEnhancement = true,
AutoRotate = true,
DeskewImage = true
};
// Document-centric workflow
var document = engine.CreateDocument();
document.AddPage(imagePath);
document.Recognize(settings);
string text = document.GetText();
// Explicit cleanup — omitting this can lock the license
document.Dispose();
engine.Shutdown();
Imports OmniPage
' OmniPage: Engine must be initialized before any operations
' License file must exist at this path on every target machine
Using engine As New OmniPageEngine()
engine.SetLicenseFile("C:\Program Files\OmniPage\license.lic")
engine.Initialize() ' Contacts license server; loads 100MB+ of native components
' Configure recognition settings for the document
Dim settings As New RecognitionSettings With {
.PrimaryLanguage = "English",
.SecondaryLanguages = {"German", "French"},
.AccuracyMode = "Maximum",
.PreserveLayout = True,
.DetectTables = True,
.DespeckleLevel = 2,
.ContrastEnhancement = True,
.AutoRotate = True,
.DeskewImage = True
}
' Document-centric workflow
Dim document = engine.CreateDocument()
document.AddPage(imagePath)
document.Recognize(settings)
Dim text As String = document.GetText()
' Explicit cleanup — omitting this can lock the license
document.Dispose()
engine.Shutdown()
End Using
このパターンは、すべての統合ポイントで再現する必要があります。ASP.NETリクエストハンドラー、Windowsサービス、バッチ処理ジョブ、単体テストなど、すべてエンジンのライフサイクルを管理する必要があります。 フローティングライセンス構成では、エラーパスでShutdown()を忘れると、サーバーが再起動するまで他のすべてのプロセスに対するライセンスシートがロックされます。
IronOCRを理解する
IronOCRは、最適化されたTesseract 5エンジンをベースに構築された商用.NET OCRライブラリで、自動前処理、ネイティブPDFサポート、および単一のNuGetパッケージからのクロスプラットフォーム展開機能を備えています。 これは、Enterprise調達の手間や、生のTesseractに必要な手動の前処理パイプラインなしに、実運用可能なOCRを必要とする開発者を対象としています。
主な特徴:
- 単一のNuGetパッケージ:
dotnet add package IronOcr— インストーラなし、DLL参照なし、ネイティブコンポーネント管理なし -文字列ベースのライセンス:アプリケーション起動時に1行のコードを追加。ファイルのデプロイ、ライセンスサーバーの設定、ハードウェアフィンガープリンティングは不要。 -自動前処理: OCRエンジンの呼び出し前に、傾き補正、ノイズ除去、コントラスト強調、二値化、解像度正規化が自動的に適用されます。 - ネイティブPDF入力:
input.LoadPdf()はスキャンされたPDFを直接処理します。 PDFモジュールのライセンスは別途必要ありません - 検索可能なPDF出力:
result.SaveAsSearchablePdf()はスキャンされた入力からテキストレイヤーPDFを生成します。 - 設計によるスレッドセーフ: 複数の
IronTesseractインスタンスが並行して実行され、調整のオーバーヘッドなし -クロスプラットフォーム: Windows、Linux、macOS、Docker、Azure、AWS Lambdaはすべて同じNuGetパッケージからサポートされます - 125以上の言語: 各言語は個別のNuGetパッケージとして利用可能です(
IronOcr.Languages.Frenchなど)。 - 永続ライセンス: $999 Lite / $1,499 Plus / $2,999 Professional / $5,999 Unlimited; 年間メンテナンス不要
機能比較
| フィーチャー | Kofax OmniPage SDK | IronOCR |
|---|---|---|
| 分布 | カスタムインストーラー、手動DLL参照 | NuGetパッケージ |
| インストール時間 | 4~12週間(調達)+数時間(セットアップ) | 30秒 |
| 開始価格 | Kofax/Tungsten Automation営業までお問い合わせください | $999 Lite(公開) |
| ライセンスモデル | Enterprise契約、年間保守契約 | 永久的で、メンテナンス不要 |
| ライセンスメカニズム | .lic ファイル + オプションのライセンスサーバー |
文字列キーまたは環境変数 |
| macOS対応 | サポートされていません | フルサポート |
| Linuxサポート | はい(2025.3で追加) | はい(全バージョン) |
詳細な機能比較
| フィーチャー | Kofax OmniPage SDK | IronOCR |
|---|---|---|
| 取得 | ||
| NuGet の利用可能性 | なし | はい |
| セルフサービストライアル | いいえ(販売促進を目的とした評価ではありません) | はい(無料トライアルあり) |
| 公開価格 | なし | はい |
| 販売プロセスが必要 | はい(通常4~12週間) | なし |
| ライセンスについて | ||
| ライセンスメカニズム | .lic ディスク上のファイル |
文字列キー |
| ライセンスサーバーのサポート | はい(フローティング/ネットワーク) | 不要 |
| ハードウェアフィンガープリンティング | はい | なし |
| 年間維持費 | ライセンス費用の18~25% | オプション |
| ページごとの実行料金 | 利用可能(変動あり) | なし |
| プラットフォームのサポート | ||
| Windows x64 | はい | はい |
| Linux | はい(2025.3以降) | はい(全バージョン) |
| macOS | なし | はい |
| Docker | 制限的 | フル |
| Azure / AWS Lambda | 複雑 | ストレート |
| OCR機能 | ||
| OCR(印刷されたテキスト) | はい、120以上の言語に対応しています。 | はい、125以上の言語に対応しています。 |
| ICR(手書き) | はい | 制限的 |
| OMR(チェックボックス/バブル) | はい | なし |
| MRZ認識 | はい | はい |
| MICR(銀行小切手) | はい | はい |
| バーコード読み取り | アドオンモジュール | 内蔵 |
| ドキュメント入力 | ||
| 画像ファイル | はい | はい |
| PDF入力(ネイティブ) | はい(追加モジュールが必要になる場合があります) | はい、内蔵 |
| パスワードで保護されたPDF | 構成依存 | はい (Password パラメーター) |
| 複数ページTIFF | はい | はい |
| ストリーム入力 | はい | はい |
| 出力 | ||
| プレーンテキスト | はい | はい |
| 検索可能なPDF | はい | はい |
| hOCR | はい | はい |
| 単語レベルの座標 | はい | はい |
| 信頼度スコア | はい | はい |
| 前処理 | ||
| 自動傾き補正 | 設定ベース | 自動 + 明示的なAPI |
| 騒音低減 | 設定ベース | 自動 + 明示的なAPI |
| コントラスト強調 | 設定ベース | 自動 + 明示的なAPI |
| 明示的なフィルタ制御 | はい | はい (Deskew(), DeNoise() など) |
| 開発分野 | ||
| エンジンライフサイクル管理 | 必須 | 不要 |
| スレッドセーフティ | 複雑な(エンジン再利用) | 内蔵 |
| 導入の複雑さ | 高(ライセンスファイル、ネイティブコンポーネント) | 単一のNuGetパッケージ |
Enterprise調達と開発者のアクセス性
OmniPageとIronOCRの最も大きな実質的な違いは、精度ではなく、"OCRが必要だ"と思ってから"アプリケーションでOCRが実行される"までの時間です。
Kofax OmniPage アプローチ
OmniPageの買収プロセスは、開発者が省略できない固定された手順に従います。
OmniPageの導入手順(kofax-enterprise-ocr.csソースコードより):
1. 販売プロセス全体(4~12週間)
2. TungstenからSDKインストーラーを受け取る
3. 開発マシンにSDKをインストールする
4. ライセンスファイルの設定(マシン単位またはフローティング)
5. ライセンスサーバーをセットアップする(ネットワークライセンスを使用する場合)
6. 本番サーバーにランタイムコンポーネントをインストールする
7. ライセンスファイルを本番環境にデプロイする
8. ライセンスサーバーとの通信用にファイアウォールを設定する
9. ライセンスの利用可能性を監視する設定を行う
10. ライセンスリリースのためのシャットダウン手順を文書化する
ステップ5、8、9は開発者の作業ではなく、インフラストラクチャチームおよびセキュリティチームとの連携が必要です。 手順7は、すべてのプロダクションデプロイメントにおいて、ハードコードされたパスに.licファイルが必要であることを意味します。 手順10は、コードパスでShutdown()を忘れると、フローティングライセンスシートが無期限にロックされるために存在します。
ページ単位のライセンスモデルは、運用上の複雑さをさらに増大させる。 使用状況レポートはライセンスサーバーに送信され、請求の照合は月次または四半期ごとに行われます。そして、ドキュメント量の予期せぬ急増(新規顧客のオンボーディング、バックログの処理など)が発生すると、誰も予算に計上していなかった超過料金の請求書が生成されます。
IronOCRのアプローチ
// Step 1: Install
// dotnet add package IronOcr
// Step 2: Configure license (one line at startup)
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Step 3: Read a document
var text = new IronTesseract().Read("document.jpg").Text;
// Step 1: Install
// dotnet add package IronOcr
// Step 2: Configure license (one line at startup)
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Step 3: Read a document
var text = new IronTesseract().Read("document.jpg").Text;
' Step 1: Install
' dotnet add package IronOcr
' Step 2: Configure license (one line at startup)
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
' Step 3: Read a document
Dim text As String = (New IronTesseract()).Read("document.jpg").Text
インストーラーはありません。 DLL参照はありません。 ディスク上にライセンスファイルがありません。 ライセンスサーバーがありません。 ファイアウォールルールは設定されていません。 シャットダウン手順はありません。 ライセンスキーは文字列で、環境変数、appsettings.json、またはAzure Key Vaultに保存します。 展開先を変更する場合(例えば、Windows VMからLinux Dockerコンテナへ)、ライセンスの再設定は不要です。
IronTesseractのセットアップガイドには、環境変数ベースのキーインジェクションを含む、すべての設定オプションが記載されています。キーインジェクションを使用すると、ライセンス文字列をソースコードから完全に削除できます。
SDKのインストールとNuGetの比較
デプロイメントモデルは、CI/CDパイプライン、Dockerコンテナ、クラウド関数がそもそも機能するかどうかを決定するものであり、セットアップの難易度だけを左右するものではありません。
Kofax OmniPage アプローチ
OmniPageのインストーラーに基づく配布モデルは、最新のデプロイメントパイプラインのあらゆる段階で摩擦を引き起こします。Dockerコンテナを構築するには、カスタムSDKインストーラーをイメージ内で実行し、ライセンスファイルを焼き込むか、実行時にマウントし、コンテナが停止する前にengine.Shutdown()を実行する必要があります。 OmniPageエンジンが正常にシャットダウンされないKubernetesポッドの再起動は、ライセンスサーバーのチェックアウトタイムアウト(通常30~60分)が経過するまで、フローティングライセンスシートをロックしたままにする可能性があります。
CI/CDパイプラインでは、統合テストを実行するすべてのエージェントにSDKがインストールされ、有効なライセンスファイルが利用可能である必要があります。 テストの並列処理能力は、ライセンスされた座席数によって制限されます。 OmniPageのページ単位課金モデルでは、自動テストの実行ごとに課金対象となるページが消費されます。
名前空間Kofax.OmniPage.CSDKは、パッケージマネージャーを使用せずに手動で追加されたDLLパスを介して参照されます。 新しいSDKバージョンへの更新は、バージョン番号を.csprojファイルでインクリメントするのではなく、すべての開発マシン、ビルドエージェント、およびプロダクションサーバー上でインストーラーを再実行することを意味します。
IronOCRのアプローチ
<PackageReference Include="IronOcr" Version="2024.x.x" />
<PackageReference Include="IronOcr" Version="2024.x.x" />
# Docker: no installer, no license file mount required
FROM mcr.microsoft.com/dotnet/aspnet:8.0
RUN apt-get update && apt-get install -y libgdiplus
COPY --from=build /app/publish /app
WORKDIR /app
ENTRYPOINT ["dotnet", "YourApp.dll"]
Dockerデプロイメントガイドには、1つのLinux依存関係(libgdiplus画像レンダリング用)が記載されており、それ以外のことは記載されていません。 同じNuGetパッケージは、プラットフォーム固有の設定なしに、 Linux 、 AWS Lambda 、およびAzure App Service上で動作します。 CI/CDパイプラインは、他のすべての依存関係と同じ方法でdotnet restoreを介してパッケージを復元します — インストーラーステップなし、ライセンスファイル管理なし、テスト並列処理におけるシート数制約なし。
ライセンスサーバーと文字列キーの比較
ライセンスアーキテクチャは、本番環境で何らかの問題が発生した場合の午前3時に、運用リスクを判断する上で重要な要素となる。
Kofax OmniPage アプローチ
OmniPageのライセンス認証シーケンスは、OCRとは全く関係のない複数のエラーモードを発生させる。
// OmniPage: License validation at engine startup
// Each of these can fail independently
public static void InitializeWithLicense(string licensePath)
{
// Failure mode 1: File missing (deployment error, path misconfiguration)
if (!File.Exists(licensePath))
throw new LicenseException("License file not found");
// Failure mode 2: File permissions (service account lacks read access)
try { using var stream = File.OpenRead(licensePath); }
catch (UnauthorizedAccessException)
{
throw new LicenseException("Cannot read license file — check permissions");
}
// Failure mode 3: License server unreachable (network partition, server restart)
var engine = new OmniPageEngine();
engine.SetLicenseFile(licensePath);
try
{
engine.Initialize(); // Network call to license server
}
catch (LicenseValidationException ex)
{
// Could be: expired, invalid hardware, concurrent seat limit exceeded,
// license server unreachable, or maintenance window
throw new LicenseException($"License validation failed: {ex.Message}");
}
}
// OmniPage: License validation at engine startup
// Each of these can fail independently
public static void InitializeWithLicense(string licensePath)
{
// Failure mode 1: File missing (deployment error, path misconfiguration)
if (!File.Exists(licensePath))
throw new LicenseException("License file not found");
// Failure mode 2: File permissions (service account lacks read access)
try { using var stream = File.OpenRead(licensePath); }
catch (UnauthorizedAccessException)
{
throw new LicenseException("Cannot read license file — check permissions");
}
// Failure mode 3: License server unreachable (network partition, server restart)
var engine = new OmniPageEngine();
engine.SetLicenseFile(licensePath);
try
{
engine.Initialize(); // Network call to license server
}
catch (LicenseValidationException ex)
{
// Could be: expired, invalid hardware, concurrent seat limit exceeded,
// license server unreachable, or maintenance window
throw new LicenseException($"License validation failed: {ex.Message}");
}
}
Imports System.IO
' OmniPage: License validation at engine startup
' Each of these can fail independently
Public Shared Sub InitializeWithLicense(licensePath As String)
' Failure mode 1: File missing (deployment error, path misconfiguration)
If Not File.Exists(licensePath) Then
Throw New LicenseException("License file not found")
End If
' Failure mode 2: File permissions (service account lacks read access)
Try
Using stream = File.OpenRead(licensePath)
End Using
Catch ex As UnauthorizedAccessException
Throw New LicenseException("Cannot read license file — check permissions")
End Try
' Failure mode 3: License server unreachable (network partition, server restart)
Dim engine As New OmniPageEngine()
engine.SetLicenseFile(licensePath)
Try
engine.Initialize() ' Network call to license server
Catch ex As LicenseValidationException
' Could be: expired, invalid hardware, concurrent seat limit exceeded,
' license server unreachable, or maintenance window
Throw New LicenseException($"License validation failed: {ex.Message}")
End Try
End Sub
アプリケーションサーバーとライセンスサーバーの間のネットワークパーティションは、パーティションが解決するまでのすべてのengine.Initialize()呼び出しを失敗させます。ライセンスが以前にそのマシンで検証されていたかどうかは関係ありません。ページごとのライセンスは、4番目の失敗モードを追加します:バッチ中のページクォータの枯渇。
IronOCRのアプローチ
// One line at application startup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Optional: verify license status
bool isLicensed = IronOcr.License.IsLicensed;
// Works offline — no license server, no network calls at runtime
var text = new IronTesseract().Read("document.jpg").Text;
// One line at application startup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Optional: verify license status
bool isLicensed = IronOcr.License.IsLicensed;
// Works offline — no license server, no network calls at runtime
var text = new IronTesseract().Read("document.jpg").Text;
Imports IronOcr
' One line at application startup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
' Optional: verify license status
Dim isLicensed As Boolean = IronOcr.License.IsLicensed
' Works offline — no license server, no network calls at runtime
Dim text As String = New IronTesseract().Read("document.jpg").Text
IronOCRはライセンスキーをローカルで検証します。 OCR処理中はネットワーク呼び出しは発生しません。 起動後にインターネット接続が切断された本番サーバーは、中断することなく文書処理を継続する。 ライセンスページには、すべての階層がカバーされています:$999 Liteは単一開発者単一プロジェクト用、$5,999 Unlimitedは開発者やプロジェクトの制限がないチーム用。
キーは環境変数(IRONOCR_LICENSE_KEY)から取得でき、コードの変更なしで、異なるキーを開発、ステージング、および本番環境で使用することができ、展開されたバイナリを修正することなく容易です。
ロードマップの安定性
過去に4回も所有者が変わったという履歴は、インフラチームやセキュリティチームが必ず質問する調達リスク要因であり、開発者は正直な回答を用意しておくべきである。
Kofax OmniPage アプローチ
2001年以降のOmniPageの所有権の変遷:Caere → Nuance → Kofax → Tungsten Automation。 買収のたびに移行期間が生じ、ドキュメントのURLが使えなくなったり、サポートチャネルが変更されたり、パートナーネットワークが再構築されたり、Enterpriseライセンス契約を新たな条件で再交渉する必要が生じたりした。 2026年1月にリリースされたOmniPage Capture SDK 2025.3(Linuxサポートを追加)は、活発な開発が行われていることを示していますが、Tungsten Automationへのブランド変更からまだ2年も経っておらず、その移行期間中は製品ロードマップのドキュメントが"レビュー中"と記載されていました。
3~5年間のEnterprise契約を購入するチームにとって、問題はOmniPageが現在機能するかどうかではなく(実際機能している)、Tungsten Automationの2028年の戦略的優先事項が製品の現在のロードマップと合致するかどうかである。Enterpriseソフトウェアの買収では、買収企業のロードマップの優先事項が自社プラットフォームのコンポーネントにShiftと、買収された製品が保守モードになるケースが頻繁に発生する。
ドキュメントの移行だけでも運用上の摩擦が生じます。Kofax時代のサポートチケット、ドキュメントのブックマーク、古いURL構造を参照するコミュニティフォーラムの投稿は正しく解決されなくなり、開発者が最もサポートを必要とするまさにその瞬間(インシデント発生時や複雑な統合時)に、サポート体験に摩擦が生じます。
IronOCRのアプローチ
Iron Softwareは、.NETライブラリを製品ラインとする開発者向けツール専門企業です。 IronOCR、 IronPDF、 IronBarcode、および関連製品は、当社のコアビジネスであり、買収によってより大規模なEnterprise自動化プラットフォームに統合される製品ではありません。 リリース履歴を見ると、 .NETのリリースサイクルに沿った一貫したアップデートが行われており( .NET 8、 .NET 9をサポートし、 .NET 10との互換性を目指している)、その傾向がうかがえます。 ドキュメントハブとチュートリアルは、バージョン固有のコンテンツを含む安定したURLで管理されています。
APIマッピングリファレンス
| Kofax OmniPage コンセプト | IronOCR相当値 |
|---|---|
using Kofax.OmniPage.CSDK; |
using IronOcr; |
OmniPageEngine |
不要(エンジンライフサイクルなし) |
engine.SetLicenseFile(path) |
IronOcr.License.LicenseKey = "key"; |
engine.Initialize() |
不要 |
engine.Shutdown() |
不要 |
engine.CreateDocument() |
new OcrInput() |
document.AddPage(imagePath) |
input.LoadImage(imagePath) |
engine.OpenPDF(pdfPath) |
input.LoadPdf(pdfPath) |
document.Recognize(settings) |
new IronTesseract().Read(input) |
document.GetText() |
result.Text |
document.Dispose() |
using var input = new OcrInput() (自動) |
engine.LoadLanguageDictionary("German") |
dotnet add package IronOcr.Languages.German |
settings.PrimaryLanguage = "English" |
ocr.Language = OcrLanguage.English; |
settings.SecondaryLanguages = new[] { "German" } |
ocr.AddSecondaryLanguage(OcrLanguage.German); |
settings.AccuracyMode = "Maximum" |
input.EnhanceResolution(300); + 前処理フィルター |
settings.DeskewImage = true |
input.Deskew(); |
settings.ContrastEnhancement = true |
input.Contrast(); |
settings.DespeckleLevel = 2 |
input.DeNoise(); |
pdfDocument.SaveAs(path, outputSettings) |
result.SaveAsSearchablePdf(path) |
| ページごとのライセンスカウント | 該当なし(ページごとの料金はかかりません) |
.lic ディスク上のファイル |
該当なし |
| ライセンスサーバーポート構成 | 該当なし |
チームがKofax OmniPageからIronOCRへの移行を検討する場合
予算上限に達する
契約処理にOmniPageを使用しているEnterpriseチームは、文書量が増加し、それに伴ってページごとのライセンス費用も増加すると、必然的に限界に達します。 ランタイム料金はSDKライセンスと維持費の上に年間で累積されます。 一度の$2,999 IronOCR Professionalライセンスのビジネスケースは簡単です:永続ライセンスは、継続的なページごとの料金と比較して迅速に元が取れます。 このような状況にあるチームは通常、代表的な文書1,000件に対して並行して精度検証を実施し、標準的な請求書や契約書の内容においてOmniPageとIronOCRの精度差が1%未満であることを確認し、2週間以内に移行を完了します。
調達スケジュールが製品配送を阻害する
文書のデジタル化機能を開発しているスタートアップ企業や中堅企業が、OCRベンダーが4~12週間の営業活動を必要とするため、製品発売日に間に合わないことに気づく。 プロダクトマネージャーには調達に8週間もかける余裕はない。 IronOCRはNuGetから30秒でインストールできます。 IronOCR製品ページからライセンスキーをセルフサービスで入手できます。この機能は既に出荷されています。 このシナリオは架空の話ではなく、開発チームが技術選択の理由を事後的にエンジニアリングリーダーに説明する際に、最もよく挙げられる理由です。
デプロイメントトポロジーの変更
Windowsサーバー上でOmniPageを運用しているチームが、Kubernetes上でのコンテナ化されたデプロイメントへの移行を決定した。 OmniPage SDKインストーラーはDockerビルドパイプラインにうまく組み込めず、ライセンスファイルをマウントするかイメージに組み込む必要があり(どちらもセキュリティ上の問題があります)、コンテナの再起動時にはエンジンのシャットダウン/起動ライフサイクルを適切に処理する必要があります。 コンテナ数を10個に水平方向に拡張するには、10個のフローティングライセンスシート、または10個のノードロックライセンスが必要です。 IronOCRのNuGetデプロイメントモデル、環境変数ベースのライセンスキー、およびオフラインライセンス検証により、コンテナ化されたデプロイメントが容易になります。 Dockerの導入に関するドキュメントには、セットアップの全工程が記載されており、水平スケーリングには追加のライセンス手続きは不要です。無制限ライセンスは無制限の導入をカバーします。
ICR要件が消滅
多くのチームがOmniPageを採用するきっかけとなったのは、ステークホルダーの要件に"手書き文字認識"が機能として挙げられていたからである。 その要件の範囲が明確になると、つまり、実際に必要なのは自由形式の手書き入力欄ではなく、チェックボックス付きの印刷済みフォームであることが判明すると、Enterprise価格設定に対するICRの正当性は消滅する。 IronOCRは、OMRに類似した機能と構造化データ抽出により、チェックボックスの検出を低コストで実現します。実際の文書群を再評価したチームは、文書量の95%以上が印刷されたPDFやスキャンされた請求書で構成されており、OmniPageのICRの利点が全く活用されていないことに気づくことがよくあります。
タングステン調達の不確実性からリスクレビューを実施
Enterpriseの調達チームは、定期的にベンダーリスクレビューを実施する。 ツールプロバイダーが25年間で4回も所有者が変わり、直近のブランド変更からまだ2年も経っておらず、移行期間中に製品ロードマップのドキュメントが"レビュー中"とマークされていた場合、一部のチームは、ワークロードを安定した、特定の分野に特化した開発ツールプロバイダーに移行することで、ベンダー集中リスクを軽減することを選択します。 これは技術的な決定であると同時に、ビジネス上の決定でもある。IronOCRの標準的なビジネス文書に対するOCR精度はOmniPageに匹敵し、今回の移行によって、年間予算編成サイクルからEnterprise契約更新に関する議論が不要になる。
一般的な移行の考慮事項
エンジンライフサイクルからステートレス呼び出しへ
OmniPageの統合は、起動時に初期化し、プロセス終了時にシャットダウンする必要がある長期間稼働するOmniPageEngineインスタンスを中心に構築されています。 IronOCRには、これに相当するライフサイクルは存在しない。 IronTesseractクラスは、呼び出しごとにインスタンス化されるか、長期間稼働するサービスとして共有されます — どちらのパターンも機能します。
// OmniPage pattern: service class with engine lifecycle
public class KofaxDocumentService : IDisposable
{
private OmniPageEngine _engine;
public KofaxDocumentService(string licensePath)
{
_engine = new OmniPageEngine();
_engine.SetLicenseFile(licensePath);
_engine.Initialize();
}
public string ProcessDocument(string imagePath)
{
var document = _engine.CreateDocument();
document.AddPage(imagePath);
document.Recognize(new RecognitionSettings { Language = "English" });
string text = document.GetText();
document.Dispose(); // Must not be forgotten
return text;
}
public void Dispose()
{
_engine.Shutdown(); // Must not be forgotten
}
}
// IronOCR equivalent: no lifecycle management needed
public class IronOcrDocumentService
{
private readonly IronTesseract _ocr;
public IronOcrDocumentService()
{
_ocr = new IronTesseract();
_ocr.Language = OcrLanguage.English;
}
public string ProcessDocument(string imagePath)
{
using var input = new OcrInput();
input.LoadImage(imagePath);
return _ocr.Read(input).Text;
}
// なし Dispose — no unmanaged resources to release
}
// OmniPage pattern: service class with engine lifecycle
public class KofaxDocumentService : IDisposable
{
private OmniPageEngine _engine;
public KofaxDocumentService(string licensePath)
{
_engine = new OmniPageEngine();
_engine.SetLicenseFile(licensePath);
_engine.Initialize();
}
public string ProcessDocument(string imagePath)
{
var document = _engine.CreateDocument();
document.AddPage(imagePath);
document.Recognize(new RecognitionSettings { Language = "English" });
string text = document.GetText();
document.Dispose(); // Must not be forgotten
return text;
}
public void Dispose()
{
_engine.Shutdown(); // Must not be forgotten
}
}
// IronOCR equivalent: no lifecycle management needed
public class IronOcrDocumentService
{
private readonly IronTesseract _ocr;
public IronOcrDocumentService()
{
_ocr = new IronTesseract();
_ocr.Language = OcrLanguage.English;
}
public string ProcessDocument(string imagePath)
{
using var input = new OcrInput();
input.LoadImage(imagePath);
return _ocr.Read(input).Text;
}
// なし Dispose — no unmanaged resources to release
}
Imports System
' OmniPage pattern: service class with engine lifecycle
Public Class KofaxDocumentService
Implements IDisposable
Private _engine As OmniPageEngine
Public Sub New(licensePath As String)
_engine = New OmniPageEngine()
_engine.SetLicenseFile(licensePath)
_engine.Initialize()
End Sub
Public Function ProcessDocument(imagePath As String) As String
Dim document = _engine.CreateDocument()
document.AddPage(imagePath)
document.Recognize(New RecognitionSettings With {.Language = "English"})
Dim text As String = document.GetText()
document.Dispose() ' Must not be forgotten
Return text
End Function
Public Sub Dispose() Implements IDisposable.Dispose
_engine.Shutdown() ' Must not be forgotten
End Sub
End Class
' IronOCR equivalent: no lifecycle management needed
Public Class IronOcrDocumentService
Private ReadOnly _ocr As IronTesseract
Public Sub New()
_ocr = New IronTesseract()
_ocr.Language = OcrLanguage.English
End Sub
Public Function ProcessDocument(imagePath As String) As String
Using input As New OcrInput()
input.LoadImage(imagePath)
Return _ocr.Read(input).Text
End Using
End Function
' なし Dispose — no unmanaged resources to release
End Class
using var input = new OcrInput()パターンは、入力データのリソースクリーンアップを管理します。 IronTesseractインスタンス自体は、明示的な解体が必要な非管理状態を持っていません。
モジュールライセンスを別途購入することなくPDFを処理できます
OmniPageのPDF処理には通常、特定の出力フォーマット設定が必要であり、SDKのエディションによっては、別途PDFモジュールライセンスが必要となる。 IronOCRのPDF入力サポートは、基本のNuGetパッケージに組み込まれています。 スキャンされたPDF、ネイティブPDF、パスワードで保護されたPDFはすべて、同じAPIインターフェースを使用します。
// Extract text from a scanned PDF — no extra module or license
using var input = new OcrInput();
input.LoadPdf("scanned-contract.pdf");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
// Create a searchable PDF from a scanned-only PDF
result.SaveAsSearchablePdf("contract-searchable.pdf");
// Process specific pages from a large PDF
using var input = new OcrInput();
input.LoadPdfPages("large-report.pdf", 1, 10); // Pages 1–10 only
var result = new IronTesseract().Read(input);
// Extract text from a scanned PDF — no extra module or license
using var input = new OcrInput();
input.LoadPdf("scanned-contract.pdf");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
// Create a searchable PDF from a scanned-only PDF
result.SaveAsSearchablePdf("contract-searchable.pdf");
// Process specific pages from a large PDF
using var input = new OcrInput();
input.LoadPdfPages("large-report.pdf", 1, 10); // Pages 1–10 only
var result = new IronTesseract().Read(input);
Imports IronOcr
' Extract text from a scanned PDF — no extra module or license
Using input As New OcrInput()
input.LoadPdf("scanned-contract.pdf")
Dim result = New IronTesseract().Read(input)
Console.WriteLine(result.Text)
End Using
' Create a searchable PDF from a scanned-only PDF
result.SaveAsSearchablePdf("contract-searchable.pdf")
' Process specific pages from a large PDF
Using input As New OcrInput()
input.LoadPdfPages("large-report.pdf", 1, 10) ' Pages 1–10 only
Dim result = New IronTesseract().Read(input)
End Using
検索可能なPDF出力ガイドでは、スキャンしたPDFを文書管理システムでインデックス化できるようにするテキストレイヤーの埋め込みについて説明しています。これは、OmniPageが導入されているワークフローでよく求められる要件です。
言語パックの配布
OmniPageの言語辞書はSDKのインストールに含まれており、現在のドキュメントが必要かどうかに関わらず、エンジンの起動時に読み込まれます。 IronOCRの言語パックは、個別のNuGetパッケージです。 インストール済みおよび参照されている言語のみが読み込まれます。
// Add language packs as NuGet packages, not installer components
// dotnet add package IronOcr.Languages.German
// dotnet add package IronOcr.Languages.French
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
ocr.AddSecondaryLanguage(OcrLanguage.German);
ocr.AddSecondaryLanguage(OcrLanguage.French);
using var input = new OcrInput();
input.LoadImage("multilingual-document.jpg");
var result = ocr.Read(input);
// Add language packs as NuGet packages, not installer components
// dotnet add package IronOcr.Languages.German
// dotnet add package IronOcr.Languages.French
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
ocr.AddSecondaryLanguage(OcrLanguage.German);
ocr.AddSecondaryLanguage(OcrLanguage.French);
using var input = new OcrInput();
input.LoadImage("multilingual-document.jpg");
var result = ocr.Read(input);
Imports IronOcr
' Add language packs as NuGet packages, not installer components
' dotnet add package IronOcr.Languages.German
' dotnet add package IronOcr.Languages.French
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.English
ocr.AddSecondaryLanguage(OcrLanguage.German)
ocr.AddSecondaryLanguage(OcrLanguage.French)
Using input As New OcrInput()
input.LoadImage("multilingual-document.jpg")
Dim result = ocr.Read(input)
End Using
多言語ガイドでは、言語の組み合わせパターンについて解説しています。 言語パックは、インストーラーの関与なしにCI/CDパイプラインでdotnet restoreを介して復元されます。 言語カタログには、利用可能な125以上のパックすべてが掲載されています。
前処理:設定オブジェクトとメソッドパイプラインの比較
OmniPageはOcrInput上でのメソッドパイプラインとして前処理を公開します。 その挙動は同等である。 呼び出しモデルが異なる。
// OmniPage: preprocessing embedded in RecognitionSettings
var preprocessSettings = new PreprocessingSettings
{
AutoRotate = true,
Deskew = true,
DespeckleLevel = 2,
ContrastEnhancement = true,
NoiseReduction = true
};
var recognitionSettings = new RecognitionSettings
{
Language = "English",
Preprocessing = preprocessSettings
};
// IronOCR: preprocessing as method pipeline on OcrInput
using var input = new OcrInput();
input.LoadImage(imagePath);
input.Deskew();
input.DeNoise();
input.Contrast();
input.Binarize();
input.EnhanceResolution(300);
var result = new IronTesseract().Read(input);
// OmniPage: preprocessing embedded in RecognitionSettings
var preprocessSettings = new PreprocessingSettings
{
AutoRotate = true,
Deskew = true,
DespeckleLevel = 2,
ContrastEnhancement = true,
NoiseReduction = true
};
var recognitionSettings = new RecognitionSettings
{
Language = "English",
Preprocessing = preprocessSettings
};
// IronOCR: preprocessing as method pipeline on OcrInput
using var input = new OcrInput();
input.LoadImage(imagePath);
input.Deskew();
input.DeNoise();
input.Contrast();
input.Binarize();
input.EnhanceResolution(300);
var result = new IronTesseract().Read(input);
Imports IronOcr
' OmniPage: preprocessing embedded in RecognitionSettings
Dim preprocessSettings As New PreprocessingSettings With {
.AutoRotate = True,
.Deskew = True,
.DespeckleLevel = 2,
.ContrastEnhancement = True,
.NoiseReduction = True
}
Dim recognitionSettings As New RecognitionSettings With {
.Language = "English",
.Preprocessing = preprocessSettings
}
' IronOCR: preprocessing as method pipeline on OcrInput
Using input As New OcrInput()
input.LoadImage(imagePath)
input.Deskew()
input.DeNoise()
input.Contrast()
input.Binarize()
input.EnhanceResolution(300)
Dim result = New IronTesseract().Read(input)
End Using
画質補正ガイドには、利用可能なすべてのフィルターが網羅されています。 デフォルトの自動前処理で十分な文書の場合、明示的な呼び出しは必要ありません。IronOCRは、傾き補正、ノイズ除去、コントラスト強調を自動的に適用します。
IronOCRの追加機能
上記の比較セクションで取り上げた機能に加え、 IronOCRは以下の機能を提供します。
- 領域ベースのOCR: ドキュメントの特定のエリアからテキストを抽出する、例としては請求書番号フィールド、ヘッダ領域、署名ブロックなど、ページ全体を処理することなく@--CODE-1256--@@ゾーンを定義します。 -非同期OCR : ASP.NETリクエストハンドラーおよびバックグラウンドサービスにおける非ブロッキングOCRのネイティブ非同期サポート -進捗状況の追跡:複数ページにわたるドキュメント処理では、長時間実行されるバッチ処理において、UI フィードバックのための進捗状況コールバックが提供されます。 -スキャン文書の処理:Enterprise文書キャプチャワークフローで最も一般的なスキャン品質プロファイルに関する専用ガイダンス -テーブル抽出:スキャンされた文書から構造化されたテーブルを読み取り、行と列の位置情報を含むセルレベルのデータを返します。
.NETの互換性と将来の準備
IronOCRは.NET 8および.NET 9を対象としており、 .NET 10との互換性は標準リリーススケジュールに沿って提供されます。 ライブラリは、管理するプラットフォーム固有のパッケージがないクロスプラットフォームのNuGetパッケージとして提供されます — 同じ<PackageReference Include="IronOcr" />エントリーがWindows、Linux、macOSのCIビルドで動作します。Kofax OmniPage SDK2025.3は2026年1月にLinuxのサポートを追加しましたが、macOSはサポートしていないため、Apple Silicon搭載ハードウェアを使用するチームの開発環境が制限されます。 IronOCRは、MAUI、 Blazor Server、 ASP.NET Core、Worker Services、Azure Functions、およびコンソールアプリケーションを同じパッケージでサポートしており、フレームワーク固有のバリアントは必要ありません。 クラウドネイティブなデプロイメントアーキテクチャ(コンテナ化されたマイクロサービス、サーバーレス関数、Kubernetesワークロード)をターゲットとするチームは、インストーラーやライセンスファイルが不要な単一のNuGetパッケージであるIronOCRの依存関係モデルが、インフラストラクチャ・アズ・コードやイミュータブルなデプロイメントパターンと非常に互換性が高いことに気づくでしょう。
結論
Kofax OmniPageは、特にICR手書き文字認識とOMRフォーム処理において、大量のEnterprise文書キャプチャにおける真の精度ベンチマークとなる製品です。 数百万ページもの書類を処理センター、政府のデジタル化プログラム、あるいは銀行の文書ワークフローを通して処理し、既にEnterprise調達インフラを整備している組織は、正当な理由からこれを利用している。 30年にわたる精度実績は紛れもない事実です。
2005年当時、Enterprise文書管理ソフトウェアにとって理にかなっていた調達モデルと導入アーキテクチャは、2026年には大きな摩擦を生む。OmniPageのSDK配布モデルが設計された当時は、 NuGetは存在していなかった。 CI/CDパイプライン、Dockerコンテナ、およびサーバーレス関数は、デプロイ対象ではありませんでした。 ライセンスアーキテクチャは.licファイル、ハードウェアフィンガープリンティング、ネットワークライセンスサーバーを中心に構築されており、不変のコンテナイメージおよび自動スケーリングクラウドインフラストラクチャとは構造的に互換性がありません。
.NET OCRワークロードの圧倒的大多数(請求書、契約書、スキャンされたPDF、身分証明書、領収書など)において、OmniPageとIronOCRの精度差は、クリーンな文書から中程度に劣化している文書まで、1%未満です。 その1%は、4〜12週間の調達期間、大幅な初期価格設定、年間メンテナンス料金、各ページごとのランタイムコスト、ライセンスサーバー運用オーバーヘッド、およびコンテナ化されたインフラストラクチャと矛盾するデプロイメントモデルを正当化しません。 IronOCRは$999 永続的で、標準的なビジネス文書コンテンツに対して95%以上の精度を提供し、30秒でインストールされ、インストーラーステップなしでDockerやLinuxにデプロイされ、実行時のネットワーク依存性なしで文字列キーを介してライセンスされます。
重要なのは、劣化した過去の文書に対するOmniPageのICR精度とIronOCRの精度を比較することではなく、実際にその精度レベルを必要とするプロジェクトが、Enterprise調達インフラストラクチャ、ライセンスサーバーの運用能力、およびインストーラベースのSDK配布のための展開許容度を備えているかどうかである。 3つの質問すべてに"はい"と答える場合は、OmniPageは適切な選択肢です。いずれかの質問に"いいえ"と答える場合は、 IronOCRのドキュメントに、即日運用開始に必要なすべての情報が記載されています。
よくある質問
Kofax OmniPage とは?
Kofax OmniPage は、開発者や企業が画像や文書からテキストを抽出するために使用する OCR ソリューションです。これは.NETアプリケーション開発のためのIronOCRと共に評価されるいくつかのOCRオプションの一つです。
IronOCRはKofax OmniPage for .NET開発者と比べてどうですか?
IronOCR はNuGetネイティブ for .NET OCRライブラリで、.CoreエンジンとしてIronTesseractを使用しています。Kofax OmniPage と比較して、よりシンプルなデプロイメント(SDK インストーラーなし)、定額制価格、COM 相互接続やクラウド依存のないクリーンな C# API を提供します。
IronOCR は Kofax OmniPage よりセットアップが簡単ですか?
IronOCRは単一のNuGetパッケージでインストールされます。SDKインストーラー、ライセンスファイルのコピー、COMコンポーネントの登録、ランタイムバイナリの管理は必要ありません。OCRエンジン全体がパッケージにバンドルされています。
Kofax OmniPage と IronOCR にはどのような精度の違いがありますか?
IronOCRは、標準的なビジネス文書、請求書、領収書、スキャンしたフォームに対して高い認識精度を達成します。高度に劣化した文書や一般的でないスクリプトの場合、精度はソースの品質によって異なります。IronOCRは低品質入力の認識を向上させる画像前処理フィルターを含んでいます。
IronOCRはPDFテキスト抽出をサポートしていますか?
IronOCRは、ネイティブPDFとスキャンしたPDFイメージの両方から、一回の呼び出しでテキストを抽出します。また、複数ページのTIFFファイル、画像、ストリームもサポートします。スキャンしたPDFの場合、OCRはページごとに適用され、ページごとの結果オブジェクトを持ちます。
Kofax OmniPage ライセンスは 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 は Kofax OmniPage と違い、Docker やコンテナでのデプロイに適していますか?
IronOCRはNuGetパッケージによってDockerコンテナで動作します。ライセンスキーは環境変数で設定します。OCRエンジン自体にはライセンスファイル、SDKパス、ボリュームマウントは必要ありません。
Kofax OmniPageと比較して、購入前にIronOCRを試すことはできますか?
IronOCRのトライアルモードでは、ドキュメントを処理し、出力に透かしをオーバーレイしたOCR結果を返します。ライセンスを購入する前に、ご自身の文書で精度を確認することができます。
IronOCRはテキスト抽出とバーコード読み取りをサポートしていますか?
IronOCRはテキスト抽出とOCRに重点を置いています。バーコード読み取りについては、Iron SoftwareはIronBarcodeをコンパニオンライブラリとして提供しています。どちらも個別に、あるいはIron Suiteのバンドルとして提供されています。
Kofax OmniPage から IronOCR への移行は簡単ですか?
Kofax OmniPageからIronOCRへの移行は通常、初期化シーケンスをIronTesseractのインスタンス生成に置き換え、COMライフサイクル管理を削除し、APIコールを更新します。ほとんどの移行はコードの複雑さを大幅に軽減します。

