Saltar al pie de página
USANDO IRONOCR

.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 para .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 para .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?

Raw Tesseract a través de una envoltura P/Invoke o el paquete Tesseract NuGet le deja responsable de: descargar y colocar los archivos de lenguaje tessdata, seleccionar el modo correcto de segmentación de páginas, manejar la división TIFF y PDF de varias páginas usted mismo, y cablear el enhebrado si desea un 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

Los usuarios de Visual Studio pueden buscar IronOcr en la interfaz gráfica de usuario del gestor de paquetes NuGet e instalarlo 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.

Tras la instalación, añada la clave de licencia al inicio de su 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
$vbLabelText   $csharpLabel

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 se extrae texto de imágenes y archivos PDF en C#?

El patrón de extracción principal es el mismo para todos los tipos de entrada. Se crea una instancia IronTesseract, se carga el contenido en un objeto OcrInput y se llama 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
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

La instancia IronTesseract es segura 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 los PDF de varias páginas, result.Pages le ofrece acceso por página al texto, la puntuación de confianza y los cuadros delimitadores. Consulte la guía de OCR de PDF de varias páginas para obtener más 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
$vbLabelText   $csharpLabel

Guía para la selección de filtros:

  • DeNoise() -- usar para escaneos con mucho moteado o artefactos de compresión
  • Deskew() -- usar cuando los documentos se fotografían en ángulo; Véase la detección de rotación de página para la detección automática
  • Scale() -- usar para letra pequeña o entrada por debajo de 150 DPI; Los valores de 150-200 suelen dar los mejores resultados
  • Binarize() -- usar para fondos de color o degradados; convierte la imagen a blanco y negro estricto
  • EnhanceResolution() -- usar para texto borroso o con poco 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.

Filtros de preprocesamiento de IronOCR y sus principales casos de uso
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
AumentarResolución() 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
$vbLabelText   $csharpLabel

La tapa MaxDegreeOfParallelism evita el agotamiento de la 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, establezca la concurrencia en 1 por instancia de función y escale horizontalmente en su lugar.

CreateSearchablePdf genera un PDF en el que la imagen original se conserva como una capa visible y el texto reconocido se incrusta de forma 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 el grado de certeza del motor sobre el 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 registro de Microsoft .NET cubre los patrones ILogger utilizados en el servicio por lotes anterior para equipos que se integran con el contenedor 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 pase 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
$vbLabelText   $csharpLabel

Este enfoque combina bien con el OCR por zonas cuando se 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
$vbLabelText   $csharpLabel

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 utiliza.

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:

Empiece con la licencia de prueba gratuita para evaluar todas las funciones en sus propios documentos antes de comprometerse con un plan.

NuGet Instalar con NuGet

PM >  Install-Package IronOcr

Echa un vistazo a IronOCR en NuGet para una instalación rápida. Con más de 10 millones de descargas, está transformando el desarrollo de PDF con C#. También puede descargar el DLL o el instalador de Windows.

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.

Kannaopat Udonpant
Ingeniero de Software
Antes de convertirse en Ingeniero de Software, Kannapat completó un doctorado en Recursos Ambientales de la Universidad de Hokkaido en Japón. Mientras perseguía su grado, Kannapat también se convirtió en miembro del Laboratorio de Robótica de Vehículos, que es parte del Departamento de Ingeniería ...
Leer más

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame