Przejdź do treści stopki
KORZYSTANIE Z IRONOCR

.NET OCR SDK: Biblioteka do rozpoznawania tekstu dla C#

.NET OCR SDK to zestaw narzędzi programistycznych, który umożliwia aplikacjom napisanym w języku C# i platformie .NET programowe wyodrębnianie tekstu z obrazów, zeskanowanych plików PDF i innych formatów dokumentów. IronOCR to gotowy do użycia w środowisku produkcyjnym zestaw SDK OCR dla platformy .NET, który obejmuje zoptymalizowany silnik Tesseract 5 z filtrami przetwarzania wstępnego, funkcją odczytu kodów kreskowych, możliwością tworzenia plików PDF z funkcją wyszukiwania oraz obsługą ponad 125 języków — a wszystko to dostępne za pośrednictwem przejrzystego interfejsu API w języku C#, działającego w systemach Windows, Linux, macOS oraz na platformach chmurowych.

Dlaczego IronOCR jest odpowiednim zestawem SDK OCR dla platformy .NET do Twojego projektu?

Tworzenie systemu rozpoznawania tekstu od podstaw oznacza zarządzanie procesami przetwarzania wstępnego obrazów, plikami danych językowych, modelami wątków i analizą wyników — to miesiące pracy, zanim uda się wyodrębnić pierwsze słowo. IronOCR eliminuje ten nadmiar, dostarczając sprawdzony w boju silnik, który Twój zespół może wdrożyć do projektu w ciągu kilku minut.

Kluczowe funkcje, które wyróżniają go spośród zwykłych powiązań Tesseract:

  • Rozpoznawanie ponad 125 języków i alfabetów, w tym tekstu pisanego odręcznie
  • Wbudowane filtry: usuwanie szumów, prostowanie, binarizacja, zwiększanie rozdzielczości i korekcja kontrastu
  • Wykrywanie kodów BarCode i kodów QR w ramach jednego przebiegu odczytu
  • Generowanie plików PDF z możliwością wyszukiwania, zawierających niewidoczne warstwy tekstowe do archiwizacji procesów roboczych
  • Asynchroniczne i równoległe przetwarzanie wsadowe dla potoków o wysokiej przepustowości
  • Zonal OCR do wybierania konkretnych obszarów strony w celu skrócenia czasu przetwarzania
  • Obsługa wielu platform: Windows, Linux, macOS, Docker i Azure

Zgodnie z dokumentacją projektu Tesseract OCR, podstawowa wersja Tesseract wymaga ręcznej konfiguracji pakietów językowych, ustawień DPI i trybów wyjściowych. IronOCR zajmuje się tym wszystkim automatycznie, pozwalając Ci skupić się na znaczeniu wyodrębnionego tekstu, a nie na tym, jak go wyodrębnić.

Jak IronOCR wypada w porównaniu z surowym Tesseractem?

Surowy Tesseract za pomocą wrappera P/Invoke lub pakietu Tesseract NuGet pozostawia Ci odpowiedzialność za: pobieranie i umieszczanie plików językowych tessdata, wybór poprawnego trybu segmentacji stron, samodzielne obsługiwanie dzielenia wielostronicowych TIFF i PDF oraz uruchomienie wielowątkowości, jeśli chcesz przetwarzać w sposób równoległy. Żadna z tych informacji nie dotyczy wyłącznie Twojego problemu biznesowego.

IronOCR łączy wszystkie te elementy. Otrzymujesz typowaną powierzchnię API, automatyczne zarządzanie danymi, wbudowaną funkcję dzielenia i łączenia plików PDF oraz silnik bezpieczny dla wątków, który można ponownie wykorzystać w różnych żądaniach. W zamian za to wymagana jest płatna licencja do użytku produkcyjnego — strona licencyjna pokazuje aktualne poziomy cenowe, w tym bezpłatną licencję deweloperską.

Dla zespołów, które potrzebują wyłącznie zależności open source, dobrym rozwiązaniem jest surowy Tesseract Plus niestandardowe przetwarzanie wstępne. Dla zespołów, które muszą szybko wdrożyć niezawodny system OCR, IronOCR ogranicza zakres integracji do kilku linii kodu w języku C#.

Jak zainstalować IronOCR .NET SDK?

Instalacja odbywa się za pośrednictwem NuGet, standardowego menedżera pakietów .NET. Uruchom następujące polecenie w katalogu projektu:

Install-Package IronOcr

Dla użytkowników Visual Studio, wyszukaj IronOcr w GUI Menadżera Pakietów NuGet i stamtąd zainstaluj. Pełne opcje instalacji, w tym ręczne odwołania do bibliotek DLL, można znaleźć w dokumentacji instalacji IronOCR.

Po instalacji, dodaj klucz licencyjny do uruchamiania aplikacji lub appsettings.json. Możesz rozpocząć bezpłatny okres próbny, aby uzyskać klucz próbny, który odblokowuje wszystkie funkcje podczas oceny wersji próbnej.

Weryfikacja instalacji

Szybka kontrola po instalacji potwierdza, że wszystko jest poprawnie podłączone. Utwórz aplikację konsolową przeznaczoną dla platformy .NET 10:

using IronOcr;

// Minimal smoke test -- reads a single image and prints extracted text
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("sample.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;

// Minimal smoke test -- reads a single image and prints extracted text
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("sample.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr

' Minimal smoke test -- reads a single image and prints extracted text
Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage("sample.png")
    Dim result = ocr.Read(input)
    Console.WriteLine(result.Text)
End Using
$vbLabelText   $csharpLabel

Jeśli tekst pojawia się w konsoli, oznacza to, że SDK jest zainstalowane, a klucz licencyjny jest ważny. Jesteś gotowy do tworzenia procesów produkcyjnych.

Jak wyodrębnić tekst z obrazów i plików PDF w C#?

Podstawowy wzorzec ekstrakcji jest spójny w przypadku wszystkich typów wejściowych. Tworzysz instancję IronTesseract, ładujesz treść do obiektu OcrInput i wywołujesz Read(). IronOCR automatycznie wykrywa format pliku na podstawie rozszerzenia, więc ta sama ścieżka kodu obsługuje pliki JPEG, PNG, TIFF, BMP oraz wielostronicowe pliki PDF.

using IronOcr;

// Reusable OCR service encapsulating the IronTesseract engine
public class OcrService
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public string ExtractText(string filePath)
    {
        using var input = new OcrInput();

        // LoadPdf for PDF files; LoadImage for raster formats
        if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(filePath);
        else
            input.LoadImage(filePath);

        return _ocr.Read(input).Text;
    }

    public async Task<string> ExtractTextAsync(string filePath)
    {
        using var input = new OcrInput();

        if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(filePath);
        else
            input.LoadImage(filePath);

        var result = await _ocr.ReadAsync(input);
        return result.Text;
    }
}
using IronOcr;

// Reusable OCR service encapsulating the IronTesseract engine
public class OcrService
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public string ExtractText(string filePath)
    {
        using var input = new OcrInput();

        // LoadPdf for PDF files; LoadImage for raster formats
        if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(filePath);
        else
            input.LoadImage(filePath);

        return _ocr.Read(input).Text;
    }

    public async Task<string> ExtractTextAsync(string filePath)
    {
        using var input = new OcrInput();

        if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(filePath);
        else
            input.LoadImage(filePath);

        var result = await _ocr.ReadAsync(input);
        return result.Text;
    }
}
Imports IronOcr

' Reusable OCR service encapsulating the IronTesseract engine
Public Class OcrService
    Private ReadOnly _ocr As New IronTesseract()

    Public Function ExtractText(filePath As String) As String
        Using input As New OcrInput()
            ' LoadPdf for PDF files; LoadImage for raster formats
            If filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
                input.LoadPdf(filePath)
            Else
                input.LoadImage(filePath)
            End If

            Return _ocr.Read(input).Text
        End Using
    End Function

    Public Async Function ExtractTextAsync(filePath As String) As Task(Of String)
        Using input As New OcrInput()
            If filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
                input.LoadPdf(filePath)
            Else
                input.LoadImage(filePath)
            End If

            Dim result = Await _ocr.ReadAsync(input)
            Return result.Text
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

Główny punkt wejścia do korzystania z usługi:

using IronOcr;

var service = new OcrService();
string text = await service.ExtractTextAsync("invoice.pdf");
Console.WriteLine(text);
using IronOcr;

var service = new OcrService();
string text = await service.ExtractTextAsync("invoice.pdf");
Console.WriteLine(text);
Imports IronOcr

Dim service = New OcrService()
Dim text As String = Await service.ExtractTextAsync("invoice.pdf")
Console.WriteLine(text)
$vbLabelText   $csharpLabel

Instancja IronTesseract jest bezpieczna dla wątków i zaprojektowana do ponownego użycia. Należy utworzyć go jednorazowo podczas uruchamiania aplikacji (na przykład poprzez wstrzykiwanie zależności w .NET Core), zamiast instancjonować go dla każdego żądania.

