.NET OCR SDK: C# 用テキスト認識ライブラリ
.NET OCR SDKは、C#および.NETアプリケーションが画像、スキャンされたPDF、その他のドキュメント形式からプログラムによってテキストを抽出できるようにするソフトウェア開発キットです。 IronOCRは、本番環境ですぐに使用できる.NET OCR SDKです。調整済みのTesseract 5エンジンをベースに、前処理フィルター、バーコード読み取り、検索可能なPDF出力、125以上の言語のサポートなど、様々な機能を搭載しています。これらの機能はすべて、Windows、Linux、macOS、クラウドプラットフォームで動作するクリーンなC# APIを通じて利用可能です。
IronOCRがあなたのプロジェクトに最適な.NET OCR SDKである理由とは?
ゼロからテキスト認識システムを構築するということは、画像前処理パイプライン、言語データファイル、スレッドモデル、出力解析などを管理することを意味し、最初の単語を抽出するまでに数ヶ月の作業が必要となる。 IronOCRは、実績のあるエンジンを搭載することで、そうした負担を解消します。チームは数分でプロジェクトに組み込むことができます。
Tesseractの生のバインディングと一線を画す主な機能:
- 手書き文字を含む125以上の言語と文字体系を認識
- 内蔵フィルター:ノイズ除去、傾き補正、二値化、解像度向上、コントラスト補正
- 同一読み取りパス内でバーコードとQRコードを検出
- アーカイブワークフロー用の非表示テキストレイヤーを備えた検索可能なPDF生成
- 高スループットパイプライン向けの非同期および並列バッチ処理
- 特定のページ領域を対象としたゾーンOCRにより、処理時間を短縮
- Windows、Linux、macOS、Docker、Azureでのクロスプラットフォーム対応
Tesseract OCRプロジェクトのドキュメントによると、Tesseractの生データでは、言語パック、DPI設定、出力モードなどを手動で設定する必要がある。 IronOCRはこれらすべてを自動的に処理するため、抽出方法ではなく、抽出されたテキストの意味に集中できます。
IronOCRはRaw Tesseractと比べてどう違うのか?
P/Invokeラッパー、もしくはNuGetパッケージ経由でTesseractを使用する場合、テスデータ言語ファイルのダウンロードと配置、正しいページ分割モードの選択、複数ページのTIFFやPDF分割の処理、並列処理を行いたい場合のスレッド配線などを行う必要があります。 これらの詳細はどれも、あなたのビジネス上の問題に特有のものではありません。
IronOCRは、そうした配管システム全体を包み込みます。 型付きAPIインターフェース、自動的なtessdata管理、組み込みのPDF分割・再結合機能、そして複数のリクエストで再利用できるスレッドセーフなエンジンが利用できます。 その代償として、本番環境で使用するには有料ライセンスが必要になります。ライセンスページには、無料の開発ライセンスを含む現在の価格帯が表示されています。
オープンソースのみの依存関係を必要とするチームにとって、Tesseractの生データにPlusのプリプロセス処理を組み合わせる方法は有効な選択肢となる。 信頼性の高いOCRを迅速に提供する必要があるチームにとって、 IronOCRは統合対象をわずか数行のC#コードにまで削減します。
IronOCR .NET SDKはどのようにインストールするのですか?
インストールは、標準の.NETパッケージマネージャーであるNuGetを通じて行います。 プロジェクトディレクトリで次のコマンドを実行します:
Install-Package IronOcr
Visual Studioユーザーの方は、NuGet Package Manager GUIでIronOcrを検索し、そこからインストールしてください。 手動でのDLL参照を含む完全なインストールオプションについては、 IronOCRのインストールに関するドキュメントを参照してください。
インストール後、ライセンスキーをアプリケーションのスタートアップまたはappsettings.jsonに追加します。 無料トライアルを開始すると、評価期間中にすべての機能が利用できるトライアルキーが入手できます。
インストールの確認
インストール後の簡単な確認で、すべてが正しく配線されていることが確認できます。 .NET 10 をターゲットとするコンソールアプリケーションを作成します。
using IronOcr;
// Minimal smoke test -- reads a single image and prints extracted text
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("sample.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
// Minimal smoke test -- reads a single image and prints extracted text
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("sample.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
' Minimal smoke test -- reads a single image and prints extracted text
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage("sample.png")
Dim result = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
コンソールにテキストが表示された場合、SDKはインストールされており、ライセンスキーは有効です。 これで、本番環境のワークフローを構築する準備が整いました。
C#で画像やPDFからテキストを抽出するにはどうすればいいですか?
コアの抽出パターンは、すべての入力タイプで一貫しています。CODE-50360--@@インスタンスを作成し、OcrInputオブジェクトにコンテンツをロードし、Read()を呼び出します。 IronOCRは拡張子からファイル形式を自動検出するため、JPEG、PNG、TIFF、BMP、および複数ページのPDFファイルを同じコードパスで処理できます。
using IronOcr;
// Reusable OCR service encapsulating the IronTesseract engine
public class OcrService
{
private readonly IronTesseract _ocr = new IronTesseract();
public string ExtractText(string filePath)
{
using var input = new OcrInput();
// LoadPdf for PDF files; LoadImage for raster formats
if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
return _ocr.Read(input).Text;
}
public async Task<string> ExtractTextAsync(string filePath)
{
using var input = new OcrInput();
if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
var result = await _ocr.ReadAsync(input);
return result.Text;
}
}
using IronOcr;
// Reusable OCR service encapsulating the IronTesseract engine
public class OcrService
{
private readonly IronTesseract _ocr = new IronTesseract();
public string ExtractText(string filePath)
{
using var input = new OcrInput();
// LoadPdf for PDF files; LoadImage for raster formats
if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
return _ocr.Read(input).Text;
}
public async Task<string> ExtractTextAsync(string filePath)
{
using var input = new OcrInput();
if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
var result = await _ocr.ReadAsync(input);
return result.Text;
}
}
Imports IronOcr
' Reusable OCR service encapsulating the IronTesseract engine
Public Class OcrService
Private ReadOnly _ocr As New IronTesseract()
Public Function ExtractText(filePath As String) As String
Using input As New OcrInput()
' LoadPdf for PDF files; LoadImage for raster formats
If filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
input.LoadPdf(filePath)
Else
input.LoadImage(filePath)
End If
Return _ocr.Read(input).Text
End Using
End Function
Public Async Function ExtractTextAsync(filePath As String) As Task(Of String)
Using input As New OcrInput()
If filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
input.LoadPdf(filePath)
Else
input.LoadImage(filePath)
End If
Dim result = Await _ocr.ReadAsync(input)
Return result.Text
End Using
End Function
End Class
サービス利用のための最上位エントリーポイント:
using IronOcr;
var service = new OcrService();
string text = await service.ExtractTextAsync("invoice.pdf");
Console.WriteLine(text);
using IronOcr;
var service = new OcrService();
string text = await service.ExtractTextAsync("invoice.pdf");
Console.WriteLine(text);
Imports IronOcr
Dim service = New OcrService()
Dim text As String = Await service.ExtractTextAsync("invoice.pdf")
Console.WriteLine(text)
CODE-50363-@@インスタンスはスレッドセーフで、再利用できるように設計されています。 リクエストごとにインスタンス化するのではなく、アプリケーションの起動時に一度だけ作成します(例えば、 ASP.NET Coreの依存性注入を使用)。
複数ページのPDFについては、result.Pagesで、テキスト、信頼度スコア、バウンディングボックスにページごとにアクセスできます。 ページごとの反復処理の詳細については、複数ページPDFのOCRガイドを参照してください。
前処理フィルターを使用してOCRの精度を向上させるにはどうすればよいですか?
フラットベッドスキャナー、スマートフォンのカメラ、ファックス機などでスキャンした生データは、ノイズ、回転、コントラストの低下、解像度の不足といった問題が頻繁に発生する。 IronOCRの画像品質補正パイプラインは、読み取り呼び出しの前に連結されるターゲットフィルターによって、それぞれの問題に対処します。
using IronOcr;
public class AccuracyOptimizedOcr
{
private readonly IronTesseract _ocr = new IronTesseract();
public string ProcessLowQualityDocument(string filePath)
{
using var input = new OcrInput();
if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
// Chain preprocessing filters in order of operation
input.DeNoise(); // Remove scan artifacts and speckling
input.Deskew(); // Correct page tilt up to 35 degrees
input.Scale(150); // Enlarge small text for better recognition
input.Binarize(); // Convert to black/white for cleaner edges
input.EnhanceResolution(300); // Sharpen blurry or low-DPI input
var result = _ocr.Read(input);
// Confidence below 70 often signals a preprocessing mismatch
if (result.Confidence < 70)
Console.WriteLine($"Warning: low confidence ({result.Confidence:F1}%)");
return result.Text;
}
}
using IronOcr;
public class AccuracyOptimizedOcr
{
private readonly IronTesseract _ocr = new IronTesseract();
public string ProcessLowQualityDocument(string filePath)
{
using var input = new OcrInput();
if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
// Chain preprocessing filters in order of operation
input.DeNoise(); // Remove scan artifacts and speckling
input.Deskew(); // Correct page tilt up to 35 degrees
input.Scale(150); // Enlarge small text for better recognition
input.Binarize(); // Convert to black/white for cleaner edges
input.EnhanceResolution(300); // Sharpen blurry or low-DPI input
var result = _ocr.Read(input);
// Confidence below 70 often signals a preprocessing mismatch
if (result.Confidence < 70)
Console.WriteLine($"Warning: low confidence ({result.Confidence:F1}%)");
return result.Text;
}
}
Imports IronOcr
Public Class AccuracyOptimizedOcr
Private ReadOnly _ocr As New IronTesseract()
Public Function ProcessLowQualityDocument(filePath As String) As String
Using input As New OcrInput()
If filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
input.LoadPdf(filePath)
Else
input.LoadImage(filePath)
End If
' Chain preprocessing filters in order of operation
input.DeNoise() ' Remove scan artifacts and speckling
input.Deskew() ' Correct page tilt up to 35 degrees
input.Scale(150) ' Enlarge small text for better recognition
input.Binarize() ' Convert to black/white for cleaner edges
input.EnhanceResolution(300) ' Sharpen blurry or low-DPI input
Dim result = _ocr.Read(input)
' Confidence below 70 often signals a preprocessing mismatch
If result.Confidence < 70 Then
Console.WriteLine($"Warning: low confidence ({result.Confidence:F1}%)")
End If
Return result.Text
End Using
End Function
End Class
フィルター選択ガイド:
- CODE-50365---斑点や圧縮アーチファクトの多いスキャンに使用してください。
- CODE-50366--ドキュメントを斜めに撮影する場合に使用します; 自動検出については、ページ回転検出を参照してください。
- 小さな文字や150DPI以下の入力に使用します; 150~200の値で通常は最良の結果が得られます
- CODE-50368--@@ -- カラーまたはグラデーションの背景に使用してください; 画像を厳密な白黒に変換する
- CODE-50369--@@--ぼやけたテキストや低コントラストのテキストに使用します; Tesseractの最適な解像度は300 DPIとされています。
国際文書解析認識誌に掲載された研究によると、文字認識率を向上させる上で、二値化と傾き補正が最も効果的な前処理ステップであることが一貫して示されている。 両方とも、あらゆる生産パイプラインの基準として適用してください。
| フィルター | 問題解決 | 応募時期 |
|---|---|---|
DeNoise()
| スキャナーのアーティファクト、スペックルノイズ | フラットベッドまたはファックスのスキャン |
Deskew()
| ページの傾きと回転 | 撮影された書類または位置ずれした書類 |
Scale()
| 文字が小さい、またはDPIが低い | 150 DPI未満の入力 |
Binarize()
| カラー背景、グラデーション | 色付きの紙または透かし入りの用紙 |
EnhanceResolution()を使用してください。 |
ぼやけと低コントラスト | カメラで撮影した画像と圧縮されたJPEG画像 |
本番環境向けのバッチ処理パイプラインはどのように構築すればよいですか?
単一ドキュメントの抽出は簡単ですが、実際の運用環境では、数百または数千ものファイルがキュー、共有フォルダ、またはクラウドストレージに到着します。 IronOCRの非同期APIとスレッドセーフなエンジンは、並列ワークロードに適しています。
using IronOcr;
using Microsoft.Extensions.Logging;
public class ProductionOcrService
{
private readonly IronTesseract _ocr;
private readonly ILogger<ProductionOcrService> _logger;
public ProductionOcrService(ILogger<ProductionOcrService> logger)
{
_logger = logger;
_ocr = new IronTesseract
{
Configuration =
{
RenderSearchablePdfsAndHocr = true,
ReadBarCodes = true
}
};
}
public async Task<IReadOnlyList<string>> ProcessBatchAsync(
IEnumerable<string> filePaths,
int maxDegreeOfParallelism = 4)
{
var results = new System.Collections.Concurrent.ConcurrentBag<string>();
var options = new ParallelOptions
{
MaxDegreeOfParallelism = maxDegreeOfParallelism
};
await Parallel.ForEachAsync(filePaths, options, async (filePath, ct) =>
{
try
{
using var input = new OcrInput();
if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
var result = await _ocr.ReadAsync(input);
results.Add(result.Text);
_logger.LogInformation("Processed {FilePath} at {Confidence:F1}% confidence",
filePath, result.Confidence);
}
catch (Exception ex)
{
_logger.LogError(ex, "OCR failed for {FilePath}", filePath);
results.Add(string.Empty);
}
});
return results.ToList();
}
public void CreateSearchablePdf(string inputPath, string outputPath)
{
using var input = new OcrInput();
if (inputPath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(inputPath);
else
input.LoadImage(inputPath);
_ocr.Read(input).SaveAsSearchablePdf(outputPath);
_logger.LogInformation("Searchable PDF written to {OutputPath}", outputPath);
}
}
using IronOcr;
using Microsoft.Extensions.Logging;
public class ProductionOcrService
{
private readonly IronTesseract _ocr;
private readonly ILogger<ProductionOcrService> _logger;
public ProductionOcrService(ILogger<ProductionOcrService> logger)
{
_logger = logger;
_ocr = new IronTesseract
{
Configuration =
{
RenderSearchablePdfsAndHocr = true,
ReadBarCodes = true
}
};
}
public async Task<IReadOnlyList<string>> ProcessBatchAsync(
IEnumerable<string> filePaths,
int maxDegreeOfParallelism = 4)
{
var results = new System.Collections.Concurrent.ConcurrentBag<string>();
var options = new ParallelOptions
{
MaxDegreeOfParallelism = maxDegreeOfParallelism
};
await Parallel.ForEachAsync(filePaths, options, async (filePath, ct) =>
{
try
{
using var input = new OcrInput();
if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
var result = await _ocr.ReadAsync(input);
results.Add(result.Text);
_logger.LogInformation("Processed {FilePath} at {Confidence:F1}% confidence",
filePath, result.Confidence);
}
catch (Exception ex)
{
_logger.LogError(ex, "OCR failed for {FilePath}", filePath);
results.Add(string.Empty);
}
});
return results.ToList();
}
public void CreateSearchablePdf(string inputPath, string outputPath)
{
using var input = new OcrInput();
if (inputPath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(inputPath);
else
input.LoadImage(inputPath);
_ocr.Read(input).SaveAsSearchablePdf(outputPath);
_logger.LogInformation("Searchable PDF written to {OutputPath}", outputPath);
}
}
Imports IronOcr
Imports Microsoft.Extensions.Logging
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
Public Class ProductionOcrService
Private ReadOnly _ocr As IronTesseract
Private ReadOnly _logger As ILogger(Of ProductionOcrService)
Public Sub New(logger As ILogger(Of ProductionOcrService))
_logger = logger
_ocr = New IronTesseract With {
.Configuration = New TesseractConfiguration With {
.RenderSearchablePdfsAndHocr = True,
.ReadBarCodes = True
}
}
End Sub
Public Async Function ProcessBatchAsync(filePaths As IEnumerable(Of String), Optional maxDegreeOfParallelism As Integer = 4) As Task(Of IReadOnlyList(Of String))
Dim results = New ConcurrentBag(Of String)()
Dim options = New ParallelOptions With {
.MaxDegreeOfParallelism = maxDegreeOfParallelism
}
Await Parallel.ForEachAsync(filePaths, options, Async Function(filePath, ct)
Try
Using input As New OcrInput()
If filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
input.LoadPdf(filePath)
Else
input.LoadImage(filePath)
End If
Dim result = Await _ocr.ReadAsync(input)
results.Add(result.Text)
_logger.LogInformation("Processed {FilePath} at {Confidence:F1}% confidence", filePath, result.Confidence)
End Using
Catch ex As Exception
_logger.LogError(ex, "OCR failed for {FilePath}", filePath)
results.Add(String.Empty)
End Try
End Function)
Return results.ToList()
End Function
Public Sub CreateSearchablePdf(inputPath As String, outputPath As String)
Using input As New OcrInput()
If inputPath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
input.LoadPdf(inputPath)
Else
input.LoadImage(inputPath)
End If
_ocr.Read(input).SaveAsSearchablePdf(outputPath)
_logger.LogInformation("Searchable PDF written to {OutputPath}", outputPath)
End Using
End Sub
End Class
CODE-50370--@@@キャップは、ファイルが大きい場合にメモリの枯渇を防ぎます。 4コアサーバーでは、値4がうまく機能します。 メモリ使用量を分析した後でのみ、値を増やしてください。 Azure Functions または AWS Lambda のデプロイでは、関数インスタンスごとに同時実行数を 1 に設定し、代わりに水平方向にスケールしてください。
CODE-50371--@@は、元の画像が可視レイヤーとして保存され、認識されたテキストがその下に不可視で埋め込まれたPDFを生成します。 これにより、PDFビューアでの全文検索や検索エンジンによるインデックス作成が可能になります。これは、文書管理システムにおいて一般的な要件です。
生産における信頼度スコアのモニタリング
すべてのOcrResultは、Confidenceプロパティ(0~100)を公開しています。 ログ記録インフラストラクチャでこの指標を追跡することで、文書の品質が低下した際に早期警告信号を受け取ることができます。たとえば、スキャナーのキャリブレーションがずれたり、新しい文書サプライヤーが予想よりも低いDPIのスキャンデータを送ってきた場合などです。
実用的な閾値戦略としては、信頼度が80未満の場合に警告をログに記録し、70未満の場合に前処理の再試行をトリガーし、60未満の場合に文書を人間によるレビュー対象としてフラグ付けする。この段階的なアプローチにより、下流システムでデータ破損が発生する前に品質問題を捕捉できる。
Microsoft .NET logging documentation は、ASP.NET Coreの組み込みDIコンテナと統合するチームのために、上記のバッチサービスで使用されている@--CODE-50374--@@パターンをカバーしています。
スキャンした文書から構造化データを抽出するにはどうすればよいですか?
テキスト抽出が最初のステップです。2番目のステップは、抽出したテキストをアプリケーションが処理できる型付きフィールドに解析することです。 このパターンはIronOCRのリードパスと.NETのRegexを組み合わせて、請求書、フォーム、レポートから構造化データを取り出します。
using IronOcr;
using System.Text.RegularExpressions;
public record Invoice(
string? InvoiceNumber,
DateOnly? Date,
decimal? TotalAmount,
string RawText
);
public class InvoiceOcrService
{
private readonly IronTesseract _ocr = new IronTesseract();
public Invoice ExtractInvoiceData(string invoicePath)
{
using var input = new OcrInput();
if (invoicePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(invoicePath);
else
input.LoadImage(invoicePath);
input.DeNoise();
input.Deskew();
var result = _ocr.Read(input);
string text = result.Text;
return new Invoice(
InvoiceNumber: ExtractInvoiceNumber(text),
Date: ExtractDate(text),
TotalAmount: ExtractAmount(text),
RawText: text
);
}
private static string? ExtractInvoiceNumber(string text)
{
var match = Regex.Match(text, @"Invoice\s*#?:?\s*(\S+)", RegexOptions.IgnoreCase);
return match.Success ? match.Groups[1].Value : null;
}
private static DateOnly? ExtractDate(string text)
{
// Numeric format: MM/DD/YYYY
var numeric = Regex.Match(text, @"\b(\d{1,2}/\d{1,2}/\d{2,4})\b");
if (numeric.Success && DateTime.TryParse(numeric.Groups[1].Value, out var d1))
return DateOnly.FromDateTime(d1);
// Written format: January 15, 2025
var written = Regex.Match(text,
@"\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+(\d{1,2}),?\s+(\d{4})\b",
RegexOptions.IgnoreCase);
if (written.Success && DateTime.TryParse(written.Value, out var d2))
return DateOnly.FromDateTime(d2);
return null;
}
private static decimal? ExtractAmount(string text)
{
var match = Regex.Match(text, @"\$\s*(\d+(?:\.\d{2})?)");
return match.Success && decimal.TryParse(match.Groups[1].Value, out var amt)
? amt
: null;
}
}
using IronOcr;
using System.Text.RegularExpressions;
public record Invoice(
string? InvoiceNumber,
DateOnly? Date,
decimal? TotalAmount,
string RawText
);
public class InvoiceOcrService
{
private readonly IronTesseract _ocr = new IronTesseract();
public Invoice ExtractInvoiceData(string invoicePath)
{
using var input = new OcrInput();
if (invoicePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(invoicePath);
else
input.LoadImage(invoicePath);
input.DeNoise();
input.Deskew();
var result = _ocr.Read(input);
string text = result.Text;
return new Invoice(
InvoiceNumber: ExtractInvoiceNumber(text),
Date: ExtractDate(text),
TotalAmount: ExtractAmount(text),
RawText: text
);
}
private static string? ExtractInvoiceNumber(string text)
{
var match = Regex.Match(text, @"Invoice\s*#?:?\s*(\S+)", RegexOptions.IgnoreCase);
return match.Success ? match.Groups[1].Value : null;
}
private static DateOnly? ExtractDate(string text)
{
// Numeric format: MM/DD/YYYY
var numeric = Regex.Match(text, @"\b(\d{1,2}/\d{1,2}/\d{2,4})\b");
if (numeric.Success && DateTime.TryParse(numeric.Groups[1].Value, out var d1))
return DateOnly.FromDateTime(d1);
// Written format: January 15, 2025
var written = Regex.Match(text,
@"\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+(\d{1,2}),?\s+(\d{4})\b",
RegexOptions.IgnoreCase);
if (written.Success && DateTime.TryParse(written.Value, out var d2))
return DateOnly.FromDateTime(d2);
return null;
}
private static decimal? ExtractAmount(string text)
{
var match = Regex.Match(text, @"\$\s*(\d+(?:\.\d{2})?)");
return match.Success && decimal.TryParse(match.Groups[1].Value, out var amt)
? amt
: null;
}
}
Imports IronOcr
Imports System.Text.RegularExpressions
Public Class Invoice
Public Property InvoiceNumber As String
Public Property Date As DateOnly?
Public Property TotalAmount As Decimal?
Public Property RawText As String
Public Sub New(invoiceNumber As String, [date] As DateOnly?, totalAmount As Decimal?, rawText As String)
Me.InvoiceNumber = invoiceNumber
Me.Date = [date]
Me.TotalAmount = totalAmount
Me.RawText = rawText
End Sub
End Class
Public Class InvoiceOcrService
Private ReadOnly _ocr As New IronTesseract()
Public Function ExtractInvoiceData(invoicePath As String) As Invoice
Using input As New OcrInput()
If invoicePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
input.LoadPdf(invoicePath)
Else
input.LoadImage(invoicePath)
End If
input.DeNoise()
input.Deskew()
Dim result = _ocr.Read(input)
Dim text As String = result.Text
Return New Invoice(
InvoiceNumber:=ExtractInvoiceNumber(text),
[Date]:=ExtractDate(text),
TotalAmount:=ExtractAmount(text),
RawText:=text
)
End Using
End Function
Private Shared Function ExtractInvoiceNumber(text As String) As String
Dim match = Regex.Match(text, "Invoice\s*#?:?\s*(\S+)", RegexOptions.IgnoreCase)
Return If(match.Success, match.Groups(1).Value, Nothing)
End Function
Private Shared Function ExtractDate(text As String) As DateOnly?
' Numeric format: MM/DD/YYYY
Dim numeric = Regex.Match(text, "\b(\d{1,2}/\d{1,2}/\d{2,4})\b")
If numeric.Success AndAlso DateTime.TryParse(numeric.Groups(1).Value, Nothing) Then
Return DateOnly.FromDateTime(DateTime.Parse(numeric.Groups(1).Value))
End If
' Written format: January 15, 2025
Dim written = Regex.Match(text,
"\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+(\d{1,2}),?\s+(\d{4})\b",
RegexOptions.IgnoreCase)
If written.Success AndAlso DateTime.TryParse(written.Value, Nothing) Then
Return DateOnly.FromDateTime(DateTime.Parse(written.Value))
End If
Return Nothing
End Function
Private Shared Function ExtractAmount(text As String) As Decimal?
Dim match = Regex.Match(text, "\$\s*(\d+(?:\.\d{2})?)")
Dim amt As Decimal
Return If(match.Success AndAlso Decimal.TryParse(match.Groups(1).Value, amt), amt, Nothing)
End Function
End Class
この方法は、フォーム上の各フィールドがどこに表示されるかを正確に把握している場合に、ゾーンOCRと組み合わせると効果的です。 境界矩形を指定することで、ページ全体の認識を省略し、請求書番号または合計金額を含む領域のみを対象とすることができるため、固定レイアウト文書の処理時間を大幅に短縮できます。
表や構造化フォームなど、より高度な抽出シナリオについては、製品サイトにあるIronOCRのデータ抽出例を参照してください。
.NETで多言語OCRをどのように処理しますか?
多くの組織は、輸出入書類、国際契約書、多言語対応の顧客提出書類など、複数の言語で書かれた文書を処理しています。 IronOCRは、読み取り呼び出しの前に言語パックを設定できるようにすることで、この問題を解決します。
using IronOcr;
// Configure multi-language recognition
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.EnglishBest; // Swap for any of 125+ supported languages
// For mixed-language documents, combine language packs
ocr.AddSecondaryLanguage(OcrLanguage.German);
using var input = new OcrInput();
input.LoadPdf("multilingual-contract.pdf");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
// Configure multi-language recognition
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.EnglishBest; // Swap for any of 125+ supported languages
// For mixed-language documents, combine language packs
ocr.AddSecondaryLanguage(OcrLanguage.German);
using var input = new OcrInput();
input.LoadPdf("multilingual-contract.pdf");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
' Configure multi-language recognition
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.EnglishBest ' Swap for any of 125+ supported languages
' For mixed-language documents, combine language packs
ocr.AddSecondaryLanguage(OcrLanguage.German)
Using input As New OcrInput()
input.LoadPdf("multilingual-contract.pdf")
Dim result = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
IronOCRの言語サポートページには、利用可能な125種類以上の言語パックすべてとダウンロード手順が掲載されています。 言語パックはNuGetパッケージ(たとえば、IronOcr.Languages.German)として出荷されるため、すでに使用しているパッケージ管理ワークフローと統合できます。
ラテン文字以外の文字セット(アラビア語、中国語、日本語、韓国語など)については、 IronOCRは右から左へのテキスト方向と表意文字に対応した最適化されたモデルを提供します。設定の詳細については、 CJK OCRガイドを参照してください。
次のステップは何ですか?
これで、あらゆる.NET 10アプリケーションに実用レベルのOCR機能を追加するために必要なパターンが揃いました。基本的なテキスト抽出、困難なスキャンに対する前処理、非同期バッチ処理、構造化データ解析、および多言語サポートなどです。
ここから、プロジェクトのニーズに基づいて以下の分野を探索してください。
-バーコードとQRコードの読み取り-- 同じ画像パスから機械読み取り可能なコードを抽出します
- HOCR出力フォーマット-- レイアウトを考慮した下流処理のために、単語レベルの境界ボックスを取得します。
- IronOCRのライセンスオプション- SaaS、OEM、Enterpriseの各ティアを含む、ロイヤリティフリーの配信モデル
- IronOCRコード例ライブラリ-- 一般的なシナリオを網羅した30以上の動作例
- Azure Functions デプロイ ガイド-- Microsoft クラウド インフラストラクチャ上のサーバーレス OCR
まずは無料トライアルライセンスで、ご自身のドキュメントを使って全機能を評価してから、有料プランへの加入を検討してください。
よくある質問
.NET OCR SDKとは何ですか?
IronOCRによる.NET OCR SDKは、C#アプリケーションに光学文字認識機能を統合するために設計されたライブラリであり、開発者は画像、PDF、およびスキャンされた文書からテキストを抽出できます。
IronOCR for .NET SDKは、シンプルなAPI、複数の言語のサポート、クロスプラットフォームの互換性、さまざまなファイル形式や低品質スキャンに対応するための高度な機能を提供します。
IronOCR for .NET SDKは、シンプルなAPI、複数言語のサポート、クロスプラットフォーム互換性、さまざまなファイル形式および低品質スキャンの処理に関する高度な機能を提供します。
IronOCRはどのように異なる言語を処理しますか?
IronOCRは低品質のスキャンを処理できますか?
はい、IronOCRは低品質のスキャンに効果的に対応するように設計されており、困難なシナリオであってもテキスト認識精度を向上させる高度なアルゴリズムを採用しています。
IronOCR for .NET SDKはクロスプラットフォームですか?
IronOCR for .NET SDKはクロスプラットフォームであり、さまざまなオペレーティングシステムで使用できるため、さまざまな開発環境にとって柔軟性があります。
IronOCRはどのようなファイル形式をサポートしていますか?
IronOCRは、画像、PDF、スキャンされたドキュメントなどの幅広いファイル形式をサポートし、異なるメディアでのテキスト認識タスクに柔軟性を提供します。
開発者はIronOCRをどのようにプロジェクトに統合できますか?
開発者はIronOCRのシンプルなAPIを使用して、C#プロジェクトに簡単に統合し、アプリケーションにOCR機能を追加するプロセスを簡素化できます。
開発者は、型付き API を使用してIronOCR をC# プロジェクトに統合できます。これにより、アプリケーションに OCR 機能を追加するプロセスが簡素化されます。
IronOCRは、ドキュメント管理システム、自動データ入力、コンテンツのデジタル化、画像やPDFからのテキスト抽出を必要とするあらゆるアプリケーションで利用できます。
このウェブページでは、IronOCR for .NET OCR SDKの概要を提供し、C#アプリケーション向けのテキスト認識機能において、シンプルなAPI、企業レベルのサポート、さまざまなドキュメント形式や言語を扱うためのクロスプラットフォーム機能などの機能に焦点を当てています。




