Jak używać śledzenia postępu OCR w C#

Jak korzystać z funkcji śledzenia postępów w języku C# za pomocą IronOCR

This article was translated from English: Does it need improvement?
Translated
View the article in English

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.

  1. Install IronOCR with NuGet Package Manager

    PM > Install-Package IronOcr
  2. 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"));
  3. Wdrożenie do testowania w środowisku produkcyjnym

    Rozpocznij używanie IronOCR w swoim projekcie już dziś z darmową wersją próbną

    arrow pointer


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)
$vbLabelText   $csharpLabel
Wynik konsoli pokazujący śledzenie postępu od 95% do 100% ukończenia wraz z sygnaturami czasowymi i danymi dotyczącymi czasu trwania

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

Najlepsze praktyki w zakresie śledzenia postępów

  1. Częstotliwość aktualizacji: Zdarzenie OcrProgress jest wywoływane często podczas przetwarzania. Rozważ filtrowanie aktualizacji, aby uniknąć przeładowania interfejsu użytkownika lub logów.

  2. 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.

  3. 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ść.

  4. 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.

  5. 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 Invoke lub BeginInvoke.

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.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 5,571,678 | Wersja: 2026.4 just released
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package IronOcr
uruchom próbkę obserwuj, jak twój obraz staje się tekstem z możliwością wyszukiwania.