Dla wielostronicowych PDF, result.Pages daje Ci dostęp do tekstu, wyników pewności i ramek ograniczających dla każdej strony. Zobacz Przewodnik po OCR wielostronicowego PDF dla szczegółów dotyczących iteracji stronami.

Jak poprawić dokładność OCR za pomocą filtrów przetwarzania wstępnego?

Surowe skany z skanerów płaskich, aparatów w smartfonach lub faksów często charakteryzują się szumami, obrotem, niskim kontrastem i niewystarczającą rozdzielczością. Proces korekcji jakości obrazu w IronOCR rozwiązuje każdy problem za pomocą ukierunkowanych filtrów, które można połączyć przed wywołaniem funkcji odczytu.

using IronOcr;

public class AccuracyOptimizedOcr
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public string ProcessLowQualityDocument(string filePath)
    {
        using var input = new OcrInput();

        if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(filePath);
        else
            input.LoadImage(filePath);

        // Chain preprocessing filters in order of operation
        input.DeNoise();              // Remove scan artifacts and speckling
        input.Deskew();               // Correct page tilt up to 35 degrees
        input.Scale(150);             // Enlarge small text for better recognition
        input.Binarize();             // Convert to black/white for cleaner edges
        input.EnhanceResolution(300); // Sharpen blurry or low-DPI input

        var result = _ocr.Read(input);

        // Confidence below 70 often signals a preprocessing mismatch
        if (result.Confidence < 70)
            Console.WriteLine($"Warning: low confidence ({result.Confidence:F1}%)");

        return result.Text;
    }
}
using IronOcr;

public class AccuracyOptimizedOcr
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public string ProcessLowQualityDocument(string filePath)
    {
        using var input = new OcrInput();

        if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(filePath);
        else
            input.LoadImage(filePath);

        // Chain preprocessing filters in order of operation
        input.DeNoise();              // Remove scan artifacts and speckling
        input.Deskew();               // Correct page tilt up to 35 degrees
        input.Scale(150);             // Enlarge small text for better recognition
        input.Binarize();             // Convert to black/white for cleaner edges
        input.EnhanceResolution(300); // Sharpen blurry or low-DPI input

        var result = _ocr.Read(input);

        // Confidence below 70 often signals a preprocessing mismatch
        if (result.Confidence < 70)
            Console.WriteLine($"Warning: low confidence ({result.Confidence:F1}%)");

        return result.Text;
    }
}
Imports IronOcr

Public Class AccuracyOptimizedOcr
    Private ReadOnly _ocr As New IronTesseract()

    Public Function ProcessLowQualityDocument(filePath As String) As String
        Using input As New OcrInput()

            If filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
                input.LoadPdf(filePath)
            Else
                input.LoadImage(filePath)
            End If

            ' Chain preprocessing filters in order of operation
            input.DeNoise()              ' Remove scan artifacts and speckling
            input.Deskew()               ' Correct page tilt up to 35 degrees
            input.Scale(150)             ' Enlarge small text for better recognition
            input.Binarize()             ' Convert to black/white for cleaner edges
            input.EnhanceResolution(300) ' Sharpen blurry or low-DPI input

            Dim result = _ocr.Read(input)

            ' Confidence below 70 often signals a preprocessing mismatch
            If result.Confidence < 70 Then
                Console.WriteLine($"Warning: low confidence ({result.Confidence:F1}%)")
            End If

            Return result.Text
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

Wskazówki dotyczące wyboru filtrów:

  • DeNoise() -- używaj przy skanach z dużymi plamami lub artefaktami kompresji
  • Deskew() -- używaj, gdy dokumenty są fotografowane pod kątem; zobacz wykrywanie obrotu strony w celu automatycznego wykrywania
  • Scale() -- używaj dla małego tekstu lub wejścia poniżej 150 DPI; wartości 150–200 zazwyczaj dają najlepsze wyniki
  • Binarize() -- używaj na kolorowych lub gradientowych tłach; konwertuje obraz na czystą czerń/biel
  • EnhanceResolution() -- używaj przy zamazanym lub niskokontrastowym tekście; docelowa rozdzielczość to 300 DPI jako optymalna wartość dla Tesseract

