IRONSOFTWAREHOME
ビデオ

Tesseract OCR WrapperからironOCRへの移行|ironOCR

Kannaopat Udonpant
Kannapat Udonpant
Updated: 2026年8月1日

このガイドは、現在 TesseractOCR NuGet パッケージを使用しており、IronOCR に明確なステップバイステップのパスが必要な .NET 開発者向けです。 本製品は、移行の主な要因となる具体的な課題(API カバレッジの不備やエラー報告の不整合)に対処し、本番環境のアプリケーションにおいてこれらの課題が最も大きな障害となるシナリオについて、移行前後のコード例を提供します。

Tesseract OCR Wrapperからの移行理由

TesseractOCR パッケージ(コミュニティ開発者 Oachkatzlschwoaf によって公開)は、Tesseract エンジンを管理された .NET API として公開する基本的な問題を解決します。 概念実証(PoC)作業においては、これで十分です。 信頼性の高いエラー信号、複数の出力形式、および完全なAPIインターフェースを必要とする本番システムにおいて、このラッパーの設計上の選択は障害となります。

**不完全なAPIインターフェース。**このラッパーは、テキスト抽出機能と、集計された信頼度(float型)を公開しています。 公開APIには、WORDレベルのデータ、バウンディングボックス、行レベルのトラバーサル、および段落レベルのグループ化は含まれていません。 値がページ上のどこに表示されるかを把握する必要があるアプリケーション(請求書のフィールド抽出、情報マスキングのパイプライン、文書分析など)は、このラッパー内では実現できません。 生のTesseractデータからhOCRを解析するための2つ目のライブラリを追加すると、時間の経過とともに積もり積もる統合作業が発生します。

無効な入力のサイレント失敗。 Tesseract エンジンが劣化した画像、未対応の形式、または内部処理エラーに遭遇すると、ラッパーはキャッチ可能な管理例外をスローする代わりに、page.GetText()から空の文字列を返します。 呼び出し元のコードは、正当な空白ページと見分けがつかない空の結果を受け取ります。 1日に数千件のドキュメントを処理する自動化パイプラインでは、監査によって問題が明らかになるまで、何ヶ月もデータが黙って失われている可能性があります。

**検索可能なPDF出力は行われません。**このラッパーはプレーンテキストを出力します。 そのテキストを検索可能なPDFに変換するには(これは法務、医療、金融サービス分野における標準的なコンプライアンス要件です)、別途PDFライブラリ、手動によるテキストレイヤーの組み立て、およびページ座標の計算が必要となります。 その統合コードは150~300行に及び、独立して保守される必要があります。

ネイティブPDF入力がありません。 ラッパーを使用してPDFを処理するすべてのコードベースにはPDF-to-imageラスター層があります:通常、PdfiumViewer、Ghostscript、またはPDFSharpが各PDFページをビットマップに変換するレンダラーAPIを呼び出します。その依存性は複雑さを増し、中間のラスター化から質の低下を導入し、独自のデプロイの設定が必要です。

マルチフォーマット入力処理なし。 ラッパーの主な入力パスは、Pix.Image.LoadFromFile に渡されるファイルパス文字列です。 アップロードされたファイルを受け取るASP.NETアプリケーションで一般的な、ストリームベースおよびバイト配列ベースの入力では、まずバイトを一時ファイルに書き出し、そのパスをエンジンに渡した後、一時ファイルをクリーンアップする必要があります。このパターンはエラーが発生しやすく、不必要なものです。

**エンジン設定の柔軟性。**このラッパーは、Tesseractのエンジン設定オプションの一部のみを公開しています。 ページ分割モードは利用可能ですが、解像度の正規化、出力タイプ、および認識パラメータの設定には、ラッパーが提供する抽象化レベルよりも低いレベルでの作業が必要となります。

基本的な問題

ラッパーのエラー契約は未定義です。 一見成功したように見える呼び出しでも、結果を黙って破棄してしまうことがあります:

// TesseractOCR: no way to tell failure from "no text on this page"
using var engine = new Engine(@"./tessdata", Language.English);
using var img = Pix.Image.LoadFromFile(imagePath);
using var page = engine.Process(img);

var text = page.Text; // returns "" on engine failure — same as blank page
// Caller cannot distinguish OCR failure from legitimate empty result
C#

IronOCRはエンジン障害時に例外をスローし、成功した結果ごとに数値による信頼度スコアを返します:

// IronOCR: failures throw, low-confidence results are detectable
var result = new IronTesseract().Read(imagePath);
// result.Confidence is 0-100; a score below 10 signals a processing problem
// An engine failure throws IronOcrException — never returns a silent empty string
Console.WriteLine($"Text: {result.Text}, Confidence: {result.Confidence}%");
C#

IronOCR 対 Tesseract OCR Wrapper:機能比較

以下の表は、本番環境のドキュメント処理アプリケーションにおいて最も重要な機能についてまとめたものです。

フィーチャーTesseract OCR ラッパーIronOCR
NuGetパッケージTesseractOCR + 手動のtessdata + ネイティブバイナリIronOcr (すべての依存関係をバンドル)
ライセンスアパッチ2.0(無料)商用 ($999–$2,399 永続)
エンジンバージョン同梱されているネイティブバイナリに依存します最適化された Tesseract 5(同梱)
プレーンテキスト出力はい (page.Text)はい (result.Text)
検索可能なPDF出力なしはい (result.SaveAsSearchablePdf())
hOCRエクスポートなしはい (result.SaveAsHocrFile())
構造化された単語/行/段落データなしはい(バウンディングボックスの座標付き)
単語ごとの信頼度スコアなしはい (word.Confidence)
総合的な信頼度はい (page.GetMeanConfidence(), 浮動小数点 0–1)はい (result.Confidence, ダブル 0–100)
一貫したエラー処理なし(失敗時は空文字列)はい(全体を通じて例外処理を適切に処理)
ネイティブPDF入力なしはい
パスワードで保護されたPDFファイルの入力なしはい
複数ページTIFF入力制限的はい
ストリームおよびバイト配列入力直接サポートは提供されませんはい (input.LoadImage(stream), input.LoadImage(bytes))
自動傾き補正なしはい
自動ノイズ除去なしはい
自動コントラスト強調なしはい
二値化なしはい
OCR中のバーコード読み取りなしはい (ocr.Configuration.ReadBarCodes = true)
地域ベースのOCR公開されているAPIはありませんはい (CropRectangle)
スレッドセーフティ制限的フル(スレッドごとに 1 つの IronTesseract インスタンス)
クロスプラットフォーム展開ネイティブバイナリの設定が必要ですWindows、Linux、macOS、Docker、Azure、AWS
.NET バージョンのサポートラッパーのバージョンによって異なります.NET Framework 4.6.2 以降、.NET Core、.NET 5/6/7/8/9
商用サポートNoneはい(メール、上位プラン優先)

クイックスタート:Tesseract OCR ラッパーから IronOCR への移行

ステップ 1: NuGet パッケージを置き換える

既存のパッケージを削除してください:

dotnet remove package TesseractOCR
SHELL

NuGetからIronOCRをインストールしてください。

dotnet add package IronOcr

プロジェクトで複数の言語を使用する場合は、該当する言語パックをインストールしてください:

dotnet add package IronOcr.Languages.French, IronOcr.Languages.German

ステップ 2: 名前空間の更新

古い名前空間の参照を IronOCR 名前空間に置き換えてください:

// Before (Tesseract OCR Wrapper)
using TesseractOCR;
using TesseractOCR.Enums;

// After (IronOCR)
using IronOcr;
C#

ステップ 3: ライセンスの初期化

アプリケーションの起動時、OCR処理が実行される前に、ライセンスキーの呼び出しを1回追加してください:

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

IronOCRのライセンスページから無料トライアルキーを入手でき、評価期間中は全機能を利用可能です。

コード移行の例

サイレント失敗を信頼性の高いエラー処理に置き換える

ラッパーのエラー挙動は、多くのチームが最初に直面する移行の引き金となります。自動化されたパイプラインが数週間稼働した後、監査によって一部のレコードにデータが含まれていないことが判明します。これはドキュメントが空白だったからではなく、エンジンが特定の画像条件で静かに失敗したためです。

Tesseract OCR ラッパーのアプローチ:

using TesseractOCR;

public class DocumentProcessor
{
    private readonly string _tessDataPath = @"./tessdata";

    public string ProcessDocument(string imagePath)
    {
        using var engine = new Engine(_tessDataPath, Language.English);
        using var img = Pix.Image.LoadFromFile(imagePath);
        using var page = engine.Process(img);

        // Empty string on engine failure — indistinguishable from blank page
        // なし exception thrown, no confidence signal, no recovery path
        var text = page.Text;

        // Caller cannot tell if this is "" because:
        // - The document is genuinely blank
        // - The image format was not supported
        // - The engine encountered an internal error
        // - The tessdata was corrupted or version-mismatched
        return text;
    }
}
C#

IronOCRのアプローチ:

using IronOcr;

