TesseractからIronOCRへの移行|IronOCR
このガイドはcharlesw Tesseract NuGetパッケージからIronOCRへの直接的な移行経路を提供します。 ここでは、tessdataフォルダの管理を排除し、Pixの初期化パターンを置き換え、組み込みの前処理パイプラインを追加し、比較記事で既に検討された内容を重複することなく、ネイティブPDFサポートを解除するために必要な特定の手順について説明します。
Tesseractからの移行理由
charlesw Tesseract パッケージは本格的なOCR機能を提供しており、800万のNuGetダウンロードがその証拠です。 課題はエンジンそのものにあるのではなく、本番環境向けの成果物を提供できるようになる前に、エンジンの周りに構築しなければならないインフラストラクチャにあります。 移行の決定を左右する主な要因は、以下の4つの具体的な課題です。
Tessdata フォルダの管理は各環境で複合します。 単語が認識される前に、tessdataパスは存在し、アプリケーションが必要とするすべての言語用の正しいTesseractEngineに渡された正確なパスでアクセス可能でなければなりません。 つまり、開発マシン、CIビルド、ステージングサーバー、本番ホスト、およびDockerコンテナごとに、個別のフォルダ構成が必要となります。 ファイルが不足していると、実行時(デプロイ後)にTesseractException: Failed to initialise tesseract engineがスローされ、欠落しているファイルが常に特定されるわけではありません。 新しい環境が生まれるたびに、この失敗を繰り返す可能性が高まります。
**Tesseract 4.1.1 が最終バージョンとなります。**charlesw ラッパーは、2019年にリリースされた Tesseract 4.1.1 に固定されています。Tesseract 5.x では LSTM モデルの改良が導入され、特定のドキュメントタイプにおいて測定可能な精度の向上が実現されています。このバージョンは本パッケージでは利用できず、また 2021年以降、ラッパーのメンテナンス頻度は大幅に低下しています。 現在の Tesseract リリースと同等の精度を求めるチームにとって、charlesw ラッパー経由でのアップグレードパスは存在しません。
**前処理を行わないということは、実世界の文書への依存がないことを意味します。**Tesseractは、汚れがなく、高解像度で、向きが正しい入力データを想定しています。 傾き、ノイズ、低解像度、または色のついた背景に対する組み込みの補正は行われません。 前処理パイプラインを手動で構築するには、グレースケール変換、コントラスト強調、二値化、メディアンノイズフィルタリング、デスキューを行う必要があり、System.Drawing.Common (Windowsのみ)を使用して約180行のコードが必要です。または、OpenCvSharp4を取り込んで適切なHough-変換デスキューを行う必要があります。 その後、新しいドキュメントソースによってエッジケースが発生しても、そのパイプラインを維持する必要があります。
**PDFは後付けの要素であり、別の依存関係チェーンを必要とします。**契約書、請求書、銀行取引明細書、コンプライアンス関連文書などは、PDF形式で届きます。 TesseractはPDFファイルを開くことができません。 このギャップを埋めるには、別途PDFレンダリングライブラリ(PdfiumViewer、PDFtoImage、またはDocnet.Core)が必要となります。これらにはそれぞれ独自のネイティブバイナリ、プラットフォーム固有のデプロイ手順、およびライセンスに関する考慮事項があります。 GhostScriptには、AGPLライセンスに関連する事項が含まれています。 パスワードで保護されたPDFには、さらに別のライブラリが追加されます。 複数の環境にまたがり、3つの別々のネイティブ依存関係チェーンを管理するチームは、メンテナンスの限界に達し、単一パッケージの代替案を直接検討するよう促されます。
スレッドセーフでないエンジン設計は並列スループットを制限します。 TesseractEngine インスタンスはスレッド間で共有できません。 標準的な並列処理パターンでは、スレッドごとに1つのエンジンが作成され、インスタンスごとに40~100 MBの言語モデルデータが読み込まれます。 8つの並列スレッドは、320-800 MBのエンジン初期化オーバーヘッドを意味しますどのドキュメントも処理される前に。 これはバグではありません。スレッドセーフではないAPIの意図された動作ですが、メモリ消費は実際に発生し、バッチサイズが大きくなるにつれて累積していきます。
基本的な問題
すべての Tesseract アプリケーションは、同じ手順で起動します。それは、アプリケーションが実行されるすべてのマシンで正しい必要がある tessdata パスを指定することです。
Tesseractのアプローチ:
// TessDataPath must exist and be populated — breaks on first clean deployment
private const string TessDataPath = @"./tessdata";
public static string ExtractText(string imagePath)
{
// Runtime failure if eng.traineddata is missing from TessDataPath
if (!Directory.Exists(TessDataPath))
throw new DirectoryNotFoundException(
$"Tessdata not found at {TessDataPath}. " +
"Download from https://github.com/tesseract-ocr/tessdata");
using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
using var img = Pix.LoadFromFile(imagePath); // Leptonica Pix object
using var page = engine.Process(img);
return page.GetText();
}
IronOCRのアプローチ:
// No tessdata folder. No path. No file check. Just OCR.
var text = new IronTesseract().Read("document.jpg").Text;
すべてのusingネスティングが消えます。 言語データは NuGet パッケージに組み込まれています。
IronOCR 対 Tesseract:機能比較
以下の表は、移行の決定において最も重要な機能をまとめたものです。
| フィーチャー | テッセラクト(チャールズW) | IronOCR |
|---|---|---|
| NuGetパッケージ | Tesseract | IronOcr |
| Tesseractエンジンバージョン | 4.1.1 (2019, 固定) | 最適化された Tesseract 5.x |
| Tessdata管理 | マニュアルのフォルダおよびファイルのダウンロード | バンドル済み — 設定不要 |
| 言語パック | 手動の.traineddataダウンロード | 言語ごとのNuGetパッケージ |
| 対応言語 | 100件以上(手動) | 125+ (NuGet) |
| 多言語同時通訳 | "eng+fra+deu"文字列 | OcrLanguage.French + OcrLanguage.German |
| 画像前処理 | マニュアル(約180行) | 組み込みのワンラインメソッド |
| デスキュー | マニュアル(ホフ変換が必要) | input.Deskew() |
| ノイズ除去 | マニュアル(メディアンフィルタ) | input.DeNoise() |
| コントラスト / 2値化 | 手動によるピクセル単位の反復処理 | input.Contrast(), input.Binarize() |
| 深いノイズ除去 | 不可 | input.DeepCleanBackgroundNoise() |
| PDF入力 | なし — 外部ライブラリが必要 | ネイティブ(スキャン、デジタル、混合) |
| パスワードで保護されたPDF | 復号ライブラリが必要です | input.LoadPdf(path, Password: "...") |
| 複数ページTIFF | 手動フレーム反復 | input.LoadImageFrames() |
| 検索可能なPDF出力 | サポートされていません | result.SaveAsSearchablePdf() |
| 構造化された結果へのアクセス | ResultIteratorループ | result.Pages, .Paragraphs, .Words |
| スレッドセーフ。 | スレッドセーフではありません | スレッドセーフなシングルインスタンス |
| バーコード読み取り | サポートされていません | ocr.Configuration.ReadBarCodes = true |
| クロスプラットフォーム | プラットフォームごとに必要なネイティブDLL | 単一のNuGetパッケージ、全プラットフォーム対応 |
| Dockerデプロイメント | apt-get + tessdata COPY 手順 | 追加の手順は不要です。 |
| ライセンスについて | アパッチ2.0(無料) | 永続 ($999 Lite / $1,499 Pro / $2,999 Enterprise) |
| 商業サポート | コミュニティ限定 | はい(メール + 優先度レベル) |
クイックスタート:Tesseract から IronOCR への移行
ステップ 1: NuGet パッケージを置き換える
charlesw Tesseract ラッパーを削除してください:
dotnet remove package Tesseract
NuGetからIronOCRをインストールしてください。
言語パックは、必要に応じて個別のパッケージとしてインストールされます:
ステップ 2: 名前空間の更新
Tesseract名前空間をIronOCR名前空間に置き換えます:
// Before
using Tesseract;
// After
using IronOcr;
ステップ 3: ライセンスの初期化
アプリケーション起動時に一度ライセンスの初期化を追加し、IronTesseractコールの前に行います。
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"開発中は、キーなしで無料トライアルを利用できます。 本番環境へのデプロイには、ライセンスページから取得した有効なキーが必要です。
コード移行の例
Tessdata のパス削除とエンジンの初期化
最も直接的な変更は、TesseractEngineの初期化とそれを囲むすべてのtessdataの検証コードを削除することです。
Tesseractのアプローチ:
// Every class that uses OCR must handle this initialization block
private const string TessDataPath = @"./tessdata";
public string RecognizeInvoiceNumber(string imagePath)
{
// Check tessdata presence — missing file = silent runtime failure
foreach (var lang in new[] { "eng" })
{
if (!File.Exists(Path.Combine(TessDataPath, $"{lang}.traineddata")))
throw new FileNotFoundException(
$"Missing {lang}.traineddata. " +
"Download from https://github.com/tesseract-ocr/tessdata");
}
using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
// Pix is a Leptonica wrapper type — not a standard .NET image
using var img = Pix.LoadFromFile(imagePath);
using var page = engine.Process(img);
string text = page.GetText();
float conf = page.GetMeanConfidence();
return conf > 0.7f ? text : string.Empty;
}
IronOCRのアプローチ:
using IronOcr;
public string RecognizeInvoiceNumber(string imagePath)
{
var result = new IronTesseract().Read(imagePath);
// Confidence property returns 0-100 double
return result.Confidence > 70 ? result.Text : string.Empty;
}
Pixオブジェクト、3レベルのネスティングがなくなります。 言語データが埋め込まれているため、IronTesseractは引数なしで構築されます。 デフォルト以外の動作が必要な場合は、IronTesseractのセットアップガイドで設定オプションを確認してください。また、完全な信頼度APIについては、信頼度スコアガイドを参照してください。
前処理パイプラインを用いた複数ページTIFFの処理
スキャンされた文書アーカイブやFAXシステムで一般的なマルチフレームTIFFファイルは、Tesseractを使用する場合、明示的なフレームの反復処理が必要です。 IronOCRは、1回の呼び出しですべてのフレームを読み込み、前処理パイプラインを一様に適用します。
Tesseractのアプローチ:
using Tesseract;
using System.Drawing;
using System.Drawing.Imaging;
private const string TessDataPath = @"./tessdata";
public static string ExtractFromMultiPageTiff(string tiffPath)
{
var allText = new System.Text.StringBuilder();
using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
using var tiffImage = Image.FromFile(tiffPath);
int frameCount = tiffImage.GetFrameCount(FrameDimension.Page);
for (int i = 0; i < frameCount; i++)
{
tiffImage.SelectActiveFrame(FrameDimension.Page, i);
// Must save each frame to disk — Pix.LoadFromFile requires a path
string tempPath = Path.GetTempFileName() + ".png";
try
{
tiffImage.Save(tempPath, ImageFormat.Png);
using var img = Pix.LoadFromFile(tempPath);
using var page = engine.Process(img);
allText.AppendLine(page.GetText());
}
finally
{
File.Delete(tempPath); // Uncleaned temp files fill disk on failure
}
}
return allText.ToString();
}
IronOCRのアプローチ:
using IronOcr;
public static string ExtractFromMultiPageTiff(string tiffPath)
{
using var input = new OcrInput();
input.LoadImageFrames(tiffPath); // Loads all frames at once
input.Deskew(); // Applied to every frame uniformly
input.DeNoise();
var result = new IronTesseract().Read(input);
return result.Text;
}
フレームの反復処理は行わないでください。 一時ファイルは作成しません。 クリーンアップ処理は行わないでください。 前処理パイプラインは、追加のループを必要とせずにすべてのフレームに適用されます。TIFFおよびGIF入力ガイドでは、大規模なアーカイブファイルにおける選択的なフレーム範囲指定を含め、マルチフレーム処理について詳細に解説しています。
検索可能なPDF生成
スキャンしたPDFを検索可能なPDFに変換するには、Tesseractを使用して各ページを画像(外部PDFライブラリ経由)に変換し、OCRを実行した後、テキストレイヤーを含むPDFを再構築する必要があります。これは、複数のライブラリを跨ぐ多段階のプロセスです。 IronOCRは、入力、OCR、出力を単一のパイプラインで処理します。
Tesseractのアプローチ:
// Requires: PdfiumViewer + Tesseract + a PDF writer library (iText, PdfSharp)
// Each library adds its own native dependencies and license considerations
using Tesseract;
// using PdfiumViewer; // Comment: must add NuGet + deploy native pdfium.dll
// using iText.Kernel.Pdf; // Comment: AGPL or commercial license required
private const string TessDataPath = @"./tessdata";
public static void CreateSearchablePdf(string inputPdfPath, string outputPdfPath)
{
// Step 1: Render PDF pages to images (requires PdfiumViewer)
// Step 2: Run OCR on each image (Tesseract)
// Step 3: Write text positions back into PDF (requires iText or PDFsharp)
//
// Total: ~150 lines across three libraries
// Native binaries required: tesseract*.dll, leptonica*.dll, pdfium.dll
// License risk: iText is AGPL unless you purchase a commercial license
throw new NotImplementedException(
"Requires PdfiumViewer + Tesseract + a PDF writer. " +
"No single-package solution exists with this stack.");
}
IronOCRのアプローチ:
using IronOcr;
public static void CreateSearchablePdf(string inputPdfPath, string outputPdfPath)
{
using var input = new OcrInput();
input.LoadPdf(inputPdfPath);
input.Deskew(); // Correct scanned page skew before OCR
input.DeNoise(); // Remove scanner artifacts
var result = new IronTesseract().Read(input);
result.SaveAsSearchablePdf(outputPdfPath);
}
1回のメソッド呼び出しで、テキストレイヤーが埋め込まれた検索可能なPDFが生成されます。 外部のPDFライブラリは不要、ネイティブのpdfiumバイナリも不要、AGPL依存関係によるライセンス上の問題も発生しません。 検索可能なPDF形式のハウツーガイドには出力形式が記載されており、PDF OCRのサンプルではスキャンされたドキュメントの処理パイプライン全体の手順が解説されています。IronOCRがPDF入力に対してどのような処理が可能かについてのより広範な背景については、PDF OCRのユースケースページで本番環境向けのアーキテクチャパターンが紹介されています。
スキャンされた文書からの構造化データの抽出
Tesseractはdo/whileループで手動のバウンディングボックス抽出が必要です。 IronOCRは、ページ、段落、行、WORDといったドキュメントの階層構造を、座標が事前に入力された強型コレクションとして公開します。
Tesseractのアプローチ:
using Tesseract;
private const string TessDataPath = @"./tessdata";
public static void ExtractStructuredData(string imagePath)
{
using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
using var img = Pix.LoadFromFile(imagePath);
using var page = engine.Process(img);
using var iter = page.GetIterator();
iter.Begin();
do
{
if (iter.IsAtBeginningOf(PageIteratorLevel.Para))
Console.WriteLine("-- New Paragraph --");
if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out var bounds))
{
string word = iter.GetText(PageIteratorLevel.Word);
float confidence = iter.GetConfidence(PageIteratorLevel.Word);
Console.WriteLine(
$"Word: '{word?.Trim()}' " +
$"at ({bounds.X1},{bounds.Y1})-({bounds.X2},{bounds.Y2}) " +
$"conf={confidence:P0}");
}
}
while (iter.Next(PageIteratorLevel.Word));
}
IronOCRのアプローチ:
using IronOcr;
public static void ExtractStructuredData(string imagePath)
{
var result = new IronTesseract().Read(imagePath);
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber} — confidence: {result.Confidence}%");
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($" Paragraph at ({paragraph.X},{paragraph.Y}):");
Console.WriteLine($" {paragraph.Text}");
foreach (var word in paragraph.Words)
{
Console.WriteLine(
$" Word: '{word.Text}' " +
$"at ({word.X},{word.Y}) " +
$"size {word.Width}x{word.Height} " +
$"conf={word.Confidence:P0}");
}
}
}
}
ResultIteratorループは完全に消えます。 ドキュメント階層は、列挙可能なコレクションの集合です。イテレータの状態管理、手動でのレベル追跡、出力パラメータによるバウンディングボックスの抽出は不要です。 各WORDオブジェクトには、独自の座標と信頼度が設定されています。 "読み取り結果ガイド"では階層の各レベルについて解説しており、"OcrResult APIリファレンス"には利用可能なすべてのプロパティが記載されています。
Tessdataファイル管理機能なしの多言語OCR
Tesseractアプリケーションに言語を追加するには、.traineddataファイルをダウンロードし、それをtessdataフォルダに配置し、そのフォルダを含むすべてのデプロイメントマニフェストを更新し、エンジン初期化文字列を変更します。 IronOCRについては、単一のNuGetパッケージ参照となります。
Tesseractのアプローチ:
using Tesseract;
private const string TessDataPath = @"./tessdata";
public static string ExtractFromEuropeanDocument(string imagePath)
{
// Before this call works, these files must exist:
// ./tessdata/eng.traineddata (~15 MB, from GitHub)
// ./tessdata/fra.traineddata (~15 MB, from GitHub)
// ./tessdata/deu.traineddata (~15 MB, from GitHub)
// ./tessdata/spa.traineddata (~15 MB, from GitHub)
// Total: ~60 MB to download, version-match, and deploy to every environment
foreach (var lang in new[] { "eng", "fra", "deu", "spa" })
{
if (!File.Exists(Path.Combine(TessDataPath, $"{lang}.traineddata")))
throw new FileNotFoundException(
$"Download {lang}.traineddata from " +
"https://github.com/tesseract-ocr/tessdata " +
$"and place in {TessDataPath}");
}
// Language string is a concatenation — order affects recognition priority
using var engine = new TesseractEngine(TessDataPath, "eng+fra+deu+spa", EngineMode.Default);
using var img = Pix.LoadFromFile(imagePath);
using var page = engine.Process(img);
return page.GetText();
}
IronOCRのアプローチ:
// Install language packs once per project:
// dotnet add package IronOcr.Languages.French
// dotnet add package IronOcr.Languages.German
// dotnet add package IronOcr.Languages.Spanish
using IronOcr;
public static string ExtractFromEuropeanDocument(string imagePath)
{
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
ocr.AddSecondaryLanguage(OcrLanguage.French);
ocr.AddSecondaryLanguage(OcrLanguage.German);
ocr.AddSecondaryLanguage(OcrLanguage.Spanish);
return ocr.Read(imagePath).Text;
}
tessdataフォルダ、ファイル存在ループ、パス結合文字列、およびデプロイメントマニフェストの更新はすべて.csprojで置き換えられます。 Dockerに言語を追加する場合、1つの追加dotnet add packageが必要です。これはDockerfile COPYステップではありません。複数言語ガイドは125以上の言語カタログとCJK文字セットを完全にカバーし、言語インデックスは使用可能なすべての言語パックを一覧にしています。
Tesseract API から IronOCR へのマッピングリファレンス
| テッセラクト(チャールズW) | IronOCR |
|---|---|
new TesseractEngine(tessDataPath, "eng", EngineMode.Default) | new IronTesseract() |
Pix.LoadFromFile(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(x, y, w, h)) |
page.GetIterator() | result.Pages / result.Paragraphs / result.Words |
iter.GetText(PageIteratorLevel.Word) | result.Words[i].Text |
iter.GetConfidence(PageIteratorLevel.Word) | result.Words[i].Confidence |
iter.TryGetBoundingBox(PageIteratorLevel.Word, out bounds) | word.X, word.Y, word.Width, word.Height |
"eng+fra+deu"言語文字列 | ocr.AddSecondaryLanguage(OcrLanguage.French) |
Tessdataフォルダ + .traineddataファイル | NuGet言語パッケージ (IronOcr.Languages.French) |
| 該当なし — PdfiumViewerまたは同様のツールが必要です | input.LoadPdf(path) |
| 該当なし — 復号ライブラリが必要 | input.LoadPdf(path, Password: "secret") |
| 該当なし - iTextまたはPDFSharpが必要です | result.SaveAsSearchablePdf(outputPath) |
| 該当なし — 手動による System.Drawing パイプライン | input.Deskew(), input.DeNoise(), input.Binarize() |
N/A — スレッドごとのエンジンParallel.ForEach | すべてのスレッドで共有される単一のIronTesseract |
| 該当なし — サポートされていません | ocr.Configuration.ReadBarCodes = true |
一般的な移行の問題と解決策
課題 1: 移行後も Tessdata のパス参照が残る
Tesseract: コードベースとFile.Exists(Path.Combine(TessDataPath, lang + ".traineddata"))チェック
**解決策:**すべての出現箇所を検索し、tessdataフォルダ自体とともに削除してください:
# Find all tessdata references in source
grep -r "TessDataPath\|tessdata\|traineddata" --include="*.cs" .
grep -r "tessdata" --include="*.csproj" .
パス定数とファイルガードを削除した後、プロジェクトからtessdataフォルダを削除してください。 .csprojファイルから削除します。 DockerfileENV TESSDATA_PREFIX環境変数宣言も削除しても安全です。
問題 2: Pix オブジェクト型を解決できません
Tesseract: Tesseract名前空間からのLeptonica画像ラッパータイプです。 変数宣言での参照(Pix.LoadFromBitmap()を呼び出すコードに表示されます。
ソリューション: input.LoadImage(path)に置き換えます。 input.LoadImage(bytes)で置き換えます。 System.Drawing.Bitmapオブジェクトを直接受け入れます。 中間ラッパー型への変換は不要です。 受け入れ可能な入力タイプの全一覧については、画像入力ガイドおよびストリーム入力ガイドを参照してください。
課題 3: ResultIterator ループパターンに直接対応するものが存在しない
Tesseract: iter.TryGetBoundingBox()を繰り返すコードは、単語レベルまたは文字レベルの抽出の標準パターンです。 このパターンでは、イテレータの状態およびレベル遷移を手動で追跡する必要があります。
ソリューション: イテレータループをresult.Pages、または適切なコレクションレベルでLINQに置き換えます。
// Before: iterator loop
using var iter = page.GetIterator();
iter.Begin();
do
{
if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out var bounds))
{
string text = iter.GetText(PageIteratorLevel.Word);
// process text and bounds
}
}
while (iter.Next(PageIteratorLevel.Word));
// After: enumerable collection
var result = new IronTesseract().Read(imagePath);
foreach (var word in result.Words)
{
// word.Text, word.X, word.Y, word.Width, word.Height, word.Confidence
}
段落レベルのアクセスには—Tesseractイテレータには直接の類似がないため—result.Pages[i].Paragraphsを使用します。 "読み取り結果"ガイドには、利用可能なすべてのレベルが記載されています。
課題 4: PDF ライブラリのコードを完全に削除する必要があります
Tesseract: Tesseractに渡す前にPDFページを画像に変換するコード—PdfiumViewer document.Render()ループ、PDFtoImage Conversion.ToImage()コール、Docnet.Core GetPageReader()パターン、またはGhostScriptプロセスの呼び出し—は、TesseractがPDFを開けないことへの対応策です。 これらのクラス、ループ、一時ファイルのパターン、およびネイティブバイナリのデプロイは、すべて真の要件を支えるための足場です。
**解決策:**PDFレンダリングのコードを完全に削除してください。 レンダーしてからOCRというブロック全体をinput.LoadPdf(path)に置き換えます。
// Before: ~50-150 lines of PdfiumViewer + Tesseract + temp file management
// After:
using var input = new OcrInput();
input.LoadPdf("document.pdf");
input.Deskew();
input.DeNoise();
var result = new IronTesseract().Read(input);
PdfiumViewer、PDFtoImage、およびDocnet.Coreパッケージ参照を.csprojから削除します。 ビルドスクリプトとDockerfilesからネイティブバイナリのデプロイメント (pdfium.dll, GhostScript実行ファイル)を削除します。 PDF入力ガイドでは、ページ範囲の選択やパスワードで保護されたPDFについて解説しています。
課題 5: スレッドごとの並列処理エンジン パターン
Tesseract: セーフな並列OCRのための標準的なパターンはParallel.ForEach本体内に作成します。単一のエンジンはスレッドセーフでないからです。 これにより、スレッドごとに言語モデル全体が読み込まれます。
ソリューション: ループの前に一度IronTesseractを作成し、内部で参照します。
// Before: engine per thread, 40-100 MB per language model, times thread count
Parallel.ForEach(files, file =>
{
using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
using var img = Pix.LoadFromFile(file);
using var page = engine.Process(img);
results[file] = page.GetText();
});
// After: single engine, thread-safe, shared pool
var ocr = new IronTesseract();
Parallel.ForEach(files, file =>
{
var result = ocr.Read(file);
results[file] = result.Text;
});
スレッドセーフへの変更によって、各スレッドごとのエンジンを迅速に解放するためだけに必要であったループ本体内のusing廃棄パターンも排除されます。
課題 6: EngineMode 列挙型に直接対応する項目がない
Tesseract: TesseractEngineコンストラクタに表示されます。 charlesw ラッパーがこれらのモードを公開しているのは、Tesseract 4.x が両方のエンジンを維持していたためです。
**解決策:**IronOCRは、高精度設定であるTesseract 5 LSTMエンジンのみを採用しています。 レガシーエンジンにフォールバックすることがないので、EngineModeパラメータは存在しません。 コンストラクタコールを変換する際にEngineMode引数を削除します。 スループットと精度のチューニングにはocr.Configuration.PageSegmentationModeを使用し、速度最適化ガイドを参照してください。
Tesseract 移行チェックリスト
移行前
コードベース内のすべての Tesseract および tessdata の参照を監査してください:
# Find all using directives for the Tesseract namespace
grep -rn "using Tesseract" --include="*.cs" .
# Find TesseractEngine constructors
grep -rn "TesseractEngine\|TessDataPath\|tessdata" --include="*.cs" .
# Find Pix object usage
grep -rn "Pix\." --include="*.cs" .
# Find ResultIterator usage
grep -rn "GetIterator\|ResultIterator\|PageIteratorLevel" --include="*.cs" .
# Find PDF rendering libraries added for Tesseract
grep -rn "PdfiumViewer\|PDFtoImage\|Docnet\|GhostScript" --include="*.cs" .
# Find tessdata references in project files
grep -rn "tessdata\|traineddata" --include="*.csproj" .
# Find tessdata references in Dockerfiles
grep -rn "tessdata\|TESSDATA_PREFIX\|libtesseract" Dockerfile* .
移行範囲を見積もるための調査結果:
- 変更が必要なクラス数を確認するために
using Tesseractでファイルをカウントします - 使用されているPDFレンダリングライブラリを特定してください(PdfiumViewer、PDFtoImage、Docnet.Core、GhostScript)
- どの言語が
TesseractEngineコンストラクタ文字列に参照されているかをメモし、追加するIronOCR言語NuGetパッケージを確認します
コードの移行
- すべての
TesseractNuGetパッケージ参照を削除します - Tesseractのサポートのみを目的として追加されたPDFレンダリングライブラリのNuGet参照(PdfiumViewer、PDFtoImage、Docnet.Core)を削除する
IronOcrNuGetパッケージをインストールします- 必要な言語NuGetパッケージをインストールします (
IronOcr.Languages.French等) - アプリケーション起動時に
IronOcr.License.LicenseKey = "YOUR-KEY";を追加します - 影響を受けたすべてのファイルで
using IronOcr;に置き換えます Directory.Exists/File.Existstessdataガードを削除しますnew IronTesseract()で置き換えますOcrInputインスタンス上で置き換えますinput.LoadImage(bytes)に置き換えますocr.Read(input)に置き換えますresult.Textに置き換えますresult.Confidenceに置き換えますresult.Pages[i].Paragraphsの列挙に置き換えます- PDFレンダリングループを
input.LoadPdf(path)で置き換え、レンダリングライブラリコードを完全に削除します ocr.AddSecondaryLanguage(OcrLanguage.X)コールで置き換えます- tessdataフォルダとそのビルド
<Content Include="...">プロジェクトアイテムを削除します - ビルドスクリプトおよびDockerfileからネイティブバイナリのデプロイ手順を削除する(tessdata COPY、TESSDATA_PREFIX ENV、apt-get libtesseract-dev)
移行後
- Tesseractラッパーの開発時に使用したのと同じサンプル画像を用いて、基本的なテキスト抽出機能を確認してください
- 信頼度スコアが妥当であることを確認してください(通常の文書で70%以上、高品質なスキャン画像で85%以上)。
- マルチページTIFF入力が
result.Pagesで正しいページ数を生成するかテストします - PdfiumViewerや外部ライブラリを必要とせずに、スキャンされたPDFを読み込めることを確認してください
- 既知の暗号化ファイルに対して
input.LoadPdf(path, Password: "...")を使用してパスワード保護されたPDFの読み取りをテストします - 検索可能なPDF出力ファイルがAdobe Readerで開くこと、およびテキスト検索に対応していることを確認してください
- 並列処理をテスト:
IronTesseractインスタンスを作成し、スレッドセーフ例外がないことを確認します - 各言語パックが、対象言語のドキュメントセットに対して正しい出力を生成することを確認する
apt-get libtesseract-devなしでDockerビルドを実行し、コンテナが正常に起動し、ドキュメントを処理することを確認します- 公開された出力ディレクトリに tessdata フォルダおよびネイティブ DLL ファイルが含まれていないことを確認してください
- ネイティブバイナリ参照を削除した後のログに
System.DllNotFoundExceptionが表示されないことを確認します
IronOCRへの移行の主なメリット
デプロイメントが1つのパッケージに縮小します。 tessdataフォルダ、プラットフォーム固有のネイティブライブラリ(tesseract50.dll, leptonica-1.82.0.dll, libtesseract.so.5)、および任意のPDFレンダリングネイティブバイナリがデプロイメントアーティファクトから削除されます。 新しい環境(Linuxコンテナ、AWS Lambda関数、macOS開発マシンなど)を追加する際、プラットフォーム固有の設定手順は不要です。 Docker 導入ガイドおよび Linux 導入ガイドには、パッケージのインストール、ライセンスキーの追加、実行という手順が記載されています。 apt-get、COPY、環境変数などは使用しないでください。
言語追加は数秒で完了します。 スペイン語のOCRサポートを追加するには、"ocr.AddSecondaryLanguage(OcrLanguage.Spanish)に変わります。 どのプラットフォームでも、同じ2つの手順で動作します。 多国籍のドキュメント処理ワークフローで一般的な、10以上の言語をサポートするチームは、継続的なメンテナンスに要する時間を数時間から、一度きりのセットアップに要する数分へと短縮できます。言語インデックスで全カタログをご覧ください。
**PDFワークフローに外部ライブラリは不要です。**PdfiumViewerのネイティブバイナリのデプロイと保守、32/64ビット環境におけるpdfium.dllのビット数の管理、GhostScriptのAGPLライセンスに関する考慮事項への対応、およびページごとのレンダリングループの記述といった要件はなくなります。 input.LoadPdf()はスキャンされたPDF、デジタルPDF、混合コンテンツPDF、およびパスワード保護されたPDFをネイティブに読み取ります。 result.SaveAsSearchablePdf()は二次ライブラリを使用せずに検索可能な出力を生成します。 スキャンしたPDFの読み込み、傾き補正とノイズ除去、OCR処理、検索可能な出力の保存という一連の処理全体が、10行未満のコードで実現できます。 プロダクションパイプラインのパターンについては、検索可能なPDFのブログ記事をご覧ください。
前処理は組み込みであり、自身で構築するものではありません。 約180行の手動の前処理コード—グレースケールカラーマトリックス、ピクセル反復コントラスト強調、メディアンフィルターノイズ除去、Hough変換デスキュー、DPIスケーリング—が一連の単一行メソッド呼び出しになります: input.Deskew(), input.DeNoise(), input.Contrast(), input.Binarize()。 実際のドキュメントのほとんどにおいて、デフォルトの読み取り処理では、明示的なフィルタ呼び出しを一切行わずに、インテリジェントな自動前処理が適用されます。 画像品質補正ガイドと画像フィルターチュートリアルでは、フィルターカタログの全項目を網羅しています。
**Tesseract 5 の精度は今すぐご利用いただけます。**charlesw ラッパーは Tesseract 4.1.1 に固定されています。IronOCR には最適化された Tesseract 5 LSTM エンジンが同梱されており、ユーザー側での操作は不要です。 低解像度のスキャン画像、FAX、手書きのフォームなど、処理が困難なドキュメントタイプにおいて精度の低下が確認されているチームは、パッケージを切り替えるだけで、Tesseract 5の改良点を即座に活用できます。 精度の差は、LSTM認識が従来のエンジンを上回る文書で最も顕著であり、これは実世界のOCRワークロードの大部分を占めています。
**商用サポートはコミュニティによるトラブルシューティングに代わるものです。**charleswラッパーはコミュニティによって維持管理されているオープンソースプロジェクトであり、応答時間の保証やSLAはありません。 IronOCRは、メールサポート、上位プランでの優先サポート、および定期的な.NET互換性アップデートが行われる商用メンテナンス済みのコードベースを提供しています。 ドキュメント処理パイプラインにおいて本番環境のSLAを締結しているチームにとって、そのサポート体制は重要です。 IronOCRの製品ページおよびドキュメントハブでは、全機能セットと導入オプションについて解説しています。
