Zum Fußzeileninhalt springen
VERWENDUNG VON IRONOCR

.NET OCR SDK: Eine Texterkennungsbibliothek für C#

Ein .NET OCR SDK ist ein Software Development Kit, mit dem C#- und .NET Anwendungen programmatisch Text aus Bildern, gescannten PDFs und anderen Dokumentformaten extrahieren können. IronOCR ist ein produktionsreifes .NET OCR SDK, das eine optimierte Tesseract 5-Engine mit Vorverarbeitungsfiltern, Barcode-Lesung, durchsuchbarer PDF-Ausgabe und Unterstützung für mehr als 125 Sprachen umschließt – alles zugänglich über eine übersichtliche C#-API, die unter Windows, Linux, macOS und Cloud-Plattformen funktioniert.

Warum ist IronOCR das richtige .NET OCR SDK für Ihr Projekt?

Die Entwicklung einer Texterkennung von Grund auf bedeutet die Verwaltung von Bildvorverarbeitungspipelines, Sprachdatendateien, Threading-Modellen und Ausgabeanalyse – monatelange Arbeit, bevor man das erste Wort extrahieren kann. IronOCR beseitigt diesen Aufwand, indem es eine praxiserprobte Engine liefert, die Ihr Team innerhalb von Minuten in ein Projekt integrieren kann.

Wesentliche Merkmale, die es von herkömmlichen Tesseract-Bindungen unterscheiden:

  • Erkennung von über 125 Sprachen und Schriftsystemen, einschließlich handgeschriebener Texte
  • Integrierte Filter: Rauschunterdrückung, Entzerrung, Binarisierung, Auflösungsverbesserung und Kontrastkorrektur
  • Barcode- und QR-Code-Erkennung innerhalb desselben Lesevorgangs
  • Generierung durchsuchbarer PDFs mit unsichtbaren Textebenen für Archivierungs-Workflows
  • Asynchrone und parallele Stapelverarbeitung für Pipelines mit hohem Durchsatz
  • Zonale OCR zur gezielten Bearbeitung bestimmter Seitenbereiche, um die Verarbeitungszeit zu verkürzen
  • Plattformübergreifende Unterstützung unter Windows, Linux, macOS, Docker und Azure

Laut der Dokumentation des Tesseract OCR-Projekts erfordert die Rohversion von Tesseract eine manuelle Konfiguration für Sprachpakete, DPI-Einstellungen und Ausgabemodi. IronOCR erledigt das alles automatisch, sodass Sie sich auf die Bedeutung des extrahierten Textes konzentrieren können, anstatt auf die Extraktion selbst.

Wie schneidet IronOCR im Vergleich zu Raw Tesseract ab?

Raw Tesseract über einen P/Invoke-Wrapper oder das Tesseract NuGet-Paket überlässt Ihnen die Verantwortung für: das Herunterladen und Platzieren von tessdata-Sprachdateien, die Auswahl des richtigen Seitensegmentierungsmodus, die Handhabung von mehrseitigen TIFF- und PDF-Splits und die Einrichtung von Threads, wenn Sie parallele Verarbeitung wünschen. Keines dieser Details ist spezifisch für Ihr geschäftliches Problem.

IronOCR kapselt diese gesamte Infrastruktur. Sie erhalten eine typisierte API-Oberfläche, automatisches Tessdata-Management, integrierte PDF-Aufteilung und -Zusammenführung sowie eine threadsichere Engine, die Sie für mehrere Anfragen wiederverwenden können. Im Gegenzug wird eine kostenpflichtige Lizenz für den Produktiveinsatz benötigt – auf der Lizenzseite werden die aktuellen Preisstufen einschließlich einer kostenlosen Entwicklungslizenz angezeigt.

Für Teams, die ausschließlich auf Open-Source-Abhängigkeiten angewiesen sind, ist die Verwendung von reinem Tesseract in Plus mit einer benutzerdefinierten Vorverarbeitung ein praktikabler Weg. Für Teams, die schnell zuverlässige OCR-Lösungen bereitstellen müssen, reduziert IronOCR die Integrationsfläche auf wenige Zeilen C#.

Wie installiert man das IronOCR .NET SDK?

Die Installation erfolgt über NuGet, den Standard-Paketmanager für .NET . Führen Sie den folgenden Befehl in Ihrem Projektverzeichnis aus:

Install-Package IronOcr

Benutzer von Visual Studio können im NuGet Package Manager GUI nach IronOcr suchen und von dort aus installieren. Die vollständigen Installationsoptionen einschließlich manueller DLL-Referenzen finden Sie in der IronOCR Installationsdokumentation .

Nach der Installation fügen Sie den Lizenzschlüssel zum Start Ihrer Anwendung oder appsettings.json hinzu. Sie können eine kostenlose Testphase starten , um einen Testschlüssel zu erhalten, der während der Testphase alle Funktionen freischaltet.

Überprüfung der Installation

Eine kurze Funktionsprüfung nach der Installation bestätigt, dass alles korrekt verkabelt ist. Erstellen Sie eine Konsolenanwendung, die auf .NET 10 abzielt:

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

Wenn Text in der Konsole erscheint, ist das SDK installiert und der Lizenzschlüssel gültig. Sie sind nun bereit, Produktionsabläufe zu erstellen.

Wie extrahiert man Text aus Bildern und PDFs in C#?

Das grundlegende Extraktionsmuster ist für alle Eingabetypen gleich. Sie erstellen eine IronTesseract Instanz, laden den Inhalt in ein OcrInput Objekt und rufen Read() auf. IronOCR erkennt das Dateiformat automatisch anhand der Dateiendung, sodass derselbe Codepfad JPEG, PNG, TIFF, BMP und mehrseitige PDFs verarbeitet.

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

Hauptzugangspunkt zur Nutzung des Dienstes:

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

Die Instanz IronTesseract ist thread-sicher und für die Wiederverwendung konzipiert. Erstellen Sie es einmalig beim Start der Anwendung (z. B. über Dependency Injection in ASP.NET Core), anstatt es bei jeder Anfrage neu zu instanziieren.

Bei mehrseitigen PDFs ermöglicht result.Pages den seitenweisen Zugriff auf den Text, den Konfidenzwert und die Begrenzungsrahmen. Einzelheiten zur seitenweisen Iteration finden Sie im mehrseitigen PDF-OCR-Leitfaden .

Wie lässt sich die Genauigkeit der OCR-Texturierung mithilfe von Vorverarbeitungsfiltern verbessern?

Rohscans von Flachbettscannern, Smartphone-Kameras oder Faxgeräten leiden häufig unter Rauschen, Rotation, geringem Kontrast und unzureichender Auflösung. Die Bildqualitätskorrektur-Pipeline von IronOCR geht jedes Problem mit gezielten Filtern an, die Sie vor dem Leseaufruf verketten.

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

Hinweise zur Filterauswahl:

  • DeNoise() -- für Scans mit starker Fleckenbildung oder Kompressionsartefakten verwenden
  • Deskew() -- wird verwendet, wenn Dokumente schräg fotografiert werden; Siehe Seitenrotationserkennung für automatische Erkennung
  • Scale() -- für Kleingedrucktes oder Eingaben unter 150 DPI verwenden; Werte zwischen 150 und 200 liefern in der Regel die besten Ergebnisse.
  • Binarize() -- Verwendung für farbige oder verlaufende Hintergründe; Konvertiert das Bild in ein striktes Schwarzweißbild.
  • EnhanceResolution() -- für verschwommenen oder kontrastarmen Text verwenden; Tesseract zielt auf 300 DPI als optimalen Einstellungsbereich ab.

Die im International Journal on Document Analysis and Recognition veröffentlichten Forschungsergebnisse zeigen übereinstimmend, dass Binarisierung und Entzerrung die beiden wichtigsten Vorverarbeitungsschritte zur Verbesserung der Zeichenerkennungsrate sind. Verwenden Sie beides als Grundlage für jede Produktionspipeline.

IronOCR Vorverarbeitungsfilter und ihre wichtigsten Anwendungsfälle
Filter Problem gelöst Wann bewerben?
DeNoise() Scannerartefakte, Speckle-Rauschen Beliebiger Flachbett- oder Faxscanner
Deskew() Seitenneigung und -drehung Fotografierte oder falsch ausgerichtete Dokumente
Scale() Kleiner Text oder niedrige DPI-Auflösung Eingabe unter 150 DPI
Binarisieren() Farbige Hintergründe, Farbverläufe Farbiges Papier oder wasserzeichenbeschichtete Formulare
EnhanceResolution() Unscharf und geringer Kontrast Kameraaufnahmen und komprimierte JPEGs

Wie baut man eine Produktionspipeline für die Stapelverarbeitung auf?

Die Extraktion einzelner Dokumente ist unkompliziert, in Produktionsszenarien hingegen treffen Hunderte oder Tausende von Dateien in Warteschlangen, freigegebenen Ordnern oder Cloud-Speichern ein. Dank der asynchronen API und der threadsicheren Engine eignet sich IronOCR für parallele Arbeitslasten.

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

Die MaxDegreeOfParallelism Kappe verhindert die Erschöpfung des Speichers, wenn die Dateien groß sind. Ein Wert von 4 funktioniert gut auf einem Server mit vier Kernen; Erhöhen Sie den Wert erst nach der Analyse der Speichernutzung. Bei Azure Functions- oder AWS Lambda-Bereitstellungen sollte die Parallelität auf 1 pro Funktionsinstanz eingestellt und stattdessen horizontal skaliert werden.

CreateSearchablePdf erzeugt eine PDF-Datei, bei der das Originalbild als sichtbare Ebene erhalten bleibt und der erkannte Text unsichtbar darunter eingebettet ist. Dies ermöglicht die Volltextsuche in PDF-Viewern und die Indizierung durch Suchmaschinen – eine gängige Anforderung in Dokumentenmanagementsystemen.

Überwachung der Vertrauenswerte in der Produktion

Jeder OcrResult gibt eine Confidence Eigenschaft (0-100) an, die widerspiegelt, wie sicher die Engine über den erkannten Text ist. Durch die Überwachung dieser Kennzahl in Ihrer Protokollierungsinfrastruktur erhalten Sie ein Frühwarnsignal, wenn sich die Dokumentqualität verschlechtert – beispielsweise, wenn die Kalibrierung eines Scanners abweicht oder ein neuer Dokumentenlieferant Scans mit niedrigerer DPI-Auflösung als erwartet liefert.

Eine praktische Schwellenwertstrategie: Bei einem Konfidenzwert unter 80 % wird eine Warnung ausgegeben, bei unter 70 % wird ein Vorverarbeitungs-Wiederholungsdurchlauf ausgelöst und bei unter 60 % werden Dokumente zur manuellen Überprüfung gekennzeichnet. Dieser gestaffelte Ansatz erkennt Qualitätsprobleme, bevor sie zu unbemerkten Datenbeschädigungen in nachgelagerten Systemen führen.

Die Microsoft .NET Logging-Dokumentation deckt die ILogger Muster ab, die im obigen Batch-Dienst für Teams verwendet werden, die mit dem integrierten DI-Container von ASP.NET Core arbeiten.

Wie extrahiert man strukturierte Daten aus gescannten Dokumenten?

Die Textextraktion ist der erste Schritt. Im zweiten Schritt wird dieser Text in typisierte Felder unterteilt, die Ihre Anwendung verarbeiten kann. Dieses Muster kombiniert den Read-Pass von IronOCR mit dem Regex von .NET, um strukturierte Daten aus Rechnungen, Formularen und Berichten zu ziehen.

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

Dieser Ansatz eignet sich gut für die zonale OCR, wenn man genau weiß, wo sich jedes Feld in einem Formular befindet. Durch die Angabe eines Begrenzungsrechtecks ​​wird die Erkennung der gesamten Seite übersprungen und nur der Bereich, der die Rechnungsnummer oder den Gesamtbetrag enthält, gezielt angesprochen – wodurch die Bearbeitungszeit für Dokumente mit festem Layout drastisch reduziert wird.

Für komplexere Extraktionsszenarien, einschließlich Tabellen und strukturierter Formulare, sehen Sie sich die IronOCR Datenextraktionsbeispiele auf der Produktseite an.

Wie handhabt man mehrsprachige OCR in .NET?

Viele Organisationen verarbeiten Dokumente in mehr als einer Sprache – Import-/Exportformulare, internationale Verträge oder mehrsprachige Kundenanfragen. IronOCR löst dieses Problem, indem es Ihnen ermöglicht, das Sprachpaket vor dem Leseaufruf zu konfigurieren.

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

Auf der IronOCR -Sprachunterstützungsseite sind alle über 125 verfügbaren Sprachpakete mit Download-Anweisungen aufgelistet. Sprachpakete werden als NuGet-Pakete ausgeliefert (z. B. IronOcr.Languages.German), so dass sie in denselben Paketverwaltungs-Workflow integriert werden können, den Sie bereits verwenden.

Für Zeichensätze außerhalb des lateinischen Alphabets – Arabisch, Chinesisch, Japanisch, Koreanisch – bietet IronOCR optimierte Modelle, die die Schreibrichtung von rechts nach links und ideografische Schriften verarbeiten. Spezifische Konfigurationshinweise finden Sie im CJK-OCR-Leitfaden .

Was sind Ihre nächsten Schritte?

Sie verfügen nun über die notwendigen Muster, um jeder .NET 10-Anwendung eine OCR-Funktion in Produktionsqualität hinzuzufügen: grundlegende Textextraktion, Vorverarbeitung für schwierige Scans, asynchrone Stapelverarbeitung, Analyse strukturierter Daten und Unterstützung mehrerer Sprachen.

Erkunden Sie von hier aus diese Bereiche entsprechend Ihren Projektanforderungen:

Beginnen Sie mit der kostenlosen Testlizenz, um den vollen Funktionsumfang anhand Ihrer eigenen Dokumente zu testen, bevor Sie sich für eine höhere Lizenzstufe entscheiden.

NuGet Mit NuGet installieren

PM >  Install-Package IronOcr

Schauen Sie sich IronOCR auf NuGet für eine schnelle Installation an. Mit über 10 Millionen Downloads transformiert es die PDF-Entwicklung mit C#. Sie können auch das DLL oder den Windows Installer herunterladen.

Häufig gestellte Fragen

Was ist das .NET OCR SDK?

Das .NET OCR SDK von IronOCR ist eine Bibliothek, die entwickelt wurde, um optische Zeichenerkennung in C#-Anwendungen zu integrieren, wodurch Entwickler Text aus Bildern, PDFs und gescannten Dokumenten extrahieren können.

Was sind die Hauptmerkmale des .NET SDK von IronOCR?

Das .NET SDK von IronOCR bietet eine einfache API, Unterstützung für mehrere Sprachen, plattformübergreifende Kompatibilität und erweiterte Funktionen für die Verarbeitung verschiedener Dateiformate und schlecht gescannter Dokumente.

Wie geht IronOCR mit verschiedenen Sprachen um?

Das .NET SDK von IronOCR unterstützt mehrere Sprachen und ermöglicht die Textextraktion und -erkennung aus Dokumenten in verschiedenen Sprachen, ohne dass zusätzliche Konfigurationen erforderlich sind.

Kann IronOCR schlecht gescannte Dokumente verarbeiten?

Ja, IronOCR ist darauf ausgelegt, schlecht gescannte Dokumente effektiv zu bearbeiten und setzt fortschrittliche Algorithmen ein, um die Genauigkeit der Texterkennung auch in herausfordernden Szenarien zu verbessern.

Ist das .NET SDK von IronOCR plattformübergreifend?

Das .NET SDK von IronOCR ist plattformübergreifend, was bedeutet, dass es auf verschiedenen Betriebssystemen verwendet werden kann und somit vielseitig für verschiedene Entwicklungsumgebungen einsetzbar ist.

Welche Dateiformate unterstützt IronOCR?

IronOCR unterstützt eine breite Palette von Dateiformaten, einschließlich Bildern, PDFs und gescannten Dokumenten, und bietet Flexibilität für Texterkennungsaufgaben in verschiedenen Medien.

Wie können Entwickler IronOCR in ihre Projekte integrieren?

Entwickler können IronOCR mithilfe der typisierten API in ihre C#-Projekte integrieren, was den Prozess des Hinzufügens von OCR-Funktionalität zu Anwendungen vereinfacht.

Welche Anwendungsfälle gibt es für IronOCR?

IronOCR kann in Dokumentenmanagementsystemen, automatisierter Dateneingabe, Inhaltsdigitalisierung und jeder Anwendung, die Textextraktion aus Bildern oder PDFs benötigt, eingesetzt werden.

Kannaopat Udonpant
Software Ingenieur
Bevor er Software-Ingenieur wurde, absolvierte Kannapat ein PhD in Umweltressourcen an der Hokkaido University in Japan. Während seines Studiums wurde Kannapat auch Mitglied des Vehicle Robotics Laboratory, das Teil der Fakultät für Bioproduktionstechnik ist. Im Jahr 2022 nutzte er seine C#-Kenntnisse, um dem Engineering-Team von Iron Software ...
Weiterlesen

Iron Support Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an