IronOCRを使ったC#での文字認識・文字起こし進捗追跡の方法
IronOCR は、OCR 操作用のイベント ベースの進行状況追跡システムを提供します。これにより、開発者は、完了率、処理されたページ数、および時間メトリックをリアルタイムで報告する OcrProgress イベントを通じてテキスト抽出の進行状況を監視できます。
クイックスタート: OcrProgress を購読して PDF を読む
この例では、 IronOCRを使用して OCR の進行状況を監視する方法を示します。組み込みの OcrProgress イベントをサブスクライブし、PDF の読み取り中にパーセンテージ、完了したページ数、合計ページ数などの即時フィードバックを受け取ります。 ほんの数行で始められます。
-
IronOCR をNuGetパッケージマネージャでインストール
PM > Install-Package IronOcr -
このコード スニペットをコピーして実行します。
var ocr = new IronOcr.IronTesseract(); ocr.OcrProgress += (s, e) => Console.WriteLine(e.ProgressPercent + "% (" + e.PagesComplete + "/" + e.TotalPages + ")"); var result = ocr.Read(new IronOcr.OcrInput().LoadPdf("file.pdf")); -
実際の環境でテストするためにデプロイする
今日プロジェクトで IronOCR を使い始めましょう無料トライアル
最小限のワークフロー(5ステップ)
- 読書の進捗状況を追跡するための C# ライブラリをダウンロードする
- **`OcrProgress`**イベントを購読する
- イベントから渡されるインスタンスを利用して進捗情報を取得する
- 進捗をパーセンテージと総所要時間で取得する
- 開始時間と終了時間、および総ページ数を取得します
私の OCR アプリケーションに進捗追跡を実装するにはどうすればよいですか?
OCRで大規模な文書やバッチファイルを処理する場合、進行状況の追跡は不可欠です。 OcrProgress イベントをサブスクライブすると、読み取りプロセスの進行状況の更新を受信できます。 これは、PDFのOCR操作や、複数ページのTIFFファイルを扱うときに特に役立ちます。
このイベントは、開始時間、総ページ数、パーセンテージとしての進捗、継続時間、終了時間など、OCRジョブの進捗に関する情報を含むインスタンスを渡します。この機能は、async オペレーションとシームレスに動作し、multithreading と組み合わせてパフォーマンスを向上させることができます。
The following example uses this document as a sample: "Experiences in Biodiversity Research: A Field Course" by Thea B. アイオワ州立大学のゲスラー氏。
:path=/static-assets/ocr/content-code-examples/how-to/progress-tracking-progress-tracking.cs
using IronOcr;
using System;
var ocrTesseract = new IronTesseract();
// Subscribe to OcrProgress event
ocrTesseract.OcrProgress += (_, ocrProgressEventsArgs) =>
{
Console.WriteLine("Start time: " + ocrProgressEventsArgs.StartTimeUTC.ToString());
Console.WriteLine("Total pages number: " + ocrProgressEventsArgs.TotalPages);
Console.WriteLine("Progress(%) | Duration");
Console.WriteLine(" " + ocrProgressEventsArgs.ProgressPercent + "% | " + ocrProgressEventsArgs.Duration.TotalSeconds + "s");
Console.WriteLine("End time: " + ocrProgressEventsArgs.EndTimeUTC.ToString());
Console.WriteLine("----------------------------------------------");
};
using var input = new OcrInput();
input.LoadPdf("Experiences-in-Biodiversity-Research-A-Field-Course.pdf");
// Progress events will fire during the read operation
var result = ocrTesseract.Read(input);
Imports IronOcr
Imports System
Private ocrTesseract = New IronTesseract()
' Subscribe to OcrProgress event
Private ocrTesseract.OcrProgress += Sub(underscore, ocrProgressEventsArgs)
Console.WriteLine("Start time: " & ocrProgressEventsArgs.StartTimeUTC.ToString())
Console.WriteLine("Total pages number: " & ocrProgressEventsArgs.TotalPages)
Console.WriteLine("Progress(%) | Duration")
Console.WriteLine(" " & ocrProgressEventsArgs.ProgressPercent & "% | " & ocrProgressEventsArgs.Duration.TotalSeconds & "s")
Console.WriteLine("End time: " & ocrProgressEventsArgs.EndTimeUTC.ToString())
Console.WriteLine("----------------------------------------------")
End Sub
Private input = New OcrInput()
input.LoadPdf("Experiences-in-Biodiversity-Research-A-Field-Course.pdf")
' Progress events will fire during the read operation
Dim result = ocrTesseract.Read(input)
イベントからどのような進捗情報にアクセスできますか?
OcrProgress イベントは、OCR パフォーマンスの監視と最適化に役立つ包括的な進捗データを提供します。 各プロパティは、操作の追跡において特定の目的を果たします:
ProgressPercent: OCR ジョブの進行状況は、完了したページの割合として 0 から 100 までの範囲で表示されます。GUI アプリケーションの進行状況バーを更新するのに役立ちます。TotalPages: OCRエンジンによって処理されているページの総数。推定完了時間の計算に不可欠です。PagesComplete: OCR 読み取りが完全に完了したページ数。 このカウントは、ページが処理されるにつれて徐々に増えていきます。Duration: OCR ジョブの合計実行時間。プロセス全体が完了するまでにかかった時間を示します。 TimeSpanフォーマットで測定され、イベントがトリガーされるたびに更新されます。StartTimeUTC: OCR ジョブが開始された日時。協定世界時 (UTC) 形式で表されます。EndTimeUTC: OCR ジョブが UTC 形式で 100% 完了した日時。 このプロパティは、OCRの処理中はNULLで、処理が終了すると入力されます。
高度な進捗追跡の実装
本番アプリケーションでは、より洗練された進捗管理を実装します。 この例には、エラー処理と詳細なロギングが含まれています:
using IronOcr;
using System;
using System.Diagnostics;
public class OcrProgressTracker
{
private readonly IronTesseract _tesseract;
private Stopwatch _stopwatch;
private int _lastReportedPercent = 0;
public OcrProgressTracker()
{
_tesseract = new IronTesseract();
// Configure for optimal performance
_tesseract.Language = OcrLanguage.EnglishBest;
_tesseract.Configuration.ReadBarCodes = false;
// Subscribe to progress event
_tesseract.OcrProgress += OnOcrProgress;
}
private void OnOcrProgress(object sender, OcrProgressEventsArgs e)
{
// Only report significant progress changes (every 10%)
if (e.ProgressPercent - _lastReportedPercent >= 10 || e.ProgressPercent == 100)
{
_lastReportedPercent = e.ProgressPercent;
Console.WriteLine($"Progress: {e.ProgressPercent}%");
Console.WriteLine($"Pages: {e.PagesComplete}/{e.TotalPages}");
Console.WriteLine($"Elapsed: {e.Duration.TotalSeconds:F1}s");
// Estimate remaining time
if (e.ProgressPercent > 0 && e.ProgressPercent < 100)
{
var estimatedTotal = e.Duration.TotalSeconds / (e.ProgressPercent / 100.0);
var remaining = estimatedTotal - e.Duration.TotalSeconds;
Console.WriteLine($"Estimated remaining: {remaining:F1}s");
}
Console.WriteLine("---");
}
}
public OcrResult ProcessDocument(string filePath)
{
_stopwatch = Stopwatch.StartNew();
using var input = new OcrInput();
input.LoadPdf(filePath);
// Apply image filters for better accuracy
input.Deskew();
input.DeNoise();
var result = _tesseract.Read(input);
_stopwatch.Stop();
Console.WriteLine($"Total processing time: {_stopwatch.Elapsed.TotalSeconds:F1}s");
return result;
}
}
using IronOcr;
using System;
using System.Diagnostics;
public class OcrProgressTracker
{
private readonly IronTesseract _tesseract;
private Stopwatch _stopwatch;
private int _lastReportedPercent = 0;
public OcrProgressTracker()
{
_tesseract = new IronTesseract();
// Configure for optimal performance
_tesseract.Language = OcrLanguage.EnglishBest;
_tesseract.Configuration.ReadBarCodes = false;
// Subscribe to progress event
_tesseract.OcrProgress += OnOcrProgress;
}
private void OnOcrProgress(object sender, OcrProgressEventsArgs e)
{
// Only report significant progress changes (every 10%)
if (e.ProgressPercent - _lastReportedPercent >= 10 || e.ProgressPercent == 100)
{
_lastReportedPercent = e.ProgressPercent;
Console.WriteLine($"Progress: {e.ProgressPercent}%");
Console.WriteLine($"Pages: {e.PagesComplete}/{e.TotalPages}");
Console.WriteLine($"Elapsed: {e.Duration.TotalSeconds:F1}s");
// Estimate remaining time
if (e.ProgressPercent > 0 && e.ProgressPercent < 100)
{
var estimatedTotal = e.Duration.TotalSeconds / (e.ProgressPercent / 100.0);
var remaining = estimatedTotal - e.Duration.TotalSeconds;
Console.WriteLine($"Estimated remaining: {remaining:F1}s");
}
Console.WriteLine("---");
}
}
public OcrResult ProcessDocument(string filePath)
{
_stopwatch = Stopwatch.StartNew();
using var input = new OcrInput();
input.LoadPdf(filePath);
// Apply image filters for better accuracy
input.Deskew();
input.DeNoise();
var result = _tesseract.Read(input);
_stopwatch.Stop();
Console.WriteLine($"Total processing time: {_stopwatch.Elapsed.TotalSeconds:F1}s");
return result;
}
}
Imports IronOcr
Imports System
Imports System.Diagnostics
Public Class OcrProgressTracker
Private ReadOnly _tesseract As IronTesseract
Private _stopwatch As Stopwatch
Private _lastReportedPercent As Integer = 0
Public Sub New()
_tesseract = New IronTesseract()
' Configure for optimal performance
_tesseract.Language = OcrLanguage.EnglishBest
_tesseract.Configuration.ReadBarCodes = False
' Subscribe to progress event
AddHandler _tesseract.OcrProgress, AddressOf OnOcrProgress
End Sub
Private Sub OnOcrProgress(sender As Object, e As OcrProgressEventsArgs)
' Only report significant progress changes (every 10%)
If e.ProgressPercent - _lastReportedPercent >= 10 OrElse e.ProgressPercent = 100 Then
_lastReportedPercent = e.ProgressPercent
Console.WriteLine($"Progress: {e.ProgressPercent}%")
Console.WriteLine($"Pages: {e.PagesComplete}/{e.TotalPages}")
Console.WriteLine($"Elapsed: {e.Duration.TotalSeconds:F1}s")
' Estimate remaining time
If e.ProgressPercent > 0 AndAlso e.ProgressPercent < 100 Then
Dim estimatedTotal = e.Duration.TotalSeconds / (e.ProgressPercent / 100.0)
Dim remaining = estimatedTotal - e.Duration.TotalSeconds
Console.WriteLine($"Estimated remaining: {remaining:F1}s")
End If
Console.WriteLine("---")
End If
End Sub
Public Function ProcessDocument(filePath As String) As OcrResult
_stopwatch = Stopwatch.StartNew()
Using input As New OcrInput()
input.LoadPdf(filePath)
' Apply image filters for better accuracy
input.Deskew()
input.DeNoise()
Dim result = _tesseract.Read(input)
_stopwatch.Stop()
Console.WriteLine($"Total processing time: {_stopwatch.Elapsed.TotalSeconds:F1}s")
Return result
End Using
End Function
End Class
進捗追跡を UI アプリケーションに統合する
Windows FormsやWPFでデスクトップアプリケーションを構築する場合、進捗管理はユーザーエクスペリエンスにとって非常に重要です。 progressイベントは、UI要素を安全に更新することができます:
using System;
using System.Windows.Forms;
using IronOcr;
public partial class OcrForm : Form
{
private IronTesseract _tesseract;
private ProgressBar progressBar;
private Label statusLabel;
public OcrForm()
{
InitializeComponent();
_tesseract = new IronTesseract();
_tesseract.OcrProgress += UpdateProgress;
}
private void UpdateProgress(object sender, OcrProgressEventsArgs e)
{
// Ensure UI updates happen on the main thread
if (InvokeRequired)
{
BeginInvoke(new Action(() => UpdateProgress(sender, e)));
return;
}
progressBar.Value = e.ProgressPercent;
statusLabel.Text = $"Processing page {e.PagesComplete} of {e.TotalPages}";
// Show completion message
if (e.ProgressPercent == 100)
{
MessageBox.Show($"OCR completed in {e.Duration.TotalSeconds:F1} seconds");
}
}
}
using System;
using System.Windows.Forms;
using IronOcr;
public partial class OcrForm : Form
{
private IronTesseract _tesseract;
private ProgressBar progressBar;
private Label statusLabel;
public OcrForm()
{
InitializeComponent();
_tesseract = new IronTesseract();
_tesseract.OcrProgress += UpdateProgress;
}
private void UpdateProgress(object sender, OcrProgressEventsArgs e)
{
// Ensure UI updates happen on the main thread
if (InvokeRequired)
{
BeginInvoke(new Action(() => UpdateProgress(sender, e)));
return;
}
progressBar.Value = e.ProgressPercent;
statusLabel.Text = $"Processing page {e.PagesComplete} of {e.TotalPages}";
// Show completion message
if (e.ProgressPercent == 100)
{
MessageBox.Show($"OCR completed in {e.Duration.TotalSeconds:F1} seconds");
}
}
}
Imports System
Imports System.Windows.Forms
Imports IronOcr
Public Partial Class OcrForm
Inherits Form
Private _tesseract As IronTesseract
Private progressBar As ProgressBar
Private statusLabel As Label
Public Sub New()
InitializeComponent()
_tesseract = New IronTesseract()
AddHandler _tesseract.OcrProgress, AddressOf UpdateProgress
End Sub
Private Sub UpdateProgress(sender As Object, e As OcrProgressEventsArgs)
' Ensure UI updates happen on the main thread
If InvokeRequired Then
BeginInvoke(New Action(Sub() UpdateProgress(sender, e)))
Return
End If
progressBar.Value = e.ProgressPercent
statusLabel.Text = $"Processing page {e.PagesComplete} of {e.TotalPages}"
' Show completion message
If e.ProgressPercent = 100 Then
MessageBox.Show($"OCR completed in {e.Duration.TotalSeconds:F1} seconds")
End If
End Sub
End Class
大きなドキュメントとタイムアウトを扱う
広範なドキュメントを処理する場合、進行状況の追跡がさらに重要になります。 タイムアウト設定やアボートトークンと組み合わせることで、より優れた制御が可能になります:
using IronOcr;
using System;
using System.Threading;
public async Task ProcessLargeDocumentWithTimeout()
{
var cts = new CancellationTokenSource();
var tesseract = new IronTesseract();
// Set a timeout of 5 minutes
cts.CancelAfter(TimeSpan.FromMinutes(5));
tesseract.OcrProgress += (s, e) =>
{
Console.WriteLine($"Progress: {e.ProgressPercent}% - Page {e.PagesComplete}/{e.TotalPages}");
// Check if we should cancel based on progress
if (e.Duration.TotalMinutes > 4 && e.ProgressPercent < 50)
{
Console.WriteLine("Processing too slow, cancelling...");
cts.Cancel();
}
};
try
{
using var input = new OcrInput();
input.LoadPdf("large-document.pdf");
var result = await Task.Run(() =>
tesseract.Read(input, cts.Token), cts.Token);
Console.WriteLine("OCR completed successfully");
}
catch (OperationCanceledException)
{
Console.WriteLine("OCR operation was cancelled");
}
}
using IronOcr;
using System;
using System.Threading;
public async Task ProcessLargeDocumentWithTimeout()
{
var cts = new CancellationTokenSource();
var tesseract = new IronTesseract();
// Set a timeout of 5 minutes
cts.CancelAfter(TimeSpan.FromMinutes(5));
tesseract.OcrProgress += (s, e) =>
{
Console.WriteLine($"Progress: {e.ProgressPercent}% - Page {e.PagesComplete}/{e.TotalPages}");
// Check if we should cancel based on progress
if (e.Duration.TotalMinutes > 4 && e.ProgressPercent < 50)
{
Console.WriteLine("Processing too slow, cancelling...");
cts.Cancel();
}
};
try
{
using var input = new OcrInput();
input.LoadPdf("large-document.pdf");
var result = await Task.Run(() =>
tesseract.Read(input, cts.Token), cts.Token);
Console.WriteLine("OCR completed successfully");
}
catch (OperationCanceledException)
{
Console.WriteLine("OCR operation was cancelled");
}
}
Imports IronOcr
Imports System
Imports System.Threading
Imports System.Threading.Tasks
Public Async Function ProcessLargeDocumentWithTimeout() As Task
Dim cts As New CancellationTokenSource()
Dim tesseract As New IronTesseract()
' Set a timeout of 5 minutes
cts.CancelAfter(TimeSpan.FromMinutes(5))
AddHandler tesseract.OcrProgress, Sub(s, e)
Console.WriteLine($"Progress: {e.ProgressPercent}% - Page {e.PagesComplete}/{e.TotalPages}")
' Check if we should cancel based on progress
If e.Duration.TotalMinutes > 4 AndAlso e.ProgressPercent < 50 Then
Console.WriteLine("Processing too slow, cancelling...")
cts.Cancel()
End If
End Sub
Try
Using input As New OcrInput()
input.LoadPdf("large-document.pdf")
Dim result = Await Task.Run(Function() tesseract.Read(input, cts.Token), cts.Token)
Console.WriteLine("OCR completed successfully")
End Using
Catch ex As OperationCanceledException
Console.WriteLine("OCR operation was cancelled")
End Try
End Function
進捗追跡のベストプラクティス
1.更新頻度: 処理中に OcrProgress イベントが頻繁に発生します。 UIやログを圧迫しないよう、更新のフィルタリングを検討してください。
2.パフォーマンスへの影響:進行状況の追跡はパフォーマンスのオーバーヘッドを最小限に抑えますが、過剰なロギングや UI の更新は OCR プロセスを遅くする可能性があります。
3.メモリ管理:大きな TIFF ファイルまたは PDF の場合、最適なパフォーマンスを確保するために、進行状況とともにメモリ使用量を監視します。
4.エラー処理:例外によって OCR プロセスが中断されるのを防ぐため、進行イベントハンドラには常にエラー処理を含めてください。
5.スレッド セーフティ: 進行状況イベントから UI 要素を更新する場合は、Invoke または BeginInvoke メソッドを使用して適切なスレッド同期を確保します。
結論
IronOCRのプログレス・トラッキングはOCR処理に必要不可欠な可視性を提供し、開発者は処理状況をユーザーに知らせる応答性の高いアプリケーションを作成することができます。 OcrProgress イベントを効果的に活用することで、1 ページのドキュメントから大規模な PDF ファイルまですべてを確実に処理できるプロフェッショナルなアプリケーションを構築できます。
より高度な OCR テクニックについては、画像フィルターおよび 結果オブジェクトに関するガイドを参照して、OCR 実装をさらに強化してください。
よくある質問
OCRの進捗状況をリアルタイムで追跡するにはどうすればよいですか?
IronOCRはOcrProgressイベントを通してイベントベースの進捗管理システムを提供します。IronTesseractインスタンス上でこのイベントをサブスクライブするだけで、OCR処理中の完了率、処理されたページ、時間メトリクスを含むリアルタイムの最新情報を受け取ることができます。
OcrProgressイベントはどのような情報を提供しますか?
IronOCRのOcrProgressイベントは、ProgressPercent (0-100%)、TotalPagesカウント、PagesCompleteカウント、開始・終了時刻、総所要時間を含む包括的なデータを提供します。この情報は、GUIアプリケーションでプログレスバーを更新したり、OCRのパフォーマンスを監視したりする際に特に役立ちます。
非同期 OCR 操作で進捗管理を使用できますか?
IronOCRの進捗管理機能は非同期処理とシームレスに連動します。OcrProgressイベントを通してリアルタイムの進捗アップデートを受け取りながら、非同期処理やマルチスレッドと組み合わせてパフォーマンスを向上させることができます。
PDF OCRの簡単な進捗管理機能を実装するにはどうすればよいですか?
IronOCRで基本的な進捗トラッキングを実装するには、IronTesseractインスタンスを作成し、ラムダ式またはイベントハンドラでOcrProgressイベントをサブスクライブし、PDFでReadメソッドを呼び出します。イベントは定期的に発生し、完了率と処理されたページの情報を提供します。
進捗管理は大規模な文書処理に役立ちますか?
IronOCRで大きな文書やバッチファイルを処理する場合、進捗管理は不可欠です。特にPDFのOCR処理や複数ページのTIFFファイルの処理に有効で、処理状況の監視、完了時間の見積もり、長時間の処理中のユーザーフィードバックが可能です。

