Ir para o conteúdo do rodapé
UTILIZANDO O IRONOCR

SDK de OCR for .NET : Uma biblioteca de reconhecimento de texto para C#

Um SDK OCR for .NET é um kit de desenvolvimento de software que permite que aplicativos C# e .NET extraiam texto de imagens, PDFs digitalizados e outros formatos de documento programaticamente. O IronOCR é um SDK OCR for .NET pronto para produção que envolve um motor Tesseract 5 ajustado com filtros de pré-processamento, leitura de códigos de barras, saída de PDF pesquisável e suporte para mais de 125 idiomas -- tudo acessível através de uma API C# limpa que funciona em Windows, Linux, macOS e plataformas de nuvem.

O que faz do IronOCR o SDK OCR for .NET certo para seu projeto?

Construir reconhecimento de texto do zero significa gerenciar pipelines de pré-processamento de imagem, arquivos de dados de idioma, modelos de thread e análise de saída -- meses de trabalho antes de extrair sua primeira palavra. O IronOCR elimina essa sobrecarga ao entregar um motor testado em batalha que sua equipe pode adicionar a um projeto em minutos.

Capacidades principais que o diferenciam das vinculações brutas do Tesseract:

  • Reconhecimento de 125+ idiomas e scripts incluindo texto manuscrito
  • Filtros embutidos: remoção de ruído, deskewing, binarização, aumento de resolução e correção de contraste
  • Detecção de códigos de barras e códigos QR na mesma passada de leitura
  • Geração de PDF pesquisável com camadas de texto invisíveis para fluxos de arquivamento
  • Processamento assíncrono e em lote paralelo para pipelines de alta capacidade
  • OCR zonal para direcionar regiões de página específicas para reduzir o tempo de processamento
  • Suporte multiplataforma para Windows, Linux, macOS, Docker e Azure

De acordo com a documentação do projeto Tesseract OCR, o Tesseract bruto requer configuração manual para pacotes de idioma, configurações de DPI e modos de saída. O IronOCR lida com tudo isso automaticamente, permitindo que você se concentre no que o texto extraído significa, em vez de como extraí-lo.

Como o IronOCR se compara ao Tesseract bruto?

Tesseract bruto via um wrapper P/Invoke ou o pacote NuGet Tesseract deixa você responsável por: baixar e posicionar arquivos de idioma tessdata, selecionar o modo correto de segmentação de página, lidar com a divisão de TIFF e PDF de várias páginas você mesmo, e configurar a execução em paralelo se desejar processamento simultâneo. Nenhum desses detalhes é exclusivo do problema da sua empresa.

IronOCR envolve toda essa infraestrutura. Você obtém uma superfície de API tipada, gerenciamento automático de tessdata, divisão e recombinação de PDF embutida, e um mecanismo thread-safe que pode ser reutilizado em várias solicitações. O compromisso é uma licença paga para uso em produção -- a página de licenciamento mostra os níveis atuais de preços, incluindo uma licença de desenvolvimento gratuita.

Para equipes que precisam apenas de dependências de código aberto, Tesseract puro mais pré-processamento personalizado é um caminho viável. Para equipes que precisam implementar OCR confiável rapidamente, IronOCR reduz a superfície de integração a algumas linhas de C#.

Como você instala o SDK IronOCR .NET?

A instalação é feita através do NuGet, o gerenciador de pacotes padrão do .NET. Execute o seguinte comando no diretório do seu projeto:

Install-Package IronOcr

Para usuários do Visual Studio, procure por IronOcr na interface gráfica do Gerenciador de Pacotes NuGet e instale de lá. Para obter opções completas de instalação, incluindo referências manuais de DLL, consulte a documentação de instalação do IronOCR.

Após a instalação, adicione a chave de licença ao início do aplicativo ou appsettings.json. Você pode iniciar um teste gratuito para obter uma chave de teste que desbloqueia todos os recursos durante a avaliação.

Verificando a Instalação

Um teste rápido após a instalação confirma que tudo está configurado corretamente. Crie um aplicativo de console direcionado ao .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

Se aparecer texto no console, o SDK está instalado e a chave de licença é válida. Você está pronto para construir fluxos de trabalho de produção.

Como Extrair Texto de Imagens e PDFs em C#?

O padrão de extração central é consistente em todos os tipos de entrada. Você cria uma instância IronTesseract, carrega conteúdo em um objeto OcrInput, e chama Read(). IronOCR detecta automaticamente o formato do arquivo a partir da extensão, de modo que o mesmo caminho de código manipula JPEG, PNG, TIFF, BMP e PDFs multipágina.

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

Ponto de entrada de alto nível para exercitar o serviço:

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

A instância IronTesseract é segura para threads e projetada para reutilização. Crie uma vez no início da aplicação (via injeção de dependência no ASP.NET Core, por exemplo) em vez de instanciar por solicitação.

Para PDFs de várias páginas, result.Pages proporciona acesso por página ao texto, pontuação de confiança e caixas de delimitação. Veja o guia de OCR para PDF de várias páginas para detalhes sobre iteração por página.

Como melhorar a precisão do OCR com filtros de pré-processamento?

Escaneamentos brutos de scanners de mesa, câmeras de smartphones ou máquinas de fax frequentemente sofrem de ruído, rotação, baixo contraste e resolução insuficiente. O pipeline de correção de qualidade de imagem do IronOCR aborda cada questão com filtros direcionados que você encadeia antes da chamada de leitura.

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

Orientação para seleção de filtros:

  • DeNoise() -- use para digitalizações com pontilhamento pesado ou artefatos de compressão
  • Deskew() -- use quando documentos são fotografados em um ângulo; consulte detecção de rotação de página para detecção automática
  • Scale() -- use para impressão pequena ou entrada abaixo de 150 DPI; valores de 150-200 tipicamente produzem os melhores resultados
  • Binarize() -- use para fundos coloridos ou com gradiente; converte imagem para preto/branco estrito
  • EnhanceResolution() -- use para texto borrado ou de baixo contraste; almeja 300 DPI como o ponto ideal do Tesseract

Pesquisa publicada no International Journal on Document Analysis and Recognition consistentemente mostra que binarização e correção de inclinação são os dois passos de pré-processamento de maior impacto para melhorar taxas de reconhecimento de caracteres. Aplique ambos como base para qualquer linha de produção.

Filtros de pré-processamento do IronOCR e seus principais casos de uso
Filtro Problema Resolvido Quando Aplicar
DeNoise() Artefatos de scanner, ruído de pontilhado Qualquer escaneamento de mesa ou de fax
Deskew() Inclinação e rotação da página Documentos fotografados ou desalinhados
Scale() Texto pequeno ou baixa DPI Entrada abaixo de 150 DPI
Binarize() Fundos coloridos, gradientes Papel colorido ou formulários com marca d'água
EnhanceResolution() Desfoque e baixo contraste Capturas de câmera e JPEGs comprimidos

Como Construir um Pipeline de Processamento em Lote para Produção?

A extração de um único documento é direta, mas cenários de produção envolvem centenas ou milhares de arquivos chegando em filas, pastas compartilhadas ou armazenamento em nuvem. A API assíncrona e o mecanismo thread-safe do IronOCR o tornam adequado para cargas de trabalho paralelas.

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

O limite MaxDegreeOfParallelism impede a exaustão de memória quando os arquivos são grandes. Um valor de 4 funciona bem em um servidor de quatro núcleos; aumente-o apenas após perfilar o uso da memória. Para implantações de Azure Functions ou AWS Lambda, defina a concorrência para 1 por instância de função e escale horizontalmente.

CreateSearchablePdf gera um PDF onde a imagem original é preservada como uma camada visível e o texto reconhecido é embutido de forma invisível abaixo dela. Isso permite a busca de texto completo em visualizadores de PDF e a indexação por mecanismos de busca — um requisito comum em sistemas de gerenciamento de documentos .

Monitorando Pontuações de Confiança em Produção

Cada OcrResult expõe uma propriedade Confidence (0-100) que reflete quão certa a máquina está sobre o texto reconhecido. Acompanhar essa métrica na sua infraestrutura de log fornece um sinal de alerta precoce quando a qualidade do documento se degrada -- por exemplo, se a calibração de um scanner se desviar ou um novo fornecedor de documentos enviar digitalizações de DPI inferior ao esperado.

Uma estratégia prática de limite: registre um aviso para confiança abaixo de 80, acione uma tentativa de pré-processamento abaixo de 70, e marque documentos para revisão humana abaixo de 60. Esta abordagem escalonada captura problemas de qualidade antes que eles causem corrupções silenciosas de dados em sistemas descendentes.

A documentação de registros do Microsoft .NET cobre os padrões ILogger usados no serviço de lote acima para equipes que integram com o contêiner DI interno do ASP.NET Core.

Como Extrair Dados Estruturados de Documentos Digitalizados?

A extração de texto é o primeiro passo. O segundo passo é analisar esse texto em campos digitados que sua aplicação possa atuar. Esse padrão combina a passagem de leitura do IronOCR com o Regex do .NET para extrair dados estruturados de faturas, formulários e relatórios.

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

Esta abordagem combina bem com OCR zonal quando você sabe exatamente onde cada campo aparece em um formulário. Fornecendo um retângulo delimitador, você ignora o reconhecimento de página inteira e direciona apenas a região que contém o número da fatura ou total -- reduzindo drasticamente o tempo de processamento para documentos de layout fixo.

Para cenários de extração mais avançados, incluindo tabelas e formulários estruturados, revise os exemplos de extração de dados do IronOCR no site do produto.

Como Lidar com OCR Multilíngue no .NET?

Muitas organizações processam documentos em mais de um idioma -- formulários de importação/exportação, contratos internacionais ou submissões de clientes multilíngues. O IronOCR lida com isso permitindo que você configure o pacote de idiomas antes da chamada de leitura.

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

A página de suporte de idiomas do IronOCR lista mais de 125 pacotes de idiomas disponíveis com instruções de download. Os pacotes de idiomas são enviados como pacotes NuGet (por exemplo, IronOcr.Languages.German) para que integrem com o mesmo fluxo de gerenciamento de pacotes que você já usa.

Para conjuntos de caracteres fora do alfabeto latino -- Árabe, Chinês, Japonês, Coreano -- o IronOCR fornece modelos otimizados que lidam com direção de texto da direita para a esquerda e scripts ideográficos. Veja o guia de OCR CJK para especificações de configuração.

Quais são os seus próximos passos?

Agora você tem os padrões necessários para adicionar OCR em nível de produção para qualquer aplicação .NET 10: extração básica de texto, pré-processamento para digitalizações difíceis, processamento em lote assíncrono, análise de dados estruturados e suporte multilíngue.

A partir daqui, explore essas áreas com base nas necessidades do seu projeto:

Comece com a licença de teste gratuito para avaliar o conjunto completo de recursos em seus próprios documentos antes de se comprometer com um nível.

NuGet Instalar com NuGet

PM >  Install-Package IronOcr

Confira o IronOCR no NuGet para uma instalação rápida. Com mais de 10 milhões de downloads, ele está transformando o desenvolvimento de PDFs com C#. Você também pode baixar o arquivo DLL ou o instalador para Windows .

Perguntas frequentes

O que é o SDK de OCR for .NET?

O SDK de OCR for .NET da IronOCR é uma biblioteca projetada para integrar recursos de reconhecimento óptico de caracteres em aplicativos C#, permitindo que os desenvolvedores extraiam texto de imagens, PDFs e documentos digitalizados.

Quais são as principais funcionalidades do SDK .NET do IronOCR?

O SDK .NET do IronOCR oferece uma API simples, suporte para vários idiomas, compatibilidade entre plataformas e recursos avançados para lidar com diversos formatos de arquivo e digitalizações de baixa qualidade.

Como o IronOCR lida com diferentes idiomas?

O SDK .NET do IronOCR suporta vários idiomas, permitindo a extração e o reconhecimento de texto de documentos em diversos idiomas sem a necessidade de configurações adicionais.

O IronOCR consegue processar digitalizações de baixa qualidade?

Sim, o IronOCR foi projetado para lidar eficazmente com digitalizações de baixa qualidade, empregando algoritmos avançados para aprimorar a precisão do reconhecimento de texto mesmo em cenários desafiadores.

O SDK .NET do IronOCR é multiplataforma?

O SDK .NET do IronOCR é multiplataforma, o que significa que pode ser usado em diferentes sistemas operacionais, tornando-o versátil para diversos ambientes de desenvolvimento.

Quais formatos de arquivo o IronOCR suporta?

O IronOCR suporta uma ampla variedade de formatos de arquivo, incluindo imagens, PDFs e documentos digitalizados, proporcionando flexibilidade para tarefas de reconhecimento de texto em diferentes mídias.

Como os desenvolvedores podem integrar o IronOCR em seus projetos?

Os desenvolvedores podem integrar o IronOCR em seus projetos C# usando sua API tipada, o que simplifica o processo de adição de funcionalidade OCR aos aplicativos.

Quais são alguns casos de uso para o IronOCR?

O IronOCR pode ser usado em sistemas de gerenciamento de documentos, entrada automatizada de dados, digitalização de conteúdo e qualquer aplicação que exija extração de texto de imagens ou PDFs.

Kannaopat Udonpant
Engenheiro de Software
Antes de se tornar Engenheiro de Software, Kannapat concluiu um doutorado em Recursos Ambientais pela Universidade de Hokkaido, no Japão. Durante o doutorado, Kannapat também integrou o Laboratório de Robótica Veicular, que faz parte do Departamento de Engenharia de Bioprodução. Em 2022, ele utilizou suas habilidades ...
Leia mais

Equipe de Suporte Iron

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim