.NET OCR SDK: una biblioteca de reconocimiento de texto para C#
Un SDK de OCR para .NET es un kit de desarrollo de software que permite a las aplicaciones de C# y .NET extraer texto de imágenes, archivos PDF escaneados y otros formatos de documento mediante programación. IronOCR es un SDK de OCR for .NET listo para producción que integra un motor Tesseract 5 optimizado con filtros de preprocesamiento, lectura de BarCodes, salida en PDF con capacidad de búsqueda y compatibilidad con más de 125 idiomas, todo ello accesible a través de una API de C# sencilla que funciona en Windows, Linux, macOS y plataformas en la nube.
¿Por qué IronOCR es el SDK de OCR for .NET adecuado para su proyecto?
Crear un sistema de reconocimiento de texto desde cero implica gestionar procesos de preprocesamiento de imágenes, archivos de datos lingüísticos, modelos de subprocesos y análisis de resultados: meses de trabajo antes de poder extraer la primera palabra. IronOCR elimina esa sobrecarga al ofrecer un motor probado en la práctica que tu equipo puede integrar en un proyecto en cuestión de minutos.
Capacidades clave que la diferencian de los enlaces Tesseract sin procesar:
- Reconocimiento de más de 125 idiomas y alfabetos, incluido el texto manuscrito
- Filtros integrados: eliminación de ruido, corrección de inclinación, binarización, mejora de la resolución y corrección del contraste
- Detección de BarCodes y códigos QR en una misma lectura
- Generación de PDF con capacidad de búsqueda y capas de texto invisibles para flujos de trabajo de archivo
- Procesamiento asíncrono y en paralelo por lotes para pipelines de alto rendimiento
- OCR zonal para seleccionar regiones específicas de la página y reducir el tiempo de procesamiento
- Compatibilidad multiplataforma con Windows, Linux, macOS, Docker y Azure
Según la documentación del proyecto Tesseract OCR, Tesseract sin modificar requiere una configuración manual de los paquetes de idiomas, los ajustes de DPI y los modos de salida. IronOCR se encarga de todo esto automáticamente, lo que te permite centrarte en el significado del texto extraído en lugar de en cómo extraerlo.
¿En qué se diferencia IronOCR de Tesseract sin procesar?
Tesseract en bruto a través de un contenedor P/Invoke o el paquete NuGet Tesseract te deja la responsabilidad de: descargar y colocar los archivos de idioma tessdata, seleccionar el modo de segmentación de página correcto, manejar la división de TIFF y PDF de múltiples páginas por ti mismo, y configurar el enhebrado si deseas procesamiento paralelo. Ninguno de esos detalles es exclusivo de su problema empresarial.
IronOCR se encarga de toda esa infraestructura. Obtienes una interfaz API tipada, gestión automática de datos, división y recombinación de PDF integrada, y un motor seguro para subprocesos que puedes reutilizar en todas las solicitudes. La contrapartida es una licencia de pago para uso en producción; la página de licencias muestra los niveles de precios actuales, incluida una licencia de desarrollo gratuita.
Para los equipos que necesitan dependencias exclusivamente de código abierto, Tesseract Plus sin procesar más un preprocesamiento personalizado es una opción viable. Para los equipos que necesitan implementar un OCR fiable rápidamente, IronOCR reduce la superficie de integración a unas pocas líneas de C#.
¿Cómo se instala el SDK de IronOCR .NET?
La instalación se realiza a través de NuGet, el gestor de paquetes estándar de .NET Standard. Ejecuta el siguiente comando en el directorio de tu proyecto:
Install-Package IronOcr
Para usuarios de Visual Studio, busca IronOcr en la GUI del Administrador de Paquetes de NuGet e instálalo desde allí. Para ver todas las opciones de instalación, incluidas las referencias manuales a DLL, consulte la documentación de instalación de IronOCR.
Después de la instalación, añade la clave de licencia al inicio de tu aplicación o appsettings.json. Puedes iniciar una prueba gratuita para obtener una clave de prueba que desbloquee todas las funciones durante la evaluación.
Verificación de la instalación
Una rápida comprobación tras la instalación confirma que todo está conectado correctamente. Crea una aplicación de consola para .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 aparece texto en la consola, significa que el SDK está instalado y que la clave de licencia es válida. Ya estás listo para crear flujos de trabajo de producción.
¿Cómo extraer texto de imágenes y PDFs en C#?
El patrón de extracción principal es consistente en todos los tipos de entrada. Creas una instancia de IronTesseract, cargas contenido en un objeto OcrInput y llamas a Read(). IronOCR detecta automáticamente el formato de archivo a partir de la extensión, por lo que la misma ruta de código gestiona archivos JPEG, PNG, TIFF, BMP y PDF de varias páginas.
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
Punto de entrada de primer nivel para utilizar el servicio:
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)
La instancia IronTesseract es segura para hilos y está diseñada para su reutilización. Cree un objeto una sola vez al iniciar la aplicación (por ejemplo, mediante la inyección de dependencias en .NET Core) en lugar de instanciarlo por cada solicitud.
Para PDFs de múltiples páginas, result.Pages te ofrece acceso por página al texto, puntaje de confianza y cuadros limitantes. Consulte la guía de OCR para PDF de varias páginas para obtener detalles sobre la iteración página por página.
¿Cómo se mejora la precisión del OCR con filtros de preprocesamiento?
Los escaneos sin procesar procedentes de escáneres planos, cámaras de teléfonos inteligentes o máquinas de fax suelen adolecer de ruido, rotación, bajo contraste y resolución insuficiente. El proceso de corrección de la calidad de imagen de IronOCR aborda cada problema con filtros específicos que se encadenan antes de la llamada de lectura.
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
Guía para la selección de filtros:
DeNoise()-- úsalo para escaneos con mucho moteado o artefactos de compresiónDeskew()-- úsalo cuando los documentos son fotografiados en un ángulo; Véase la detección de rotación de página para la detección automáticaScale()-- úsalo para impresiones pequeñas o entradas inferiores a 150 DPI; Los valores de 150-200 suelen dar los mejores resultadosBinarize()-- úsalo para fondos coloreados o con gradientes; convierte la imagen a blanco y negro estrictoEnhanceResolution()-- úsalo para texto borroso o de bajo contraste; apunta a 300 ppp como el punto óptimo de Tesseract
Las investigaciones publicadas en la revista International Journal on Document Analysis and Recognition demuestran sistemáticamente que la binarización y la corrección de la inclinación son los dos pasos de preprocesamiento de mayor impacto para mejorar las tasas de reconocimiento de caracteres. Aplique ambas como referencia para cualquier proceso de producción.
| Filtrar | Problema resuelto | Cuándo solicitarlo |
|---|---|---|
DeNoise() |
Artefactos del escáner, ruido de moteado | Cualquier escaneo con escáner plano o fax |
Descortar() |
Inclinación y rotación de la página | Documentos fotografiados o desalineados |
Escala() |
Texto pequeño o baja resolución (DPI) | Resolución inferior a 150 ppp |
Binarize() |
Fondos de color, degradados | Papel de color o formularios con marca de agua |
EnhanceResolution() |
Desenfoque y bajo contraste | Capturas de cámara y archivos JPEG comprimidos |
¿Cómo se crea un canal de procesamiento por lotes en producción?
La extracción de un solo documento es sencilla, pero los escenarios de producción implican cientos o miles de archivos que llegan a colas, carpetas compartidas o almacenamiento en la nube. La API asíncrona y el motor seguro para subprocesos de IronOCR lo hacen adecuado para cargas de trabajo en paralelo.
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
El límite MaxDegreeOfParallelism previene el agotamiento de memoria cuando los archivos son grandes. Un valor de 4 funciona bien en un servidor de cuatro núcleos; Auméntelo solo después de analizar el uso de la memoria. Para implementaciones de Azure Functions o AWS Lambda, ajuste la concurrencia a 1 por instancia de función y escale horizontalmente en su lugar.
CreateSearchablePdf genera un PDF donde la imagen original se conserva como una capa visible y el texto reconocido se incrusta de manera invisible debajo de ella. Esto permite la búsqueda de texto completo en visores de PDF y la indexación por parte de los motores de búsqueda, un requisito habitual en los sistemas de gestión de documentos.
Supervisión de las puntuaciones de confianza en producción
Cada OcrResult expone una propiedad Confidence (0-100) que refleja cuán seguro está el motor respecto al texto reconocido. El seguimiento de esta métrica en su infraestructura de registro le proporciona una señal de alerta temprana cuando la calidad de los documentos se degrada; por ejemplo, si la calibración de un escáner se desvía o si un nuevo proveedor de documentos envía escaneos con un DPI inferior al esperado.
Una estrategia práctica de umbrales: registrar una advertencia con una confianza inferior a 80, activar una pasada de preprocesamiento y reintento por debajo de 70, y marcar los documentos para su revisión humana por debajo de 60. Este enfoque por niveles detecta los problemas de calidad antes de que provoquen una corrupción silenciosa de los datos en los sistemas posteriores.
La documentación de registros de Microsoft .NET cubre los patrones ILogger utilizados en el servicio por lotes arriba para equipos que se integran con el contenedor de DI incorporado de ASP.NET Core.
¿Cómo se extraen datos estructurados de documentos escaneados?
La extracción de texto es el primer paso. El segundo paso consiste en analizar ese texto y convertirlo en campos tipificados sobre los que tu aplicación pueda actuar. Este patrón combina el paso de lectura de IronOCR con Regex de .NET para extraer datos estructurados de facturas, formularios e informes.
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
Este enfoque se combina bien con OCR zonal cuando sabe exactamente dónde aparece cada campo en un formulario. Al proporcionar un rectángulo delimitador, se omite el reconocimiento de página completa y se selecciona únicamente la zona que contiene el número de factura o el total, lo que reduce drásticamente el tiempo de procesamiento de los documentos de diseño fijo.
Para escenarios de extracción más avanzados, que incluyen tablas y formularios estructurados, consulte los ejemplos de extracción de datos de IronOCR en el sitio web del producto.
¿Cómo se gestiona el OCR multilingüe en .NET?
Muchas organizaciones procesan documentos en más de un idioma: formularios de importación/exportación, contratos internacionales o envíos multilingües de clientes. IronOCR lo gestiona permitiéndole configurar el paquete de idioma antes de la llamada de lectura.
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 página de compatibilidad lingüística de IronOCR enumera los más de 125 paquetes de idiomas disponibles con instrucciones de descarga. Los paquetes de idiomas se envían como paquetes NuGet (por ejemplo, IronOcr.Languages.German) para que se integren con el mismo flujo de trabajo de gestión de paquetes que ya utilizas.
Para conjuntos de caracteres fuera del alfabeto latino (árabe, chino, japonés, coreano), IronOCR proporciona modelos optimizados que gestionan la dirección del texto de derecha a izquierda y los scripts ideográficos. Consulte la guía de OCR CJK para conocer los detalles de configuración.
¿Cuales son tus próximos pasos?
Ahora dispone de los patrones necesarios para añadir OCR de nivel de producción a cualquier aplicación .NET 10: extracción básica de texto, preprocesamiento para escaneos difíciles, procesamiento por lotes asíncrono, análisis de datos estructurados y compatibilidad con múltiples idiomas.
A partir de aquí, explora estas áreas en función de las necesidades de tu proyecto:
- Lectura de código de barras y código QR -- extraer códigos legibles por máquina del mismo pase de imagen
- Formato de salida HOCR -- obtener cuadros delimitadores a nivel de palabra para procesamiento descendente consciente del diseño
- Opciones de licencia de IronOCR: modelo de distribución libre de regalías con niveles SaaS, OEM y Enterprise
- Biblioteca de ejemplos de código de IronOCR: más de 30 ejemplos funcionales que abarcan escenarios comunes
- Guía de implementación de Azure Functions -- OCR sin servidor en infraestructura cloud de Microsoft
Empiece con la licencia de prueba gratuita para evaluar todas las funciones en sus propios documentos antes de comprometerse con un plan.
Preguntas Frecuentes
¿Qué es el SDK de .NET OCR?
El SDK de .NET OCR de IronOCR es una biblioteca diseñada para integrar capacidades de reconocimiento óptico de caracteres en aplicaciones C#, permitiendo a los desarrolladores extraer texto de imágenes, PDFs y documentos escaneados.
¿Cuáles son las características clave del SDK de .NET de IronOCR?
El SDK de .NET de IronOCR ofrece una API simple, soporte para múltiples idiomas, compatibilidad multiplataforma y características avanzadas para manejar varios formatos de archivo y escaneos de baja calidad.
¿Cómo maneja IronOCR diferentes idiomas?
El SDK de .NET de IronOCR admite múltiples idiomas, permitiendo la extracción y reconocimiento de texto de documentos en varios idiomas sin requerir configuraciones adicionales.
¿Puede IronOCR procesar escaneos de baja calidad?
Sí, IronOCR está diseñado para manejar eficazmente escaneos de baja calidad, empleando algoritmos avanzados para mejorar la precisión del reconocimiento de texto incluso en escenarios desafiantes.
¿Es el SDK de .NET de IronOCR multiplataforma?
El SDK de .NET de IronOCR es multiplataforma, lo que significa que se puede usar en diferentes sistemas operativos, haciéndolo versátil para varios entornos de desarrollo.
¿Qué formatos de archivo admite IronOCR?
IronOCR admite una amplia gama de formatos de archivo, incluyendo imágenes, PDFs y documentos escaneados, proporcionando flexibilidad para tareas de reconocimiento de texto en diferentes medios.
¿Cómo pueden los desarrolladores integrar IronOCR en sus proyectos?
Los desarrolladores pueden integrar IronOCR en sus proyectos C# utilizando su API tipificada, lo que simplifica el proceso de agregar funcionalidad de OCR a las aplicaciones.
¿Cuáles son algunos casos de uso para IronOCR?
IronOCR se puede usar en sistemas de gestión de documentos, entrada de datos automatizada, digitalización de contenido y cualquier aplicación que requiera extracción de texto de imágenes o PDFs.




