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.

Dłączego 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?

Raw Tesseract za pośrednictwem opakowania P/Invoke lub pakietu NuGet Tesseract nakłada na użytkownika odpowiedziąlność za: pobranie i umieszczenie plików językowych tessdata, wybór odpowiedniego trybu segmentacji stron, samodzielne rozdzielanie wielostronicowych plików TIFF i PDF oraz skonfigurowanie wątków, jeśli użytkownik chce korzystać z przetwarzania równoległego. Ż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 wymagańa 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

Użytkownicy Visual Studio powinni wyszukać IronOcr w interfejsie graficznym menedżera pakietów NuGet i zainstalować go stamtąd. 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 języku C#?

Podstawowy schemat wyodrębniania danych jest spójny dla wszystkich typów danych wejściowych. Tworzy się instancję IronTesseract, ładuje zawartość do obiektu OcrInput i wywołuje 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 z myślą o ponownym użyciu. 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.

W przypadku wielostronicowych plików PDF result.Pages zapewnia dostęp do tekstu, wskaźnika pewności i ramek ograniczających dla każdej strony. Szczegółowe informacje na temat iteracji strona po stronie można znaleźć w wielostronicowym przewodniku dotyczącym OCR plików PDF.

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() -- stosować w przypadku skanów z silnym plamieniem lub artefaktami kompresji
  • Deskew() -- stosować, gdy dokumenty są fotografowane pod kątem; zobacz wykrywanie obrotu strony w celu automatycznego wykrywania
  • Scałe() -- stosować w przypadku małego PRINT lub danych wejściowych o rozdzielczości poniżej 150 DPI; wartości 150–200 zazwyczaj dają najlepsze wyniki
  • Binarize() -- używaj w przypadku kolorowych lub gradientowych tła; konwertuje obraz na czystą czerń/biel
  • EnhanceResolution() -- stosować w przypadku tekstu rozmytego lub o niskim kontraś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
Scałe() 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 w przypadku dużych plików. Wartość 4 działa dobrze na serwerze czterordzeniowym; zwiększaj ją dopiero po profilowaniu wykorzystania pamięci. W przypadku wdrożeń Azure Functions lub AWS Lambda należy ustawić współbieżność na 1 na instancję funkcji i zamiast tego skalować horyzontalnie.

CreateSearchablePdf generuje plik PDF, w którym oryginalny obraz jest zachowany jako widoczna warstwa, a rozpoznany tekst jest osadzony niewidocznie pod nim. 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 stopień pewności silnika co do rozpoznanego tekstu. Ś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 dotycząca logowania w Microsoft .NET obejmuje wzorce ILogger używane w powyższej usłudze wsadowej dla zespołów integrujących się z wbudowanym kontenerem DI w 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 proces odczytu IronOCR z funkcją .NET Regex w celu pobierania ustrukturyzowanych danych 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

Takie podejście dobrze współgra z OCR strefowym, gdy dokładnie wiadomo, gdzie na formularzu pojawia się każde pole. 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 procesem zarządzania pakietami, z którego już korzystasz.

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 wieloplatformowy, 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

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie