IRONSOFTWAREHOME
VÍDEOS

Migrando do XImage.OCR para o IronOCR

Kannaopat Udonpant
Kannapat Udonpant
Updated: 1 de agosto de 2026

Este guia destina-se a desenvolvedores .NET que estão migrando uma integração existente do XImage.OCR para o IronOCR . Este documento aborda o processo de consolidação de pacotes, alterações de namespace e API, além de exemplos concretos de migração de código para os cenários em que a arquitetura fragmentada do XImage.OCR gera mais atrito. Não é necessário ler o artigo comparativo previamente.

Por que migrar do XImage.OCR?

XImage.OCR é um wrapper comercial do Tesseract, da RasterEdge, que distribui sua funcionalidade por meio de uma cadeia de pacotes NuGet coordenados. A arquitetura funciona em pequena escala, mas gera custos de manutenção crescentes à medida que as aplicações aumentam.

O número de pacotes aumenta a cada novo idioma. Adicionar um novo idioma significa adicionar um pacote NuGet . Um aplicativo de cinco idiomas carrega seis pacotes em seu .csproj. Um aplicativo com dez idiomas contém onze. Cada pacote deve ser fixado na mesma versão que o núcleo — uma restrição que produz falhas silenciosas em tempo de execução quando um desenvolvedor atualiza apenas parte da cadeia. O IronOCR oferece um pacote único para mais de 125 idiomas.

Sincronização de Versões É um Risco Constante. dotnet outdated atualiza pacotes avidamente. Quando RasterEdge.XImage.OCR avança para 12.5.0 mas XImage.OCR.Language.French permanece em 12.4.0, o erro aparece em tempo de execução, não em tempo de compilação, e a mensagem raramente aponta para sincronização de versão como a causa. As equipes que executam pipelines de CI/CD aprendem a adicionar o controle de versão explícito para cada pacote XImage.OCR — uma sobrecarga que não serve para nada além de compensar o modelo fragmentado.

Sem pré-processamento integrado, a precisão em documentos reais é garantida. O XImage.OCR envia as imagens diretamente para o mecanismo Tesseract subjacente. Uma digitalização a 150 DPI com dois graus de inclinação entra no Tesseract sem alterações. O limite de precisão para essa entrada é de 60 a 75%, independentemente do wrapper do Tesseract que estiver sendo usado.IronOCR fornece um pipeline de pré-processamento — Deskew(), DeNoise(), Contrast(), Binarize(), Sharpen() — que corrige esses problemas antes que o reconhecimento seja executado.

A saída estruturada requer análise manual. XImage.OCR retorna uma string simples. Extrair a posição das palavras, os limites das linhas ou a confiança por palavra exige que você analise a sequência de caracteres manualmente.IronOCR retorna um objeto OcrResult com Pages, Paragraphs, Lines, Words, e dados por caractere com coordenadas de pixel e pontuações de confiança embutidas.

Os formatos de saída se limitam a texto simples. Para gerar um PDF pesquisável a partir de um resultado do XImage.OCR, é necessário adquirir o SDK PDF da RasterEdge — um segundo produto comercial.IronOCR produz PDFs pesquisáveis através de result.SaveAsSearchablePdf() sem dependências adicionais.

A implantação multiplataforma não é suportada. O XImage.OCR é direcionado ao Windows. Contêineres Linux, ambientes de desenvolvimento macOS e implantações nativas da nuvem no Azure ou AWS exigem uma biblioteca diferente. O IronOCR funciona no Windows, Linux, macOS, Docker, Azure App Service e AWS Lambda a partir do mesmo pacote.

O problema fundamental

O XImage.OCR requer um pacote NuGet por idioma. Dez idiomas significam onze pacotes, todos bloqueados em versão entre si:

<!-- XImage.OCR: 11 packages to support 10 languages — every version must match -->
<PackageReference Include="RasterEdge.XImage.OCR" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.English" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.German" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.French" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Spanish" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Italian" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Portuguese" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.ChineseSimplified" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Japanese" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Korean" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Arabic" Version="12.4.0" />
XML

O IronOCR substitui o bloco inteiro por uma única linha:

<!-- IronOCR: One package. 125+ languages. Não version coordination. -->
<PackageReference Include="IronOcr" Version="2024.x.x" />
XML

##IronOCR vs XImage.OCR: Comparação de Recursos

A tabela abaixo abrange as funcionalidades mais relevantes para a decisão de migração.

RecursoXImage.OCRIronOCR
Pacotes NuGet apenas em inglês2 (núcleo + pacote de idiomas)1
Pacotes NuGet para 10 idiomas111
Sincronização de versões necessáriaSim — todos os pacotes devem ser iguais.Não
Idiomas disponíveis~15 como pacotes separadosMais de 125 itens incluídos
Pré-processamento integradoNoneCorrigir distorção, reduzir ruído, aumentar contraste, binarizar, aumentar nitidez, redimensionar, dilatar, erodir, inverter
Remoção profunda de ruídoNoneSim (DeepCleanBackgroundNoise())
Entrada nativa de PDFRequer o SDK de PDF da RasterEdgeSim (input.LoadPdf())
Saída em PDF pesquisávelRequer o SDK de PDF da RasterEdgeSim (result.SaveAsSearchablePdf())
Entrada TIFF de várias páginasLimitadoSim (input.LoadImageFrames())
Entrada de matriz de bytesManual via MemoryStreamSim (input.LoadImage(bytes))
Entrada de fluxoManualSim (input.LoadImage(stream))
Saída estruturadacorda simplesPáginas, parágrafos, linhas, palavras, caracteres com coordenadas
Pontuações de confiança por palavraNão disponívelSim
Leitura de código de barrasNão disponívelSim (ocr.Configuration.ReadBarCodes = true)
Exportação hOCRNão disponívelSim
Segurança da roscaNão é seguro para threadsSegurança total da rosca
Modelo de memória (paralelo)Uma instância de manipulador por thread.Instância compartilhada única
Multiplataformaprincipalmente WindowsWindows, Linux, macOS, Docker, Azure, AWS
Compatibilidade com .NET.NET Standard 2.0, .NET Framework 4.5+.NET Framework 4.6.2+, .NET Core, .NET 5/6/7/8/9
Tipo de licençaComercial (RasterEdge)Perpetual (Lite $999, Pro $1,499, Enterprise $2,999)
Apoio comercialSuporte RasterEdgeSim, com níveis definidos por licença.

Guia rápido: Migração do XImage.OCR para o IronOCR

Passo 1: Substituir pacotes NuGet

Remova todos os pacotes XImage.OCR. O número de comandos corresponde ao número de pacotes de idiomas que você instalou:

dotnet remove package RasterEdge.XImage.OCR
dotnet remove package XImage.OCR.Language.English
dotnet remove package XImage.OCR.Language.German
dotnet remove package XImage.OCR.Language.French
# Repeat for every language pack in your project
SHELL

Instale o IronOCR a partir do NuGet :

dotnet add package IronOcr

Etapa 2: Atualizar Namespaces

Substitua as importações do namespace RasterEdge pelo namespace único IronOCR:

// Before (XImage.OCR)
using RasterEdge.XImage.OCR;
using RasterEdge.Imaging.Basic;

// After (IronOCR)
using IronOcr;
C#

Etapa 3: Inicializar a licença

Adicione a inicialização da licença uma única vez, na inicialização do aplicativo, antes de qualquer chamada de OCR:

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

Armazene a chave em uma variável de ambiente ou gerenciador de segredos em vez de codificá-la diretamente no código:

IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY");

Exemplos de migração de código

Consolidação de inicialização de múltiplos pacotes

A primeira tarefa de migração é consolidar o bloco de inicialização do XImage.OCR — ativação da licença, criação do manipulador e atribuição de idioma baseada em string — no equivalente do IronOCR.

Abordagem XImage.OCR:

// Requires: RasterEdge.XImage.OCR + one XImage.OCR.Language.* package per language
// Language strings must exactly match installed package names or OCR fails at runtime

RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("your-ximage-license-key");

var ocrHandler = new OCRHandler();

// String codes — typo "enh" instead of "eng" silently fails or throws at runtime
ocrHandler.Languages = new[] { "eng", "deu", "fra", "spa", "ita" };

// Process returns a plain string — no structure, no confidence
string extractedText = ocrHandler.Process("document.png");
Console.WriteLine(extractedText);
C#

Abordagem IronOCR:

// Requires: IronOcr (single package — all languages included)
IronOcr.License.LicenseKey = "YOUR-IRONOCR-LICENSE-KEY";

var ocr = new IronTesseract();

// Type-safe enum — compiler catches typos, no runtime surprises
ocr.Language = OcrLanguage.English + OcrLanguage.German +
               OcrLanguage.French + OcrLanguage.Spanish + OcrLanguage.Italian;

using var input = new OcrInput();
input.LoadImage("document.png");

var result = ocr.Read(input);
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
C#

Os códigos de idioma baseados em string no XImage.OCR ("eng", "deu") falham em tempo de execução quando o pacote NuGet correspondente está ausente ou na versão errada. O enum OcrLanguage no IronOCR torna impossível compilar combinações de idioma inválidas. O guia de configuração do IronTesseract abrange completamente as opções de configuração do mecanismo, e o tutorial para múltiplos idiomas documenta como funcionam as combinações de idiomas primários e secundários para documentos em idiomas mistos.

Unificação do tratamento de formatos de imagem

O XImage.OCR processa cada fonte de imagem de forma diferente, dependendo do formato. Matrizes de bytes, fluxos e caminhos de arquivos exigem caminhos de código ligeiramente diferentes.IronOCR aceita todos eles através dos mesmos métodos OcrInput.

Abordagem XImage.OCR:

// XImage.OCR: different handling per image source type
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";

// File path — works directly
string resultFromFile = ocrHandler.Process("invoice.jpg");

// Byte array — must write to temp file first, then process
byte[] imageBytes = File.ReadAllBytes("invoice.jpg");
string tempPath = Path.GetTempFileName() + ".jpg";
File.WriteAllBytes(tempPath, imageBytes);
try
{
    string resultFromBytes = ocrHandler.Process(tempPath);
    Console.WriteLine(resultFromBytes);
}
finally
{
    File.Delete(tempPath);    //Manualcleanup — easy to forget
}

// Multi-page TIFF — must split frames manually
// Não built-in TIFF frame iteration in base XImage.OCR
C#

Abordagem IronOCR:

// IronOCR: unified OcrInput accepts all source types identically
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var ocr = new IronTesseract();

// File path
using (var input = new OcrInput())
{
    input.LoadImage("invoice.jpg");
    var result = ocr.Read(input);
    Console.WriteLine($"From file: {result.Text}");
}

// Byte array — no temp file needed
byte[] imageBytes = File.ReadAllBytes("invoice.jpg");
using (var input = new OcrInput())
{
    input.LoadImage(imageBytes);
    var result = ocr.Read(input);
    Console.WriteLine($"From bytes: {result.Text}");
}

// Multi-page TIFF — all frames processed in one call
using (var input = new OcrInput())
{
    input.LoadImageFrames("scanned-archive.tiff");
    var result = ocr.Read(input);
    Console.WriteLine($"TIFF pages: {result.Pages.Count}");
    foreach (var page in result.Pages)
        Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
}
C#

O padrão de arquivo temporário para matrizes de bytes em XImage.OCR é uma fonte comum de inchaço do disco e vazamento de arquivos em caminhos de erro. O LoadImage(byte[]) do IronOCR elimina completamente o arquivo intermediário. O guia de entrada de imagens e o guia de entrada TIFF/GIF abrangem todos os tipos de fontes suportadas, incluindo fluxos e processamento de múltiplos quadros.

Otimização do formato de saída

XImage.OCR retorna uma string simples. A geração de um PDF pesquisável requer um segundo produto RasterEdge. O IronOCR gera texto simples, PDFs pesquisáveis ​​e dados estruturados a partir do mesmo objeto de resultado, sem a necessidade de pacotes adicionais.

Abordagem XImage.OCR:

// XImage.OCR: plain text output only
// Searchable PDF requires purchasing the RasterEdge PDF SDK separately

var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";

string plainText = ocrHandler.Process("scanned-contract.jpg");

// To produce a searchable PDF from this text, you would need:
// 1. Purchase RasterEdge PDF SDK (separate commercial license)
// 2. Create a PDF document programmatically
// 3. Embed the extracted text as invisible text layer over the image
// 4. Manage the PDF document lifecycle manually
// Não built-in path from OCR result to searchable PDF in XImage.OCR alone
Console.WriteLine(plainText);
C#

Abordagem IronOCR:

// IronOCR: plain text, searchable PDF, and structured data from one result
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadImage("scanned-contract.jpg");

var result = ocr.Read(input);

// Plain text
Console.WriteLine(result.Text);

// Searchable PDF — no extra package required
result.SaveAsSearchablePdf("searchable-contract.pdf");

// Structured data: paragraphs with bounding box coordinates
foreach (var page in result.Pages)
{
    foreach (var paragraph in page.Paragraphs)
    {
        Console.WriteLine($"Paragraph at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");
    }
}

// Per-word confidence for quality gating
var lowConfidenceWords = result.Pages
    .SelectMany(p => p.Words)
    .Where(w => w.Confidence < 70)
    .ToList();

Console.WriteLine($"Words below 70% confidence: {lowConfidenceWords.Count}");
C#

A chamada SaveAsSearchablePdf() incorpora o texto reconhecido como uma camada oculta sob a imagem original, tornando o documento totalmente pesquisável por texto sem alterar sua aparência visual. O guia em PDF pesquisável aborda opções de intervalo de páginas e configurações de DPI. Para padrões de extração de dados estruturados, o guia de leitura de resultados documenta toda a hierarquia de OcrResult, incluindo coordenadas de palavras e acesso de confiança. O exemplo de PDF pesquisável fornece uma implementação completa e funcional.

Processamento de documentos em lote

XImage.OCR não é seguro para uso em múltiplas threads. Cada thread de trabalho concorrente deve criar sua própria instância OCRHandler, multiplicando o consumo de memória pela quantidade de threads. O IronOCR utiliza uma única instância compartilhada entre todas as threads.

Abordagem XImage.OCR:

// XImage.OCR: one handler per thread — memory multiplies with concurrency
// 4 threads processing English documents: 4 x ~100MB = ~400MB for OCR alone
// 4 threads processing 5 languages: 4 x ~250MB = ~1GB just for OCR handlers

var results = new ConcurrentDictionary<string, string>();
string[] documentPaths = Directory.GetFiles("./incoming", "*.png");

Parallel.ForEach(documentPaths,
    new ParallelOptions { MaxDegreeOfParallelism = 4 },
    documentPath =>
    {
        // Each thread must create and dispose its own handler
        var ocrHandler = new OCRHandler();
        ocrHandler.Language = "eng";

        try
        {
            string text = ocrHandler.Process(documentPath);
            results[documentPath] = text;
        }
        finally
        {
            //Manualdisposal required — no using statement support shown
            ocrHandler.Dispose();
        }
    });

foreach (var kvp in results)
    Console.WriteLine($"{Path.GetFileName(kvp.Key)}: {kvp.Value.Length} chars");
C#

Abordagem IronOCR:

// IronOCR: single IronTesseract instance shared across all threads
// Memory stays flat regardless of thread count
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var ocr = new IronTesseract();    // Create once outside the parallel loop
var results = new ConcurrentDictionary<string, string>();
string[] documentPaths = Directory.GetFiles("./incoming", "*.png");

Parallel.ForEach(documentPaths, documentPath =>
{
    // OcrInput is created per thread — IronTesseract instance is shared
    using var input = new OcrInput();
    input.LoadImage(documentPath);
    input.Deskew();     // Preprocessing runs per-document, not per-thread engine
    input.DeNoise();

    var result = ocr.Read(input);
    results[documentPath] = result.Text;
});

foreach (var kvp in results)
    Console.WriteLine($"{Path.GetFileName(kvp.Key)}: {kvp.Value.Length} chars");
C#

O padrão de manipulador por thread do XImage.OCR significa que um trabalho em lote de quatro threads carregando cinco idiomas utiliza aproximadamente 1 GB de memória do manipulador OCR antes de processar um único documento. A instância compartilhada do IronOCR mantém o uso de memória limitado à pegada de uma única instância, independentemente do paralelismo. O exemplo de multithreading demonstra o padrão por completo, e o guia de otimização de velocidade aborda o ajuste de configuração para cargas de trabalho em lote focadas em throughput.

Extração Combinada de Código de Barras e Texto

O XImage.OCR não possui capacidade de leitura de código de barras. Documentos que contêm texto e códigos de barras exigem duas bibliotecas separadas e duas passagens separadas. O IronOCR extrai ambos em uma única operação de leitura.

Abordagem XImage.OCR:

// XImage.OCR: text only — barcodes require a separate library and second pass

var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";

// Pass 1: text extraction with XImage.OCR
string documentText = ocrHandler.Process("warehouse-label.png");
Console.WriteLine($"Text: {documentText}");

// Pass 2: barcode reading requires a completely separate library
// e.g., ZXing.Net, Dynamsoft Barcode Reader, or another commercial SDK
// - Additional NuGet package required
// - Additional license required
// - Additional code for result merging
// Não combined text + barcode result object exists in XImage.OCR
C#

Abordagem IronOCR:

// IronOCR: text and barcodes from a single Read() call
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;    // Enable barcode extraction

using var input = new OcrInput();
input.LoadImage("warehouse-label.png");

var result = ocr.Read(input);

// Text and barcodes in one result object
Console.WriteLine($"Document text:\n{result.Text}");

if (result.Barcodes.Any())
{
    Console.WriteLine($"\nBarcodes found: {result.Barcodes.Count}");
    foreach (var barcode in result.Barcodes)
        Console.WriteLine($"  [{barcode.BarcodeType}] {barcode.Value}");
}
C#

Configurar ReadBarCodes = true adiciona detecção de código de barras à passagem de reconhecimento sem exigir uma segunda biblioteca ou uma segunda leitura. O guia de leitura de código de barras e o exemplo de OCR de código de barras abordam os formatos de código de barras suportados e as opções de configuração para documentos com conteúdo misto.

Referência de mapeamento da API XImage.OCR para o IronOCR

XImage.OCREquivalente de IronOCR
new OCRHandler()new IronTesseract()
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("key")IronOcr.License.LicenseKey = "key"
ocrHandler.Language = "eng"ocr.Language = OcrLanguage.English
ocrHandler.Languages = new[] { "eng", "deu" }ocr.Language = OcrLanguage.English + OcrLanguage.German
ocrHandler.Process(imagePath)ocr.Read(input).Text (após input.LoadImage(path))
ocrHandler.Process(image) (de objeto)input.LoadImage(bytes) ou input.LoadImage(stream)
ocrHandler.ProcessRegion(path, rect)input.LoadImage(path, new CropRectangle(x, y, w, h))
ocrHandler.SetVariable("tessedit_char_whitelist", "0-9")ocr.Configuration.WhiteListCharacters = "0123456789"
result (string simples)result.Text
result.MeanConfidenceresult.Confidence
Não existe equivalenteresult.Pages / result.Paragraphs / result.Lines
Não existe equivalenteresult.Words (com .X, .Y, .Confidence)
Não existe equivalenteresult.SaveAsSearchablePdf("output.pdf")
Não existe equivalenteinput.Deskew()
Não existe equivalenteinput.DeNoise()
Não existe equivalenteinput.Contrast()
Não existe equivalenteinput.Binarize()
Não existe equivalenteinput.Sharpen()
Não existe equivalenteinput.LoadImageFrames("file.tiff") (multi-frame)
Requer o SDK de PDF da RasterEdgeinput.LoadPdf(pdfPath)
Requer o SDK de PDF da RasterEdgeresult.SaveAsSearchablePdf("output.pdf")
Não disponívelocr.Configuration.ReadBarCodes = true
Instâncias OCRHandler por threadInstância IronTesseract compartilhada única

Problemas e soluções comuns em migrações

Problema 1: Falhas em tempo de execução após atualização parcial do pacote

XImage.OCR: Executar dotnet outdated ou dotnet restore com um cache de pacotes desatualizado pode avançar RasterEdge.XImage.OCR para uma nova versão enquanto mantém os pacotes de idioma na versão anterior. A falha ocorre em tempo de execução durante a primeira chamada de OCR, com uma mensagem de erro que não identifica claramente a incompatibilidade de versão como a causa principal. Encontrar a discrepância requer verificar manualmente todas as entradas PackageReference.

Solução: Após remover os pacotes XImage.OCR e instalar o IronOCR, não há mais sincronização de versões a ser mantida. O pacote único IronOcr carrega tudo. Se precisar de pacotes de idioma além dos padrões incluídos, instale pacotes IronOcr.Languages.* de forma independente – eles não precisam estar na mesma versão que o núcleo:

dotnet add package IronOcr, IronOcr.Languages.Arabic, IronOcr.Languages.Japanese, ...

Problema 2: Códigos de idioma de string causam falhas silenciosas de OCR

XImage.OCR: Códigos de idioma são strings ("eng", "deu", "fra"). Um erro de digitação em um código de idioma — "engg", "ger" em vez de "deu" — ou cai silenciosamente para um idioma padrão ou lança uma exceção em tempo de execução, dependendo da versão do XImage.OCR. Nenhum dos resultados é capturado em tempo de compilação.

**Solução:**IronOCR usa o enum OcrLanguage. Valores inválidos são erros de compilação, não surpresas em tempo de execução. Migrar arrays de strings para expressões enum:

// Before (XImage.OCR) — typos compile fine, fail at runtime
ocrHandler.Languages = new[] { "eng", "deu", "fra" };

// After (IronOCR) — typos are compile errors
ocr.Language = OcrLanguage.English + OcrLanguage.German + OcrLanguage.French;
C#

Consulte o guia de vários idiomas para saber como combinar idiomas primários e secundários em documentos com conteúdo em idiomas mistos.

Problema 3: Arquivos temporários deixados no disco devido ao processamento de matrizes de bytes

XImage.OCR: Processar imagens de matrizes de bytes exige a gravação de um arquivo temporário porque OCRHandler.Process() aceita um caminho de arquivo, não um buffer. Caminhos de exceção que pulam o bloco finally deixam esses arquivos temporários no disco. Em aplicações de alto rendimento, isso se acumula rapidamente.

Solução: OcrInput.LoadImage() aceita byte[] diretamente. Nenhum arquivo temporário foi criado:

// Before (XImage.OCR) — temp file required
string tempPath = Path.GetTempFileName() + ".png";
File.WriteAllBytes(tempPath, imageBytes);
try { text = ocrHandler.Process(tempPath); }
finally { File.Delete(tempPath); }

// After (IronOCR) — direct byte array loading, no disk I/O
using var input = new OcrInput();
input.LoadImage(imageBytes);
var result = ocr.Read(input);
string text = result.Text;
C#

Problema 4: Esgotamento de memória sob carga paralela

XImage.OCR: O processamento paralelo exige um OCRHandler por thread. Oito threads processando documentos em cinco idiomas carregam oito instâncias de mecanismo separadas, cada uma contendo todos os cinco pacotes de idiomas. Com aproximadamente 50 MB por idioma por instância, oito threads consomem cerca de 2 GB de memória do mecanismo de OCR antes mesmo de qualquer dado do documento entrar em cena.

Solução: Uma única instância IronTesseract lida com todos os threads. Crie OcrInput por documento (é descartável e leve), reutilize IronTesseract durante toda a aplicação:

// Single instance — shared safely across all threads
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English + OcrLanguage.German +
               OcrLanguage.French + OcrLanguage.Spanish + OcrLanguage.Italian;

Parallel.ForEach(documentPaths, path =>
{
    using var input = new OcrInput();    // Per-document, lightweight
    input.LoadImage(path);
    var result = ocr.Read(input);        // Thread-safe call on shared instance
    ProcessResult(result.Text);
});
C#

Problema 5: O pipeline de CI/CD para de funcionar após uma restauração parcial.

XImage.OCR: Um agente CI/CD com um cache de pacotes aquecido geralmente tem alguns pacotes de idiomas XImage.OCR em cache em uma versão antiga. Quando apenas o pacote principal foi atualizado no arquivo de projeto, a restauração foi bem-sucedida, mas o ambiente de execução carregou assemblies incompatíveis. A compilação foi aprovada; A implantação falha.

Solução: Após a migração para o IronOCR, o pipeline de CI/CD restaura um pacote. Adicione uma etapa de validação para confirmar se a versão esperada está presente:

# In your CI pipeline — verify single package restore
dotnet restore
dotnet list package | grep IronOcr

# Não version coordination logic needed — only one package to check
SHELL

Problema 6: Falta de dados estruturados para análise sintática subsequente

XImage.OCR: Retorna uma string simples. Aplicações que necessitam de posições de palavras, agrupamentos de linhas ou confiança por palavra devem analisar a string usando heurísticas de espaço em branco ou lógica personalizada. A precisão dessa análise sintática diminui em documentos com layouts de várias colunas, tabelas ou texto rotacionado.

Solução: O OcrResult do IronOCR expõe diretamente toda a hierarquia de documentos. Não é necessário analisar a string:

var result = ocr.Read(input);

// Direct access to structured data — no string manipulation
foreach (var page in result.Pages)
{
    foreach (var line in page.Lines)
    {
        // Line text, bounding box, and per-word data all available
        Console.WriteLine($"Line [{line.X},{line.Y}]: {line.Text}");

        foreach (var word in line.Words)
            Console.WriteLine($"  Word '{word.Text}' confidence: {word.Confidence}%");
    }
}
C#

Para obter informações completas sobre a API de dados estruturados, consulte o guia de instruções de leitura de resultados e a página de recursos de resultados de OCR .

Lista de verificação para migração do XImage.OCR

Pré-migração

Antes de fazer alterações, faça uma auditoria no código-fonte para encontrar todos os pontos de contato com XImage.OCR:

# Find all XImage.OCR namespace imports
grep -r "RasterEdge.XImage.OCR\|Yiigo.Image.Ocr\|XImage.OCR" --include="*.cs" .

# Find all OCRHandler usages
grep -r "OCRHandler\|ocrHandler" --include="*.cs" .

# Find all string-based language assignments
grep -r "\.Language\s*=\s*\"" --include="*.cs" .
grep -r "\.Languages\s*=\s*new\[\]" --include="*.cs" .

# Find all XImage.OCR package references in project files
grep -r "RasterEdge.XImage.OCR\|XImage.OCR.Language" --include="*.csproj" .

# Count distinct language packs installed
grep "XImage.OCR.Language" --include="*.csproj" -r . | wc -l
SHELL

Observe quais tipos de origem de imagem estão em uso (caminhos de arquivo, matrizes de bytes, fluxos, TIFF) e identifique quaisquer locais que usem arquivos temporários para processamento de matrizes de bytes. Esses são alvos de limpeza de alta prioridade.

Migração de código

  1. Remova todas as referências de pacote RasterEdge.XImage.OCR e XImage.OCR.Language.* de cada arquivo .csproj
  2. Adicione referência de pacote IronOcr (dotnet add package IronOcr)
  3. Substitua using RasterEdge.XImage.OCR por using IronOcr em todos os arquivos
  4. Adicione IronOcr.License.LicenseKey = ... no início da aplicação (uma vez por processo)
  5. Substitua new OCRHandler() por new IronTesseract()
  6. Substitua atribuições de idioma por string ("eng", "deu") por valores de enum OcrLanguage
  7. Substitua ocrHandler.Process(path) por input.LoadImage(path) + ocr.Read(input).Text
  8. Substitua padrões de byte-array-para-arquivo-temporário por input.LoadImage(byte[])
  9. Substitua a divisão manual de quadros de TIFF multipágina por input.LoadImageFrames("file.tiff")
  10. Remova a instanciação OCRHandler por thread dos loops Parallel.ForEach — use uma instância IronTesseract compartilhada única
  11. Adicione chamadas de pré-processamento (input.Deskew(), input.DeNoise()) após cada LoadImage() para documentos de fontes de qualidade variável
  12. Substitua o manuseio de resultados de string simples por result.Text para texto ou result.SaveAsSearchablePdf() para saída PDF
  13. Substitua ocrHandler.SetVariable("tessedit_char_whitelist", ...) por ocr.Configuration.WhiteListCharacters = ...
  14. Atualize o pipeline CI/CD: remova etapas de restauração de múltiplos pacotes, remova a lógica de sincronização de versão, verifique a restauração de pacote único IronOcr

Pós-migração

  • Confirmar se a extração básica de texto produz resultados corretos a partir de uma imagem de teste reconhecidamente boa.
  • Verificar se os documentos multilíngues retornam texto para todos os idiomas configurados.
  • Os caminhos de entrada do array de bytes testados produzem a saída correta sem a criação de arquivos temporários no disco.
  • Confirme que documentos TIFF multipágina retornam a contagem de páginas correta em result.Pages
  • Execute o processamento em lote paralelo sob carga e meça o pico de memória — deve ser substancialmente menor que a linha de base do XImage.OCR.
  • Verifique se o PDF pesquisável abre corretamente no Adobe Acrobat ou em um visualizador de PDF e se o texto é selecionável.
  • Testar o pré-processamento em uma digitalização de baixa qualidade ou distorcida e comparar a precisão do texto extraído com a linha de base do XImage.OCR
  • Confirme se a inicialização da chave de licença é executada antes da primeira chamada de OCR e se não gera uma exceção.
  • Validar se a restauração de CI/CD é bem-sucedida em um ambiente limpo, sem pacotes em cache.
  • Verifique se a saída de dados estruturados (result.Words, result.Paragraphs) corresponde ao layout esperado do documento

Principais benefícios da migração para o IronOCR

Um Único Pacote Substitui Todo um Gráfico de Dependência. Todo pacote XImage.OCR.Language.*, o pacote central RasterEdge.XImage.OCR, e o overhead de sincronização de versão entre eles colapsam em um único comando dotnet add package IronOcr. O contador de entradas .csproj cai de onze para um. A etapa de restauração de CI/CD passa de uma operação com vários pacotes e onze pontos de falha independentes para uma restauração de pacote único. Essa simplificação resulta em: menos pacotes para auditar em busca de vulnerabilidades de segurança, menos entradas para atualizar quando a compatibilidade com o .NET muda e nenhuma lógica de coordenação de versões para manter em pipelines de atualização automatizados. A página do produto IronOCR e a central de documentação fornecem informações completas sobre os recursos e a implementação.

As melhorias na precisão do pré-processamento são imediatas. A migração não é uma substituição direta, mas sim uma atualização em termos de precisão. Qualquer documento que XImage.OCR processou com precisão degradada devido a distorção, ruído ou baixa resolução agora tem um caminho direto para melhoria via input.Deskew(), input.DeNoise(), e input.Contrast(). Sem biblioteca externa de processamento de imagens, sem conhecimento especializado em processamento de imagens na equipe de desenvolvimento, sem dependências separadas para licenciar e manter. Adicionar três linhas após LoadImage() recupera de 20 a 35 pontos percentuais de precisão em documentos digitalizados previamente aceitos como "bons o suficiente". O guia de correção de qualidade de imagem e a página de recursos de pré-processamento cobrem o efeito de cada filtro em diferentes cenários de qualidade de documento.

PDFs pesquisáveis ​​e dados estruturados eliminam custos adicionais com SDKs. As duas solicitações mais comuns dos usuários do XImage.OCR — saída em PDF pesquisável e dados em nível de palavra com coordenadas — exigem produtos RasterEdge adicionais que implicam em licenças comerciais separadas. Após a migração, result.SaveAsSearchablePdf() produz documentos pesquisáveis de qualidade arquivística sem pacotes extras, e result.Words fornecem dados estruturados com caixas delimitadoras e pontuações de confiança. A funcionalidade que antes exigia duas licenças agora está disponível em apenas uma. A documentação completa sobre o formato de saída está disponível na página de recursos de resultados de OCR .

O processamento paralelo é escalável sem penalidades de memória. O modelo de manipulador por thread do XImage.OCR torna a escalabilidade dispendiosa. Dobrar o número de threads dobra a memória consumida pelas instâncias do mecanismo de OCR. O modelo de instância compartilhada do IronOCR significa que a memória permanece limitada à pegada de uma única instância, independentemente do paralelismo. Um servidor que processa lotes de documentos em oito threads simultâneas consome a mesma memória do mecanismo de OCR que um servidor que processa um documento por vez. Isso se traduz diretamente em custos de hospedagem mais baixos e maior capacidade de processamento em infraestrutura fixa.

Implantação Cross-Platform Abre Sem Mudanças de Código. O mesmo pacote IronOcr e o mesmo código de aplicação rodam no Windows, Linux, macOS, Docker, Azure App Service, e AWS Lambda. Sem código condicional à plataforma, sem variantes de pacote específicas da plataforma, sem testes de implantação da camada OCR por ambiente. Equipes que conteinerizam cargas de trabalho, executam ambientes de desenvolvimento macOS ou implantam em infraestrutura de nuvem baseada em Linux obtêm compatibilidade imediata. O guia de implantação do Docker , o guia de implantação do Azure e o guia de implantação do Linux documentam a configuração para cada ambiente de destino.

Mais de 125 idiomas eliminam a limitação de cobertura linguística. O XImage.OCR oferece suporte a aproximadamente quinze idiomas em seus pacotes comerciais. Distribuições padrão tessdata incluem mais de 100 idiomas sem custo.IronOCR agrupa 125+ idiomas e os expõe através de pacotes IronOcr.Languages.* opcionais que seguem um padrão de instalação limpa sem a restrição de bloqueio de versão. Estão disponíveis os 24 idiomas oficiais da UE, todos os principais idiomas CJK, árabe, hebraico e escritas especializadas. O índice de idiomas lista todos os idiomas suportados com o nome do pacote correspondente.

Observe: Adobe Acrobat, Dynamsoft, Tesseract, ZXing.NET, e xImage.OCR são marcas registradas de seus respectivos proprietários. Este site não é afiliado, endossado ou patrocinado pela Adobe Inc., Dynamsoft, Google, RasterEdge, ou ZXing.NET. Todos os nomes de produtos, logotipos e marcas são propriedade de seus respectivos proprietários. As comparações são apenas para fins informativos e refletem informações disponíveis publicamente no momento da redação.

Artigos relacionados

Key in blue circle

Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.

Your trial license will be sent to your email address

Sem limitações. 100% desbloqueado. Sem cartão de crédito.

bullet_checkedNão é necessário cartão de crédito nem criação de conta.Sem limitações. 100% desbloqueado. Sem cartão de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Agende sua consulta sem compromisso.
Preencha o formulário abaixo ou envie um e-mail para sales@ironsoftware.com
Os seus dados serão sempre mantidos em sigilo.
Aprovado por milhões de engenheiros em todo o mundo.
Logotipos dos clientes da Iron Software
Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.
Não é necessário cartão de crédito nem criação de conta.