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
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
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)
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
Guide de sélection des filtres :
DeNoise()-- à utiliser pour les numérisations présentant un fort mouchetage ou des artefacts de compressionDeskew()-- à utiliser lorsque les documents sont photographiés sous un angle ; voir la détection de rotation de page pour la détection automatiqueScale()-- à 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 strictEnhanceResolution()-- à 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.
| 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
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
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
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 :
- Lecture des codes-barres et des codes QR : extraction des codes lisibles par machine à partir d'une même image
- Format de sortie HOCR : obtention de cadres de délimitation au niveau des mots pour un traitement en aval prenant en compte la mise en page
- Options de licence IronOCR : modèle de distribution sans redevance avec des niveaux SaaS, OEM et Enterprise
- Bibliothèque d'exemples de code IronOCR -- plus de 30 exemples fonctionnels couvrant des scénarios courants
- Guide de déploiement d'Azure Functions : reconnaissance optique de caractères (OCR) sans serveur sur l'infrastructure cloud Microsoft
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.
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.