public class DocumentProcessor
{
    public string ProcessDocument(string imagePath)
    {
        try
        {
            var result = new IronTesseract().Read(imagePath);

            // Confidence below threshold means the result is unreliable
            if (result.Confidence < 15)
            {
                // Route to human review queue — do not silently write empty data
                throw new InvalidOperationException(
                    $"OCR confidence too low ({result.Confidence:F1}%) for: {imagePath}");
            }

            return result.Text;
        }
        catch (IronOcrException ex)
        {
            // Engine failures are typed exceptions — never silent empty strings
            // Log and rethrow with context so the pipeline can flag the document
            throw new ApplicationException(
                $"OCR engine failure processing '{imagePath}': {ex.Message}", ex);
        }
    }
}
C#

あらゆる障害モードは、キャッチ可能な型付き例外として発生します。 品質の低い翻訳結果には信頼度スコアが表示されるため、呼び出し元コードは、前処理を行って再試行するか、手動レビューに回すか、あるいは入力を拒否するかを判断できます。 データの損失は一切ありません。

信頼度スコアリング API の詳細については、信頼度スコアのハウツーガイドをご覧ください。

プレーンテキストからドキュメントアーカイブパイプラインへの出力拡張

文書管理における一般的な要件として、スキャンしたアーカイブ(紙の契約書、請求書、FAX記録など)を、文書管理システムがインデックス化できる検索可能なPDFに変換することが挙げられます。 このラッパーはプレーンテキストのみを出力し、それ以外は何も出力しません。 その出力から検索可能なPDFを作成するには、PDFライブラリ、手動によるテキストの重ね書き、ページごとの座標計算、およびフォントメトリックの処理が必要となります。

Tesseract OCR ラッパーのアプローチ:

using TesseractOCR;
// Also requires: a PDF library (PDFsharp, iText, or similar)
// Also requires: a PDF rasterizer (PdfiumViewer or Ghostscript) to convert input PDFs to images

public class ArchivePipeline
{
    private readonly string _tessDataPath = @"./tessdata";

    public string ExtractText(string imagePath)
    {
        using var engine = new Engine(_tessDataPath, Language.English);
        using var img = Pix.Image.LoadFromFile(imagePath);
        using var page = engine.Process(img);

        return page.Text; // Plain text only — searchable PDF requires a separate pipeline
    }

    // To create a searchable PDF from this text, you would need:
    // 1. Load the original image as a PDF page background
    // 2. Map character positions back to image coordinates
    // 3. Overlay an invisible text layer using a PDF library
    // 4. Handle multi-page documents with per-page iteration
    // That is approximately 150-300 lines of additional code
}
C#

IronOCRのアプローチ:

using IronOcr;

public class ArchivePipeline
{
    // Single method handles the full document archive pipeline
    public void ProcessArchive(string[] inputPaths, string outputDirectory)
    {
        var ocr = new IronTesseract();

        foreach (var inputPath in inputPaths)
        {
            var result = ocr.Read(inputPath);

            // Plain text for full-text search indexing
            var textPath = Path.Combine(outputDirectory,
                Path.GetFileNameWithoutExtension(inputPath) + ".txt");
            File.WriteAllText(textPath, result.Text);

            // Searchable PDF — invisible text layer aligned to original scan
            var pdfPath = Path.Combine(outputDirectory,
                Path.GetFileNameWithoutExtension(inputPath) + "-searchable.pdf");
            result.SaveAsSearchablePdf(pdfPath);
        }
    }

    // Input can be scanned image files or existing PDFs — same API
    public void ProcessScannedPdf(string scannedPdfPath, string outputPath)
    {
        var result = new IronTesseract().Read(scannedPdfPath);
        result.SaveAsSearchablePdf(outputPath);
    }
}
C#

同じ Read() 呼び出しは、画像ファイルと PDF ドキュメントの両方を受け入れます。 SaveAsSearchablePdf() 呼び出しは、正しく配置された不可視テキストレイヤーを持つ標準のインデックス可能な PDF ファイルを生成します。 PDFライブラリへの依存なし、座標計算なし、テキストオーバーレイのアセンブリなし。

検索可能なPDF出力ガイドおよび検索可能なPDFサンプルでは、複数ページおよびバッチ処理のシナリオについて解説しています。

バッチ処理のためのエンジン設定の簡素化

ラッパーは、OCR 呼び出しごとに新しい Engine インスタンスを必要とし、そのインスタンスはコンストラクタ引数としてtessdataファイルシステムパスを必要とします。 数千件のドキュメントを処理するバッチ処理のシナリオでは、これはインスタンス化のたびにtessdataパスの解決と検証を行うことを意味し、各呼び出し箇所でエンジン初期化のオーバーヘッドが発生することになります。

Tesseract OCR ラッパーのアプローチ:

using TesseractOCR;

public class BatchOcrService
{
    // tessdata path must be configured correctly in every environment
    private readonly string _tessDataPath;

    public BatchOcrService(string tessDataPath)
    {
        // Path validation deferred to runtime — no early error on misconfiguration
        _tessDataPath = tessDataPath;
    }

    public IEnumerable<string> ProcessBatch(IEnumerable<string> imagePaths)
    {
        var results = new List<string>();

        foreach (var path in imagePaths)
        {
            // New engine created per document — tessdata path re-resolved each time
            using var engine = new Engine(_tessDataPath, Language.English);
            using var img = Pix.Image.LoadFromFile(path);
            using var page = engine.Process(img);

            results.Add(page.Text);
        }

        return results;
    }
}
C#

IronOCRのアプローチ:

using IronOcr;

public class BatchOcrService
{
    // One IronTesseract instance for the lifetime of the service
    // Thread-safe — can be registered as a singleton in DI
    private readonly IronTesseract _ocr;

    public BatchOcrService()
    {
        _ocr = new IronTesseract();
        // Optional: tune for batch throughput
        _ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5;
    }

    public IEnumerable<string> ProcessBatch(IEnumerable<string> imagePaths)
    {
        // Reuse the initialized engine — no tessdata path re-resolution per call
        return imagePaths.Select(path => _ocr.Read(path).Text).ToList();
    }

    // Parallel batch processing — IronTesseract is thread-safe with separate instances
    public IEnumerable<string> ProcessBatchParallel(string[] imagePaths)
    {
        var results = new string[imagePaths.Length];

        Parallel.For(0, imagePaths.Length, i =>
        {
            // Separate instance per thread — thread-safe by design
            var ocr = new IronTesseract();
            results[i] = ocr.Read(imagePaths[i]).Text;
        });

        return results;
    }
}
C#

エンジンの初期化には起動時のオーバーヘッドが伴います。 連続呼び出し全体で IronTesseract インスタンスを再利用すると、そのオーバーヘッドがなくなります。 並列処理の場合、1スレッドにつき1インスタンスという構成となります。各インスタンスは独立して初期化され、並行して安全に使用できます。 ロックなし、共有状態なし。

完全な並列バッチ処理の実装については、マルチスレッドの例を参照してください。

一時ファイルを使用せずに多形式の入力を処理する

アップロードされたファイルを受信するASP.NETアプリケーションでは、ドキュメントはストリームまたはバイト配列として扱われます。 このラッパーの主な入力パスはファイルシステムパスです。つまり、アプリケーションはアップロードされたデータを一時ファイルに書き出し、そのパスをエンジンに渡した後、一時ファイルを削除する必要があります。このパターンは脆弱であり、リクエストごとにI/Oのオーバーヘッドが発生します。

Tesseract OCR ラッパーのアプローチ:

using TesseractOCR;

public class UploadOcrController
{
    private readonly string _tessDataPath = @"./tessdata";

    public async Task<string> ProcessUpload(Stream uploadStream)
    {
        // Must write to temp file — no direct stream input path in the wrapper
        var tempPath = Path.GetTempFileName();
        try
        {
            using (var fileStream = File.Create(tempPath))
            {
                await uploadStream.CopyToAsync(fileStream);
            }

            using var engine = new Engine(_tessDataPath, Language.English);
            using var img = Pix.Image.LoadFromFile(tempPath); // file path required
            using var page = engine.Process(img);

            return page.Text;
        }
        finally
        {
            // Cleanup — if this throws, temp file leaks
            if (File.Exists(tempPath))
                File.Delete(tempPath);
        }
    }
}
C#

IronOCRのアプローチ:

using IronOcr;

public class UploadOcrController
{
    public string ProcessUpload(Stream uploadStream)
    {
        // Direct stream input — no temporary file, no I/O overhead, no cleanup
        using var input = new OcrInput();
        input.LoadImage(uploadStream);
        return new IronTesseract().Read(input).Text;
    }

    public string ProcessUploadBytes(byte[] imageBytes)
    {
        // Byte array input — works directly from memory
        using var input = new OcrInput();
        input.LoadImage(imageBytes);
        return new IronTesseract().Read(input).Text;
    }

    public string ProcessMultiPageTiff(Stream tiffStream)
    {
        // Multi-frame TIFF — all frames processed in one call
        using var input = new OcrInput();
        input.LoadImageFrames(tiffStream);
        return new IronTesseract().Read(input).Text;
    }
}
C#

OcrInput は、ストリーム、バイト配列、ファイルパス、および マルチフレーム TIFF を統一されたロード API を通じて受け入れます。 一時ファイルも、I/Oのオーバーヘッドも、クリーンアップ処理も一切発生しません。 using ブロックは、OcrInput 上のリソース廃棄を正しく処理します。

ストリーム入力ガイドおよび画像入力ガイドでは、メモリマップされたファイルやネットワークストリームを含む、サポートされているすべての入力ソースについて解説しています。

文書分析のための構造化データの抽出

ラッパーは、page.Text から 1 つの文字列として全ドキュメントを返します。 請求書の金額、日付、明細項目など、特定のフィールドを識別する必要があるアプリケーションは、文脈情報なしに、ヒューリスティックまたは正規表現を用いてその文字列を解析する必要があります。 ページ上の個々のWORDとその位置にアクセスするためのAPIは存在しません。

Tesseract OCR ラッパーのアプローチ:

using TesseractOCR;
using System.Text.RegularExpressions;

public class InvoiceFieldExtractor
{
    private readonly string _tessDataPath = @"./tessdata";

    public Dictionary<string, string> ExtractFields(string imagePath)
    {
        using var engine = new Engine(_tessDataPath, Language.English);
        using var img = Pix.Image.LoadFromFile(imagePath);
        using var page = engine.Process(img);

        var fullText = page.Text;

        // Must parse the full string — no spatial context available
        // Pattern matching is fragile across different invoice layouts
        var fields = new Dictionary<string, string>();

        var totalMatch = Regex.Match(fullText, @"Total[:\s]+\$?([\d,]+\.\d{2})");
        if (totalMatch.Success)
            fields["Total"] = totalMatch.Groups[1].Value;

        var dateMatch = Regex.Match(fullText, @"Date[:\s]+(\d{1,2}/\d{1,2}/\d{4})");
        if (dateMatch.Success)
            fields["Date"] = dateMatch.Groups[1].Value;

        return fields;
        // なし spatial fallback when text patterns fail — the data is lost
    }
}
C#

IronOCRのアプローチ:

using IronOcr;

public class InvoiceFieldExtractor
{
    public Dictionary<string, string> ExtractFields(string imagePath)
    {
        var result = new IronTesseract().Read(imagePath);
        var fields = new Dictionary<string, string>();

        // Traverse structured result — words carry position and confidence
        foreach (var page in result.Pages)
        {
            foreach (var paragraph in page.Paragraphs)
            {
                var paraText = paragraph.Text.Trim();

                // Spatial proximity: find words near known label positions
                if (paraText.StartsWith("Total", StringComparison.OrdinalIgnoreCase))
                {
                    fields["Total"] = paraText;
                    // paragraph.X, paragraph.Y give position for layout validation
                }

                if (paraText.StartsWith("Invoice Date", StringComparison.OrdinalIgnoreCase))
                {
                    fields["Date"] = paraText;
                }
            }
        }

        // Flag low-confidence extractions for review rather than silently accepting them
        var lowConfidenceWords = result.Pages
            .SelectMany(p => p.Paragraphs)
            .SelectMany(para => para.Words)
            .Where(w => w.Confidence < 50)
            .Select(w => w.Text)
            .ToList();

        if (lowConfidenceWords.Any())
            fields["_LowConfidenceWarning"] = string.Join(", ", lowConfidenceWords);

        return fields;
    }
}
C#

result.Pages[].Paragraphs[].Words[] 階層は、各単語の位置 (X, Y, Width, Height) と信頼性を公開します。 以前は不安定な文字列解析に依存していた抽出ロジックでも、ページ上の既知のラベルの右側や直下に値が表示されるという"空間的な近接性"を利用できるようになります。

"読み取り結果ガイド"では、一般的な抽出パターンのコード例とともに、階層構造全体を解説しています。

Tesseract OCR ラッパー API から IronOCR へのマッピングリファレンス

Tesseract OCR ラッパーIronOCR相当値
new Engine(tessDataPath, Language.English)new IronTesseract() (パス不要)
new Engine(tessDataPath, "eng+fra")ocr.Language = OcrLanguage.English; ocr.AddSecondaryLanguage(OcrLanguage.French)
Pix.Image.LoadFromFile(imagePath)input.LoadImage(imagePath)
engine.Process(img)ocr.Read(input) または ocr.Read(imagePath)
page.Textresult.Text
page.GetMeanConfidence() (浮動小数点 0–1)result.Confidence (ダブル 0–100)
同等の機能なし — ストリーム入力には一時ファイルが必要ですinput.LoadImage(stream)
対応する機能なし — バイト入力には一時ファイルが必要ですinput.LoadImage(byteArray)
対応する項目なし — PDFはサポートされていませんinput.LoadPdf(pdfPath)
対応する項目なし — PDFはサポートされていませんinput.LoadPdf(pdfPath, Password: "secret")
同等のものなし — マルチフレーム TIFF 限定input.LoadImageFrames(tiffPath)
対応する項目なし — テキスト以外の出力形式はありませんresult.SaveAsSearchablePdf(outputPath)
該当なし — hOCR出力なしresult.SaveAsHocrFile(outputPath)
対応する項目なし — 構造化データなしresult.Pages[i].Paragraphs[j].Words[k]
対応するWORDがない — WORDの対応関係がないword.X, word.Y, word.Width, word.Height
相当語なし — WORD ごとの信頼度なしword.Confidence
同等のものなし — 前処理なしinput.Deskew(), input.DeNoise(), input.Contrast()
該当なし — 地域選択なしinput.LoadImage(path, new CropRectangle(x, y, w, h))
対応なし — BARCODEのサポートはありませんocr.Configuration.ReadBarCodes = true; 結果.バーコード
TesseractException (不一致)IronOcrException (一貫性があり、失敗時に常にスローされる)

クラスおよびメソッドの完全なドキュメントは、IronTesseract API リファレンスおよび OcrResult API リファレンスに記載されています。

一般的な移行の問題と解決策

課題 1: 移行後に空の文字列の結果が表示されなくなる

Tesseract OCR Wrapper: 失敗と空のページの両方を検出するために if (string.IsNullOrEmpty(result)) をチェックするコードは、移行後に異なる動作をします。 IronOCRは失敗時に空の値を返すのではなく例外をスローするため、空文字列チェックではエンジンの障害を検出できなくなりました。

**解決策:**2つの課題を分離する。 エンジンの失敗には try/catch を使用し、品質フィルタリングには result.Confidence をチェックしてください:

try
{
    var result = new IronTesseract().Read(imagePath);
    if (result.Confidence < 10)
    {
        // Genuinely unreadable or blank — route to review
        return string.Empty;
    }
    return result.Text;
}
catch (IronOcrException)
{
    // Engine failure — log and handle separately from blank pages
    return null; // or rethrow
}
C#

課題 2: 信頼度スケールの変更

Tesseract OCR Wrapper: page.GetMeanConfidence() は 0 から 1 までの float を返します。 0.7f のような値でしきい値を超えているコードは、すべての IronOCR 結果で発火します。

Solution: IronOCR の result.Confidence はパーセンテージ (0 から 100) で表現される double です。 更新閾値の比較については、元の値に100を乗じて算出してください:

// Before (TesseractOCR): if (confidence < 0.7f)
// After (IronOCR):
if (result.Confidence < 70)
{
    // Below 70% confidence
}
C#

課題 3: 言語文字列のフォーマットが変更されました

Tesseract OCR Wrapper: 言語は Engine コンストラクタ内で + 区切り文字列として指定されます: "eng+fra+deu"。 関連する .traineddata ファイルは、正確なパスで tessdata ディレクトリ内に存在する必要があります。

Solution: 言語 NuGet パッケージをインストールし、OcrLanguage enum を使用します。 デプロイからtessdataディレクトリを削除してください:

// dotnet add package IronOcr.Languages.French
// dotnet add package IronOcr.Languages.German

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

多言語ガイドには、利用可能な125以上の言語パッケージがすべて記載されています。

課題 4: Tessdata のパス設定が欠落しています

Tesseract OCR Wrapper: Engine コンストラクタは、最初の引数としてtessdataファイルシステムパスを必要とします。 このパスは通常、設定に保存され、実行時に注入されます。移行後、その設定キーは使用されなくなります。

**解決策:**設定ファイルおよびデプロイメントスクリプトから tessdata パスを削除してください。リポジトリおよびデプロイメントアーティファクトから tessdata ディレクトリを削除してください。 Engine コンストラクタ呼び出しからパスパラメータを削除 — IronOCR はインストールされたNuGet パッケージから自動的に言語データを解決:

// Before: new Engine(configuration["TessDataPath"], Language.English)
// After:
var ocr = new IronTesseract(); // language resolved from NuGet package
ocr.Language = OcrLanguage.English;
C#

課題 5: PDF 入力にはラスタライズ層の削除が必要

Tesseract OCR Wrapper: PDF処理には、各ページをエンジンに渡す前にビットマップに変換するためのラスタライズライブラリ(PdfiumViewer、Ghostscript、または類似のライブラリ)が必要でした。現在、そのライブラリは不要になりました。

**解決策:**PDFラスタライズライブラリを削除し、変換→OCRという一連の処理を、IronOCRへの直接呼び出しに置き換えます:

// Before: rasterize each PDF page to bitmap, OCR each bitmap, collect results
// After:
using var input = new OcrInput();
input.LoadPdf("document.pdf");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
C#

PDF入力ガイドでは、ページ範囲の選択やパスワードで保護されたPDFについて解説しています。

課題 6: ストリーム入力に一時ファイルが不要

Tesseract OCR Wrapper: ASP.NET コントローラーにファイルをアップロードし、アップロードされたストリームに対して OCR 処理を行うには、一時ファイルへのバイト書き込み、ファイルパスからの OCR 処理、そして一時ファイルの削除が必要でした。この処理パターンでは、OCR 呼び出しで例外が発生した場合、一時ファイルが孤立したまま残ってしまいます。

Solution: OcrInput を使用してストリームから直接ロードします:

// Before: write to temp, OCR, delete temp
// After:
public async Task<string> OcrUpload(IFormFile file)
{
    using var stream = file.OpenReadStream();
    using var input = new OcrInput();
    input.LoadImage(stream);
    return new IronTesseract().Read(input).Text;
}
C#

一時ファイルは生成されず、クリーンアップ処理も不要で、例外発生時の孤立ファイルも発生しません。

Tesseract OCR ラッパー移行チェックリスト

移行前

新しいコードを記述する前に、コードベース内のラッパーの使用箇所をすべて確認してください:

# Find all files using the TesseractOCR namespace
grep -r "using TesseractOCR" --include="*.cs" .

# Find Engine constructor calls — these carry the tessdata path
grep -rn "new Engine(" --include="*.cs" .

# Find tessdata path configuration references
grep -rn "tessdata" --include="*.cs" .
grep -rn "tessdata" --include="*.json" .
grep -rn "tessdata" --include="*.xml" .

# Find all page.Text and page.GetText() calls — the primary output pattern
grep -rn "page\.Text\|page\.GetText()" --include="*.cs" .

# Find GetMeanConfidence calls — confidence scale will change
grep -rn "GetMeanConfidence" --include="*.cs" .

# Find PDF rasterization libraries that can be removed after migration
grep -rn "PdfiumViewer\|Ghostscript\|PDFsharp" --include="*.cs" .
grep -rn "PdfiumViewer\|Ghostscript\|PdfSharp" --include="*.csproj" .
SHELL

コードを記述する前に、結果を文書化してください。 tessdata パスを使用している呼び出し箇所がいくつあるか、信頼度スコアリングを使用している箇所がいくつあるか、また、失敗を検出するために空文字列の返却に依存しているコードがあるかどうかを確認してください。

コードの移行

  1. プロジェクトファイルから TesseractOCR NuGet パッケージを削除します。
  2. dotnet add package IronOcr 経由で IronOcr をインストールします。
  3. 以前に .traineddata ファイルとしてダウンロードした各言語の言語パックをインストールします。
  4. アプリケーションの起動時に IronOcr.License.LicenseKey = "YOUR-KEY"; を追加します。
  5. すべての using TesseractOCR; および using TesseractOCR.Enums; ディレクティブを using IronOcr; に置き換えます。
  6. すべての new Engine(tessDataPath, language) インスタンスを new IronTesseract() に置き換えます。
  7. Pix.Image.LoadFromFile(path) および engine.Process(img)ocr.Read(path) または OcrInput ベースの呼び出しに置き換えます。
  8. page.Text および page.GetText()result.Text に置き換えます。
  9. 信頼性閾値の比較を更新: 旧 float 閾値を double パーセンテージ スケール用に 100 倍します。
  10. +-区切りの言語文字列を ocr.Language および ocr.AddSecondaryLanguage() 呼び出しに置き換えます。
  11. 空の文字列失敗検出を try/catch IronOcrException に置き換えます。
  12. ストリーム入力用の一時ファイルパターンを input.LoadImage(stream) に置き換えます。
  13. IronOCR の input.LoadPdf() がラスター化ステップを代替する場合、PDF ラスタライズ ライブラリの参照を削除します。
  14. デプロイメントアーティファクトおよび設定ファイルから tessdata ディレクトリを削除してください。
  15. 逐次的なワークロードのために DI コンテナに IronTesseract をシングルトンとして登録します。 並列処理では、スレッドごとに1つのインスタンスを使用してください。

移行後

  • 過去にテストに合格した画像に対するOCRの結果が、ラッパーの出力品質と同等か、それ以上であることを確認してください。
  • エンジンの失敗が空の文字列を返す代わりに IronOcrException をスローするようになったことを確認します。
  • 信頼度スコアが0~100の範囲内にあること、および閾値の比較に更新された尺度が使用されていることを確認してください。
  • 多言語ドキュメントをテストし、各言語の NuGet パッケージが正しくインストールされ、認識されていることを確認します。
  • テストストリームおよびバイト配列の入力パスを確認し、一時ファイルが作成されないことを確認してください。
  • PDF入力を直接(ラスタライズせずに)テストし、ページ数とテキスト内容が正しいことを確認してください。
  • 検索可能なPDF出力をPDFビューアでテストし、テキスト検索の結果が元のスキャン画像の位置と一致することを確認してください。
  • バッチ処理パスを実行し、再利用された IronTesseract インスタンスでスループットを確認します。
  • tessdata ディレクトリがデプロイメントから削除されていること、およびそのディレクトリがなくてもアプリケーションが正常に起動することを確認してください。
  • OCRを実行するASP.NETエンドポイントに対して負荷テストを実行し、リクエストごとのインスタンスにおけるスレッドセーフ性を検証します。

IronOCRへの移行の主なメリット

**定義されたエラー契約。**移行後、OCRの失敗が発生するたびに、意味のあるメッセージを含む、キャッチ可能な型付き例外が生成されます。 空文字列によるサイレントな失敗モードは解消されました。 これまで、ファイルサイズの確認、画像解析の実行、文字数の比較といった外部の品質検証ロジックを必要としていたパイプラインは、代わりに IronOCR の例外モデルと信頼度スコアに依存できるようになります。

追加のライブラリなしでのアウトプットフォーマットカバレッジ。Read() 呼び出しから返される OcrResult オブジェクトは、追加のパッケージなしでプレーンテキスト、検索可能なPDF、およびhOCRエクスポートをサポートします。 コンプライアンスアーカイブ用の検索可能なPDF生成や、アクセシビリティパイプライン向けのhOCRエクスポートが、複数のライブラリを統合するプロジェクトではなく、わずか2行のコードで実現できるようになります。

**ドキュメントインテリジェンスのための構造化データ。**結果オブジェクトごとに、ページ、段落、行、単語、文字といった完全なWORD階層に加え、バウンディングボックスの座標およびWORDごとの信頼度情報が利用可能です。 以前は脆弱な正規表現でプレーンな文字列を解析していた請求書抽出ツール、情報マスキングツール、およびフォーム処理ツールは、フィールドの識別をレイアウトに依存しないものにする空間的コンテキストを獲得しました。 OCR結果機能ページでは、データモデル全体を網羅しています。

**ネイティブ PDF およびマルチフォーマット入力。**PDF ラスタライズライブラリおよびその関連設定は、依存関係グラフから削除されます。 ストリームおよびバイト配列は、一時ファイルなしでOcrInput に直接ロードされます。 1回の呼び出しでマルチフレームTIFFを処理します。 ラッパーを囲んでいた入力処理コード(フォーマット検出、一時ファイル管理、クリーンアップロジック)は、統一されたロードAPIに置き換えられました。

**環境設定不要のデプロイ。**tessdataディレクトリ、ネイティブバイナリバージョンの確認、およびプラットフォーム固有のバイナリデプロイ手順は削除されました。 IronOCRは、エンジンと言語データをNuGetパッケージに同梱しています。 DockerLinuxAzure、またはAWSへのデプロイには、1行のライブラリ依存関係の設定以外に、環境固有の設定は一切必要ありません。

**商用サポートおよび明確なライセンス。**このラッパーはコミュニティによってメンテナンスされており、サポート契約は提供されていません。 IronOCRは、メールサポート、専任のドキュメントチーム、および.NET バージョンとの互換性を保証した定期的なリリースを提供しています。 永続ライセンスモデル — Liteティアで$999から開始 — は、1ページあたりの請求の驚きや、新しい.NETバージョンへのアクセスをブロックするサブスクリプションの更新がないことを意味します。 通常、ライセンスへの投資は、ラッパーの機能不足による統合作業を不要にする最初のイテレーションの段階で回収されます。

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

関連する記事

Key in blue circle

無料の30日間トライアルキーをすぐに入手してください。

Your trial license will be sent to your email address

制限なし。100% ロック解除済み。クレジットカード不要。

bullet_checkedクレジットカードやアカウントの作成は不要です。制限なし。100% ロック解除済み。クレジットカード不要。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
義務のない相談を受ける
下記のフォームを記入するか、sales@ironsoftware.comにメールしてください。
あなたの詳細は常に守秘されます。
世界中の数百万人のエンジニアから信頼されています。
ライセンスはより安く
あなたの無料30日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。