Jak korzystać z funkcji śledzenia postępów w języku C# za pomocą IronOCR
IronOCR zapewnia system śledzenia postępów operacji OCR oparty na zdarzeniach, umożliwiając programistom monitorowanie postępów czytania poprzez zdarzenie OcrProgress, które raportuje procent ukończenia, przetworzone strony i metryki czasu w czasie rzeczywistym.
Szybki start: Subskrybuj OcrProgress i czytaj pliki PDF
Ten przykład pokazuje, jak monitorować postępy OCR przy użyciu IronOCR: subskrybuj wbudowane zdarzenie OcrProgress i otrzymuj natychmiastowe informacje zwrotne, w tym procent, ukończone strony i całkowitą liczbę stron podczas czytania pliku PDF. Aby rozpocząć, wystarczy kilka wierszy.
-
Install IronOCR with NuGet Package Manager
PM > Install-Package IronOcr -
Skopiuj i uruchom ten fragment kodu.
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")); -
Wdrożenie do testowania w środowisku produkcyjnym
Rozpocznij używanie IronOCR w swoim projekcie już dziś z darmową wersją próbną
Minimalny proces (5 kroków)
- Pobierz bibliotekę C# do śledzenia postępów w czytaniu
- Zapisz się na wydarzenie
OcrProgress - Wykorzystaj instancję przekazaną przez zdarzenie, aby pobrać informacje o postępie
- Podaj postęp w procentach i całkowity czas trwania
- Pobierz godziny rozpoczęcia i zakończenia, a także całkowitą liczbę stron
Jak wdrożyć śledzenie postępów w mojej aplikacji OCR?
Śledzenie postępów jest niezbędne podczas przetwarzania dużych dokumentów lub partii plików za pomocą OCR. Zdarzenie OcrProgress można subskrybować, aby otrzymywać aktualizacje postępów procesu czytania. Jest to szczególnie przydatne w przypadku operacji OCR plików PDF oraz podczas pracy z wielostronicowymi plikami TIFF.
Zdarzenie przekazuje instancję zawierającą informacje o postępie zadania OCR, takie jak czas rozpoczęcia, łączna liczba stron, postęp w procentach, czas trwania i czas zakończenia. Ta funkcjonalność działa płynnie z operacjami asynchronicznymi i może być połączona z wielowątkowością w celu zwiększenia wydajności.
Poniższy przykład wykorzystuje następujący dokument jako próbkę: "Experiences in Biodiversity Research: A Field Course" autorstwa Thea B. Gessler, Uniwersytet Stanowy w Iowa.
: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)
Jakie informacje o postępach mogę uzyskać podczas wydarzenia?
Zdarzenie OcrProgress dostarcza kompleksowych danych o postępie, które pomagają monitorować i optymalizować wydajność OCR. Każda właściwość służy konkretnemu celowi w śledzeniu operacji:
ProgressPercent: Postęp zadania OCR jako procent ukończonych stron, w zakresie od 0 do 100. Przydatne do aktualizacji pasków postępu w aplikacjach GUI.TotalPages: Całkowita liczba stron przetwarzanych przez silnik OCR. Niezbędne do obliczania szacowanego czasu ukończenia.PagesComplete: Liczba stron, na których czytanie OCR zostało w pełni ukończone. Liczba ta rośnie stopniowo w miarę przetwarzania stron.Duration: Całkowity czas trwania zadania OCR, wskazujący czas potrzebny na ukończenie całego procesu. Mierzone w formacie TimeSpan i aktualizowane za każdym razem, gdy zdarzenie zostanie wywołane.StartTimeUTC: Data i godzina rozpoczęcia zadania OCR, przedstawione w formacie uniwersalnego czasu koordynowanego (UTC).EndTimeUTC: Data i godzina, kiedy zadanie OCR zostało w 100% ukończone, w formacie UTC. Ta właściwość ma wartość null podczas trwania procesu OCR i zostaje wypełniona po zakończeniu procesu.
Zaawansowane wdrożenie śledzenia postępów
W przypadku aplikacji produkcyjnych należy wdrożyć bardziej zaawansowane śledzenie postępów. Ten przykład obejmuje obsługę błędów i szczegółowe logowanie:
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
Integracja śledzenia postępów z aplikacjami UI
Podczas tworzenia aplikacji desktopowych przy użyciu Windows Forms lub WPF śledzenie postępów ma kluczowe znaczenie dla komfortu użytkowania. Zdarzenie progress może bezpiecznie aktualizować elementy interfejsu użytkownika:
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
Praca z dużymi dokumentami i limitami czasu
Podczas przetwarzania obszernych dokumentów śledzenie postępów staje się jeszcze bardziej cenne. Połącz to z ustawieniami limitu czasu i tokenami przerwania, aby uzyskać lepszą kontrolę:
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
Najlepsze praktyki w zakresie śledzenia postępów
-
Częstotliwość aktualizacji: Zdarzenie
OcrProgressjest wywoływane często podczas przetwarzania. Rozważ filtrowanie aktualizacji, aby uniknąć przeładowania interfejsu użytkownika lub logów. -
Wpływ na wydajność: Śledzenie postępów powoduje minimalne obciążenie wydajnościowe, ale nadmierne logowanie lub aktualizacje interfejsu użytkownika mogą spowolnić proces OCR.
-
Zarządzanie pamięcią: W przypadku dużych plików TIFF lub PDF należy monitorować wykorzystanie pamięci wraz z postępem przetwarzania, aby zapewnić optymalną wydajność.
-
Obsługa błędów: Zawsze uwzględniaj obsługę błędów w procedurach obsługi zdarzeń postępu, aby zapobiec zakłóceniom procesu OCR przez wyjątki.
- Bezpieczeństwo wątków: Podczas aktualizacji elementów interfejsu użytkownika ze zdarzenia postępu, należy zapewnić odpowiednią synchronizację wątków za pomocą metod
InvokelubBeginInvoke.
Wnioski
Śledzenie postępów w IronOCR zapewnia niezbędny wgląd w operacje OCR, umożliwiając programistom tworzenie responsywnych aplikacji, które na bieżąco informują użytkowników o statusie przetwarzania. Wykorzystując zdarzenie OcrProgress skutecznie, możesz tworzyć profesjonalne aplikacje, które z pewnością obsługują wszystko, od dokumentów jednostronicowych po obszerne pliki PDF.
Aby poznać bardziej zaawansowane techniki OCR, zapoznaj się z naszymi przewodnikami dotyczącymi filtrów obrazu i obiektów wynikowych, które pozwolą Ci jeszcze bardziej ulepszyć Twoje implementacje OCR.
Często Zadawane Pytania
Jak śledzić postępy OCR w czasie rzeczywistym?
IronOCR zapewnia system śledzenia postępów oparty na zdarzeniach przez zdarzenie OcrProgress. Wystarczy zasubskrybować to zdarzenie na swojej instancji IronTesseract, a otrzymasz aktualizacje w czasie rzeczywistym, w tym procent ukończenia, strony przetworzone i metryki czasowe podczas operacji OCR.
Jakie informacje dostarcza zdarzenie OcrProgress?
Zdarzenie OcrProgress w IronOCR dostarcza pełnych danych, w tym ProgressPercent (0-100%), liczby TotalPages, liczby PagesComplete, czasu rozpoczęcia i zakończenia oraz całkowitego czasu trwania. Te informacje są szczególnie przydatne do aktualizacji pasków postępu w aplikacjach GUI i monitorowania wydajności OCR.
Czy mogę używać śledzenia postępów z asynchronicznymi operacjami OCR?
Tak, funkcjonalność śledzenia postępów IronOCR działa bezproblemowo z operacjami asynchronicznymi. Możesz ją łączyć z asynchronicznym przetwarzaniem a nawet wielowątkowością, aby zwiększyć wydajność, otrzymując jednocześnie aktualizacje postępów w czasie rzeczywistym przez zdarzenie OcrProgress.
Jak zaimplementować prosty śledzący postępów dla OCR PDF?
Aby zaimplementować podstawowe śledzenie postępów z IronOCR, utwórz instancję IronTesseract, zasubskrybuj zdarzenie OcrProgress za pomocą wyrażenia lambda lub obsługi zdarzeń, następnie wywołaj metodę Read z twoim PDF. Zdarzenie będzie wywoływane okresowo, dostarczając informacje o procencie ukończenia i przetworzonych stronach.
Czy śledzenie postępów jest przydatne przy przetwarzaniu dużych dokumentów?
Śledzenie postępów jest niezbędne przy przetwarzaniu dużych dokumentów lub partii plików z IronOCR. Jest szczególnie cenne dla operacji OCR PDF i wielostronicowych plików TIFF, pozwalając na monitorowanie statusu przetwarzania, oszacowanie czasu ukończenia i dostarczanie feedbacku dla użytkownika podczas długich operacji.

