如何使用 IronOCR 在 C# 中进行进度跟踪
IronOCR 为 OCR 操作提供基于事件的进度跟踪系统,开发者可通过 OcrProgress 事件实时监控读取进度,该事件会实时报告完成百分比、已处理页面数及时间指标。
快速开始:订阅 OcrProgress 并读取 PDF
本示例演示了如何使用 IronOCR 监控 OCR 进度:订阅其内置的 OcrProgress 事件,在读取 PDF 时实时获取进度反馈,包括完成百分比、已处理页数及总页数。 只需几行即可开始。
-
使用 NuGet 包管理器安装 https://www.nuget.org/packages/IronOcr
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 任务 100% 完成的日期和时间(UTC 格式)。 当 OCR 正在进行时,该属性为空,而一旦该过程结束,该属性就会被填充。
高级进度跟踪实施
对于生产应用程序,实施更复杂的进度跟踪。 本示例包括错误处理和详细日志记录:
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 窗体或 WPF 构建桌面应用程序时,进度跟踪对用户体验至关重要。 进度事件可以安全地更新 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
进度跟踪的最佳实践
- 更新频率:在处理过程中,
OcrProgress事件会频繁触发。 考虑过滤更新,以避免 UI 或日志过多。
2.性能影响:进度跟踪的性能开销极小,但过多的日志记录或 UI 更新可能会减慢 OCR 进程。
3.内存管理:对于大型 TIFF 文件或 PDF 文件,应随着进度监控内存使用情况,以确保最佳性能。
4.错误处理:始终在进度事件处理程序中包含错误处理,以防止异常干扰 OCR 进程。
- 线程安全:当通过进度事件更新 UI 元素时,请使用
Invoke或BeginInvoke方法确保正确的线程同步。
结论
IronOCR 中的进度跟踪提供了 OCR 操作的基本可见性,使开发人员能够创建响应式应用程序,让用户随时了解处理状态。 通过有效利用 OcrProgress 事件,您可以自信地构建专业应用程序,从单页文档到庞大的 PDF 文件,无所不能。
常见问题解答
如何实时跟踪 OCR 进度?
IronOCR 通过 OcrProgress 事件提供基于事件的进度跟踪系统。只需在您的 IronTesseract 实例上订阅该事件,您就会收到实时更新,包括 OCR 操作期间的完成百分比、已处理页面和时间指标。
OcrProgress 活动提供哪些信息?
IronOCR 中的 OcrProgress 事件提供了全面的数据,包括 ProgressPercent(0-100%)、TotalPages 计数、PagesComplete 计数、开始和结束时间以及总持续时间。这些信息对于更新 GUI 应用程序中的进度条和监控 OCR 性能特别有用。
我可以在异步 OCR 操作中使用进度跟踪吗?
是的,IronOCR 的进度跟踪功能可与异步操作无缝配合。您可以将其与异步处理甚至多线程结合起来以提高性能,同时还能通过 OcrProgress 事件接收实时进度更新。
如何为 PDF OCR 实现一个简单的进度跟踪器?
要使用 IronOCR 实现基本的进度跟踪,需要创建一个 IronTesseract 实例,使用 lambda 表达式或事件处理程序订阅 OcrProgress 事件,然后调用 PDF 的 Read 方法。该事件将定期触发,提供完成百分比和已处理页数信息。
进度跟踪对大型文档处理有用吗?
在使用 IronOCR 处理大型文档或批量文件时,进度跟踪至关重要。它对于 PDF OCR 操作和多页 TIFF 文件尤为重要,可以让您监控处理状态、估算完成时间,并在长时间的操作过程中提供用户反馈。
IronOCR 是否支持多种语言?
IronOCR支持多种语言,使其成为全球应用程序中需要不同语言文本识别的多功能工具。
IronOCR可以集成到现有应用程序中吗?
IronOCR设计为易于使用C#集成到现有应用程序中,允许开发人员以最小的努力为他们的软件添加OCR功能。
使用IronOCR进行文档管理有什么好处?
使用IronOCR进行文档管理可以通过将扫描的文档转换为可搜索和可编辑文本来简化工作流程,减少手动数据输入的需要,提高文档可访问性。
IronOCR如何提高数据准确性?
IronOCR通过其高级识别算法和图像校正功能提高数据准确性,确保文本提取过程既可靠又精确。
IronOCR 有免费试用版吗?
是的,Iron Software 提供IronOCR 的免费试用,使用户在做出购买决定之前可以测试其功能和能力。

