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

OCR API Microsoft Azure Vision とIronOCR: どちらがドキュメント画像をより適切に処理しますか?

TesseractからOCRの結果を1つでも読み取る前に、グレースケール変換、コントラスト強調、二値化、ノイズ除去、傾き補正、DPIスケーリングなど、テキスト認識とは全く関係のない約180行の画像処理コードからなる前処理パイプラインを記述する必要があります。 charlesw Tesseractラッパーの真のコストは、無料のライセンス料ではなく、理想的な条件下でスキャンされていない文書でもエンジンが確実に動作するようにするための20~40時間のエンジニアリング作業にある。 そして、アプリケーションがPDFファイルを受信することに気づき、パイプラインを最初からやり直して、PDFレンダリングライブラリを前面に組み込む必要が出てくる。

Tesseractを理解する

NuGet パッケージ Tesseract(charlesw ラッパー)は、ネイティブの Tesseract OCR エンジンを .NET アプリケーションに公開する P/Invoke ブリッジです。 これは、Leptonica画像処理ライブラリとTesseractエンジンバイナリをラップすることで、C#開発者が利用可能な最も高性能なオープンソースOCRエンジンの1つに直接アクセスできるようにします。

Tesseract自体は、オープンソースの世界におけるOCRの基盤となっている。 元々は1980年代にヒューレット・パッカードで開発され、2005年にGoogleによってオープンソース化されたこのエンジンは、charleswラッパーだけでもNuGetで約800万回ダウンロードされた。 その数字は、ニッチなプロジェクトではなく、真の有用性を反映している。 画像が鮮明で適切な形式であれば、Tesseractは最小限の設定で95%以上の精度を達成します。

このライブラリのあらゆる実用利用を形作る重要なアーキテクチャ上の事実:

-画像のみの入力: Tesseractは画像を処理します。 内部にPDFレンダリング機能はありません。 すべてのPDFワークフローでは、Tesseractが処理する前に各ページを画像に変換するために、個別のライブラリ(PdfiumViewer、PDFtoImage、Docnet.Core、GhostScriptなど)が必要です。 -手動による前処理が必要です。Tesseractは、クリーンで高解像度、かつ適切な向きの画像を必要とします。 内蔵フィルターは搭載されていません。 歪み、ノイズ、低DPI、カラー背景などは、補正を行わないと精度を低下させる要因となり、その補正は完全に開発者の責任となる。

  • Tessdata ファイル管理: 言語認識は、GitHub からダウンロードして tessdata フォルダに配置された .traineddata ファイルに依存しています。 各言語のファイルサイズは15~100MBです。 開発環境、CI環境、ステージング環境、本番環境、Docker環境など、あらゆる環境において、正しいファイルが正しいパスに配置されている必要があります。
  • ネイティブバイナリ配置: ラッパーはプラットフォーム固有のネイティブライブラリを提供します (Windows 上では tesseract50.dll, leptonica-1.82.0.dll;Linux上では .so ファイルです)。 これらはアプリケーションと同時にデプロイし、ターゲットアーキテクチャに適合させる必要があります。
  • 非スレッドセーフエンジン: TesseractEngine インスタンスはスレッド間で共有できません。 並列処理では、スレッドごとに1つのエンジンを作成する必要があり、エンジンの初期化に必要な40~100MBのメモリ使用量が並列度に応じて増加します。
  • Tesseract のバージョンは 4.1.1 に固定されています: charlesw ラッパーは、2019 年にリリースされた Tesseract 4.1.1 を追跡しています。LSTM の精度が向上した Tesseract 5.x は、このパッケージでは利用できません。

前処理のギャップ

前処理の要件は、省略できる設定オプションではありません。これは、実際の文書において、生産精度を確保するか、使用できない出力になるかの分かれ目となるものです。 このラッパーの image-preprocessing-tesseract.cs ソースファイルは、完全な手動パイプラインを文書化しています。

// Tesseract requires every one of these steps to be written manually
public static string ExtractWithPreprocessing(string imagePath)
{
    using (var original = new Bitmap(imagePath))
    {
        // Step 2: Convert to grayscale (~25 lines)
        using (var grayscale = ConvertToGrayscale(original))
        {
            // Step 3: Apply contrast enhancement (~15 lines)
            using (var enhanced = EnhanceContrast(grayscale))
            {
                // Step 4: Binarize — convert to black and white (~15 lines)
                using (var binarized = Binarize(enhanced, 128))
                {
                    // Step 5: Remove noise (~25 lines)
                    using (var denoised = RemoveNoise(binarized))
                    {
                        // Step 6: デスキュー if rotated (~50 lines, simplified)
                        using (var deskewed = Deskew(denoised))
                        {
                            // Step 7: Scale to 300 DPI (~20 lines)
                            using (var scaled = ScaleToDpi(deskewed, 300))
                            {
                                return RunTesseract(scaled);  // Save to temp file, load Pix, process
                            }
                        }
                    }
                }
            }
        }
    }
}
// Tesseract requires every one of these steps to be written manually
public static string ExtractWithPreprocessing(string imagePath)
{
    using (var original = new Bitmap(imagePath))
    {
        // Step 2: Convert to grayscale (~25 lines)
        using (var grayscale = ConvertToGrayscale(original))
        {
            // Step 3: Apply contrast enhancement (~15 lines)
            using (var enhanced = EnhanceContrast(grayscale))
            {
                // Step 4: Binarize — convert to black and white (~15 lines)
                using (var binarized = Binarize(enhanced, 128))
                {
                    // Step 5: Remove noise (~25 lines)
                    using (var denoised = RemoveNoise(binarized))
                    {
                        // Step 6: デスキュー if rotated (~50 lines, simplified)
                        using (var deskewed = Deskew(denoised))
                        {
                            // Step 7: Scale to 300 DPI (~20 lines)
                            using (var scaled = ScaleToDpi(deskewed, 300))
                            {
                                return RunTesseract(scaled);  // Save to temp file, load Pix, process
                            }
                        }
                    }
                }
            }
        }
    }
}
Imports System.Drawing

Public Class ImageProcessor
    ' Tesseract requires every one of these steps to be written manually
    Public Shared Function ExtractWithPreprocessing(imagePath As String) As String
        Using original As New Bitmap(imagePath)
            ' Step 2: Convert to grayscale (~25 lines)
            Using grayscale As Bitmap = ConvertToGrayscale(original)
                ' Step 3: Apply contrast enhancement (~15 lines)
                Using enhanced As Bitmap = EnhanceContrast(grayscale)
                    ' Step 4: Binarize — convert to black and white (~15 lines)
                    Using binarized As Bitmap = Binarize(enhanced, 128)
                        ' Step 5: Remove noise (~25 lines)
                        Using denoised As Bitmap = RemoveNoise(binarized)
                            ' Step 6: デスキュー if rotated (~50 lines, simplified)
                            Using deskewed As Bitmap = Deskew(denoised)
                                ' Step 7: Scale to 300 DPI (~20 lines)
                                Using scaled As Bitmap = ScaleToDpi(deskewed, 300)
                                    Return RunTesseract(scaled)  ' Save to temp file, load Pix, process
                                End Using
                            End Using
                        End Using
                    End Using
                End Using
            End Using
        End Using
    End Function

    ' Placeholder methods for image processing steps
    Private Shared Function ConvertToGrayscale(original As Bitmap) As Bitmap
        ' Implementation goes here
        Return original
    End Function

    Private Shared Function EnhanceContrast(grayscale As Bitmap) As Bitmap
        ' Implementation goes here
        Return grayscale
    End Function

    Private Shared Function Binarize(enhanced As Bitmap, threshold As Integer) As Bitmap
        ' Implementation goes here
        Return enhanced
    End Function

    Private Shared Function RemoveNoise(binarized As Bitmap) As Bitmap
        ' Implementation goes here
        Return binarized
    End Function

    Private Shared Function Deskew(denoised As Bitmap) As Bitmap
        ' Implementation goes here
        Return denoised
    End Function

    Private Shared Function ScaleToDpi(deskewed As Bitmap, dpi As Integer) As Bitmap
        ' Implementation goes here
        Return deskewed
    End Function

    Private Shared Function RunTesseract(scaled As Bitmap) As String
        ' Implementation goes here
        Return String.Empty
    End Function
End Class
$vbLabelText   $csharpLabel

その入れ子になった using 構造はプレースホルダーではなく、各ステップが実際の実装です: グレースケールのためのカラーマトリックス、コントラストのためのピクセル反復、二値化のための別のピクセル反復、ノイズのためのメディアンフィルター、デスキューのためのホフ変換の代替。 image-preprocessing-tesseract.cs ソースに直接記載されています: "簡易デスキュー ― 実際の実装にはホフ変換が必要です。 通常、これにはOpenCVまたは同様のライブラリが必要です。

合計すると、単語が一つも読まれるまでに約180行かかる。 同じファイルにある精度表を見れば、なぜこの投資が必要なのかがわかる。Tesseractを前処理なしで5度傾いた文書に適用した場合、精度は60~70%だが、適切に前処理された入力では90%以上に達する。

IronOCRを理解する

IronOCRは、最適化されたTesseract 5 LSTMエンジン、組み込みの前処理パイプライン、ネイティブPDFサポート、およびネイティブバイナリ管理を必要としないマネージドAPIを組み込んだ商用.NET OCRライブラリです。 このライブラリは、tessdataフォルダ、プラットフォーム固有のDLL展開手順、および追加のPDFレンダリングライブラリを必要とせず、単一のNuGetパッケージとしてインストールされます。

IronOCRの設計を特徴づける主な要素:

  • 自動前処理: Deskew(デスキュー)、DeNoise(デノイズ)、Contrast(コントラスト)、Binarize(二値化)、EnhanceResolution(解像度向上)は、OcrInput 上のワンラインメソッドコールです。 また、このエンジンは、OCRを開始する前に、デフォルトでインテリジェントな自動前処理を適用します。
  • ネイティブ PDF 入力: input.LoadPdf() では、スキャンされた PDF、デジタル PDF、混合 PDF を外部依存なく受け入れます。 パスワードで保護されたPDFには、追加のパラメータが1つ必要です。
  • 125 以上の言語を NuGet 経由で: 言語パックは標準 NuGet パッケージとしてインストールされ、フォルダ管理やパス設定は不要です — IronOcr.Languages.French, IronOcr.Languages.Arabic
  • スレッドセーフ IronTesseract インスタンス: 単一のインスタンスがすべてのスレッドに同時にサービスを提供します。 並列バッチ処理では、スレッドごとのエンジン初期化は不要です。 -クロスプラットフォーム対応の単一パッケージ: Windows、Linux、macOS、Docker、Azure、AWSはすべて同じNuGetパッケージからデプロイでき、プラットフォーム固有の設定は不要です。 -検索可能なPDF出力: OCRの結果を1回のメソッド呼び出しで検索可能なPDFに変換します。
  • 価格設定: $999 Lite 永続 / $1,499 Plus / $2,999 Professional / $5,999 Unlimited — 一度の購入で、ドキュメントごとの料金はなし。

機能比較

フィーチャー テッセラクト(チャールズW) IronOCR
ライセンス アパッチ2.0(無料) 商業用 ($999+ 永続)
PDF入力 なし — 外部ライブラリが必要 ネイティブ組み込み
画像前処理 マニュアル — 100行以上のコード 自動化+一行メソッド
言語管理 tessdataファイルの手動ダウンロード NuGetパッケージのインストール
スレッドセーフ スレッドセーフではありません(スレッドエンジンごと) スレッドセーフなシングルインスタンス
デプロイメント ネイティブDLL + tessdataフォルダ 単一のNuGetパッケージ
Tesseract版 4.1.1 (2019) 5.x に最適化済み

詳細な機能比較

カテゴリー/機能 テッセラクト(チャールズW) IronOCR
セットアップとインストール
NuGetインストール Install-Package Tesseract Install-Package IronOcr
追加のセットアップ手順 tessdataのダウンロード + パス設定 None
ネイティブバイナリ展開 必須 バンドル
Dockerのセットアップ apt-get + tessdata コピー 追加の手順は不要です。
セットアップ時間の目安 2~4時間 5分
前処理
デスキュー マニュアル(50行以上) input.Deskew()
ノイズ除去 マニュアル(25行以上) input.DeNoise()
コントラスト強調 マニュアル(15行以上) input.Contrast()
二値化 マニュアル(15行以上) input.Binarize()
解像度スケーリング マニュアル(20行以上) input.EnhanceResolution(300)
プリプロセッシングコードの総行数 約180行 1~10行
PDFサポート
スキャンされたPDFを読む ネイティブサポートされていません ネイティブ
デジタル版PDFを読む ネイティブサポートされていません ネイティブ
パスワードで保護されたPDF 復号ライブラリが必要です 1つのパラメータ
ページ範囲の選択 マニュアル(PDFライブラリ経由) input.LoadPdfPages()
検索可能なPDFを作成する サポートされていません result.SaveAsSearchablePdf()
言語サポート
英語 含まれています(ファイルが必要です) 含まれるもの
その他の言語 マニュアル .traineddata ダウンロード NuGetパッケージ
言語数 100以上(手動管理) 125+ (NuGet)
1回の通話で多言語対応 "eng+fra+deu" 文字列 AddSecondaryLanguage()
ねじ切り
スレッドセーフエンジン なし はい
並列処理 スレッドごとのエンジン作成 共有単一インスタンス
スレッドごとのメモリ それぞれ40~100MB 共用プール
出力と結果
プレーンテキスト page.GetText() result.Text
単語レベルの境界ボックス ResultIterator ループ result.Words LINQ
信頼度スコア page.GetMeanConfidence() result.Confidence
検索可能なPDF サポートされていません result.SaveAsSearchablePdf()
hOCRエクスポート page.GetHOCRText() result.SaveAsHocrFile()
バーコード検出 サポートされていません ocr.Configuration.ReadBarCodes = true
プラットフォームサポート
ウィンドウズ はい はい
Linux コンパイル/apt-getが必要です はい
macOS 手動設定が必要です はい
Docker 複数ステップのセットアップ すぐに使える

前処理のギャップ

20~40時間という所要時間の見積もりは、前処理の要件に基づいています。 それは誇張ではない。 Tesseractを使用して信頼性の高い前処理パイプラインをゼロから構築するということは、 IronOCRに組み込まれているすべての変換を実装することを意味します。

テッセラクトアプローチ

image-preprocessing-tesseract.cs で示されている完全な前処理パイプラインには System.Drawing.Common(Windows のみ)が必要ですが、ImageSharp のようなクロスプラットフォームのライブラリでも代用できます。デスキューの実装単独でも簡易化されていることが示されており、本番用のスキュー検出アルゴリズムにはホフライン変換が必要で、通常は追加依存関係として OpenCvSharp4 を使用しています:

// image-preprocessing-tesseract.cs — the actual implementation pattern
private static Bitmap ConvertToGrayscale(Bitmap original)
{
    var result = new Bitmap(original.Width, original.Height);
    using (var graphics = Graphics.FromImage(result))
    {
        var colorMatrix = new ColorMatrix(new float[][]
        {
            new float[] { 0.299f, 0.299f, 0.299f, 0, 0 },
            new float[] { 0.587f, 0.587f, 0.587f, 0, 0 },
            new float[] { 0.114f, 0.114f, 0.114f, 0, 0 },
            new float[] { 0, 0, 0, 1, 0 },
            new float[] { 0, 0, 0, 0, 1 }
        });
        using (var attributes = new ImageAttributes())
        {
            attributes.SetColorMatrix(colorMatrix);
            graphics.DrawImage(original,
                new Rectangle(0, 0, original.Width, original.Height),
                0, 0, original.Width, original.Height,
                GraphicsUnit.Pixel, attributes);
        }
    }
    return result;
}

private static Bitmap EnhanceContrast(Bitmap image)
{
    var result = new Bitmap(image.Width, image.Height);
    float contrast = 1.5f;
    for (int y = 0; y < image.Height; y++)
    {
        for (int x = 0; x < image.Width; x++)
        {
            var pixel = image.GetPixel(x, y);
            int r = Clamp((int)((pixel.R - 128) * contrast + 128));
            int g = Clamp((int)((pixel.G - 128) * contrast + 128));
            int b = Clamp((int)((pixel.B - 128) * contrast + 128));
            result.SetPixel(x, y, Color.FromArgb(r, g, b));
        }
    }
    return result;
}

private static Bitmap RemoveNoise(Bitmap image)
{
    var result = new Bitmap(image.Width, image.Height);
    int kernelSize = 3;
    int radius = kernelSize / 2;
    for (int y = radius; y < image.Height - radius; y++)
    {
        for (int x = radius; x < image.Width - radius; x++)
        {
            var pixels = new List<int>();
            for (int ky = -radius; ky <= radius; ky++)
                for (int kx = -radius; kx <= radius; kx++)
                    pixels.Add(image.GetPixel(x + kx, y + ky).R);
            pixels.Sort();
            int median = pixels[pixels.Count / 2];
            result.SetPixel(x, y, Color.FromArgb(median, median, median));
        }
    }
    return result;
}

// After all preprocessing, save to temp file — Tesseract requires a file path
private static string RunTesseract(Bitmap preprocessed)
{
    string tempPath = Path.GetTempFileName() + ".png";
    try
    {
        preprocessed.Save(tempPath, ImageFormat.Png);
        using (var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default))
        using (var img = Pix.LoadFromFile(tempPath))
        using (var page = engine.Process(img))
            return page.GetText();
    }
    finally
    {
        if (File.Exists(tempPath)) File.Delete(tempPath);
    }
}
// image-preprocessing-tesseract.cs — the actual implementation pattern
private static Bitmap ConvertToGrayscale(Bitmap original)
{
    var result = new Bitmap(original.Width, original.Height);
    using (var graphics = Graphics.FromImage(result))
    {
        var colorMatrix = new ColorMatrix(new float[][]
        {
            new float[] { 0.299f, 0.299f, 0.299f, 0, 0 },
            new float[] { 0.587f, 0.587f, 0.587f, 0, 0 },
            new float[] { 0.114f, 0.114f, 0.114f, 0, 0 },
            new float[] { 0, 0, 0, 1, 0 },
            new float[] { 0, 0, 0, 0, 1 }
        });
        using (var attributes = new ImageAttributes())
        {
            attributes.SetColorMatrix(colorMatrix);
            graphics.DrawImage(original,
                new Rectangle(0, 0, original.Width, original.Height),
                0, 0, original.Width, original.Height,
                GraphicsUnit.Pixel, attributes);
        }
    }
    return result;
}

private static Bitmap EnhanceContrast(Bitmap image)
{
    var result = new Bitmap(image.Width, image.Height);
    float contrast = 1.5f;
    for (int y = 0; y < image.Height; y++)
    {
        for (int x = 0; x < image.Width; x++)
        {
            var pixel = image.GetPixel(x, y);
            int r = Clamp((int)((pixel.R - 128) * contrast + 128));
            int g = Clamp((int)((pixel.G - 128) * contrast + 128));
            int b = Clamp((int)((pixel.B - 128) * contrast + 128));
            result.SetPixel(x, y, Color.FromArgb(r, g, b));
        }
    }
    return result;
}

private static Bitmap RemoveNoise(Bitmap image)
{
    var result = new Bitmap(image.Width, image.Height);
    int kernelSize = 3;
    int radius = kernelSize / 2;
    for (int y = radius; y < image.Height - radius; y++)
    {
        for (int x = radius; x < image.Width - radius; x++)
        {
            var pixels = new List<int>();
            for (int ky = -radius; ky <= radius; ky++)
                for (int kx = -radius; kx <= radius; kx++)
                    pixels.Add(image.GetPixel(x + kx, y + ky).R);
            pixels.Sort();
            int median = pixels[pixels.Count / 2];
            result.SetPixel(x, y, Color.FromArgb(median, median, median));
        }
    }
    return result;
}

// After all preprocessing, save to temp file — Tesseract requires a file path
private static string RunTesseract(Bitmap preprocessed)
{
    string tempPath = Path.GetTempFileName() + ".png";
    try
    {
        preprocessed.Save(tempPath, ImageFormat.Png);
        using (var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default))
        using (var img = Pix.LoadFromFile(tempPath))
        using (var page = engine.Process(img))
            return page.GetText();
    }
    finally
    {
        if (File.Exists(tempPath)) File.Delete(tempPath);
    }
}
Imports System.Drawing
Imports System.Drawing.Imaging
Imports Tesseract
Imports System.IO

' image-preprocessing-tesseract.vb — the actual implementation pattern
Private Shared Function ConvertToGrayscale(original As Bitmap) As Bitmap
    Dim result As New Bitmap(original.Width, original.Height)
    Using graphics As Graphics = Graphics.FromImage(result)
        Dim colorMatrix As New ColorMatrix(New Single()() {
            New Single() {0.299F, 0.299F, 0.299F, 0, 0},
            New Single() {0.587F, 0.587F, 0.587F, 0, 0},
            New Single() {0.114F, 0.114F, 0.114F, 0, 0},
            New Single() {0, 0, 0, 1, 0},
            New Single() {0, 0, 0, 0, 1}
        })
        Using attributes As New ImageAttributes()
            attributes.SetColorMatrix(colorMatrix)
            graphics.DrawImage(original, New Rectangle(0, 0, original.Width, original.Height), 0, 0, original.Width, original.Height, GraphicsUnit.Pixel, attributes)
        End Using
    End Using
    Return result
End Function

Private Shared Function EnhanceContrast(image As Bitmap) As Bitmap
    Dim result As New Bitmap(image.Width, image.Height)
    Dim contrast As Single = 1.5F
    For y As Integer = 0 To image.Height - 1
        For x As Integer = 0 To image.Width - 1
            Dim pixel As Color = image.GetPixel(x, y)
            Dim r As Integer = Clamp(CInt((pixel.R - 128) * contrast + 128))
            Dim g As Integer = Clamp(CInt((pixel.G - 128) * contrast + 128))
            Dim b As Integer = Clamp(CInt((pixel.B - 128) * contrast + 128))
            result.SetPixel(x, y, Color.FromArgb(r, g, b))
        Next
    Next
    Return result
End Function

Private Shared Function RemoveNoise(image As Bitmap) As Bitmap
    Dim result As New Bitmap(image.Width, image.Height)
    Dim kernelSize As Integer = 3
    Dim radius As Integer = kernelSize \ 2
    For y As Integer = radius To image.Height - radius - 1
        For x As Integer = radius To image.Width - radius - 1
            Dim pixels As New List(Of Integer)()
            For ky As Integer = -radius To radius
                For kx As Integer = -radius To radius
                    pixels.Add(image.GetPixel(x + kx, y + ky).R)
                Next
            Next
            pixels.Sort()
            Dim median As Integer = pixels(pixels.Count \ 2)
            result.SetPixel(x, y, Color.FromArgb(median, median, median))
        Next
    Next
    Return result
End Function

' After all preprocessing, save to temp file — Tesseract requires a file path
Private Shared Function RunTesseract(preprocessed As Bitmap) As String
    Dim tempPath As String = Path.GetTempFileName() & ".png"
    Try
        preprocessed.Save(tempPath, ImageFormat.Png)
        Using engine As New TesseractEngine(TessDataPath, "eng", EngineMode.Default)
            Using img As Pix = Pix.LoadFromFile(tempPath)
                Using page As Page = engine.Process(img)
                    Return page.GetText()
                End Using
            End Using
        End Using
    Finally
        If File.Exists(tempPath) Then File.Delete(tempPath)
    End Try
End Function

Private Shared Function Clamp(value As Integer) As Integer
    Return Math.Max(0, Math.Min(255, value))
End Function

Private Const TessDataPath As String = "path_to_tessdata" ' Define the path to tessdata directory
$vbLabelText   $csharpLabel

これはソースファイルから抽出した実際のコードであり、意図的に最悪のケースを想定したものです。 コントラストとノイズを除去するためのピクセル反復法は、すべてのピクセルに対してO(n²)の計算量で実行されます。 一時ファイルの保存と読み込みは必須です。 Pix.LoadFromFile にはディスク上のファイルパスが必要です。 1日に1,000件のスキャン済み文書を処理するアプリケーションの場合、これはOCR処理時間に加えて無視できないオーバーヘッドとなります。

IronOCRのアプローチ

IronOCR での同じ前処理は、OcrInput 上のメソッドコールの連続です。

// dotnet add package IronOcr
using IronOcr;

using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

input.Deskew();           // Detects and corrects skew angle automatically
input.DeNoise();          // Removes scanner artifacts and specks
input.Contrast();         // Enhances contrast for character separation
input.Binarize();         // Converts to black and white with adaptive threshold
input.EnhanceResolution(300);  // Scales to 300 DPI for optimal recognition

var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Console.WriteLine(result.Text);
// dotnet add package IronOcr
using IronOcr;

using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

input.Deskew();           // Detects and corrects skew angle automatically
input.DeNoise();          // Removes scanner artifacts and specks
input.Contrast();         // Enhances contrast for character separation
input.Binarize();         // Converts to black and white with adaptive threshold
input.EnhanceResolution(300);  // Scales to 300 DPI for optimal recognition

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

Dim input As New OcrInput()
input.LoadImage("low-quality-scan.jpg")

input.Deskew()           ' Detects and corrects skew angle automatically
input.DeNoise()          ' Removes scanner artifacts and specks
input.Contrast()         ' Enhances contrast for character separation
input.Binarize()         ' Converts to black and white with adaptive threshold
input.EnhanceResolution(300)  ' Scales to 300 DPI for optimal recognition

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

一時ファイルはありません。 ピクセル反復処理は行いません。 System.Drawing.CommonやOpenCvSharp4への依存関係はありません。画像品質補正ガイド画像方向補正ガイドは、利用可能な15種類以上のフィルターカタログ全体を網羅しています。 画像フィルタの例では、低品質スキャンパイプラインの全体像を示しています。

ほとんどの実際の文書では、デフォルトの読み込みでは、明示的なフィルタ呼び出しを一切行わずに、インテリジェントな自動前処理が適用されます。

// Automatic preprocessing applied internally — no explicit filter calls needed
var text = new IronTesseract().Read("scanned-invoice.jpg").Text;
// Automatic preprocessing applied internally — no explicit filter calls needed
var text = new IronTesseract().Read("scanned-invoice.jpg").Text;
Imports IronTesseract

' Automatic preprocessing applied internally — no explicit filter calls needed
Dim text As String = New IronTesseract().Read("scanned-invoice.jpg").Text
$vbLabelText   $csharpLabel

高解像度で鮮明な入力であれば、これは全くコストがかかりません。 72 DPIのスマートフォン写真の場合、エンジンはテキストを認識する前に、拡大縮小、強調、正規化処理を行います。

PDFギャップ

PDFはビジネス文書の標準的な配信形式です。 契約書、請求書、銀行取引明細書、医療記録――それらはすべてPDFファイルで届く。 TesseractはPDFファイルを開くことができません。 橋渡しをするには、別のライブラリ、別のネイティブ依存関係、そして50~150行の接着コードが必要になります。

テッセラクトアプローチ

pdf-ocr-processing-tesseract.cs ファイルは、3 つの別の PDF レンダリングライブラリオプション(PdfiumViewer、PDFtoImage、Docnet.Core)を文書化しており、それぞれに異なる依存関係チェーンとトレードオフがあります。 そのファイルに示されているPdfiumViewerのパターンは、代表的なものです。

// Tesseract PDF processing — from pdf-ocr-processing-tesseract.cs
// Requires: PdfiumViewer NuGet + pdfium native DLL deployed to application directory
// NuGet: PdfiumViewer, PdfiumViewer.Native.x64

using PdfiumViewer;

public static string ExtractFromPdfWithPdfium(string pdfPath)
{
    var results = new List<string>();

    using (var document = PdfDocument.Load(pdfPath))
    {
        using (var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default))
        {
            for (int pageIndex = 0; pageIndex < document.PageCount; pageIndex++)
            {
                // Render page to image at 300 DPI
                using (var pageImage = document.Render(pageIndex, 300, 300,
                    PdfRenderFlags.CorrectFromDpi))
                {
                    // Tesseract requires a file path — must write to disk first
                    string tempPath = Path.GetTempFileName() + ".png";
                    try
                    {
                        pageImage.Save(tempPath);
                        using (var img = Pix.LoadFromFile(tempPath))
                        using (var page = engine.Process(img))
                            results.Add(page.GetText());
                    }
                    finally
                    {
                        File.Delete(tempPath);  // Must clean up or disk fills
                    }
                }
            }
        }
    }

    return string.Join("\n\n--- Page Break ---\n\n", results);
}
// Tesseract PDF processing — from pdf-ocr-processing-tesseract.cs
// Requires: PdfiumViewer NuGet + pdfium native DLL deployed to application directory
// NuGet: PdfiumViewer, PdfiumViewer.Native.x64

using PdfiumViewer;

public static string ExtractFromPdfWithPdfium(string pdfPath)
{
    var results = new List<string>();

    using (var document = PdfDocument.Load(pdfPath))
    {
        using (var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default))
        {
            for (int pageIndex = 0; pageIndex < document.PageCount; pageIndex++)
            {
                // Render page to image at 300 DPI
                using (var pageImage = document.Render(pageIndex, 300, 300,
                    PdfRenderFlags.CorrectFromDpi))
                {
                    // Tesseract requires a file path — must write to disk first
                    string tempPath = Path.GetTempFileName() + ".png";
                    try
                    {
                        pageImage.Save(tempPath);
                        using (var img = Pix.LoadFromFile(tempPath))
                        using (var page = engine.Process(img))
                            results.Add(page.GetText());
                    }
                    finally
                    {
                        File.Delete(tempPath);  // Must clean up or disk fills
                    }
                }
            }
        }
    }

    return string.Join("\n\n--- Page Break ---\n\n", results);
}
Imports PdfiumViewer
Imports Tesseract

Public Shared Function ExtractFromPdfWithPdfium(pdfPath As String) As String
    Dim results As New List(Of String)()

    Using document = PdfDocument.Load(pdfPath)
        Using engine = New TesseractEngine(TessDataPath, "eng", EngineMode.Default)
            For pageIndex As Integer = 0 To document.PageCount - 1
                ' Render page to image at 300 DPI
                Using pageImage = document.Render(pageIndex, 300, 300, PdfRenderFlags.CorrectFromDpi)
                    ' Tesseract requires a file path — must write to disk first
                    Dim tempPath As String = Path.GetTempFileName() & ".png"
                    Try
                        pageImage.Save(tempPath)
                        Using img = Pix.LoadFromFile(tempPath)
                            Using page = engine.Process(img)
                                results.Add(page.GetText())
                            End Using
                        End Using
                    Finally
                        File.Delete(tempPath)  ' Must clean up or disk fills
                    End Try
                End Using
            Next
        End Using
    End Using

    Return String.Join(vbCrLf & vbCrLf & "--- Page Break ---" & vbCrLf & vbCrLf, results)
End Function
$vbLabelText   $csharpLabel

pdf-ocr-processing-tesseract.cs ソースには依存関係チェーンが直接記載されている: "Tesseract: Apache 2.0, PdfiumViewer: BSD, iText: AGPL または商業用, GhostScript: AGPL または商業用。 最後の項目はエンタープライズの文脈では重要です ― GhostScript の AGPL ライセンスは、商業用 GhostScript ライセンスを購入しない限り、アプリケーションをオープンソースにすることを要求します。

パスワードで保護されたPDFは、さらにセキュリティ層を厚くする。 同じファイルの PasswordProtectedPdf クラスは、NotImplementedException を"暗号化サポート (iText, PDFSharp) を持つ PDF ライブラリが必要"とのコメントで投げます。 TesseractはPDFを復号化できません。そのため、パスワード保護は、独自のライセンス上の考慮事項を伴う4つ目の依存関係を意味します。

IronOCRのアプローチ

IronOCRは、スキャンされたPDF、デジタルテキストPDF、混合コンテンツPDF、パスワードで保護されたPDFなど、PDFをネイティブに読み取ります。

// dotnet add package IronOcr
using IronOcr;

// Scanned PDF — direct load, no rendering library required
var result = new IronTesseract().Read("scanned-contract.pdf");
Console.WriteLine(result.Text);

// Password-protected PDF — one additional parameter
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var protectedResult = new IronTesseract().Read(input);

// Specific page range from a 200-page document
using var rangeInput = new OcrInput();
rangeInput.LoadPdfPages("large-report.pdf", 1, 10);
var rangeResult = new IronTesseract().Read(rangeInput);

// Create searchable PDF with embedded text layer
var searchable = new IronTesseract().Read("scanned-invoice.pdf");
searchable.SaveAsSearchablePdf("searchable-invoice.pdf");
// dotnet add package IronOcr
using IronOcr;

// Scanned PDF — direct load, no rendering library required
var result = new IronTesseract().Read("scanned-contract.pdf");
Console.WriteLine(result.Text);

// Password-protected PDF — one additional parameter
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var protectedResult = new IronTesseract().Read(input);

// Specific page range from a 200-page document
using var rangeInput = new OcrInput();
rangeInput.LoadPdfPages("large-report.pdf", 1, 10);
var rangeResult = new IronTesseract().Read(rangeInput);

// Create searchable PDF with embedded text layer
var searchable = new IronTesseract().Read("scanned-invoice.pdf");
searchable.SaveAsSearchablePdf("searchable-invoice.pdf");
Imports IronOcr

' Scanned PDF — direct load, no rendering library required
Dim result = New IronTesseract().Read("scanned-contract.pdf")
Console.WriteLine(result.Text)

' Password-protected PDF — one additional parameter
Using input As New OcrInput()
    input.LoadPdf("encrypted.pdf", Password:="secret")
    Dim protectedResult = New IronTesseract().Read(input)
End Using

' Specific page range from a 200-page document
Using rangeInput As New OcrInput()
    rangeInput.LoadPdfPages("large-report.pdf", 1, 10)
    Dim rangeResult = New IronTesseract().Read(rangeInput)
End Using

' Create searchable PDF with embedded text layer
Dim searchable = New IronTesseract().Read("scanned-invoice.pdf")
searchable.SaveAsSearchablePdf("searchable-invoice.pdf")
$vbLabelText   $csharpLabel

PDFレンダリングライブラリがありません。 一時ファイルはありません。 AGPLライセンスに関する考慮事項はありません。 PDF入力方法に関するガイドでは、すべてのPDF入力方法を網羅しています。 検索可能なPDF形式のハウツーガイドでは、テキストレイヤーの出力方法について説明しています。 文書処理パイプラインを構築するチーム向けに、 PDF OCRのユースケースページには、本番環境におけるアーキテクチャパターンが掲載されています。

前処理メソッドは PDF 入力上で同じように機能するため、input.Deskew(), input.DeNoise(), input.EnhanceResolution() といった呼び出しをスキャンされた PDF で中間変換ステップなしで実行できます。

テストデータ管理

すべての Tesseract 展開には tessdata フォルダの問題が含まれています。 フォルダは存在し、正しい .traineddata ファイルで満たされ、TesseractEngine 初期化で指定されたパスでアクセス可能でなければなりません。 これは、規模が大きくなるにつれて複雑化する導入の複雑さを生み出します。

テッセラクトアプローチ

multi-language-tesseract.cs ファイルは、言語ファイルのサイズと管理プロセスを文書化しています。

// Must exist before initialization:
// ./tessdata/eng.traineddata   (~15 MB)
// ./tessdata/fra.traineddata   (~15 MB)
// ./tessdata/deu.traineddata   (~15 MB)
// ./tessdata/chi_sim.traineddata  (~45 MB)
// ./tessdata/jpn.traineddata   (~40 MB)
// 10 languages = 200-300 MB to download and manage

public string SafeMultiLanguageOcr(string imagePath, string[] languages)
{
    // Check presence before attempting — runtime failures are worse
    foreach (var lang in languages)
    {
        if (!File.Exists(Path.Combine(TessDataPath, $"{lang}.traineddata")))
        {
            throw new FileNotFoundException(
                $"Missing {lang}.traineddata in {TessDataPath}. " +
                "Download from https://github.com/tesseract-ocr/tessdata");
        }
    }

    var langString = string.Join("+", languages);  // e.g., "eng+fra+deu"
    using var engine = new TesseractEngine(TessDataPath, langString, EngineMode.Default);
    using var img = Pix.LoadFromFile(imagePath);
    using var page = engine.Process(img);
    return page.GetText();
}
// Must exist before initialization:
// ./tessdata/eng.traineddata   (~15 MB)
// ./tessdata/fra.traineddata   (~15 MB)
// ./tessdata/deu.traineddata   (~15 MB)
// ./tessdata/chi_sim.traineddata  (~45 MB)
// ./tessdata/jpn.traineddata   (~40 MB)
// 10 languages = 200-300 MB to download and manage

public string SafeMultiLanguageOcr(string imagePath, string[] languages)
{
    // Check presence before attempting — runtime failures are worse
    foreach (var lang in languages)
    {
        if (!File.Exists(Path.Combine(TessDataPath, $"{lang}.traineddata")))
        {
            throw new FileNotFoundException(
                $"Missing {lang}.traineddata in {TessDataPath}. " +
                "Download from https://github.com/tesseract-ocr/tessdata");
        }
    }

    var langString = string.Join("+", languages);  // e.g., "eng+fra+deu"
    using var engine = new TesseractEngine(TessDataPath, langString, EngineMode.Default);
    using var img = Pix.LoadFromFile(imagePath);
    using var page = engine.Process(img);
    return page.GetText();
}
Imports System.IO
Imports Tesseract

Public Function SafeMultiLanguageOcr(imagePath As String, languages As String()) As String
    ' Check presence before attempting — runtime failures are worse
    For Each lang In languages
        If Not File.Exists(Path.Combine(TessDataPath, $"{lang}.traineddata")) Then
            Throw New FileNotFoundException(
                $"Missing {lang}.traineddata in {TessDataPath}. " &
                "Download from https://github.com/tesseract-ocr/tessdata")
        End If
    Next

    Dim langString = String.Join("+", languages)  ' e.g., "eng+fra+deu"
    Using engine As New TesseractEngine(TessDataPath, langString, EngineMode.Default)
        Using img As Pix = Pix.LoadFromFile(imagePath)
            Using page As Page = engine.Process(img)
                Return page.GetText()
            End Using
        End Using
    End Using
End Function
$vbLabelText   $csharpLabel

防御的なファイルの存在チェックは過剰ではありません — .traineddata ファイルが見つからない場合、どのファイルが欠けているかを必ずしも明確に示さないメッセージで TesseractException: Failed to initialise tesseract engine が発生します。 basic-text-extraction-tesseract.cs ソースには、一般的なランタイム例外が文書化されています: 欠けている Leptonica バイナリ用の System.DllNotFoundException、欠けている tessdata 用の TesseractException、32/64 ビットの不一致用の BadImageFormatException

Docker環境では、tessdataファイルをコンテナイメージにコピーする必要があります。 3 つの言語をそれぞれ 15 MB で追加し、best モデルをそれぞれ 50-100 MB で追加すると、コンテナイメージは数百メガバイト膨らみます。 CI/CDパイプラインは、これらのダウンロードをキャッシュするか、キャッシュがコールド状態のときにビルド時間が遅くなることを許容する必要があります。

IronOCRのアプローチ

IronOCRにおける言語サポートは、 NuGetパッケージのリファレンスです。

// Install once: dotnet add package IronOcr.Languages.French
// Install once: dotnet add package IronOcr.Languages.German
using IronOcr;

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);

var result = ocr.Read("multilingual-document.jpg");
// Install once: dotnet add package IronOcr.Languages.French
// Install once: dotnet add package IronOcr.Languages.German
using IronOcr;

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);

var result = ocr.Read("multilingual-document.jpg");
Imports IronOcr

' Install once: dotnet add package IronOcr.Languages.French
' Install once: dotnet add package IronOcr.Languages.German

Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.French
ocr.AddSecondaryLanguage(OcrLanguage.German)

Dim result = ocr.Read("multilingual-document.jpg")
$vbLabelText   $csharpLabel

言語データはNuGetパッケージに組み込まれています。 作成するフォルダも、設定するパスも、 GitHubからダウンロードして検証するファイルもありません。Dockerに言語を追加することは、PackageReference ラインを .csproj に追加することを意味します。 多言語対応のハウツーガイドでは、125以上の言語カタログ全体を網羅しており、 多言語対応のブログ記事では、CJK文字セットを含む本番環境における多言語パイプラインについて詳しく解説しています。

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

Tesseract (charlesw) API IronOCR相当値
new TesseractEngine(tessDataPath, "eng", EngineMode.Default) new IronTesseract()
Pix.LoadFromFile(path) input.LoadImage(path) または ocr.Read(path)
Pix.LoadFromMemory(bytes) input.LoadImage(bytes)
engine.Process(img) ocr.Read(input)
page.GetText() result.Text
page.GetMeanConfidence() result.Confidence
page.GetHOCRText(0) result.SaveAsHocrFile(path)
engine.Process(img, tessRect) input.LoadImage(path, new CropRectangle(...))
iter.GetText(PageIteratorLevel.Word) result.Words[i].Text
iter.GetConfidence(PageIteratorLevel.Word) result.Words[i].Confidence
iter.TryGetBoundingBox(PageIteratorLevel.Word, out bounds) result.Words[i].X, .Y, .Width, .Height
"eng+fra+deu" 言語文字列 ocr.AddSecondaryLanguage(OcrLanguage.French)
該当なし — PdfiumViewerまたは同様のツールが必要です input.LoadPdf(path)
該当なし — PDFライブラリが必要です input.LoadPdf(path, Password: "secret")
該当なし — サポートされていません result.SaveAsSearchablePdf(outputPath)
手動前処理パイプライン input.Deskew(), input.DeNoise(), input.Binarize()
スレッドごとの手動マルチスレッドエンジン スレッドセーフな単一 IronTesseract インスタンス

チームがTesseractからIronOCRへの移行を検討する場合

前処理のマイルストーンが到来

Tesseractのすべてのプロジェクトは、クリーンなテストイメージから始まります。 サンプル請求書、鮮明にスキャンされた文書、初回読み込みで正常に動作する300 DPIのPNGファイル。 前処理に関する問題は後回しにされる。 そして最初の生産バッチが届く。150 DPIでファックス送信された発注書、3度傾いたスキャン済みの契約書、蛍光灯の下で撮影された領収書の写真などだ。 精度は60~70%に低下する。 チームは延期されていた前処理パイプラインの実装に取り​​組んだが、グレースケール変換とコントラスト強調は処理可能であるものの、傾き補正にはハフ変換が必要で、ノイズ除去にはメディアンフィルタが必要であり、どちらも2時間でできる作業ではないことが判明した。 このマイルストーンにいるチーム — 前処理の債務がスプリントバックログ項目になるところ — は、ライセンスコストが2人の開発者が画像処理作業に費やす2週間より安いため、しばしばIronOCRを評価します。

PDF要件が表示されます

文書処理アプリケーションは、ほぼ例外なく最終的にはPDFサポートを必要とする。 最初に思い浮かぶのは"PdfiumViewerを追加する"という回答でしょう。これはドキュメントが充実しており、多くのケースに適切に対応できます。 プロダクションで問題が発生します: ネイティブ pdfium.dll はアプリケーションディレクトリに正しいビットで存在する必要があり、コンテナイメージには Dockerfile の明示的な COPY ステップが必要であり、Linux 展開には対応する .so ファイルが必要であり、パスワード保護された PDF には個別の暗号化解除ライブラリが必要です。 Tesseractネイティブライブラリ、Leptonica、pdfiumという3つの異なる依存関係チェーンを4つの環境(Windows、Linux、Docker、CI)で管理しているチームは、メンテナンスの限界に達し、単一パッケージの代替案を検討する価値が出てきます。

大規模並列処理

500件の請求書を処理するバッチOCRジョブは、並列処理によってメリットが得られます。 charleswラッパーを使用すると、安全な並列処理パターンによってスレッドごとに1つのエンジンインスタンスが作成され、それぞれ40~100MBの言語モデルデータがロードされます。 8スレッドの場合、ドキュメントを読み込む前の段階で320~800MBのエンジンメモリが必要になります。 OCRサービスをプロファイリングし、メモリ負荷がドキュメントの内容ではなくエンジンの初期化に集中していることに気づいたチームは、IronOCRのスレッドセーフなシングルインスタンスモデルが根本原因に直接対処していることを発見しました。 マルチスレッドの例は、そのパターンを示している。

展開環境が増加する

Windows上で開始されたプロジェクトに、クラウド展開用のLinuxコンテナが追加されました。 Dockerfileにはネイティブライブラリのインストール手順が必要になり、tessdataファイルをコンテナ内にコピーし、tessdataパス環境変数を正しく設定する必要があります。 その後、macOS開発者がチームに加わった。 そして、誰かがAWS Lambdaにデプロイしたいと考える。 各プラットフォームは、サイレントに障害が発生する可能性のある設定項目を新たに追加します。本番環境のコンテナで実行時にネイティブライブラリが見つからないことは、 NuGetパッケージのコストがわずかに高くなるよりも深刻な問題です。IronOCR のDockerデプロイメントガイドは、その対照を示しています。システムパッケージも、tessdataのコピー手順も、環境変数もありません。

Tesseract版の通貨に関する問題

Tesseract 5.x では、特定の文書タイプで測定可能な LSTM 精度の向上が導入されました。charlesw ラッパーは Tesseract 4.1.1 を対象としています。難しい文書での OCR 精度が製品品質の指標となるチームにとって、バージョン間のギャップは真剣に検討すべき事項です。特に、代替手段として最新のエンジンリリースを追跡する商用メンテナンスパッケージがある場合はなおさらです。

一般的な移行の考慮事項

Tessdataフォルダの削除

IronOCR への移行後の最初のクリーンアップステップは、tessdata フォルダを削除し、プロジェクトファイルから対応する <Content Include="tessdata\**"> 項目を削除することです。ハードコーディングされたパスの検証コード — basic-text-extraction-tesseract.cs 内の Directory.Exists(TessDataPath) ガードも削除されます。 using Tesseract; 名前空間参照および Page 型参照はすべて OcrResult に置き換える必要があります。

PDFライブラリの削除

Tesseract PDF処理をサポートするためだけに追加されたPDFレンダリングライブラリ(PdfiumViewer、PDFtoImage、Docnet.Coreなど)は削除できます。 それらのパッケージが必要とするネイティブバイナリ依存関係 (pdfium.dll, GhostScript バイナリ) も消えます。 それらの依存関係のための Dockerfile COPYapt-get ラインはもはや必要ありません。 IronOCRのPDF入力ガイドでは、ページ範囲の選択やパスワードで保護された文書など、これらのライブラリが扱うすべてのPDF入力形式について解説しています。 レンダリングから OCR への全体のブロック、通常 50-80 行で 3 つのライブラリにわたりますが、input.LoadPdf(path) の後に単一の Read() コールに縮小されます。

前処理コード置換

既存の前処理メソッド — ScaleToDpi — は、IronOCR のフィルタメソッドに直接マッピングされます。 一時ファイルの保存と読み込みのパターンが完全に消滅します。 色固有の変換については画像色補正ガイドを、解像度管理についてはDPI設定ガイドを参照してください。

スレッドモデルの変更

各スレッドごとに Parallel.ForEach ループ内で TesseractEngine を作成するコードは、ループの前に一度 IronTesseract を作成し、すべてのスレッドで共有するように変更されます。 これは単なるリファクタリングではなく、正当性に関する変更です。以前のパターンは、スレッドセーフでないAPIに対する防御的なプログラミングでした。 新しいパターンは、スレッドセーフなAPIの意図された使用方法です。 この変更により、スレッドごとのエンジン初期化オーバーヘッド(スレッドあたり40~100MBの言語モデルデータ)は解消されます。これは、 IronOCRがエンジンインスタンスごとに完全なモデル状態をロードするのではなく、共有の内部プールを維持するためです。

IronOCRの追加機能

前処理やPDFサポートに加え、 IronOCRはコアとなる比較機能にとどまらない、幅広い機能を備えています。

-領域ベースのOCR:画像全体を処理することなく、定義された切り抜き領域からテキストを抽出します。 この地域OCRガイド切り抜き例では、請求書ヘッダーの抽出とフォームフィールドの分離について説明しています。

  • 信頼性に基づく品質ルーティング: result.Confidence は、低信頼性の結果を OCR を二度実行することなく人間のレビューキューにルーティングできるドキュメントレベルの精度推定を提供します。信頼性スコアガイドを参照してください。 -非同期OCR:非同期OCRガイドでは、CPUバウンドな操作でリクエストスレッドをブロックすることが許容されないASP.NET Coreアプリケーション向けの非ブロッキングOCRについて説明します。 -特殊な文書タイプ:パスポート読み取りMICR/小切手読み取りナンバープレート読み取りは、カスタムトレーニングモデルを必要とせずに、対象機能として利用可能です。 -速度設定:ドキュメントごとのレイテンシが重要な高スループットバッチ処理のための速度最適化ガイド速度チューニング例ドキュメント設定オプション。

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

IronOCRは.NET 6、 .NET 7、 .NET 8、および.NET 9を対象としており、2026年のリリース時には.NET 10を積極的にサポートする予定です。 このライブラリは、最新 for .NETに移行していないプロジェクト向けに、 .NET Standard 2.0もサポートしています。 charlesw Tesseract ラッパーは.NET Standard 2.0 を対象としており、2019 年版の Tesseract エンジン バージョン 4.1.1 に固定されています。このパッケージを通じた Tesseract 5.x のサポートに関するロードマップは発表されていません。 新規開発プロジェクトや複数年にわたるメンテナンス期間を計画しているチームにとって、エンジンのバージョンギャップとラッパーのメンテナンス頻度の低下は、無料ライセンスと並んで考慮すべき重要な要素です。

結論

charlesw NuGetラッパーを介したTesseractは、おもちゃではなく、正真正銘のOCRエンジンです。 800万ダウンロードという数字は、実際のアプリケーションにおける実際の使用状況を反映しており、クリーンで適切にフォーマットされた画像においては、その人気を正当化する精度レベルに達している。 真の比較対象はOCRの品質ではなく、その品質を実運用環境で実現するために必要なエンジニアリング作業の規模である。

前処理のギャップが、最も重要なトレードオフである。 実世界の文書において、精度が高いものと低いものを区別するために、およそ180行もの画像処理コードを書くのは、決して些細な不便ではない。 これは、画像処理の知識、追加の依存関係、そして新しい文書タイプが登場するたびに継続的なメンテナンスが必要となる、技術的な作業です。 PDFのギャップは、さらに別の問題を引き起こす。すなわち、2つ目のライブラリ、2つ目のネイティブバイナリセット、別の展開環境、そしてGhostScriptやiTextとのライセンス上の潜在的な問題である。 これら二つのギャップが合わさって、プロトタイプと量産システムを区別する20~40時間のセットアップ時間の見積もりにつながっている。

IronOCRは、これらの2つの課題に直接的に対処します。前処理は1行のメソッド呼び出しで済み、PDFはネイティブの入力フォーマットであり、ソリューション全体が単一のNuGetパッケージとしてデプロイされます。 $999 永続ライセンスは、画像処理コードと依存関係チェーン管理に2週間を費やさないための費用です。 開発者時間がライセンス価格より高価なチームにとって、この数学は簡単です。 オープンソースライセンスの要件があるチームや予算がゼロのチームにとって、Tesseractは依然として有力な選択肢であり、それに伴うエンジニアリング投資についても十分に考慮する必要がある。

この決定は、文書の種類と運用状況に明確に合致している。単一環境での展開において、クリーンで管理されたイメージは、Tesseractの無料ライセンスに適している。 実世界のスキャン、PDFワークフロー、マルチ環境展開、大規模な並列処理といった要素はそれぞれ摩擦を生み出し、 IronOCRに有利な状況を作り出します。 ほとんどの生産文書処理システムは、これらの条件のうち少なくとも2つに遭遇する。

ご注意Ghostscript, PDFium, PDFSharp, Tesseract, iTextはそれぞれの所有者に登録商標されています。 このサイトはArtifex Software, Chromium Project, Google, empira Software GmbH, iText Groupとの提携、支援、またはスポンサーシップは受けていません。全ての製品名、ロゴ、ブランドはそれぞれの所有者に帰属します。 比較は情報提供のみを目的としており、執筆時点で公開されている情報を反映しています。

よくある質問

Tesseract OCRとは?

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

IronOCRはTesseract OCR for .NET開発者と比べてどうですか?

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

IronOCR はTesseract OCRより簡単にセットアップできますか?

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

Tesseract OCRとIronOCRにはどのような精度の違いがありますか?

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

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

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

Tesseract 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 はTesseract OCRと違い、Dockerやコンテナでのデプロイに適していますか?

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

Tesseract OCRと比較して、購入前にIronOCRを試すことはできますか?

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

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

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

Tesseract OCRからIronOCRへの移行は簡単ですか?

Tesseract 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時間オンラインで対応しています。
チャット
メール
電話してね