Badania opublikowane w International Journal on Document Analysis and Recognition konsekwentnie pokazują, że binarizacja i prostowanie są dwoma etapami przetwarzania wstępnego o największym wpływie na poprawę wskaźników rozpoznawania znaków. Zastosuj oba jako punkt odniesienia dla każdego procesu produkcyjnego.

Filtry przetwarzania wstępnego IronOCR i ich główne zastosowania
Filtruj Problem rozwiązany Kiedy złożyć wniosek
DeNoise() Artefakty skanera, szum plamkowy Wszelkie skany z skanera płaskiego lub faksu
Deskew() Przechylenie i obrót strony Dokumenty ze zdjęciami lub nieprawidłowo wyrównane
Scale() Mały tekst lub niska rozdzielczość Rozdzielczość poniżej 150 DPI
Binarize() Kolorowe tła, gradienty Kolorowy papier lub formularze z znakiem wodnym
EnhanceResolution() Rozmycie i niski kontrast Zdjęcia z aparatu i skompresowane pliki JPEG

Jak zbudować produkcyjny potok przetwarzania wsadowego?

Pobieranie pojedynczych dokumentów jest proste, ale w rzeczywistych sytuacjach mamy do czynienia z setkami lub tysiącami plików trafiających do kolejek, folderów współdzielonych lub pamięci w chmurze. Asynchroniczny interfejs API i silnik IronOCR odporny na wątki sprawiają, że nadaje się on do równoległych obciążeń.

using IronOcr;
using Microsoft.Extensions.Logging;

public class ProductionOcrService
{
    private readonly IronTesseract _ocr;
    private readonly ILogger<ProductionOcrService> _logger;

    public ProductionOcrService(ILogger<ProductionOcrService> logger)
    {
        _logger = logger;
        _ocr = new IronTesseract
        {
            Configuration =
            {
                RenderSearchablePdfsAndHocr = true,
                ReadBarCodes = true
            }
        };
    }

    public async Task<IReadOnlyList<string>> ProcessBatchAsync(
        IEnumerable<string> filePaths,
        int maxDegreeOfParallelism = 4)
    {
        var results = new System.Collections.Concurrent.ConcurrentBag<string>();

        var options = new ParallelOptions
        {
            MaxDegreeOfParallelism = maxDegreeOfParallelism
        };

        await Parallel.ForEachAsync(filePaths, options, async (filePath, ct) =>
        {
            try
            {
                using var input = new OcrInput();

                if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
                    input.LoadPdf(filePath);
                else
                    input.LoadImage(filePath);

                var result = await _ocr.ReadAsync(input);
                results.Add(result.Text);
                _logger.LogInformation("Processed {FilePath} at {Confidence:F1}% confidence",
                    filePath, result.Confidence);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "OCR failed for {FilePath}", filePath);
                results.Add(string.Empty);
            }
        });

        return results.ToList();
    }

    public void CreateSearchablePdf(string inputPath, string outputPath)
    {
        using var input = new OcrInput();

        if (inputPath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(inputPath);
        else
            input.LoadImage(inputPath);

        _ocr.Read(input).SaveAsSearchablePdf(outputPath);
        _logger.LogInformation("Searchable PDF written to {OutputPath}", outputPath);
    }
}
using IronOcr;
using Microsoft.Extensions.Logging;

public class ProductionOcrService
{
    private readonly IronTesseract _ocr;
    private readonly ILogger<ProductionOcrService> _logger;

    public ProductionOcrService(ILogger<ProductionOcrService> logger)
    {
        _logger = logger;
        _ocr = new IronTesseract
        {
            Configuration =
            {
                RenderSearchablePdfsAndHocr = true,
                ReadBarCodes = true
            }
        };
    }

    public async Task<IReadOnlyList<string>> ProcessBatchAsync(
        IEnumerable<string> filePaths,
        int maxDegreeOfParallelism = 4)
    {
        var results = new System.Collections.Concurrent.ConcurrentBag<string>();

        var options = new ParallelOptions
        {
            MaxDegreeOfParallelism = maxDegreeOfParallelism
        };

        await Parallel.ForEachAsync(filePaths, options, async (filePath, ct) =>
        {
            try
            {
                using var input = new OcrInput();

                if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
                    input.LoadPdf(filePath);
                else
                    input.LoadImage(filePath);

                var result = await _ocr.ReadAsync(input);
                results.Add(result.Text);
                _logger.LogInformation("Processed {FilePath} at {Confidence:F1}% confidence",
                    filePath, result.Confidence);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "OCR failed for {FilePath}", filePath);
                results.Add(string.Empty);
            }
        });

