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

MODI OCR C# 対 IronOCR: C# の適切な光学文字認識ライブラリの選択

Microsoft Office Document Imaging (MODI) は、かつて MS Office 2003 および 2007 にバンドルされていた定番の OCR コンポーネントであり、開発者は COM ベースのオブジェクト モデルを介してスキャン画像から直接テキストを抽出することができました。 長年にわたり、MODI.Document クラスは、Visual Studio ソリューション内で TIFF および BMP 画像ファイルを機械可読テキストに変換する、無数の文書デジタル化プロジェクトを支えてきました。

しかし、MODIには重大な落とし穴があります。MicrosoftはOffice 2010以降のバージョンからMODIを削除したため、開発者はOCR機能を維持するためだけに、古いOfficeのインストールやスタンドアロンインストーラーに頼らざるを得なくなりました。クロスプラットフォーム展開、クラウド環境、または最新のWindowsバージョンをターゲットとする最新の.NETプロジェクトにとって、MODIは深刻な障害となります。

この記事では、MODI OCR C# と、専用に構築された.NET光学文字認識ライブラリであるIronOCRを、コードの実装、機能、プラットフォームのサポート、ライセンスの観点から比較検討します。 既存コードの保守であれ、新規プロジェクトの立ち上げであれ、ここに記載された情報は適切な選択をするための参考になるでしょう。

以下のコード例を参考に、 IronOCRを30日間無料でお試しください

比較結果が一目でわかるようにするにはどうすればよいでしょうか?

カテゴリ MODI OCR IronOCR
コアアーキテクチャ COM相互運用機能。Microsoft Office Document Imaging DLL参照が必要です。 純粋な.NETライブラリ。 Tesseract 5 エンジンは C# 向けに最適化されています
プラットフォームサポート Windowsのみ対応。 コンピューターにOffice 2003/2007がインストールされている必要があります。 Windows、Linux、macOS、Azure、Docker、iOS、Android
画像フォーマット TIFF、MDI、BMP TIFF、PNG、JPEG、BMP、GIF、PDF、複数ページ画像
言語サポート miLANG パラメータ経由で最大 22 言語 NuGet言語パック経由で125以上の言語に対応
OCRの精度 清潔感のある標準フォントの文書を高く評価 自動画像補正フィルター使用時、99.8%以上
出力オプション レイアウトオブジェクトからのプレーンテキスト プレーンテキスト、検索可能なPDF、構造化データ(ページ、行、単語、バーコード)
インストール Office インストーラー + ソリューション エクスプローラーの COM 参照 NuGetパッケージ: Install-Package IronOCR
アクティブ開発 Office 2007以降は提供終了 定期的なアップデートにより積極的に維持管理されています。
ライセンス 有効なMicrosoft Officeライセンスが必要です 永久ライセンスは749ドルから。 30日間無料トライアル
サポート コミュニティフォーラムのみ メール、ライブチャット、電話による直接的なエンジニアリングサポート

How Does Microsoft Office Document Imaging Perform OCR in C#?

MODIは、COMベースのオブジェクトモデルを通して光学文字認識(OCR)を実行します。 このプロセスは、MODI.Documentオブジェクトを作成し、画像ファイルのパスを読み込み、OCRメソッドを呼び出して画像を解析し、文字を識別することから始まります。 OCR処理が完了すると、各ページの画像オブジェクトとレイアウトオブジェクトを通じて、テキスト情報とレイアウト情報にアクセスできるようになります。

Visual StudioプロジェクトでMODIを使用するには、Microsoft Office Document Imaging Type Libraryへの参照を追加する必要があります。 ソリューションエクスプローラーで、[参照]フォルダーを右クリックし、[COM]タブを選択して、適切なMODIバージョン(Office 2003の場合は11.0、Office 2007の場合は12.0)を選択します。

// MODI OCR: Extracting text from a scanned TIFF document
private string ExtractTextFromImage(string path)
{
    string extractedText = "";
    MODI.Document doc = new MODI.Document();
    try
    {
        // Create the document object from the image file path
        doc.Create(path);
        // Run optical character recognition with English language
        doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
        // Access the first page image and retrieve recognized text
        MODI.Image modiImage = (MODI.Image)doc.Images[0];
        extractedText = modiImage.Layout.Text;
    }
    catch (Exception ex)
    {
        // Handle OCR exceptions for unsupported or corrupted image files
        string message = ex.Message;
        Console.WriteLine(message);
    }
    finally
    {
        doc.Close(false);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
    }
    return extractedText;
}
// MODI OCR: Extracting text from a scanned TIFF document
private string ExtractTextFromImage(string path)
{
    string extractedText = "";
    MODI.Document doc = new MODI.Document();
    try
    {
        // Create the document object from the image file path
        doc.Create(path);
        // Run optical character recognition with English language
        doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
        // Access the first page image and retrieve recognized text
        MODI.Image modiImage = (MODI.Image)doc.Images[0];
        extractedText = modiImage.Layout.Text;
    }
    catch (Exception ex)
    {
        // Handle OCR exceptions for unsupported or corrupted image files
        string message = ex.Message;
        Console.WriteLine(message);
    }
    finally
    {
        doc.Close(false);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
    }
    return extractedText;
}
' MODI OCR: Extracting text from a scanned TIFF document
Private Function ExtractTextFromImage(ByVal path As String) As String
    Dim extractedText As String = ""
    Dim doc As New MODI.Document()
    Try
        ' Create the document object from the image file path
        doc.Create(path)
        ' Run optical character recognition with English language
        doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, True, True)
        ' Access the first page image and retrieve recognized text
        Dim modiImage As MODI.Image = CType(doc.Images(0), MODI.Image)
        extractedText = modiImage.Layout.Text
    Catch ex As Exception
        ' Handle OCR exceptions for unsupported or corrupted image files
        Dim message As String = ex.Message
        Console.WriteLine(message)
    Finally
        doc.Close(False)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(doc)
    End Try
    Return extractedText
End Function
$vbLabelText   $csharpLabel

この関数は、標準的なMODIワークフローを示しています。Createメソッドはファイルを読み込み、OCRメソッドは指定された言語を使用して認識を実行し、Layout.Textは抽出された文字列を提供します。 return extractedText ステートメントは、出力を呼び出し元に渡します。

MODIは鮮明で高解像度の文書画像に対してはまずまずの精度を提供するものの、顕著な限界もある。 TIFF、MDI、BMP形式のみをサポートしています。 本アプリケーションを実行するすべてのコンピューター(運用サーバーを含む)に、Microsoft Officeがインストールされている必要があります。 低品質画像のスキャン、歪み補正、デジタルノイズ低減のための組み込みサポートはありません。さらに、MODIはCOM相互運用性に依存しているため、 .NET Core、 .NET 5以降、またはクロスプラットフォーム環境では使用できません。そのため、DockerコンテナやAzure App Servicesなどの最新のデプロイメントターゲットには適していません。

最新の.NETライブラリはOCR機能をどのように処理するのか?

IronOCRは、COM相互運用方式を、単一のNuGetパッケージでインストールできる純粋な.NET APIに置き換えます。 IronTesseractクラスは高度に最適化されたTesseract 5エンジンをラップし、OcrInputクラスは画像の読み込み、前処理、およびマルチフォーマットのサポートを処理します。これらはすべて、Microsoft Officeやターゲットコンピュータへの外部依存関係を必要とせずに実現されます。

using IronOcr;
// Create the IronTesseract OCR engine object
var ocr = new IronTesseract();
using var input = new OcrInput();
// Load images in any common format — PNG, JPEG, TIFF, BMP, GIF, or PDF
input.LoadImage("scanned-document.tiff");
// Apply filters to correct low-quality scans automatically
input.Deskew();   // Straighten skewed page images
input.DeNoise();  // Remove digital noise from scanning artifacts
// Read text from the processed document
var result = ocr.Read(input);
// Output plain text
Console.WriteLine(result.Text);
// Save as a searchable PDF for document management system integration
result.SaveAsSearchablePdf("output-searchable.pdf");
using IronOcr;
// Create the IronTesseract OCR engine object
var ocr = new IronTesseract();
using var input = new OcrInput();
// Load images in any common format — PNG, JPEG, TIFF, BMP, GIF, or PDF
input.LoadImage("scanned-document.tiff");
// Apply filters to correct low-quality scans automatically
input.Deskew();   // Straighten skewed page images
input.DeNoise();  // Remove digital noise from scanning artifacts
// Read text from the processed document
var result = ocr.Read(input);
// Output plain text
Console.WriteLine(result.Text);
// Save as a searchable PDF for document management system integration
result.SaveAsSearchablePdf("output-searchable.pdf");
Imports IronOcr

' Create the IronTesseract OCR engine object
Dim ocr As New IronTesseract()
Using input As New OcrInput()
    ' Load images in any common format — PNG, JPEG, TIFF, BMP, GIF, or PDF
    input.LoadImage("scanned-document.tiff")
    ' Apply filters to correct low-quality scans automatically
    input.Deskew()   ' Straighten skewed page images
    input.DeNoise()  ' Remove digital noise from scanning artifacts
    ' Read text from the processed document
    Dim result = ocr.Read(input)
    ' Output plain text
    Console.WriteLine(result.Text)
    ' Save as a searchable PDF for document management system integration
    result.SaveAsSearchablePdf("output-searchable.pdf")
End Using
$vbLabelText   $csharpLabel

IronOCRの出力

MODI OCR C# vs. IronOCR: C# で適切な光学文字認識ライブラリを選択する: 画像 1 - IronOCR の出力例

上記のコードは、 IronOCRがTIFFスキャン画像を完全なOCRパイプラインを通してわずか数行で処理する様子を示しています。 OcrInputオブジェクトは、ほぼすべての画像ファイルまたはPDFドキュメントを受け入れます。また、Deskew()とDeNoise()は、MODIで低品質な結果が生じる原因となる一般的なスキャン時のアーティファクトを補正します。 Read メソッドは、プレーンテキストだけでなく、ページ、段落、行、単語ごとに整理された構造化データを含む OcrResult オブジェクトを返します。各データには、信頼度スコアと座標情報が含まれています。

請求書、フォーム、または複数ページのTIFFファイルを処理するプロジェクト向けに、 IronOCRには、テキスト領域を自動的に検出するコンピュータビジョン機能、バーコードとQRコードの同時読み取り機能、およびNuGetパッケージとしてインストール可能な125以上の言語のサポートも含まれています。

画像からテキストを抽出する際の主な違いは何ですか?

これら2つの選択肢の本当の差は、"完璧な"サンプルファイルの使用をやめて、実際の文書を扱い始めた瞬間に明らかになる。 ここで言っているのは、コーヒーの染みが付いていたり、ページが傾いていたり、スマートフォンで撮った低解像度の写真だったりする、あの見栄えの悪いスキャン画像のことです。

MODIは、特にクリーンで高コントラストなオフィス文書という、異なる時代のために開発された。 高性能スキャナーで鮮明なTIFFファイルを取得すれば、問題なく動作します。しかし、画像が少しでも回転していたり​​、デジタルノイズが含まれていると、MODIの精度は著しく低下します。 これらの問題を解決するための組み込みフィルターがないため、OCR処理を開始する前に、GDI+やSystem.Drawingなどの別のライブラリを使用して画像を自分で前処理する必要があります。 メモリ管理も少々面倒です。 Marshal.ReleaseComObject を手動で呼び出さないと、本番環境でメモリリークが発生する可能性が高くなります。

IronOCRは、箱から出してすぐにこの面倒な作業をすべて自動で行ってくれます。 画像をクリーンアップするためのカスタムコードを書く代わりに、input.Deskew() または input.DeNoise() を呼び出すだけで済みます。 これらのフィルターは画像を準備することで、たとえ"見栄えの悪い"文書であっても、エンジンが99.8%の精度を達成できるようにします。

プロのヒント: MODIから移行する場合は、単にコードを置き換えるだけでなく、レイアウトデータを活用してください。 MODIはほとんどの場合、巨大な"テキストの塊"として表示するのに対し、 IronOCRはテキストを段落や行に分解し、信頼度スコアを表示します。 自動請求書処理システムを構築していて、人間の目による確認が必要な可能性のある文書にフラグを立てる必要がある場合、これは非常に役立ちます。

また、 IronOCRは複数ページのTIFFファイルやPDFファイルを単一のオブジェクトとして扱う点にも注目すべきです。 以前のMODI.Imagesコレクションのように、画像を手動でループ処理する必要はありません。 単純に、より速く、よりクリーンで、そして正直言って、はるかに壊れにくいんです。

開発者はどのようにして従来の手法から移行できるのか?

既存のプロジェクトでMODIを置き換えるのは簡単です。 コアとなる移行作業は、COM参照をNuGetパッケージに置き換え、OCRメソッド呼び出しを更新することです。 MODIパターンを現代版に変換すると次のようになります。

using IronOcr;
// Replace: MODI.Document doc = new MODI.Document();
var ocr = new IronTesseract();
// Replace: doc.Create(filePath); with OcrInput
using var input = new OcrInput();
input.LoadImage("document.tiff");  // Accepts the same TIFF files MODI used
// Replace: doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
ocr.Language = OcrLanguage.English;
// Replace: modiImage.Layout.Text
var result = ocr.Read(input);
string text = result.Text;
Console.WriteLine(text);
using IronOcr;
// Replace: MODI.Document doc = new MODI.Document();
var ocr = new IronTesseract();
// Replace: doc.Create(filePath); with OcrInput
using var input = new OcrInput();
input.LoadImage("document.tiff");  // Accepts the same TIFF files MODI used
// Replace: doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
ocr.Language = OcrLanguage.English;
// Replace: modiImage.Layout.Text
var result = ocr.Read(input);
string text = result.Text;
Console.WriteLine(text);
Imports IronOcr

Dim ocr As New IronTesseract()

Using input As New OcrInput()
    input.LoadImage("document.tiff") ' Accepts the same TIFF files MODI used
    ocr.Language = OcrLanguage.English
    Dim result = ocr.Read(input)
    Dim text As String = result.Text
    Console.WriteLine(text)
End Using
$vbLabelText   $csharpLabel

マッピングはほぼ1対1です。MODI.Document.CreateはOcrInput.LoadImageになり、言語パラメータ付きのOCRメソッドはocr.Languageとocr.Readの組み合わせになり、Layout.Textはresult.Textになります。 COM参照なし、Officeへの依存なし、メモリを手動で管理するためのMarshal.ReleaseComObjectもなし。

直接的な置き換えにとどまらず、移行によってMODIには存在しない機能も利用できるようになります。例えば、LinuxとmacOSへのクロスプラットフォーム展開、クラウドおよびコンテナ展開、検索可能なPDF出力、そしてカスタムフォントのトレーニング機能を備えた完全なTesseract 5エンジンなどです。

現代のOCRニーズに最適なソリューションはどれか?

MODIは、Microsoft OfficeがすべてのWindowsコンピュータに標準搭載されていた時代に、その役割を果たした。 既にOffice 2003または2007に依存しているレガシーシステムを保守しているチームにとっては、まだ機能するかもしれないが、それは既にサポートが終了したソフトウェアへの脆弱な依存であり、将来への道筋は示されていない。

IronOCRは、新規プロジェクトはもちろん、近代化を必要とする既存システムに対しても、包括的で継続的にメンテナンスされるソリューションを提供します。 Officeへの依存を完全に排除し、主要なプラットフォームすべてで動作し、従来の方法では処理できなかった低品質の画像も処理でき、プレーンテキストをはるかに超える構造化されたOCR出力を提供します。 充実したドキュメント直接的なエンジニアリングサポート、そして749ドルからの永久ライセンスにより、大規模な本番環境レベルの文書処理に対応できるように設計されています。

今IronOCRを始めましょう。
green arrow pointer

OCRを本番環境に導入する準備はできていますか? IronOCRのライセンスオプションを検討して、チームに最適なものを見つけてください。

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

アイアンサポートチーム

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