.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
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
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)
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
Wskazówki dotyczące wyboru filtrów:
DeNoise()-- stosować w przypadku skanów z silnym plamieniem lub artefaktami kompresjiDeskew()-- stosować, gdy dokumenty są fotografowane pod kątem; zobacz wykrywanie obrotu strony w celu automatycznego wykrywaniaScał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 wynikiBinarize()-- używaj w przypadku kolorowych lub gradientowych tła; konwertuje obraz na czystą czerń/bielEnhanceResolution()-- 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.
| 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
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
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
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:
- Odczytywanie kodów BarCode i kodów QR — wyodrębnianie kodów nadających się do odczytu maszynowego z tego samego obrazu
- Format wyjściowy HOCR — uzyskiwanie prostokątów ograniczających na poziomie WORD do dalszego przetwarzania uwzględniającego układ
- Opcje licencyjne IronOCR — model dystrybucji Bez opłat licencyjnych z poziomami SaaS, OEM i Enterprise
- Biblioteka przykładów kodu IronOCR — ponad 30 działających przykładów obejmujących typowe scenariusze
- Przewodnik wdrażania Azure Functions — bezserwerowe OCR w infrastrukturze chmurowej Microsoft
Zacznij od bezpłatnej licencji próbnej, aby ocenić pełny zestaw funkcji na własnych dokumentach przed podjęciem decyzji o wyborze planu.
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.