        return results.ToList();
    }

    public void CreateSearchablePdf(string inputPath, string outputPath)
    {
        using var input = new OcrInput();

        if (inputPath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(inputPath);
        else
            input.LoadImage(inputPath);

        _ocr.Read(input).SaveAsSearchablePdf(outputPath);
        _logger.LogInformation("Searchable PDF written to {OutputPath}", outputPath);
    }
}
Imports IronOcr
Imports Microsoft.Extensions.Logging
Imports System.Collections.Concurrent
Imports System.Threading.Tasks

Public Class ProductionOcrService
    Private ReadOnly _ocr As IronTesseract
    Private ReadOnly _logger As ILogger(Of ProductionOcrService)

    Public Sub New(logger As ILogger(Of ProductionOcrService))
        _logger = logger
        _ocr = New IronTesseract With {
            .Configuration = New TesseractConfiguration With {
                .RenderSearchablePdfsAndHocr = True,
                .ReadBarCodes = True
            }
        }
    End Sub

    Public Async Function ProcessBatchAsync(filePaths As IEnumerable(Of String), Optional maxDegreeOfParallelism As Integer = 4) As Task(Of IReadOnlyList(Of String))
        Dim results = New ConcurrentBag(Of String)()

        Dim options = New ParallelOptions With {
            .MaxDegreeOfParallelism = maxDegreeOfParallelism
        }

        Await Parallel.ForEachAsync(filePaths, options, Async Function(filePath, ct)
            Try
                Using input As New OcrInput()
                    If filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
                        input.LoadPdf(filePath)
                    Else
                        input.LoadImage(filePath)
                    End If

                    Dim result = Await _ocr.ReadAsync(input)
                    results.Add(result.Text)
                    _logger.LogInformation("Processed {FilePath} at {Confidence:F1}% confidence", filePath, result.Confidence)
                End Using
            Catch ex As Exception
                _logger.LogError(ex, "OCR failed for {FilePath}", filePath)
                results.Add(String.Empty)
            End Try
        End Function)

        Return results.ToList()
    End Function

    Public Sub CreateSearchablePdf(inputPath As String, outputPath As String)
        Using input As New OcrInput()
            If inputPath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
                input.LoadPdf(inputPath)
            Else
                input.LoadImage(inputPath)
            End If

            _ocr.Read(input).SaveAsSearchablePdf(outputPath)
            _logger.LogInformation("Searchable PDF written to {OutputPath}", outputPath)
        End Using
    End Sub
End Class
$vbLabelText   $csharpLabel

Limit MaxDegreeOfParallelism zapobiega wyczerpaniu pamięci, gdy pliki są duże. Wartość 4 działa dobrze na serwerze czterordzeniowym; zwiększaj ją dopiero po profilowaniu wykorzystania pamięci. Dla wdrożeń Azure Functions lub AWS Lambda, ustaw współbieżność na 1 na instancję funkcji i skaluj horyzontalnie zamiast tego.

CreateSearchablePdf generuje PDF, w którym oryginalny obraz jest zachowany jako widoczna warstwa, a rozpoznany tekst jest osadzony niewidocznie poniżej. Umożliwia to wyszukiwanie pełnotekstowe w przeglądarkach plików PDF oraz indeksowanie przez wyszukiwarki — co jest powszechnym wymaganiem w systemach zarządzania dokumentami.

Monitorowanie wyników pewności w środowisku produkcyjnym

Każdy OcrResult udostępnia właściwość Confidence (0-100), która odzwierciedla pewność silnika w rozpoznawanym tekście. Śledzenie tego wskaźnika w infrastrukturze logowania daje wczesny sygnał ostrzegawczy, gdy jakość dokumentów się pogarsza — na przykład, jeśli kalibracja skanera się zmienia lub nowy dostawca dokumentów wysyła skany o niższej rozdzielczości niż oczekiwano.

Praktyczna strategia progowa: rejestruj ostrzeżenie przy poziomie pewności poniżej 80, uruchamiaj ponowne przetwarzanie wstępne przy poziomie poniżej 70 i oznaczaj dokumenty do ręcznej weryfikacji przy poziomie poniżej 60. To wielopoziomowe podejście pozwala wychwycić problemy z jakością, zanim spowodują one ciche uszkodzenie danych w systemach niższego szczebla.

Dokumentacja logowania Microsoft .NET obejmuje wzorce ILogger stosowane w powyższej usłudze zbiorczej dla zespołów integrujących z wbudowanym kontenerem DI ASP.NET Core.

Jak wyodrębnić dane strukturalne ze skanowanych dokumentów?

Pierwszym krokiem jest wyodrębnienie tekstu. Drugim krokiem jest przetworzenie tego tekstu na pola typu, na których aplikacja może działać. Ten wzorzec łączy przejście odczytu IronOCR z Regex .NET, aby pozyskać strukturalne dane z faktur, formularzy i raportów.

using IronOcr;
using System.Text.RegularExpressions;

public record Invoice(
    string? InvoiceNumber,
    DateOnly? Date,
    decimal? TotalAmount,
    string RawText
);

public class InvoiceOcrService
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public Invoice ExtractInvoiceData(string invoicePath)
    {
        using var input = new OcrInput();

        if (invoicePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(invoicePath);
        else
            input.LoadImage(invoicePath);

        input.DeNoise();
        input.Deskew();

        var result = _ocr.Read(input);
        string text = result.Text;

        return new Invoice(
            InvoiceNumber: ExtractInvoiceNumber(text),
            Date: ExtractDate(text),
            TotalAmount: ExtractAmount(text),
            RawText: text
        );
    }

    private static string? ExtractInvoiceNumber(string text)
    {
        var match = Regex.Match(text, @"Invoice\s*#?:?\s*(\S+)", RegexOptions.IgnoreCase);
        return match.Success ? match.Groups[1].Value : null;
    }

    private static DateOnly? ExtractDate(string text)
    {
        // Numeric format: MM/DD/YYYY
        var numeric = Regex.Match(text, @"\b(\d{1,2}/\d{1,2}/\d{2,4})\b");
        if (numeric.Success && DateTime.TryParse(numeric.Groups[1].Value, out var d1))
            return DateOnly.FromDateTime(d1);

        // Written format: January 15, 2025
        var written = Regex.Match(text,
            @"\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+(\d{1,2}),?\s+(\d{4})\b",
            RegexOptions.IgnoreCase);
        if (written.Success && DateTime.TryParse(written.Value, out var d2))
            return DateOnly.FromDateTime(d2);

        return null;
    }

    private static decimal? ExtractAmount(string text)
    {
        var match = Regex.Match(text, @"\$\s*(\d+(?:\.\d{2})?)");
        return match.Success && decimal.TryParse(match.Groups[1].Value, out var amt)
            ? amt
            : null;
    }
}
using IronOcr;
using System.Text.RegularExpressions;

public record Invoice(
    string? InvoiceNumber,
    DateOnly? Date,
    decimal? TotalAmount,
    string RawText
);

public class InvoiceOcrService
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public Invoice ExtractInvoiceData(string invoicePath)
    {
        using var input = new OcrInput();

        if (invoicePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            input.LoadPdf(invoicePath);
        else
            input.LoadImage(invoicePath);

        input.DeNoise();
        input.Deskew();

        var result = _ocr.Read(input);
        string text = result.Text;

        return new Invoice(
            InvoiceNumber: ExtractInvoiceNumber(text),
            Date: ExtractDate(text),
            TotalAmount: ExtractAmount(text),
            RawText: text
        );
    }

    private static string? ExtractInvoiceNumber(string text)
    {
        var match = Regex.Match(text, @"Invoice\s*#?:?\s*(\S+)", RegexOptions.IgnoreCase);
        return match.Success ? match.Groups[1].Value : null;
    }

    private static DateOnly? ExtractDate(string text)
    {
        // Numeric format: MM/DD/YYYY
        var numeric = Regex.Match(text, @"\b(\d{1,2}/\d{1,2}/\d{2,4})\b");
        if (numeric.Success && DateTime.TryParse(numeric.Groups[1].Value, out var d1))
            return DateOnly.FromDateTime(d1);

        // Written format: January 15, 2025
        var written = Regex.Match(text,
            @"\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+(\d{1,2}),?\s+(\d{4})\b",
            RegexOptions.IgnoreCase);
        if (written.Success && DateTime.TryParse(written.Value, out var d2))
            return DateOnly.FromDateTime(d2);

        return null;
    }

    private static decimal? ExtractAmount(string text)
    {
        var match = Regex.Match(text, @"\$\s*(\d+(?:\.\d{2})?)");
        return match.Success && decimal.TryParse(match.Groups[1].Value, out var amt)
            ? amt
            : null;
    }
}
Imports IronOcr
Imports System.Text.RegularExpressions

Public Class Invoice
    Public Property InvoiceNumber As String
    Public Property Date As DateOnly?
    Public Property TotalAmount As Decimal?
    Public Property RawText As String

    Public Sub New(invoiceNumber As String, [date] As DateOnly?, totalAmount As Decimal?, rawText As String)
        Me.InvoiceNumber = invoiceNumber
        Me.Date = [date]
        Me.TotalAmount = totalAmount
        Me.RawText = rawText
    End Sub
End Class

Public Class InvoiceOcrService
    Private ReadOnly _ocr As New IronTesseract()

    Public Function ExtractInvoiceData(invoicePath As String) As Invoice
        Using input As New OcrInput()

            If invoicePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
                input.LoadPdf(invoicePath)
            Else
                input.LoadImage(invoicePath)
            End If

            input.DeNoise()
            input.Deskew()

            Dim result = _ocr.Read(input)
            Dim text As String = result.Text

            Return New Invoice(
                InvoiceNumber:=ExtractInvoiceNumber(text),
                [Date]:=ExtractDate(text),
                TotalAmount:=ExtractAmount(text),
                RawText:=text
            )
        End Using
    End Function

    Private Shared Function ExtractInvoiceNumber(text As String) As String
        Dim match = Regex.Match(text, "Invoice\s*#?:?\s*(\S+)", RegexOptions.IgnoreCase)
        Return If(match.Success, match.Groups(1).Value, Nothing)
    End Function

    Private Shared Function ExtractDate(text As String) As DateOnly?
        ' Numeric format: MM/DD/YYYY
        Dim numeric = Regex.Match(text, "\b(\d{1,2}/\d{1,2}/\d{2,4})\b")
        If numeric.Success AndAlso DateTime.TryParse(numeric.Groups(1).Value, Nothing) Then
            Return DateOnly.FromDateTime(DateTime.Parse(numeric.Groups(1).Value))
        End If

        ' Written format: January 15, 2025
        Dim written = Regex.Match(text,
            "\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+(\d{1,2}),?\s+(\d{4})\b",
            RegexOptions.IgnoreCase)
        If written.Success AndAlso DateTime.TryParse(written.Value, Nothing) Then
            Return DateOnly.FromDateTime(DateTime.Parse(written.Value))
        End If

        Return Nothing
    End Function

    Private Shared Function ExtractAmount(text As String) As Decimal?
        Dim match = Regex.Match(text, "\$\s*(\d+(?:\.\d{2})?)")
        Dim amt As Decimal
        Return If(match.Success AndAlso Decimal.TryParse(match.Groups(1).Value, amt), amt, Nothing)
    End Function
End Class
$vbLabelText   $csharpLabel

To podejście dobrze współgra z OCR skierowanym na zonę, gdy dokładnie wiadomo, gdzie pojawia się każde pole na formularzu. Podając prostokąt ograniczający, pomijasz rozpoznawanie całej strony i skupiasz się wyłącznie na obszarze zawierającym numer faktury lub sumę — co znacznie skraca czas przetwarzania dokumentów o stałym układzie.

Aby zapoznać się z bardziej zaawansowanymi scenariuszami ekstrakcji, w tym tabelami i formularzami strukturalnymi, przejrzyj przykłady ekstrakcji danych IronOCR na stronie produktu.

Jak radzisz sobie z wielojęzycznym OCR w .NET?

Wiele organizacji przetwarza dokumenty w więcej niż jednym języku — formularze importowe/eksportowe, umowy międzynarodowe lub wielojęzyczne zgłoszenia klientów. IronOCR radzi sobie z tym, umożliwiając konfigurację pakietu językowego przed wywołaniem funkcji odczytu.

using IronOcr;

// Configure multi-language recognition
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.EnglishBest;  // Swap for any of 125+ supported languages

// For mixed-language documents, combine language packs
ocr.AddSecondaryLanguage(OcrLanguage.German);

using var input = new OcrInput();
input.LoadPdf("multilingual-contract.pdf");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;

// Configure multi-language recognition
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.EnglishBest;  // Swap for any of 125+ supported languages

// For mixed-language documents, combine language packs
ocr.AddSecondaryLanguage(OcrLanguage.German);

using var input = new OcrInput();
input.LoadPdf("multilingual-contract.pdf");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr

' Configure multi-language recognition
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.EnglishBest  ' Swap for any of 125+ supported languages

' For mixed-language documents, combine language packs
ocr.AddSecondaryLanguage(OcrLanguage.German)

Using input As New OcrInput()
    input.LoadPdf("multilingual-contract.pdf")
    Dim result = ocr.Read(input)
    Console.WriteLine(result.Text)
End Using
$vbLabelText   $csharpLabel

Strona pomocy technicznej IronOCR zawiera listę wszystkich ponad 125 dostępnych pakietów językowych wraz z instrukcjami pobierania. Pakiety językowe są dostarczane jako pakiety NuGet (na przykład, IronOcr.Languages.German) dzięki czemu integrują się z tym samym przepływem zarządzania pakietami, którego już używasz.

W przypadku zestawów znaków spoza alfabetu łacińskiego — arabskiego, chińskiego, japońskiego, koreańskiego — IronOCR zapewnia zoptymalizowane modele obsługujące kierunek tekstu od prawej do lewej oraz skrypty ideograficzne. Szczegóły konfiguracji można znaleźć w przewodniku CJK OCR.

Jakie są Twoje kolejne kroki?

Masz teraz wzorce potrzebne do dodania OCR klasy produkcyjnej do dowolnej aplikacji .NET 10: podstawowe wyodrębnianie tekstu, przetwarzanie wstępne trudnych skanów, asynchroniczne przetwarzanie wsadowe, parsowanie danych strukturalnych oraz obsługa wielu języków.

W tym miejscu zapoznaj się z poniższymi obszarami w zależności od potrzeb Twojego projektu:

Zacznij od bezpłatnej licencji próbnej, aby ocenić pełny zestaw funkcji na własnych dokumentach przed podjęciem decyzji o wyborze planu.

NuGet Zainstaluj za pomocą NuGet

PM >  Install-Package IronOcr

Sprawdź IronOCR na NuGet dla szybkiej instalacji. Z ponad 10 milionami pobrań, przekształca rozwój PDF z C#. Możesz również pobrać DLL lub instalator Windows.

Często Zadawane Pytania

Czym jest .NET OCR SDK?

.NET OCR SDK autorstwa IronOCR to biblioteka zaprojektowana do integracji możliwości rozpoznawania znaków optycznych w aplikacjach C#, pozwalająca deweloperom ekstrakcji tekstu z obrazów, PDFów i zeskanowanych dokumentów.

Jakie są kluczowe funkcje .NET SDK IronOCR?

.NET SDK IronOCR oferuje proste API, wsparcie dla wielu języków, kompatybilność z wieloma platformami i zaawansowane funkcje dla obsługi różnych formatów plików i niskiej jakości skanów.

W jaki sposób IronOCR obsługuje różne języki?

.NET SDK IronOCR wspiera różne języki, umożliwiając ekstrakcję i rozpoznawanie tekstu z dokumentów w różnych językach bez potrzeby dodatkowych konfiguracji.

Czy IronOCR może przetwarzać niskiej jakości skany?

Tak, IronOCR jest zaprojektowany, aby skutecznie obsługiwać niskiej jakości skany, stosując zaawansowane algorytmy w celu zwiększenia dokładności rozpoznawania tekstu nawet w trudnych warunkach.

Czy .NET SDK IronOCR działa na różnych platformach?

.NET SDK IronOCR jest wielopłatformowy, co oznacza, że można go używać na różnych systemach operacyjnych, co czyni go wszechstronnym dla różnych środowisk programistycznych.

Jakie formaty plików wspiera IronOCR?

IronOCR obsługuje szeroką gamę formatów plików, w tym obrazy, PDFy i zeskanowane dokumenty, zapewniając elastyczność dla zadań rozpoznawania tekstu w różnych mediach.

Jak deweloperzy mogą zintegrować IronOCR w swoich projektach?

Deweloperzy mogą zintegrować IronOCR w swoich projektach C# używając jego typizowanego API, co upraszcza proces dodawania funkcji OCR do aplikacji.

Jakie są niektóre przypadki użycia dla IronOCR?

IronOCR może być używany w systemach zarządzania dokumentami, automatycznym wprowadzaniu danych, cyfryzacji treści i dowolnych aplikacjach wymagających ekstrakcji tekstu z obrazów lub PDFów.

Kannaopat Udonpant
Inżynier oprogramowania
Zanim stał się inżynierem oprogramowania, Kannapat ukończył doktorat z zasobów środowiskowych na Uniwersytecie Hokkaido w Japonii. W czasie studiowania, Kannapat również został członkiem Laboratorium Robotyki Pojazdów, które jest częścią Wydziału Inżynierii Bioprodukcji. W 2022 roku wykorzystał swoje umiejętności w ...
Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie