Passer au contenu du pied de page
UTILISATION D'IRONOCR

Kit de développement logiciel (SDK) OCR .NET : une bibliothèque de reconnaissance de texte pour C#

Un kit de développement logiciel OCR .NET OCR ) permet aux applications C# et .NET d'extraire par programmation du texte à partir d'images, de PDF numérisés et d'autres formats de documents. IronOCR est un kit de développement logiciel (SDK) OCR .NET prêt pour la production qui intègre un moteur Tesseract 5 optimisé avec des filtres de prétraitement, la lecture de codes-barres, la sortie PDF consultable et la prise en charge de plus de 125 langues – le tout accessible via une API C# propre fonctionnant sous Windows, Linux, macOS et sur les plateformes cloud.

Pourquoi IronOCR est-il le kit de développement logiciel (SDK) OCR .NET idéal pour votre projet ?

Créer un système de reconnaissance de texte à partir de zéro implique de gérer des chaînes de prétraitement d'images, des fichiers de données linguistiques, des modèles de traitement multithread et l'analyse syntaxique des résultats — des mois de travail avant même d'extraire votre premier mot. IronOCR élimine ces frais généraux en fournissant un moteur éprouvé que votre équipe peut intégrer à un projet en quelques minutes.

Principales fonctionnalités qui le distinguent des liaisons Tesseract brutes :

  • Reconnaissance de plus de 125 langues et systèmes d'écriture, y compris le texte manuscrit Filtres intégrés : suppression du bruit, redressement de la distorsion, binarisation, amélioration de la résolution et correction du contraste
  • Détection des codes-barres et des codes QR lors d'une même passe de lecture
  • Génération de PDF consultables avec des calques de texte invisibles pour les flux de travail d'archivage
  • Traitement par lots asynchrone et parallèle pour les pipelines à haut débit
  • OCR zonal pour cibler des régions spécifiques de la page et réduire le temps de traitement
  • Prise en charge multiplateforme sur Windows, Linux, macOS, Docker et Azure

Selon la documentation du projet Tesseract OCR , Tesseract brut nécessite une configuration manuelle pour les packs de langue, les paramètres DPI et les modes de sortie. IronOCR gère tout cela automatiquement, vous permettant de vous concentrer sur la signification du texte extrait plutôt que sur la manière de l'extraire.

Comment IronOCR se compare-t-il à Tesseract brut ?

Raw Tesseract via un wrapper P/Invoke ou le package @Tesseract NuGet vous laisse la responsabilité de : télécharger et placer les fichiers de langage tessdata, sélectionner le bon mode de segmentation des pages, gérer vous-même le fractionnement de plusieurs pages TIFF et PDF, et câbler le threading si vous souhaitez un traitement parallèle. Aucun de ces détails n'est spécifique à votre problème d'entreprise.

IronOCR enveloppe toute cette tuyauterie. Vous bénéficiez d'une interface API typée, d'une gestion automatique des données tessdata, d'une fonction intégrée de division et de recombinaison de PDF et d'un moteur thread-safe réutilisable pour plusieurs requêtes. En contrepartie, une licence payante est requise pour une utilisation en production ; la page relative aux licences affiche les différents niveaux de prix actuels, y compris une licence de développement gratuite.

Pour les équipes qui ont besoin de dépendances exclusivement open source, l'utilisation de Tesseract brut Plus à un prétraitement personnalisé constitue une solution viable. Pour les équipes qui ont besoin de déployer rapidement une solution OCR fiable, IronOCR réduit la surface d'intégration à quelques lignes de C#.

Comment installer le SDK IronOCR .NET ?

L'installation s'effectue via NuGet, le gestionnaire de packages standard .NET . Exécutez la commande suivante dans votre répertoire de projet :

Install-Package IronOcr

Pour les utilisateurs de Visual Studio, recherchez IronOcr dans l'interface graphique du gestionnaire de paquets NuGet et installez à partir de là. Pour connaître toutes les options d'installation, y compris les références DLL manuelles, consultez la documentation d'installation IronOCR .

Après l'installation, ajoutez la clé de licence au démarrage de votre application ou appsettings.json. Vous pouvez démarrer un essai gratuit pour obtenir une clé d'essai qui débloque toutes les fonctionnalités pendant la période d'évaluation.

Vérification de l'installation

Un rapide contrôle de bon fonctionnement après l'installation confirme que tout est correctement câblé. Créer une application console ciblant .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

Si du texte apparaît dans la console, le SDK est installé et la clé de licence est valide. Vous êtes prêt à mettre en place des flux de production.

Comment extraire du texte à partir d'images et de fichiers PDF en C# ?

Le modèle d'extraction de base est cohérent pour tous les types d'entrée. Vous créez une instance IronTesseract, chargez le contenu dans un objet OcrInput et appelez Read(). IronOCR détecte automatiquement le format de fichier à partir de son extension ; ainsi, le même chemin de code gère les formats JPEG, PNG, TIFF, BMP et PDF multipages.

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

Point d'entrée principal pour exercer le service :

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

L'instance IronTesseract est sécurisée pour les threads et conçue pour être réutilisée. Créez-le une seule fois au démarrage de l'application (via l'injection de dépendances dans ASP.NET Core, par exemple) plutôt que de l'instancier à chaque requête.

Pour les PDF multipages, result.Pages vous permet d'accéder, page par page, au texte, au score de confiance et aux boîtes de délimitation. Consultez le guide OCR PDF multipage pour plus de détails sur l'itération page par page.

Comment améliorer la précision de la reconnaissance optique de caractères (OCR) grâce aux filtres de prétraitement ?

Les numérisations brutes provenant de scanners à plat, d'appareils photo de smartphones ou de télécopieurs souffrent fréquemment de bruit, de rotation, d'un faible contraste et d'une résolution insuffisante. Le pipeline de correction de la qualité d'image d'IronOCR traite chaque problème grâce à des filtres ciblés que vous enchaînez avant l'appel de lecture.

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

Guide de sélection des filtres :

  • DeNoise() -- à utiliser pour les numérisations présentant un fort mouchetage ou des artefacts de compression
  • Deskew() -- à utiliser lorsque les documents sont photographiés sous un angle ; voir la détection de rotation de page pour la détection automatique
  • Scale() -- à utiliser pour les petits caractères ou les entrées inférieures à 150 DPI ; Les valeurs de 150 à 200 donnent généralement les meilleurs résultats.
  • Binarize() -- à utiliser pour les fonds colorés ou dégradés ; convertit l'image en noir et blanc strict
  • EnhanceResolution() -- à utiliser pour les textes flous ou à faible contraste ; L'objectif est de 300 DPI, considéré comme le point d'équilibre optimal du Tesseract.

Les recherches publiées dans l' International Journal on Document Analysis and Recognition montrent systématiquement que la binarisation et le redressement sont les deux étapes de prétraitement ayant le plus grand impact sur l'amélioration des taux de reconnaissance de caractères. Appliquez les deux comme base pour tout pipeline de production.

Filtres de prétraitement IronOCR et leurs principaux cas d'utilisation
Filtre Problème résolu Quand postuler
DeNoise() Artefacts de numérisation, bruit de speckle Tout scanner à plat ou fax
Deskew() Inclinaison et rotation de la page Documents photographiés ou mal alignés
Scale() Texte de petite taille ou faible résolution Entrée inférieure à 150 DPI
Binarize() Fonds colorés, dégradés Papier de couleur ou formulaires filigranés
Améliorer la résolution() Flou et faible contraste Captures d'écran et fichiers JPEG compressés

Comment construire un pipeline de traitement par lots pour la production ?

L'extraction d'un seul document est simple, mais les scénarios de production impliquent des centaines, voire des milliers de fichiers arrivant dans des files d'attente, des dossiers partagés ou un stockage cloud. L'API asynchrone et le moteur thread-safe d'IronOCR le rendent adapté aux charges de travail parallèles.

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

Le capuchon MaxDegreeOfParallelism évite l'épuisement de la mémoire lorsque les fichiers sont volumineux. La valeur 4 fonctionne bien sur un serveur à quatre cœurs ; N'augmentez cette valeur qu'après avoir analysé l'utilisation de la mémoire. Pour les déploiements Azure Functions ou AWS Lambda , définissez la concurrence à 1 par instance de fonction et effectuez plutôt une mise à l'échelle horizontale.

CreateSearchablePdf génère un PDF dans lequel l'image originale est préservée en tant que couche visible et le texte reconnu est incorporé de manière invisible en dessous. Cela permet la recherche en texte intégral dans les visionneuses PDF et l'indexation par les moteurs de recherche — une exigence courante dans les systèmes de gestion de documents.

Suivi des scores de confiance en production

Chaque OcrResult expose une propriété Confidence (0-100) qui reflète le degré de certitude du moteur quant au texte reconnu. Le suivi de cette métrique dans votre infrastructure de journalisation vous permet de recevoir un signal d'alerte précoce en cas de dégradation de la qualité des documents, par exemple si l'étalonnage d'un scanner dérive ou si un nouveau fournisseur de documents envoie des numérisations à une résolution inférieure à celle attendue.

Une stratégie de seuil pratique : enregistrer un avertissement lorsque le niveau de confiance est inférieur à 80, déclencher une nouvelle tentative de prétraitement lorsque le niveau est inférieur à 70 et signaler les documents pour une vérification humaine lorsque le niveau est inférieur à 60. Cette approche par paliers permet de détecter les problèmes de qualité avant qu'ils ne provoquent une corruption silencieuse des données dans les systèmes en aval.

La Documentation de Microsoft .NET sur la journalisation couvre les modèles ILogger utilisés dans le service batch ci-dessus pour les équipes qui s'intègrent au conteneur DI intégré d'ASP.NET Core.

Comment extraire des données structurées à partir de documents numérisés ?

L'extraction de texte est la première étape. La deuxième consiste à analyser ce texte et à le convertir en champs exploitables par votre application. Ce modèle combine la passe de lecture d'IronOCR avec la Regex de .NET pour extraire des données structurées de factures, de formulaires et de rapports.

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

Cette approche se combine bien avec la reconnaissance optique de caractères (OCR) zonale lorsque vous savez exactement où chaque champ apparaît sur un formulaire. En fournissant un rectangle de délimitation, vous évitez la reconnaissance de la page entière et ciblez uniquement la région contenant le numéro de facture ou le total, ce qui réduit considérablement le temps de traitement des documents à mise en page fixe.

Pour des scénarios d'extraction plus avancés, notamment pour les tableaux et les formulaires structurés, consultez les exemples d'extraction de données IronOCR sur le site du produit.

Comment gérer la reconnaissance optique de caractères multilingue en .NET?

De nombreuses organisations traitent des documents dans plusieurs langues : formulaires d'import/export, contrats internationaux ou documents clients multilingues. IronOCR gère cela en vous permettant de configurer le pack de langue avant l'appel de lecture.

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

La page d'assistance linguistique IronOCR répertorie plus de 125 packs de langue disponibles avec les instructions de téléchargement. Les packs linguistiques sont livrés en tant que paquets NuGet (par exemple, IronOcr.Languages.German), de sorte qu'ils s'intègrent au même flux de gestion des paquets que celui que vous utilisez déjà.

Pour les jeux de caractères autres que l'alphabet latin (arabe, chinois, japonais, coréen), IronOCR propose des modèles optimisés qui gèrent le sens d'écriture de droite à gauche et les écritures idéographiques. Consultez le guide OCR CJK pour plus de détails sur la configuration.

Quelles sont vos prochaines étapes ?

Vous disposez désormais des modèles nécessaires pour ajouter une fonction OCR de qualité professionnelle à n'importe quelle application .NET 10 : extraction de texte de base, prétraitement pour les numérisations difficiles, traitement par lots asynchrone, analyse de données structurées et prise en charge multilingue.

À partir d'ici, explorez ces domaines en fonction des besoins de votre projet :

Commencez par la licence d'essai gratuite pour évaluer l'ensemble des fonctionnalités sur vos propres documents avant de vous engager sur un abonnement.

NuGet Installer avec NuGet

PM >  Install-Package IronOcr

Consultez IronOCR sur NuGet pour une installation rapide. Avec plus de 10 millions de téléchargements, il transforme le développement PDF avec C#. Vous pouvez également télécharger le DLL ou l'installateur Windows.

Questions Fréquemment Posées

Qu'est-ce que le SDK OCR .NET ?

Le SDK OCR .NET de IronOCR est une bibliothèque conçue pour intégrer des capacités de reconnaissance optique de caractères dans les applications C#, permettant aux développeurs d'extraire du texte à partir d'images, de PDF et de documents numérisés.

Quelles sont les principales fonctionnalités du SDK .NET de IronOCR ?

Le SDK .NET de IronOCR offre une API simple, un support pour plusieurs langues, une compatibilité multiplateforme, et des fonctionnalités avancées pour gérer divers formats de fichiers et des scans de faible qualité.

Comment IronOCR gère-t-il différentes langues ?

Le SDK .NET de IronOCR prend en charge plusieurs langues, permettant l'extraction et la reconnaissance de texte à partir de documents dans diverses langues sans nécessiter de configurations supplémentaires.

IronOCR peut-il traiter des scans de faible qualité ?

Oui, IronOCR est conçu pour gérer efficacement les scans de faible qualité, en employant des algorithmes avancés pour améliorer la précision de la reconnaissance de texte même dans des scénarios difficiles.

Le SDK .NET de IronOCR est-il multiplateforme ?

Le SDK .NET de IronOCR est multiplateforme, ce qui signifie qu'il peut être utilisé sur différents systèmes d'exploitation, le rendant polyvalent pour divers environnements de développement.

Quels formats de fichiers IronOCR supporte-t-il ?

IronOCR prend en charge un large éventail de formats de fichiers, y compris les images, les PDF, et les documents numérisés, offrant une flexibilité pour les tâches de reconnaissance de texte à travers différents médias.

Comment les développeurs peuvent-ils intégrer IronOCR dans leurs projets ?

Les développeurs peuvent intégrer IronOCR à leurs projets C# grâce à son API typée, ce qui simplifie l'ajout de fonctionnalités OCR aux applications.

Quels sont certains cas d'utilisation pour IronOCR ?

IronOCR peut être utilisé dans les systèmes de gestion de documents, la saisie de données automatisée, la numérisation de contenu, et toute application nécessitant l'extraction de texte à partir d'images ou de PDF.

Kannaopat Udonpant
Ingénieur logiciel
Avant de devenir ingénieur logiciel, Kannapat a obtenu un doctorat en ressources environnementales à l'université d'Hokkaido au Japon. Pendant qu'il poursuivait son diplôme, Kannapat est également devenu membre du laboratoire de robotique de véhicules, qui fait partie du département de bioproduction. En 2022, il a utilisé ses compé...
Lire la suite

Équipe de soutien Iron

Nous sommes en ligne 24 heures sur 24, 5 jours sur 7.
Chat
Email
Appelez-moi