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 oparty na zdarzeniach system śledzenia postępów operacji OCR, umożliwiający programistom monitorowanie postępów odczytu za pomocą zdarzenia OcrProgress, które w czasie rzeczywistym informuje o procentowym stopniu zaawansowania, liczbie przetworzonych stron oraz wskaźnikach czasowych.

Szybki start: Subskrybuj OcrProgress i czytaj pliki PDF

Ten przykład pokazuje, jak monitorować postęp OCR za pomocą IronOCR: zasubskrybuj wbudowane zdarzenie OcrProgress i otrzymuj natychmiastowe informacje zwrotne, w tym procent, liczbę ukończonych stron i całkowitą liczbę stron podczas odczytu 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. Można subskrybować wydarzenie OcrProgress, aby otrzymywać aktualizacje dotyczące postępów w procesie 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.

The following example uses this document as a sample: "Experiences in Biodiversity Research: A Field Course" by 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 dotyczących postępu, 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 wyrażony jako procent ukończonych stron, w zakresie od 0 do 100. Przydatne do aktualizowania pasków postępu w aplikacjach GUI.
  • TotalPages: Łączna liczba stron przetwarzanych przez silnik OCR. Niezbędna do obliczenia szacowanego czasu zakończenia.
  • PagesComplete: Liczba stron, na których odczyt OCR został w pełni zakończony. Liczba ta rośnie stopniowo w miarę przetwarzania stron.
  • Duration: Całkowity czas trwania zadania OCR, wskazujący czas potrzebny do zakończenia 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, podana w formacie czasu uniwersalnego (UTC).
  • EndTimeUTC: Data i godzina całkowitego zakończenia zadania OCR 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 na podstawie zdarzenia postępu należy zapewnić prawidłową 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. Skutecznie wykorzystując OcrProgress, możesz tworzyć profesjonalne aplikacje, które z pewnością sobie poradzą ze wszystkim, 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.

Czy IronOCR obsługuje wiele języków?

IronOCR obsługuje wiele języków, co czyni go wszechstronnym narzędziem dla globalnych aplikacji wymagających rozpoznawania tekstu w różnych językach.

Czy IronOCR można zintegrować z istniejącymi aplikacjami?

IronOCR jest zaprojektowany do łatwej integracji z istniejącymi aplikacjami używając C#, co pozwala programistom dodać funkcjonalność OCR do swojego oprogramowania z minimalnym wysiłkiem.

Jakie są korzyści z używania IronOCR do zarządzania dokumentami?

Używanie IronOCR do zarządzania dokumentami upraszcza przepływ pracy przez konwertowanie zeskanowanych dokumentów na przeszukiwalny i edytowalny tekst, redukując konieczność ręcznego wprowadzania danych i poprawiając dostępność dokumentów.

Jak IronOCR może poprawić dokładność danych?

IronOCR poprawia dokładność danych dzięki swoim zaawansowanym algorytmom rozpoznawania i funkcjom korekcji obrazów, zapewniając, że proces ekstrakcji tekstu jest zarówno niezawodny, jak i precyzyjny.

Czy dostępna jest bezpłatna wersja próbna IronOCR?

Tak, Iron Software oferuje bezpłatną wersję próbną IronOCR, umożliwiając użytkownikom przetestowanie jego funkcji i możliwości przed podjęciem decyzji o zakupie.

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,896,332 | Wersja: 2026.5 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.