フッターコンテンツにスキップ
他のコンポーネントと比較する

AzureのOCR vs IronOCR: .NETプロジェクトに最適な光学式文字認識ソリューションは?

Windows.Media.Ocr は、すべての Windows 10 および Windows 11 のインストールに無料で付属しているため魅力的ですが、同じアプリケーションをLinuxサーバー、Docker コンテナ、またはAWSラムダ関数にデプロイしようとすると、API が存在しないという問題が発生します。プラットフォームのロックインは、このライブラリの特殊なケースではありません。 それは決定的な制約条件である。 Windows.Media.Ocr を選択すること以降のすべてのアーキテクチャ上の決定は、ホスト OS が Windows 10 または Windows 11 のデスクトップまたはコンシューマー向けサーバーでなければならないという要件によって左右されます。 LinuxもmacOSもDockerもLinux上のAzure FunctionsもAWS Lambdaも利用できません。 外部に展開する予定が全くない、社内向けのWindowsツールを開発している開発者にとって、0ドルという価格は魅力的に映るだろう。 その他すべての企業にとって、隠れたコストとは、導入要件が変化した際に、OCRをまったく別のシステムに書き換える必要があることである。

Windows.Media.Ocr を理解する

Windows.Media.OcrはWindows Runtime (WinRT) APIの一部で、Windows 8.1で導入され、Windows 10および11用に改良されました。OcrResultを返します。

このAPIは、WinRTのasync/awaitコントラクトに基づいて構築されています。 すべての操作はWinRTのasync Task呼び出しを通じて流れる: RecognizeAsyncを呼び出す。 .NET 6以降、WinRT APIを利用するには、net8.0-windows10.0.19041.0のようなWindows専用のターゲットフレームワークモニカー(TFM)が必要です。 そのTFMがないプロジェクトファイルでは、Windows.Media.Ocrを参照するコードをコンパイルできません — その型はアセンブリグラフ内に存在しないのです。

主な建築上の特徴:

  • Windows 10/11のみ— Windows Server(デスクトップ エクスペリエンスなし)では、すべての構成でWinRT APIサーフェスは利用できず、LinuxおよびmacOSでは全く利用できません。
  • WinRT非同期モデル — すべての認識はIAsyncOperationサポートの非同期呼び出しを通じて流れます; 同期パスが存在しない
  • OSからの言語パックTryCreateFromUserProfileLanguagesは、その特定のマシンにユーザーまたはIT管理者によってインストールされたWindows言語パックから使用可能な言語を解決します; バンドルまたはポータブル言語モデルはありません
  • 画像のみの入力 — APIはSoftwareBitmapを直接受け入れます; APIのどのレイヤーにもPDF入力パスは存在しません -前処理パイプラインなし— 生のビットマップが認識器に渡されます。 回転補正、ノイズ除去、コントラスト強調、解像度スケーリングは、開発者が個別のWindowsイメージングAPIを使用して行う責任があります。 -検索可能なPDF出力はありません。認識されたテキストは、線形状を含むプレーンな文字列データとして返されます。 PDFへのエクスポート機能は提供されていません。
  • Windows専用TFMが必要 — プロジェクトファイルはnet*-windows* TFMをターゲットにする必要があり、これにより同じプロジェクトがクロスプラットフォームでコンパイルされることが妨げられます

WinRT非同期スタック

Windows.Media.Ocr を使用した基本的な OCR 操作では、認識を開始する前に、WinRT API サーフェスの複数のレイヤーをナビゲートする必要があります。

// Windows.Media.Ocr: 6+ async steps before receiving any text
// Requires net8.0-windows10.0.19041.0 TFM — will not compile cross-platform

public async Task<string> ExtractTextAsync(string imagePath)
{
    // Step 1: WinRT file system access
    var file = await StorageFile.GetFileFromPathAsync(imagePath);

    // Step 2: Open WinRT stream
    using var stream = await file.OpenAsync(FileAccessMode.Read);

    // Step 3: Create bitmap decoder
    var decoder = await BitmapDecoder.CreateAsync(stream);

    // Step 4: Decode to SoftwareBitmap
    var bitmap = await decoder.GetSoftwareBitmapAsync();

    // Step 5: Check language availability — null if not installed on this machine
    var engine = OcrEngine.TryCreateFromLanguage(
        new Windows.Globalization.Language("en-US"));
    if (engine == null)
        throw new Exception("OCR engine not available for this language");

    // Step 6: Recognize
    var result = await engine.RecognizeAsync(bitmap);
    return result.Text;
}
// Windows.Media.Ocr: 6+ async steps before receiving any text
// Requires net8.0-windows10.0.19041.0 TFM — will not compile cross-platform

public async Task<string> ExtractTextAsync(string imagePath)
{
    // Step 1: WinRT file system access
    var file = await StorageFile.GetFileFromPathAsync(imagePath);

    // Step 2: Open WinRT stream
    using var stream = await file.OpenAsync(FileAccessMode.Read);

    // Step 3: Create bitmap decoder
    var decoder = await BitmapDecoder.CreateAsync(stream);

    // Step 4: Decode to SoftwareBitmap
    var bitmap = await decoder.GetSoftwareBitmapAsync();

    // Step 5: Check language availability — null if not installed on this machine
    var engine = OcrEngine.TryCreateFromLanguage(
        new Windows.Globalization.Language("en-US"));
    if (engine == null)
        throw new Exception("OCR engine not available for this language");

    // Step 6: Recognize
    var result = await engine.RecognizeAsync(bitmap);
    return result.Text;
}
Imports System.Threading.Tasks
Imports Windows.Media.Ocr
Imports Windows.Storage
Imports Windows.Graphics.Imaging
Imports Windows.Storage.Streams
Imports Windows.Globalization

Public Async Function ExtractTextAsync(imagePath As String) As Task(Of String)
    ' Step 1: WinRT file system access
    Dim file As StorageFile = Await StorageFile.GetFileFromPathAsync(imagePath)

    ' Step 2: Open WinRT stream
    Using stream As IRandomAccessStream = Await file.OpenAsync(FileAccessMode.Read)

        ' Step 3: Create bitmap decoder
        Dim decoder As BitmapDecoder = Await BitmapDecoder.CreateAsync(stream)

        ' Step 4: Decode to SoftwareBitmap
        Dim bitmap As SoftwareBitmap = Await decoder.GetSoftwareBitmapAsync()

        ' Step 5: Check language availability — Nothing if not installed on this machine
        Dim engine As OcrEngine = OcrEngine.TryCreateFromLanguage(New Language("en-US"))
        If engine Is Nothing Then
            Throw New Exception("OCR engine not available for this language")
        End If

        ' Step 6: Recognize
        Dim result As OcrResult = Await engine.RecognizeAsync(bitmap)
        Return result.Text
    End Using
End Function
$vbLabelText   $csharpLabel

engineのヌルチェックは任意ではありません。 コードを実行しているマシンにターゲット言語パックがインストールされていない場合、TryCreateFromLanguageはnullを返し、認識は不可能です。 代替手段はない。 アプリケーションは、ユーザーにエラーを表示するか、あるいはエラーを通知せずに処理を終了する必要がある。

IronOCRを理解する

IronOCRは、最適化されたTesseract 5エンジンをベースに構築された商用.NET OCRライブラリであり、前処理、PDF読み取り、多言語対応、構造化データ出力などを処理するマネージドAPIレイヤーを備えています。 これは単一のNuGetパッケージとしてインストールされ、別途デプロイする必要のある外部ネイティブバイナリ、管理する必要のあるtessdataフォルダ、およびプラットフォーム固有のTFMは必要ありません。

主な特徴:

-設計段階からクロスプラットフォーム対応— コード変更なしで、Windows、Linux、macOS、Docker、Azure App Service (WindowsまたはLinux)、AWS Lambda、およびGCP Cloud Runで動作します

  • 自動前処理 — 傾き補正、ノイズ処理、コントラスト強調、二値化、および解像度拡大が、低品質の入力に対して自動的に適用され、OcrInputフィルタメソッドを通じて明示的な制御が可能です
  • ネイティブPDF入力IronTesseract.ReadはPDFパスを直接受け入れます; 変換ステップなし、外部ライブラリなし
  • 125以上の言語がバンドルされています— 言語パックは、アプリケーションとともにデプロイされるNuGetパッケージです。 OSにインストールされている言語データに依存しない
  • 検索可能なPDF出力OcrResult.SaveAsSearchablePdfは、スキャンされた入力からテキストレイヤーPDFを作成します
  • 構造化された結果モデルWords、および単語ごとの信頼性スコアとバウンディングボックスを公開します
  • スレッドセーフIronTesseract インスタンスは、追加の同期なしで並行ワークロードをサポートします
  • 永続ライセンス — $999 Liteから$5,999 Unlimitedまで、一度購入すれば無制限に文書を処理できます

機能比較

フィーチャー Windows.Media.Ocr IronOCR
プラットフォーム Windows 10/11のみ Windows、Linux、macOS、Docker、クラウド
価格 無料 $5,999 永続
PDF入力 なし ネイティブ
言語モデル OSにインストールされたパック NuGet経由で 125 個以上がバンドルされています
前処理 None 自動フィルター + 明示的フィルター
検索可能なPDF出力 なし はい
APIモデル WinRT 非同期 .NET Standard

詳細な機能比較

フィーチャー Windows.Media.Ocr IronOCR
プラットフォームサポート
Windows 10/11 はい はい
Windowsサーバー 制限的 はい
Linux なし はい
macOS なし はい
Docker なし はい
Azure Functions(Linux) なし はい
AWSラムダ なし はい
入力フォーマット
JPEG / PNG / BMP はい(WinRTパイプライン経由) はい
PDF(スキャン画像) なし はい
PDFファイル(パスワード保護あり) なし はい
TIFF / マルチページ なし はい
ストリーム/バイト配列 いいえ(WinRT StorageFileのみ) はい
URL なし はい
言語サポート
言語ソース OSにインストールされている言語パック 125個以上のNuGetパックがバンドルされています
OS管理者権限なしでインストール なし はい(NuGet)
多言語同時通訳 なし はい
マシン間での言語移植性 なし はい
前処理
デスキュー なし はい (input.Deskew())
ノイズ除去 なし はい (input.DeNoise())
コントラスト強調 なし はい (input.Contrast())
二値化 なし はい (input.Binarize())
解像度スケーリング なし はい (input.EnhanceResolution(300))
出力
プレーンテキスト はい はい
検索可能なPDF なし はい
hOCR / HTML なし はい
単語レベルの境界ボックス 部分的(線形状) はい
単語ごとの信頼度スコア なし はい
APIデザイン
TFM制限 net*-windows* が必要です None
同期パス なし はい
OCR中のバーコード読み取り なし はい
地域ベースのOCR なし はい

プラットフォームロックイン vs. クロスプラットフォーム展開

これら2つのライブラリ間の最も重要な違いは、精度でも、前処理でも、PDFサポートでもなく、デプロイメントトポロジーである。 Windows.Media.Ocr はWindows 10/11以外では存在しません。これは構成の問題でもNuGetパッケージの欠落でもありません。 このAPIを支えるWinRTランタイムは、他のすべてのオペレーティングシステムには存在しない。

Windows.Media.OCR アプローチ

WinRTへの依存関係は、コードが1行も実行される前にプロジェクトファイル内で顕在化します。 TargetFramework はWindowsプラットフォームバージョンを指定する必要があります:


<PropertyGroup>
  <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
</PropertyGroup>

<PropertyGroup>
  <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
</PropertyGroup>
XML

そのTFMでは、Linuxコンテナからプロジェクトを使用することはできません。 ASP.NETデプロイの標準的なLinuxベースのイメージであるnet8.0(Windowsサフィックスなし)をターゲットとしたプロジェクトで参照しようとすると、実行時エラーではなくコンパイルエラーが発生します。 ベンダーロックインはビルド時に強制されます。

OCRワーカーがLinux上で動作するマイクロサービスアーキテクチャ、またはクロスプラットフォームのDockerイメージを生成するCI/CDパイプラインでOCR要件が発生した場合、Windows.Media.Ocrは評価対象ではなく、最初のピークを迎える前に除外されます。

IronOCRのアプローチ

IronOCRは、プラットフォーム固有のTFMなしでnet9.0をターゲットにしています。 同じNuGetパッケージとアプリケーションバイナリは、Windows、Linux、macOS のいずれのプラットフォームでも動作します。 DockerにIronOCRをデプロイするには、Linuxベースのイメージにapt-getラインが1つ必要で、他には何も必要ありません:

FROM mcr.microsoft.com/dotnet/aspnet:8.0
#Linuxdependency for System.Drawing
RUN apt-get update && apt-get install -y libgdiplus

COPY --from=build /app/publish /app
WORKDIR /app
ENTRYPOINT ["dotnet", "YourApp.dll"]

アプリケーションコード自体は、Windows版とLinux版で変更されていません。

// Same code — Windows, Linux, macOS, Docker, AWS Lambda
// なし platform TFM, no WinRT, no conditional compilation
using IronOcr;

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read("document.jpg").Text;
// Same code — Windows, Linux, macOS, Docker, AWS Lambda
// なし platform TFM, no WinRT, no conditional compilation
using IronOcr;

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read("document.jpg").Text;
Imports IronOcr

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim text As String = New IronTesseract().Read("document.jpg").Text
$vbLabelText   $csharpLabel

IronOCRは、AWS LambdaLinux上のAzure Functions 、およびLinuxサーバー上で、コードの変更なしで直接動作します。 展開対象は構成上の懸念事項であり、アーキテクチャ上の制約ではない。

言語サポート:OS依存性 vs. バンドルパック

Windows.Media.Ocr は、言語の可用性を完全にホストマシンに委ねます。アプリケーションが認識できる言語のセットは、ユーザーまたは IT 管理者が特定の Windows インストール環境にインストールした言語パックによって決まります。 これは、あなたのコードとは全く関係のない、ある種の生産上の障害を生み出します。

Windows.Media.OCR アプローチ

要求された言語がインストールされていない場合、OcrEngine.TryCreateFromLanguageはnullを返します。 OCR対応言語パックが全く存在しない場合、TryCreateFromUserProfileLanguagesはnullを返します。 どちらの方法もヌル値の処理が必要であり、どちらもスムーズな復旧手段を提供していません。つまり、コードから言語をインストールしたり、アプリケーションに言語をバンドルしたりする方法はありません。

// Windows.Media.Ocr: language availability is a runtime unknown
// Returns null if the language pack is not installed on this machine

var engine = OcrEngine.TryCreateFromLanguage(
    new Windows.Globalization.Language("fr-FR"));

if (engine == null)
{
    // French OCR is simply unavailable — no recovery path
    // User must go to Windows Settings > Language to install French
    throw new InvalidOperationException(
        "French OCR unavailable. Install the French language pack in Windows Settings.");
}

var result = await engine.RecognizeAsync(bitmap);
// Windows.Media.Ocr: language availability is a runtime unknown
// Returns null if the language pack is not installed on this machine

var engine = OcrEngine.TryCreateFromLanguage(
    new Windows.Globalization.Language("fr-FR"));

if (engine == null)
{
    // French OCR is simply unavailable — no recovery path
    // User must go to Windows Settings > Language to install French
    throw new InvalidOperationException(
        "French OCR unavailable. Install the French language pack in Windows Settings.");
}

var result = await engine.RecognizeAsync(bitmap);
Imports Windows.Globalization
Imports Windows.Media.Ocr

' Windows.Media.Ocr: language availability is a runtime unknown
' Returns Nothing if the language pack is not installed on this machine

Dim engine = OcrEngine.TryCreateFromLanguage(New Language("fr-FR"))

If engine Is Nothing Then
    ' French OCR is simply unavailable — no recovery path
    ' User must go to Windows Settings > Language to install French
    Throw New InvalidOperationException("French OCR unavailable. Install the French language pack in Windows Settings.")
End If

Dim result = Await engine.RecognizeAsync(bitmap)
$vbLabelText   $csharpLabel

Windows.Media.Ocr を使用した多言語文書処理アプリケーションをデプロイするには、デプロイ先のすべてのマシンで Windows 言語パックのインストールを調整する必要があります。 共有サーバーやグループポリシーで管理されているユーザーのマシンでは、これは開発者の制御範囲外です。

IronOCRのアプローチ

IronOCRは、言語モデルを専用のNuGetパッケージとして提供しており、アプリケーションバイナリと同時にデプロイされます。 言語データはビルド成果物とともに転送され、OSの設定には含まれません。 125以上の言語をサポートすることはdotnet add package操作です:

dotnet add package IronOcr.Languages.French, IronOcr.Languages.German, IronOcr.Languages.Arabic, IronOcr.Languages.ChineseSimplified
// IronOCR: language availability is a deploy-time guarantee, not a runtime unknown
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);

// Works on any machine, any OS, zero OS configuration required
var result = ocr.Read("multilingual-document.jpg");
Console.WriteLine(result.Text);
// IronOCR: language availability is a deploy-time guarantee, not a runtime unknown
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);

// Works on any machine, any OS, zero OS configuration required
var result = ocr.Read("multilingual-document.jpg");
Console.WriteLine(result.Text);
Imports IronOcr

' IronOCR: language availability is a deploy-time guarantee, not a runtime unknown
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.French
ocr.AddSecondaryLanguage(OcrLanguage.German)

' Works on any machine, any OS, zero OS configuration required
Dim result = ocr.Read("multilingual-document.jpg")
Console.WriteLine(result.Text)
$vbLabelText   $csharpLabel

言語カタログには、ラテン語、CJK文字、アラビア語、ヘブライ語、デーヴァナーガリー文字、キリル文字、および数学記号などの特殊な文字セットがすべて含まれています。 各言語パックのバージョンはIronOCRパッケージのバージョンと連動しているため、本番環境で使用される言語モデルは、ローカル環境でテストされたものと一致します。

前処理の欠如

低品質のスキャン画像(わずかに回転したページ、斑点ノイズのあるコピーされたテキスト、オフホワイトの紙に薄れたインクなど)は、そのまま受け取ったOCRエンジンでは精度が低下します。 前処理によって、認識処理を実行する前にこれらの欠陥が修正されます。 Windows.Media.Ocr は、いかなる種類の前処理レイヤーも提供しません。

Windows.Media.OCR アプローチ

APIはSoftwareBitmapを受け入れ、テキストを返します。 その2点間の画質の変化は設定できません。 最適でない入力の精度を向上させる必要がある開発者は、SoftwareBitmapを構築する前にWindows Imaging Component APIを使用して手動で前処理を実装する必要があります。 それは独自の保守負担を伴う別のコードベースであり、OCR API自体がWindows専用であるのと同じ理由で、Windows専用のままになっている。

// Windows.Media.Ocr: no preprocessing — what you pass is what gets recognized
// Skewed, noisy, or low-resolution images degrade accuracy with no remedy
// Manual preprocessing via separate Windows Imaging APIs is the only option

var bitmap = await decoder.GetSoftwareBitmapAsync();
// bitmap goes directly to recognition with no quality improvement
var result = await engine.RecognizeAsync(bitmap);
// Windows.Media.Ocr: no preprocessing — what you pass is what gets recognized
// Skewed, noisy, or low-resolution images degrade accuracy with no remedy
// Manual preprocessing via separate Windows Imaging APIs is the only option

var bitmap = await decoder.GetSoftwareBitmapAsync();
// bitmap goes directly to recognition with no quality improvement
var result = await engine.RecognizeAsync(bitmap);
Imports System.Threading.Tasks

' Windows.Media.Ocr: no preprocessing — what you pass is what gets recognized
' Skewed, noisy, or low-resolution images degrade accuracy with no remedy
' Manual preprocessing via separate Windows Imaging APIs is the only option

Dim bitmap = Await decoder.GetSoftwareBitmapAsync()
' bitmap goes directly to recognition with no quality improvement
Dim result = Await engine.RecognizeAsync(bitmap)
$vbLabelText   $csharpLabel

標準的な、鮮明な文書スキャン(管理されたスキャン環境、一定の照明、最低300 DPI、正しい向き)であれば、この制限は許容範囲内です。 携帯電話のカメラ、自動給紙のずれがあるフラットベッドスキャナー、ファックス文書、またはコピーされた資料から画像を受け取る文書処理パイプラインの場合、これは前処理レイヤーをゼロから構築するか、精度の低下を受け入れるかのどちらかを意味します。

IronOCRのアプローチ

IronOCRのOcrInputクラスは、順番に適用される個々のフィルタメソッドを備えた前処理パイプラインを提供します。 画像品質補正フィルターは、生産文書処理における最も一般的な精度低下要因に対処します。

// IronOCR: explicit preprocessing pipeline
// Each filter targets a specific quality defect
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

input.Deskew();              // Correct page rotation up to ~40 degrees
input.DeNoise();             // Remove scanner speckle and compression artifacts
input.Contrast();            // Boost contrast on faded or washed-out text
input.Binarize();            // Convert to black/white with optimal threshold
input.EnhanceResolution(300); // Scale image to 300 DPI for recognition

var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
// IronOCR: explicit preprocessing pipeline
// Each filter targets a specific quality defect
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

input.Deskew();              // Correct page rotation up to ~40 degrees
input.DeNoise();             // Remove scanner speckle and compression artifacts
input.Contrast();            // Boost contrast on faded or washed-out text
input.Binarize();            // Convert to black/white with optimal threshold
input.EnhanceResolution(300); // Scale image to 300 DPI for recognition

var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr

' IronOCR: explicit preprocessing pipeline
' Each filter targets a specific quality defect
Using input As New OcrInput()
    input.LoadImage("low-quality-scan.jpg")

    input.Deskew()              ' Correct page rotation up to ~40 degrees
    input.DeNoise()             ' Remove scanner speckle and compression artifacts
    input.Contrast()            ' Boost contrast on faded or washed-out text
    input.Binarize()            ' Convert to black/white with optimal threshold
    input.EnhanceResolution(300) ' Scale image to 300 DPI for recognition

    Dim result = New IronTesseract().Read(input)
    Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
$vbLabelText   $csharpLabel

一般的なケースでは、IronOCRはファイルパスにReadを直接呼び出す際に自動前処理を適用し、エンジンが品質問題を検出して、明示的なフィルタ構成なしに修正します。 画像フィルタチュートリアルは、ToGrayScaleを含む、特殊なシナリオのための完全なフィルタセットをカバーしています。 色補正フィルター向き補正は、標準以外の色プロファイルを持つドキュメントや、複数の角度で回転されたドキュメントに対応するために、処理パイプラインをさらに拡張します。

PDFサポート不在

PDFはEnterprise環境において最も主流な文書フォーマットである。 契約書、請求書、スキャンされたアーカイブ、政府発行の書類などはPDFファイルで届きます。 Windows.Media.OcrにはPDFの概念はなく、画像データのみを受け入れます。 PDF文書のOCR処理には、別途PDFレンダリングライブラリ、ページごとのラスタライズ処理、および結果の手動による組み立てが必要となる。

Windows.Media.OCR アプローチ

APIにはPDFへのパスは含まれていません。 Windows.Media.OcrでスキャンしたPDFをOCRするために、開発者は次のように行います: 個別のPDFレンダリングライブラリ(Windowsに組み込まれていないもの)を使用して各ページをRecognizeAsyncを呼び出し、結果を手動で連結します。 そのレンダリングライブラリ自体には、追加のライセンスおよび展開に関する考慮事項があります。 Windows.Media.Ocr コードは、実装全体のごく一部です。

// Windows.Media.Ocr: no PDF support
// Requires external PDF renderer to rasterize pages before OCR
// Conceptual pattern — a PDF rendering library is not provided by Windows APIs

// Step 1: Use external PDF library to render page to bitmap (not shown)
// Step 2: Pass rendered bitmap to Windows OCR
// var bitmap = RenderPdfPageToBitmap(pdfPath, pageIndex); // external library required

var engine = OcrEngine.TryCreateFromUserProfileLanguages();
if (engine == null)
    throw new Exception("No OCR language available");

// Step 3: Recognize the rasterized page
// var result = await engine.RecognizeAsync(bitmap);
// Step 4: Collect and concatenate results across all pages manually
// Windows.Media.Ocr: no PDF support
// Requires external PDF renderer to rasterize pages before OCR
// Conceptual pattern — a PDF rendering library is not provided by Windows APIs

// Step 1: Use external PDF library to render page to bitmap (not shown)
// Step 2: Pass rendered bitmap to Windows OCR
// var bitmap = RenderPdfPageToBitmap(pdfPath, pageIndex); // external library required

var engine = OcrEngine.TryCreateFromUserProfileLanguages();
if (engine == null)
    throw new Exception("No OCR language available");

// Step 3: Recognize the rasterized page
// var result = await engine.RecognizeAsync(bitmap);
// Step 4: Collect and concatenate results across all pages manually
' Windows.Media.Ocr: no PDF support
' Requires external PDF renderer to rasterize pages before OCR
' Conceptual pattern — a PDF rendering library is not provided by Windows APIs

' Step 1: Use external PDF library to render page to bitmap (not shown)
' Step 2: Pass rendered bitmap to Windows OCR
' Dim bitmap = RenderPdfPageToBitmap(pdfPath, pageIndex) ' external library required

Dim engine = OcrEngine.TryCreateFromUserProfileLanguages()
If engine Is Nothing Then
    Throw New Exception("No OCR language available")
End If

' Step 3: Recognize the rasterized page
' Dim result = Await engine.RecognizeAsync(bitmap)
' Step 4: Collect and concatenate results across all pages manually
$vbLabelText   $csharpLabel

外部PDFレンダリングのステップを追加するだけで、当初は"無料で組み込み済みの"ソリューションだったものが、依存関係、学習曲線、そして新たな障害発生箇所を抱えることになる。

IronOCRのアプローチ

IronOCRはPDFをネイティブに読み取ります。 外部レンダラーなし、ラスタライズ工程なし、手動ページ組み立てなし。 画像パスを受け入れる同じIronTesseract.Readメソッドは、PDFパスも受け入れます。 .NETにおけるPDF OCRはたった1行のコードで実現できます。

// IronOCR: native PDF support — no external renderer needed
var text = new IronTesseract().Read("scanned-document.pdf").Text;

// Password-protected PDFs
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);

// 検索可能なPDF output: make a scanned PDF text-searchable
var ocrResult = new IronTesseract().Read("scanned-archive.pdf");
ocrResult.SaveAsSearchablePdf("searchable-output.pdf");
// IronOCR: native PDF support — no external renderer needed
var text = new IronTesseract().Read("scanned-document.pdf").Text;

// Password-protected PDFs
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);

// 検索可能なPDF output: make a scanned PDF text-searchable
var ocrResult = new IronTesseract().Read("scanned-archive.pdf");
ocrResult.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr

' IronOCR: native PDF support — no external renderer needed
Dim text As String = New IronTesseract().Read("scanned-document.pdf").Text

' Password-protected PDFs
Using input As New OcrInput()
    input.LoadPdf("encrypted.pdf", Password:="secret")
    Dim result = New IronTesseract().Read(input)
    Console.WriteLine(result.Text)
End Using

' 検索可能なPDF output: make a scanned PDF text-searchable
Dim ocrResult = New IronTesseract().Read("scanned-archive.pdf")
ocrResult.SaveAsSearchablePdf("searchable-output.pdf")
$vbLabelText   $csharpLabel

検索可能なPDF機能は、元のスキャン画像の上にテキストレイヤーを埋め込むことで、視覚的な忠実度を維持しながら、全文検索やコピー&ペーストを可能にするPDFを生成します。 これは、文書管理システムやコンプライアンスアーカイブにおける一般的な要件です。 Windows.Media.Ocr は、その API のどのレベルにおいても、この出力を生成することはできません。

APIマッピングリファレンス

Windows.Media.Ocr IronOCR相当値
OcrEngine.TryCreateFromLanguage(lang) new IronTesseract() with ocr.Language = OcrLanguage.X
OcrEngine.TryCreateFromUserProfileLanguages() new IronTesseract() (デフォルト言語自動解決)
engine.RecognizeAsync(softwareBitmap) ocr.Read("image.jpg") or ocr.Read(ocrInput)
OcrResult.Text OcrResult.Text
OcrResult.Lines OcrResult.Lines (拡張メタデータ付き)
OcrLine.Text OcrResult.Lines[i].Text
OcrLine.Words OcrResult.Words (バウンディングボックス+信頼度付き)
OcrWord.BoundingRect OcrResult.Words[i].X, .Y, .Width, .Height
BitmapDecoder.CreateAsync(stream) input.LoadImage(stream) via OcrInput
StorageFile.GetFileFromPathAsync(path) ocr.Read("path") directly
同等のファイルはありません(PDFはサポートされていません) ocr.Read("document.pdf")
同等のファイルはありません(PDFはサポートされていません) input.LoadPdf("file.pdf", Password: "x")
同等のファイルはありません(検索可能なPDFファイルはありません)。 result.SaveAsSearchablePdf("output.pdf")
同等の項目なし(前処理なし) input.Deskew(), input.DeNoise(), input.Contrast()
同等のものはありません(多言語対応ではありません) ocr.AddSecondaryLanguage(OcrLanguage.X)
該当するものなし(信頼性なし) result.Confidence, word.Confidence

チームがWindows.Media.OcrからIronOCRへの移行を検討する場合

アプリケーションがWindowsデスクトップの容量を超えました

最も一般的なきっかけは、Windows以外の展開対象を導入する要件変更です。 当初はWindowsの内部ツールとして開発されたデスクトップユーティリティが、Webサービス、Dockerベースのマイクロサービス、またはクラウド機能へと昇格する。 その瞬間、Windows.Media.Ocr が障害物となる。 OCRコンポーネントは、対象プラットフォームにAPIが存在しないため、完全に書き直す必要があります。ポートも互換性シムも、問題を解決する条件付きコンパイルフラグもありません。 IronOCRを事前に導入していたチームは、今回の書き換え作業の必要はありません。

言語要件がインストール済みパックを超えています

文書処理パイプラインは、しばしばその範囲を拡大する。 英語の請求書を処理するために構築されたシステムに、フランス語、ドイツ語、アラビア語、または日本語の文書を処理する必要性が生じる。 Windows.Media.Ocr を使用する場合、これらの言語をサポートするには、開発者マシン、テスト用仮想マシン、本番サーバー、およびそれらに含まれるすべてのコンテナなど、すべての展開対象にわたって OS 言語パックのインストールを調整する必要があります。 グループポリシーで管理される環境や、OSのフットプリントが最小限のクラウドVMでは、そのような連携は現実的ではありません。 IronOCRのNuGetベースの言語パックはアプリケーションと共にデプロイされるため、OSとの連携は不要です。

PDF処理が対象範囲に追加されました

当初の要件が"フラットベッドスキャナーからの画像をOCR処理する"だった場合、Windows.Media.Ocrは機能します。 要件が"アーカイブに蓄積されたスキャン済みPDFの処理も行う"まで拡大すると、2つ目のライブラリが検討対象に加わる。 そのライブラリは、追加の依存関係、追加のライセンス上の考慮事項、そして追加の障害発生箇所となる。 画像OCRとPDF OCRの両方を統一されたAPIで必要とするチームにとって、 IronOCRは最初から2つのライブラリを使用するアーキテクチャを排除できることが分かります。

実世界の入力では精度が低下する

管理されたスキャン環境は、鮮明な画像を生み出す。 実際の入力データ(携帯電話で撮影した写真、わずかに傾いたフラットベッドスキャン、古いファックスで受信した文書、コピーされた資料など)は、Windows.Media.Ocr では修正できない精度低下を引き起こします。 顧客からテキストメッセージが届かなかったという苦情が寄せられ始めると、チームはこれまで省略していた前処理手順が必要になったことに気づく。 WindowsイメージングAPIを使用した前処理を後付けすることは、相当な開発作業となり、ソリューションがWindows専用のままになってしまう。 IronOCRの前処理パイプラインは既に完成している。

サーバー展開に関する疑問が生じる

Windows.Media.Ocr のドキュメントでは、クライアントアプリケーション向けの API が明確に位置づけられています。 サーバー環境(ユーザーがアップロードしたドキュメントを処理するASP.NETアプリケーション、ドキュメントキューを利用するWindowsサービスなど)で実行するには、デスクトップエクスペリエンスがインストールされたWindows Server環境が必要となり、これはLinuxコンテナよりも負荷が高く、コストも高くなります。 インフラストラクチャチームが、ホスティングコストを削減するためにOCRワーカーをLinuxインスタンスで実行できるかどうかを尋ねた場合、Windows.Media.Ocrでは答えは"いいえ"です。

一般的な移行の考慮事項

プロジェクトファイル TFM の変更

Windows.Media.Ocrは、プロジェクトファイルにWindows専用のTFMが必要です (net8.0-windows10.0.19041.0など)。 クロスプラットフォーム対応のためにその依存関係を解消するということは、TFMサフィックスを削除することを意味します。 IronOCRは、Windows専用のサフィックスなしでnet9.0をターゲットにしています。 移行時には、プロジェクト内の他の WinRT API 依存関係が Windows TFM を必要としないことを確認してください。他の Windows プラットフォーム機能 (シェル統合、Windows 通知など) は、プラットフォームチェックの背後に抽象化する必要がある場合があります。

非同期から同期への移行

Windows.Media.Ocrは完全に非同期です — Task<OcrResult>にマッピングされます。IronOCRは同期および非同期の両方のパスを提供します。 同期型ocr.Read("file.jpg")は多段のawaitチェーンを直接置き換えます。 OCR呼び出しがバックグラウンドサービスまたはタスクベースのパイプライン内に存在するサーバーアプリケーションの場合、非同期パスも利用可能です。 いずれにしても、6つ以上の非同期ステップから1つの呼び出しへの移行は簡単です。

// Before: Windows.Media.Ocr — 6+ await operations
var file = await StorageFile.GetFileFromPathAsync(imagePath);
using var stream = await file.OpenAsync(FileAccessMode.Read);
var decoder = await BitmapDecoder.CreateAsync(stream);
var bitmap = await decoder.GetSoftwareBitmapAsync();
var engine = OcrEngine.TryCreateFromUserProfileLanguages();
var winResult = await engine.RecognizeAsync(bitmap);
string text = winResult.Text;

// After: IronOCR — 1 call, same result, any platform
string text = new IronTesseract().Read(imagePath).Text;
// Before: Windows.Media.Ocr — 6+ await operations
var file = await StorageFile.GetFileFromPathAsync(imagePath);
using var stream = await file.OpenAsync(FileAccessMode.Read);
var decoder = await BitmapDecoder.CreateAsync(stream);
var bitmap = await decoder.GetSoftwareBitmapAsync();
var engine = OcrEngine.TryCreateFromUserProfileLanguages();
var winResult = await engine.RecognizeAsync(bitmap);
string text = winResult.Text;

// After: IronOCR — 1 call, same result, any platform
string text = new IronTesseract().Read(imagePath).Text;
Imports Windows.Storage
Imports Windows.Graphics.Imaging
Imports Windows.Media.Ocr

' Before: Windows.Media.Ocr — 6+ await operations
Dim file As StorageFile = Await StorageFile.GetFileFromPathAsync(imagePath)
Using stream = Await file.OpenAsync(FileAccessMode.Read)
    Dim decoder As BitmapDecoder = Await BitmapDecoder.CreateAsync(stream)
    Dim bitmap = Await decoder.GetSoftwareBitmapAsync()
    Dim engine = OcrEngine.TryCreateFromUserProfileLanguages()
    Dim winResult = Await engine.RecognizeAsync(bitmap)
    Dim text As String = winResult.Text
End Using

' After: IronOCR — 1 call, same result, any platform
Dim text As String = New IronTesseract().Read(imagePath).Text
$vbLabelText   $csharpLabel

言語パックの置き換え

以前ocr.Language = OcrLanguage.Frenchを設定します。 IronOCRの言語カタログには、利用可能な125種類以上のパックがすべて掲載されています。 言語コードはBCP-47タグからOcrLanguage列挙型へ簡単にマッピングされます。

ヌルエンジンのハンドリング削除

Windows.Media.Ocr では、エンジン作成呼び出しのたびに null チェックを行う必要があります。 IronOCRは、設定または初期化の失敗時にnullを返すのではなく、構造化された例外をスローします。 nullチェックのガード句を削除し、必要に応じて標準的な例外処理に置き換えてください。 その結果、よりクリーンな通話サイトが実現し、"利用できない言語がサイレントに表示される"という障害モードも発生しなくなりました。

IronOCRの追加機能

IronOCRは、Windows.Media.Ocrの機能を直接置き換える機能に加えて、Windows.Media.Ocrには同等の機能がない以下の機能も備えています。

-スキャン文書処理— TIFFや複数ページのPDF入力を含む、複数ページのスキャンアーカイブ専用の処理機能 -表の抽出— 請求書明細項目、レポートグリッド、フォームマトリックスなど、文書内の表形式データを構造的に検出します。 -特殊な文書タイプ(パスポートのMRZゾーン、MICRチェックライン、ナンバープレート、手書き文字など)には、それぞれ専用の処理経路が用意されています。 -進捗状況の追跡— バッチ処理はイベントを介して進捗状況を報告し、アプリケーションUIで進捗バーと処理速度の監視を可能にします。

.NETの互換性と将来の準備

IronOCRは、プラットフォーム固有のサフィックスのない標準TFM上で.NET 6、 .NET 7、 .NET 8、および.NET 9をサポートするとともに、レガシーアプリケーションのサポートとして.NET Framework 4.6.2から4.8までをサポートしています。 このライブラリは、 .NET のリリースサイクルに合わせて定期的に更新され、2026 年のロードマップには.NET 10 のサポートが含まれています。Windows.Media.Ocr は、 .NET 5 以降で WinRT 相互運用をサポートするすべて for .NETバージョンで使用できますが、Windows TFM の要件により、適用対象は Windows をターゲットとするプロジェクトに限定されます。 .NETのクロスプラットフォーム戦略が成熟するにつれ、より多くのチームがLinuxコンテナやクラウド関数を第一級のデプロイメントターゲットとして採用するようになるにつれて、Windows.Media.OcrのTFM制約は、些細な注意点ではなく、より顕著なアーキテクチャ上の問題となってきています。

結論

Windows.Media.Ocrは、特定の正当なニッチ市場を開拓しています。それは、クロスプラットフォーム対応を一切目指さず、基本的な画像OCR機能のみを必要とし、予算も0ドルという厳しい制約のあるWindows 10/11デスクトップアプリケーションです。そして、そのニッチ市場において、このアプリケーションは十分に機能します。 そのニッチな分野以外、つまりLinuxコンテナ、クラウド関数、多言語要件を持つサーバー、またはPDFを処理するドキュメントパイプラインを対象とするデプロイメントの場合、対象プラットフォームにはAPIが存在しないため、コードを置き換える必要があります。

より根本的な問題は、Windows.Media.Ocrの制限が偶発的なものではなく、アーキテクチャ上の問題であるということだ。 プラットフォームのロックインは、無効にする設定フラグではありません。 APIが依存しているWinRTランタイムに組み込まれています。 言語の可用性は、ビルド時に含めるべきパッケージではなく、OS管理者に委ねられています。 PDFサポートは、 NuGetパッケージで追加すべき不足機能ではありません。 APIインターフェース上には全く存在しない。 それぞれの制約には、それを補うための別のシステムが必要であり、それぞれの補填システムはプラットフォームへの依存性を再び生み出す。

IronOCRは、プラットフォーム、言語、前処理、PDFという4つの制約すべてを単一のパッケージで解決します。 $999のエントリ価格は$0ではなく、管理された入力と英語のみの文書を持つWindows専用のデスクトップユーティリティの場合、Windows.Media.Ocrは有効な選択のままです。より広範な要件を持つプロジェクトでは、Windows.Media.Ocrの制限に基づいて構築するコストが、プロジェクトが最初の本番展開に達する前に、開発者の時間の中でIronOCRのライセンスコストを超える可能性があります。

実地テストは簡単です。展開先がLinux、Docker、またはクラウド機能になる可能性があり、入力ドキュメントがPDFであったり、デフォルトのOSパック以外の言語で入力される可能性がある場合、Windows.Media.Ocrは適切な基盤ではありません。 プロジェクトの途中でそれに気づくのは、最初から適切なツールを選ぶよりもはるかにコストがかかる。 IronOCRの機能セットを自社の具体的な要件と照らし合わせて評価してから、どちらの方向性を選択するかを決定するのが、最も効率的な方法です。

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

よくある質問

Windows.Media.Ocrとは何ですか?

Windows.Media.Ocrは、開発者や企業が画像や文書からテキストを抽出するために使用するOCRソリューションです。.NETアプリケーション開発のためにIronOCRとともに評価されるいくつかのOCRオプションの一つです。

IronOCRは.NET開発者向けWindows.Media.Ocrと比較してどうですか?

IronOCRはNuGetネイティブ for .NET OCRライブラリで、IronTesseractをコアエンジンとして使用しています。Windows.Media.Ocrと比較して、よりシンプルなデプロイメント(SDKインストーラーなし)、定額価格、COMインターオプやクラウド依存のないクリーンなC# APIを提供します。

IronOCRのセットアップはWindows.Media.Ocrより簡単ですか?

IronOCRは単一のNuGetパッケージでインストールされます。SDKインストーラー、ライセンスファイルのコピー、COMコンポーネントの登録、ランタイムバイナリの管理は必要ありません。OCRエンジン全体がパッケージにバンドルされています。

Windows.Media.OcrとIronOCRにはどのような精度の違いがありますか?

IronOCRは、標準的なビジネス文書、請求書、領収書、スキャンしたフォームに対して高い認識精度を達成します。高度に劣化した文書や一般的でないスクリプトの場合、精度はソースの品質によって異なります。IronOCRは低品質入力の認識を向上させる画像前処理フィルターを含んでいます。

IronOCRはPDFテキスト抽出をサポートしていますか?

IronOCRは、ネイティブPDFとスキャンしたPDFイメージの両方から、一回の呼び出しでテキストを抽出します。また、複数ページのTIFFファイル、画像、ストリームもサポートします。スキャンしたPDFの場合、OCRはページごとに適用され、ページごとの結果オブジェクトを持ちます。

Windows.Media.Ocrライセンスは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はWindows.Media.Ocrとは異なり、Dockerやコンテナでのデプロイメントに適していますか?

IronOCRはNuGetパッケージによってDockerコンテナで動作します。ライセンスキーは環境変数で設定します。OCRエンジン自体にはライセンスファイル、SDKパス、ボリュームマウントは必要ありません。

Windows.Media.Ocrと比較して、購入前にIronOCRを試すことはできますか?

IronOCRのトライアルモードでは、ドキュメントを処理し、出力に透かしをオーバーレイしたOCR結果を返します。ライセンスを購入する前に、ご自身の文書で精度を確認することができます。

IronOCRはテキスト抽出とバーコード読み取りをサポートしていますか?

IronOCRはテキスト抽出とOCRに重点を置いています。バーコード読み取りについては、Iron SoftwareはIronBarcodeをコンパニオンライブラリとして提供しています。どちらも個別に、あるいはIron Suiteのバンドルとして提供されています。

Windows.Media.OcrからIronOCRへの移行は簡単ですか?

Windows.Media.OcrからIronOCRへの移行は通常、初期化シーケンスをIronTesseractのインスタンス生成に置き換え、COMライフサイクル管理を削除し、APIコールを更新します。ほとんどの移行はコードの複雑さを大幅に軽減する。

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

アイアンサポートチーム

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