SDK de OCR para .NET : Uma biblioteca de reconhecimento de texto para C#
Um SDK OCR para .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 para .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 para .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?
O uso do Tesseract puro, seja por meio de um wrapper P/Invoke ou do pacote NuGet Tesseract, deixa a seu critério: baixar e colocar os arquivos de idioma tessdata, selecionar o modo de segmentação de página correto, lidar com a divisão de arquivos TIFF e PDF de várias páginas e configurar o processamento paralelo, caso deseje. 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 a partir daí. 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 à inicialização do seu 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
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 você extrai texto de imagens e PDFs em C#?
O padrão de extração principal é consistente em todos os tipos de entrada. Você cria uma instância de IronTesseract, carrega o 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
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)
A instância IronTesseract é thread-safe 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 com várias páginas, result.Pages fornece acesso, página por página, ao texto, à pontuação de confiança e às caixas delimitadoras. Consulte o guia de OCR para PDFs multipágina para obter detalhes sobre a iteração página 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
Orientação para seleção de filtros:
DeNoise()-- usar para digitalizações com ruído intenso ou artefatos de compressãoDeskew()-- usar quando os documentos são fotografados em ângulo; consulte detecção de rotação de página para detecção automáticaScale()-- usar para impressão pequena ou entrada com menos de 150 DPI; valores de 150-200 tipicamente produzem os melhores resultadosBinarize()-- usar para fundos coloridos ou com gradiente; converte imagem para preto/branco estritoEnhanceResolution()-- usar para texto desfocado ou com 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.
| 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
O recurso MaxDegreeOfParallelism impede o esgotamento da 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 implementações do Azure Functions ou AWS Lambda, defina a concorrência para 1 por instância de função e escale horizontalmente em vez disso.
CreateSearchablePdf gera um PDF onde a imagem original é preservada como uma camada visível e o texto reconhecido é incorporado invisivelmente 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 o grau de certeza do mecanismo 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 registro do Microsoft .NET aborda os padrões ILogger usados no serviço em lote acima para equipes que se integram ao contêiner de injeção de dependência integrado 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. Este 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
Essa 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
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 distribuídos como pacotes NuGet (por exemplo, IronOcr.Languages.German), portanto, integram-se ao mesmo fluxo de trabalho de gerenciamento de pacotes que você já utiliza.
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:
- Leitura de código de barras e QR -- extraia códigos legíveis por máquina na mesma passada da imagem
- Formato de saída HOCR -- obtenha caixas delimitadoras de palavras para processamento subsequente ciente do layout
- Opções de licenciamento do IronOCR -- modelo de distribuição isento de royalties com SaaS, OEM e camadas empresariais
- Biblioteca de exemplos de código do IronOCR -- mais de 30 exemplos funcionais cobrindo cenários comuns
- Guia de implementação do Azure Functions -- OCR sem servidor na infraestrutura de nuvem da Microsoft
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.
Perguntas frequentes
O que é o SDK de OCR para .NET?
O SDK de OCR para .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.




