IRONSOFTWAREHOME
VÍDEOS

Migrando do OCR da Syncfusion para o IronOCR

Kannaopat Udonpant
Kannapat Udonpant
Updated: 1 de agosto de 2026

Este guia descreve o processo completo de migração do processador OCR da Syncfusion para o IronOCR para desenvolvedores .NET que precisam extrair texto de documentos digitalizados e PDFs. Ele abrange as mudanças específicas de configuração, reescritas de código e limpeza de implantação necessárias para substituir Syncfusion.PDF.OCR.Net.Core pelo pacote NuGet IronOcr, com foco particular na eliminação do gerenciamento de arquivos tessdata e na configuração do caminho binário do Tesseract que toda implantação do OCR Syncfusion requer.

Por que migrar do OCR da Syncfusion ?

O OCR Syncfusion é um wrapper do Tesseract incorporado em um Suite de 1.600 componentes. Para equipes cuja única necessidade é a extração de texto, essa arquitetura cria atrito em todos os níveis: configuração, implantação, manutenção e licenciamento.

A pasta tessdata segue todos os ambientes. Cada estação de trabalho de desenvolvedor, runner de CI, servidor de staging e contêiner de produção precisa de um diretório tessdata contendo arquivos .traineddata para cada idioma que o aplicativo usa. Somente o texto em inglês ocupa 23 MB no modelo padrão ou 94 MB no melhor modelo LSTM. Um aplicativo com suporte a cinco idiomas adiciona de 100 a 500 MB a cada artefato de implantação. Essa pasta deve estar no caminho exato que o construtor OCRProcessor espera ou o aplicativo lança imediatamente ao iniciar. Isso não é um custo de configuração única — é um custo operacional recorrente que aparece sempre que um novo ambiente é provisionado.

A configuração do caminho binário do Tesseract falha entre ambientes. O construtor OCRProcessor requer um caminho para o diretório tessdata que deve ser resolvido corretamente em todas as plataformas de destino. O caminho que funciona em uma máquina de desenvolvedor Windows (@"tessdata/") falha em um contêiner Linux a menos que o pipeline de implantação copie explicitamente a pasta. As compilações de imagem Docker devem incluir uma camada COPY tessdata/ /app/tessdata/. Os pipelines de CI devem automatizar os downloads do tessdata. Ambientes isolados da internet (air-gapped) devem gerenciar a distribuição de arquivos binários separadamente da restauração de pacotes NuGet . Cada ambiente adiciona uma nova oportunidade para uma incompatibilidade de caminho que produz uma falha silenciosa de OCR ou uma exceção em tempo de execução.

A arquitetura centrada em PDF impõe uma sobrecarga de conversão para entrada de imagem. O OCRProcessor da Syncfusion aceita objetos PdfLoadedDocument, não arquivos de imagem. Extrair texto de um JPG requer criar um PdfDocument, adicionar uma página, desenhar a imagem nela, salvar em um MemoryStream, recarregar como um PdfLoadedDocument, e então executar o OCR — nove operações antes do passo de reconhecimento de texto. Essa ida e volta adiciona sobrecarga de execução e complexidade de código para cada fluxo de trabalho de OCR baseado em imagem.

O licenciamento de Suite cria eventos de conformidade desencadeados pelo crescimento. A licença comunitária da Syncfusion exige menos de cinco desenvolvedores, menos de dez funcionários, menos de US$ 1 milhão em receita anual e menos de US$ 3 milhões em financiamento externo vitalício — tudo simultaneamente. Ultrapassar qualquer limite invalida a licença imediatamente e exige uma atualização comercial, com um custo entre US$ 995 e US$ 1.595 por desenvolvedor por ano. Uma equipe de cinco desenvolvedores que utiliza o OCR Syncfusion comercialmente há três anos paga entre US$ 14.925 e US$ 23.925 pela mesma capacidade de extração de texto disponível no IronOCR Professional por um pagamento único de US$ 2.999.

A ausência de pré-processamento integrado implica em dependências externas para digitalizações degradadas. O Tesseract produz resultados ruins em imagens rotacionadas, ruidosas ou de baixo contraste sem pré-processamento. A Syncfusion não expõe nenhuma API de pré-processamento. Os desenvolvedores que precisam de correção de distorção, redução de ruído ou contraste devem adicionar uma biblioteca de imagens separada (System.Drawing, SkiaSharp, ImageSharp), implementar os filtros e integrar a saída ao processo de conversão de PDF antes que o OCR possa começar. Trata-se de uma dependência de terceiros e de 20 a 40 linhas de código adicionais para uma funcionalidade que o IronOCR fornece como métodos integrados.

Apenas OCR é necessário, mas todo o suite é licenciado. A Syncfusion puxa Syncfusion.Pdf.Net.Core, Syncfusion.Compression.Net.Core, e outras dependências transitivas independentemente de quais recursos são realmente usados. Para equipes que desenvolvem um serviço específico de processamento de documentos, esse gráfico de dependências tem um peso significativo — em termos de tempo de compilação, tamanho da imagem do contêiner e custo de licenciamento — para componentes que não têm relevância para a extração de texto.

O problema fundamental

O OCR Syncfusion exige a configuração de um caminho de sistema de arquivos tessdata antes que qualquer chamada de OCR seja possível:

// Syncfusion: tessdata path required — fails in any environment where this path is wrong
private const string TessDataPath = @"tessdata/";

using var document = new PdfLoadedDocument("scanned-invoice.pdf");
using var processor = new OCRProcessor(TessDataPath);  // throws if path does not resolve
processor.Settings.Language = Languages.English;
processor.PerformOCR(document);

var text = new StringBuilder();
foreach (PdfLoadedPage page in document.Pages)
    text.AppendLine(page.ExtractText());
C#

O IronOCR não requer nenhuma configuração de caminho. Os dados de idioma estão incluídos no pacote:

// IronOCR: no tessdata path, no path configuration, no folder to deploy
var text = new IronTesseract().Read("scanned-invoice.pdf").Text;
C#

##IronOCR vs Syncfusion OCR: Comparação de Recursos

A tabela abaixo abrange os recursos mais importantes para equipes que estão migrando do OCR da Syncfusion .

RecursoOCR SyncfusionIronOCR
Pacote NuGetSyncfusion.PDF.OCR.Net.Core (suite)IronOcr (independente)
tessdata ObrigatórioSim — download manual e configuração de caminhoNão — incluído internamente
OCR de imagem diretaNão — requer conversão de PDF de ida e volta.Sim — LoadImage() ou caminho diretamente
OCR direto de PDFSim — modelo de entrada primáriaSim — suporte de primeira classe
Pré-processamento automáticoNão — é necessária uma biblioteca externa.Sim — correção de distorção, redução de ruído, contraste, binarização.
Saída em PDF pesquisávelSim — salvar após PerformOCR()Sim — result.SaveAsSearchablePdf()
Idiomas suportadosMais de 60 via download manual de dados tessMais de 125 idiomas disponíveis via pacotes NuGet
Simultâneo em vários idiomasSim — flags bitwise no enum LanguagesSim — AddSecondaryLanguage()
OCR baseado em regiãoNãoSim — CropRectangle
Leitura de código de barrasNãoSim — ocr.Configuration.ReadBarCodes = true
Saída EstruturadaPáginas apenas via page.ExtractText()Páginas, parágrafos, linhas, palavras, caracteres com coordenadas
Pontuação de ConfiançaNãoSim — result.Confidence e pontuações por palavra
Exportação hOCRNãoSim
Entrada de fluxoSomente via fluxo PDFEntrada direta de fluxo para imagens e PDFs
Segurança da roscaNão documentado como thread-safeCompleto — uma instância IronTesseract por thread
MultiplataformaSim — mas o tessdata precisa ser resolvido em cada plataforma.Sim — um único NuGet, sem configuração de caminho.
Implantação do DockerRequer camada tessdata na imagem.Embalagem única, sem camadas extras.
Modelo de licenciamentoAssinatura anual do Suite (US$ 995 a US$ 1.595 por desenvolvedor por ano)Perpetual (Lite $999, Pro $1,499, Enterprise $2,999)
Restrições de Licença ComunitáriaLimites de receita, número de funcionários e financiamento com direitos de auditoriaSem restrições no período de teste gratuito.
Motor OCRTesseract 5 (invólucro padrão)Tesseract 5 otimizado com melhorias de precisão.

Guia rápido: Migração do OCR da Syncfusion para o IronOCR

Passo 1: Substitua o pacote NuGet

Remova o OCR Syncfusion e quaisquer outros pacotes da Syncfusion que tenham sido instalados exclusivamente para a funcionalidade de OCR:

dotnet remove package Syncfusion.PDF.OCR.Net.Core
dotnet remove package Syncfusion.Pdf.Net.Core
dotnet remove package Syncfusion.Compression.Net.Core
SHELL

Instale o IronOCR a partir do NuGet :

dotnet add package IronOcr

Etapa 2: Atualizar Namespaces

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

// Before (Syncfusion)
using Syncfusion.OCRProcessor;
using Syncfusion.Pdf;
using Syncfusion.Pdf.Parsing;

// 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";

Não é necessário fazer inscrição Suite . Não é necessária verificação de elegibilidade para licença comunitária. A chave é uma string simples atribuída a uma propriedade estática.

Exemplos de migração de código

Eliminação de Caminhos do Tessdata e Inicialização do OCR

Os códigos fontes da Syncfusion comumente incluem lógica de validação tessdata — verificando que o diretório existe e que os arquivos .traineddata exigidos estão presentes antes de tentar o OCR. Esse código de proteção existe porque a ausência de um arquivo tessdata causa uma exceção em tempo de execução, e incidentes em produção causados ​​por arquivos de idioma ausentes são comuns o suficiente para que as equipes criem verificações defensivas.

Abordagem OCR da Syncfusion :

using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;

public class DocumentOcrService
{
    // Path hardcoded — different on every deployment target
    private const string TessDataPath = @"tessdata/";

    private bool ValidateTessdataBeforeUse(string languageCode)
    {
        // Guard required because missing files cause runtime exceptions
        if (!Directory.Exists(TessDataPath))
            throw new InvalidOperationException(
                "tessdata directory not found. Download from github.com/tesseract-ocr/tessdata_best");

        string filePath = Path.Combine(TessDataPath, $"{languageCode}.traineddata");
        if (!File.Exists(filePath))
            throw new InvalidOperationException(
                $"{languageCode}.traineddata not found — file must be downloaded manually");

        return true;
    }

    public string ExtractText(string pdfPath, string languageCode = "eng")
    {
        ValidateTessdataBeforeUse(languageCode);  // defensive check before every call

        using var document = new PdfLoadedDocument(pdfPath);
        using var processor = new OCRProcessor(TessDataPath);
        processor.Settings.Language = Languages.English;
        processor.PerformOCR(document);

        var sb = new StringBuilder();
        foreach (PdfLoadedPage page in document.Pages)
            sb.AppendLine(page.ExtractText());

        return sb.ToString();
    }
}
C#

Abordagem IronOCR:

using IronOcr;

public class DocumentOcrService
{
    // Não tessdata path — no validation logic — no defensive checks
    public string ExtractText(string pdfPath)
    {
        return new IronTesseract().Read(pdfPath).Text;
    }
}
C#

O método inteiro ValidateTessdataBeforeUse e a constante TessDataPath são deletados. As etapas do pipeline de implantação que copiam a pasta tessdata foram removidas. O script de CI que faz o download dos arquivos .traineddata é removido. A camada do Dockerfile que copia os dados do tess para a imagem do contêiner foi removida. Nenhum desses códigos precisa ser substituído — simplesmente não é mais necessário. O guia de configuração do IronTesseract abrange todas as opções de inicialização disponíveis caso seja necessária alguma configuração além das opções padrão.

Pipeline de geração de PDF pesquisável

A saída de PDF pesquisável da Syncfusion funciona chamando PerformOCR() em um documento carregado, o que adiciona uma camada de texto invisível no lugar, e então salvando o documento modificado em um stream. O padrão exige o gerenciamento de dois fluxos — a entrada e a saída — e as etapas de OCR e salvamento são operações separadas no mesmo objeto de documento mutável.

Abordagem OCR da Syncfusion :

using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;

public class SearchablePdfService
{
    private const string TessDataPath = @"tessdata/";

    public void ConvertToSearchable(string inputPdfPath, string outputPdfPath)
    {
        // Load document — mutable: PerformOCR modifies it in place
        using var document = new PdfLoadedDocument(inputPdfPath);
        using var processor = new OCRProcessor(TessDataPath);

        processor.Settings.Language = Languages.English;

        // Step 1: OCR modifies the document object
        processor.PerformOCR(document);

        // Step 2: Save the modified document to a separate output file
        using var outputStream = new FileStream(outputPdfPath, FileMode.Create, FileAccess.Write);
        document.Save(outputStream);
    }

    public byte[] ConvertToSearchableBytes(string inputPdfPath)
    {
        using var document = new PdfLoadedDocument(inputPdfPath);
        using var processor = new OCRProcessor(TessDataPath);

        processor.Settings.Language = Languages.English;
        processor.PerformOCR(document);

        using var outputStream = new MemoryStream();
        document.Save(outputStream);
        return outputStream.ToArray();
    }
}
C#

Abordagem IronOCR:

using IronOcr;

public class SearchablePdfService
{
    public void ConvertToSearchable(string inputPdfPath, string outputPdfPath)
    {
        var result = new IronTesseract().Read(inputPdfPath);
        result.SaveAsSearchablePdf(outputPdfPath);
    }

    public byte[] ConvertToSearchableBytes(string inputPdfPath)
    {
        using var input = new OcrInput();
        input.LoadPdf(inputPdfPath);

        var result = new IronTesseract().Read(input);

        // SaveAsSearchablePdf also accepts a MemoryStream
        using var ms = new MemoryStream();
        result.SaveAsSearchablePdf(ms);
        return ms.ToArray();
    }
}
C#

O modelo de documento mutável que a Syncfusion usa — onde PerformOCR() modifica o documento carregado no lugar antes de salvar — é substituído pelo padrão de leitura-e-saída imutável do IronOCR. O objeto OcrResult contém o texto reconhecido e pode ser salvo em um PDF pesquisável, exportado como texto simples ou percorrido como dados estruturados, tudo a partir do mesmo resultado. O guia prático de PDF pesquisável e o exemplo de PDF pesquisável abordam opções de saída adicionais, incluindo configurações de conformidade com PDF/A.

Pipeline de OCR de PDF baseado em fluxo

Os serviços de produção que recebem documentos PDF via upload HTTP, fila de mensagens ou armazenamento de blobs normalmente trabalham com fluxos em vez de caminhos de arquivo. A Syncfusion aceita streams através de PdfLoadedDocument, mas a restrição de caminho tessdata ainda se aplica — a pasta tessdata deve existir no servidor onde o stream é processado.

Abordagem OCR da Syncfusion :

using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;

public class StreamOcrService
{
    private const string TessDataPath = @"tessdata/";

    public string ExtractFromStream(Stream pdfStream)
    {
        // Stream input works, but tessdata path constraint remains
        using var document = new PdfLoadedDocument(pdfStream);
        using var processor = new OCRProcessor(TessDataPath);

        processor.Settings.Language = Languages.English;
        processor.PerformOCR(document);

        var sb = new StringBuilder();
        foreach (PdfLoadedPage page in document.Pages)
            sb.AppendLine(page.ExtractText());

        return sb.ToString();
    }

    public async Task<string> ExtractFromStreamAsync(Stream pdfStream)
    {
        // Não native async — must wrap in Task.Run
        return await Task.Run(() => ExtractFromStream(pdfStream));
    }
}
C#

Abordagem IronOCR:

using IronOcr;

public class StreamOcrService
{
    public string ExtractFromStream(Stream pdfStream)
    {
        using var input = new OcrInput();
        input.LoadPdf(pdfStream);    // accepts Stream directly

        return new IronTesseract().Read(input).Text;
    }

    public async Task<string> ExtractFromStreamAsync(Stream pdfStream)
    {
        using var input = new OcrInput();
        input.LoadPdf(pdfStream);

        var ocr = new IronTesseract();
        var result = await ocr.ReadAsync(input);   // native async support
        return result.Text;
    }
}
C#

O método LoadPdf() em OcrInput aceita um Stream diretamente, sem necessidade de escrita de arquivo intermediária.IronOCR também fornece um método ReadAsync() para integração assíncrona nativa — não é necessário um wrapper Task.Run(). Para controladores de API web, Azure Functions e outros padrões de serviço assíncronos, esta API se encaixa perfeitamente. O guia de entrada de fluxo documenta todas as opções de carregamento de fluxo, incluindo fluxos de imagem e fluxos TIFF de várias páginas. O guia de OCR assíncrono aborda o suporte a tokens de cancelamento e retornos de chamada de progresso para lotes de documentos de longa duração.

Extração de parágrafos e palavras estruturadas

O modelo de extração de texto da Syncfusion oferece dois níveis: texto concatenado para o documento completo via result.Text, e texto por página através da iteração page.ExtractText(). Não existe estrutura de subpáginas — sem coordenadas de palavras, sem limites de parágrafos, sem pontuações de confiança por ocorrência. Aplicações que precisam localizar campos específicos por posição ou filtrar tokens de baixa confiança devem implementar sua própria lógica de análise sintática sobre a string concatenada.

Abordagem OCR da Syncfusion :

using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;

public class StructuredExtractionService
{
    private const string TessDataPath = @"tessdata/";

    public Dictionary<int, string> ExtractPerPage(string pdfPath)
    {
        var pageTexts = new Dictionary<int, string>();

        using var document = new PdfLoadedDocument(pdfPath);
        using var processor = new OCRProcessor(TessDataPath);

        processor.Settings.Language = Languages.English;
        processor.PerformOCR(document);

        // Page-level is the finest granularity available
        int pageNum = 1;
        foreach (PdfLoadedPage page in document.Pages)
        {
            pageTexts[pageNum] = page.ExtractText();
            pageNum++;
        }

        return pageTexts;
        // Não word coordinates, no paragraph boundaries, no per-token confidence
    }
}
C#

Abordagem IronOCR:

using IronOcr;

public class StructuredExtractionService
{
    public void ExtractWithStructure(string pdfPath)
    {
        var result = new IronTesseract().Read(pdfPath);

        Console.WriteLine($"Overall confidence: {result.Confidence}%");

        foreach (var page in result.Pages)
        {
            Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words");

            foreach (var paragraph in page.Paragraphs)
            {
                Console.WriteLine($"  Paragraph at ({paragraph.X}, {paragraph.Y}):");
                Console.WriteLine($"  {paragraph.Text}");
            }
        }
    }

    public IEnumerable<string> ExtractHighConfidenceWords(string pdfPath, int minConfidence = 80)
    {
        var result = new IronTesseract().Read(pdfPath);

        // Per-word confidence filtering — not possible with Syncfusion's page-level model
        return result.Pages
            .SelectMany(p => p.Words)
            .Where(w => w.Confidence >= minConfidence)
            .Select(w => w.Text);
    }
}
C#

O modelo de saída estruturada expõe parágrafos, linhas, palavras e caracteres com coordenadas de caixa delimitadora e pontuações de confiança individuais. Isso é particularmente útil para extração de campos de faturas, análise de formulários e classificação de documentos — fluxos de trabalho em que saber onde o texto aparece na página é tão importante quanto o que o texto diz. O guia de resultados de leitura e o documento de referência da API OcrResult descrevem o grafo de objetos completo.

Processamento de documentos em lote com execução paralela

Os serviços de OCR de alto volume processam dezenas ou centenas de documentos simultaneamente. A Syncfusion não documenta OCRProcessor como thread-safe, o que força o processamento sequencial ou exige que os desenvolvedores implementem seu próprio pool de instâncias. As instâncias do IronOCR são seguras para criar por thread, permitindo uso direto com Parallel.ForEach ou PLINQ sem sincronização adicional.

Abordagem OCR da Syncfusion :

using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;

public class BatchOcrService
{
    private const string TessDataPath = @"tessdata/";

    public Dictionary<string, string> ProcessBatch(IEnumerable<string> pdfPaths)
    {
        var results = new Dictionary<string, string>();

        // Sequential processing — OCRProcessor thread safety not guaranteed
        foreach (var path in pdfPaths)
        {
            using var document = new PdfLoadedDocument(path);
            using var processor = new OCRProcessor(TessDataPath);

            processor.Settings.Language = Languages.English;
            processor.PerformOCR(document);

            var sb = new StringBuilder();
            foreach (PdfLoadedPage page in document.Pages)
                sb.AppendLine(page.ExtractText());

            results[path] = sb.ToString();
        }

        return results;
    }
}
C#

Abordagem IronOCR:

using IronOcr;

public class BatchOcrService
{
    public Dictionary<string, string> ProcessBatch(IEnumerable<string> pdfPaths)
    {
        var results = new ConcurrentDictionary<string, string>();

        // Parallel processing — IronTesseract is safe per-thread
        Parallel.ForEach(pdfPaths, pdfPath =>
        {
            var ocr = new IronTesseract();   // one instance per thread
            var text = ocr.Read(pdfPath).Text;
            results[pdfPath] = text;
        });

        return new Dictionary<string, string>(results);
    }
}
C#

Criar uma instância IronTesseract por thread é o padrão documentado para processamento paralelo. Sem estado compartilhado, sem disputa de bloqueio, sem necessidade de infraestrutura de agrupamento de instâncias. O exemplo de multithreading mostra benchmarks de throughput para tamanhos típicos de lotes de documentos, e o guia de otimização de velocidade aborda opções de configuração do mecanismo para cargas de trabalho sensíveis à latência.

Referência de mapeamento da API OCR da Syncfusion para o IronOCR

OCR SyncfusionEquivalente de IronOCRNotas
Syncfusion.PDF.OCR.Net.CoreIronOcrSubstitua o pacote NuGet
Syncfusion.OCRProcessorIronOcrEspaço de nomes único
Syncfusion.PdfRemoverNão é mais necessário
Syncfusion.Pdf.ParsingRemoverNão é mais necessário
SyncfusionLicenseProvider.RegisterLicense()IronOcr.License.LicenseKey =Atribuição de string, sem registro de Suite
new OCRProcessor(tessdataPath)new IronTesseract()Nenhum argumento de caminho
PdfLoadedDocument(filePath)Passar caminho diretamente para ocr.Read(path)Ou usar OcrInput com LoadPdf()
PdfLoadedDocument(stream)input.LoadPdf(stream)O suporte de streaming é direto.
processor.Settings.Language = Languages.Englishocr.Language = OcrLanguage.EnglishOcrLanguage enum
Idiomas.Inglês | Idiomas.Francêsocr.Language = OcrLanguage.English; ocr.AddSecondaryLanguage(OcrLanguage.French)O padrão aditivo substitui os indicadores bit a bit.
processor.PerformOCR(document)ocr.Read(input)Retorna OcrResult diretamente
page.ExtractText()result.Text ou result.Pages[i].TextNão é necessário nenhum loop para o texto completo.
Iteração document.PagesArray result.Pages[]Inclui parágrafos, palavras e caracteres.
document.Save(outputStream) após OCRresult.SaveAsSearchablePdf(path)Método dedicado
Lógica de validação do TessdataRemover completamenteNão há dados de teste para validar.
Constante de caminho de dados manuaisRemover completamenteNão é um requisito do IronOCR.
Conversão de imagem para PDF PdfBitmapinput.LoadImage(imagePath)Não há comunicação de ida e volta em PDF para OCR de imagens.
API sem pré-processamentoinput.Deskew(), input.DeNoise(), input.Contrast()Embutido em OcrInput

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

Problema 1: Diretório Tessdata não encontrado após a troca de pacotes

Syncfusion OCR: A verificação de validação do diretório tessdata foi implementada como uma proteção na inicialização ou por chamada. Após remover a Syncfusion e instalar o IronOCR, este código de validação ainda compila (usa System.IO, não namespaces da Syncfusion) mas agora protege uma operação que não existe mais. Deixar esse código no lugar é código morto que pode confundir desenvolvedores futuros.

Solução: Elimine completamente toda a lógica de validação do tessdata. Remover a constante TessDataPath, todos os cheques Directory.Exists(TessDataPath), todos os cheques File.Exists(Path.Combine(TessDataPath, ...)) e quaisquer métodos de validação de inicialização. O IronOCR não gera exceções relacionadas a dados de teste porque não há dados de teste que possam estar faltando:

// Delete these entirely — they have no equivalent in IronOCR
// private const string TessDataPath = @"tessdata/";
// private bool ValidateTessdata() { ... }

// The only error handling needed after migration:
try
{
    return new IronTesseract().Read(pdfPath).Text;
}
catch (FileNotFoundException)
{
    throw new ArgumentException($"PDF file not found: {pdfPath}");
}
C#

Problema 2: Arquivos de idioma não disponíveis em tempo de execução

OCR Syncfusion: Arquivos de idioma .traineddata foram implantados como artefatos de sistema de arquivo, marcados CopyToOutputDirectory no .csproj, e copiados pelo sistema de build. Depois de remover a pasta tessdata do projeto, etapas relacionadas à linguagem no CI e entradas .csproj ainda podem referenciar os arquivos deletados, causando avisos de build ou falhas no pipeline.

Solução: Remova todas as entradas relacionadas a tessdata de arquivos .csproj e definições de pipeline de CI. Instale os pacotes de idiomas como pacotes NuGet :

# Languages install as NuGet packages — no manual file management
dotnet add package IronOcr.Languages.French
dotnet add package IronOcr.Languages.German
dotnet add package IronOcr.Languages.ChineseSimplified
SHELL
// Language configuration after migration
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);
var result = ocr.Read("multilingual-report.pdf");
C#

O guia para múltiplos idiomas cobre a instalação de pacotes de idioma e os valores de enum OcrLanguage para todos os 125+ idiomas suportados.

Problema 3: A ordem dos bytes na saída de PDF pesquisável difere

OCR Syncfusion: O PDF pesquisável foi produzido chamando document.Save(stream) após PerformOCR() possuir mutado o documento. Alguns consumidores subsequentes da matriz de bytes podem ter sido programados para esperar a estrutura de PDF específica da Syncfusion, campos de metadados ou string de produtor.

Solução: O SaveAsSearchablePdf() do IronOCR produz um PDF padrão com uma camada de texto. Teste a saída com seus consumidores subsequentes (visualizadores de PDF, índices de pesquisa, sistemas de arquivamento) para verificar a compatibilidade. Se for necessária uma saída idêntica byte a byte, um teste de transição que compare a capacidade de extração do texto (e não os bytes brutos) é o critério de aceitação apropriado:

// Verify the searchable PDF contains the expected text
var result = new IronTesseract().Read("scanned.pdf");
result.SaveAsSearchablePdf("output-searchable.pdf");

// Validation: confirm text layer is present and readable
var verificationText = new IronTesseract().Read("output-searchable.pdf").Text;
Assert.True(verificationText.Contains("expected content"));
C#

Problema 4: O tamanho da imagem Docker aumenta após a tentativa de migração.

Syncfusion OCR: Algumas equipes tentam a migração, mantendo os arquivos tessdata na imagem Docker como precaução durante os testes. Isso resulta na presença tanto da camada tessdata quanto do pacote IronOCR na imagem, aumentando desnecessariamente o tamanho da imagem.

Solução: Exclua a camada de COPY tessdata do Dockerfile antes de construir a imagem migrada. O pacote IronOCR é autossuficiente. O guia de implantação do Docker fornece imagens base verificadas e configurações para sistemas operacionais Alpine, Debian e Ubuntu:

# Remover this layer entirely after migration
# COPY tessdata/ /app/tessdata/

#IronOCR requires only the standard .NET runtime
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "YourService.dll"]
Text

Problema 5: O padrão PerformOCR/ExtractText em duas etapas não possui equivalente direto.

OCR Syncfusion: Algum código de chamada passa uma referência PdfLoadedDocument entre métodos — um método chama PerformOCR() e outro chama ExtractText() — confiando na mutação de estado do objeto do documento. Este padrão não existe no IronOCR porque Read() retorna um objeto de resultado autocontido.

Solução: Refatore quaisquer padrões de divisão de OCR/extração em um único método que aceite um caminho de arquivo ou stream e retorne um OcrResult. O objeto resultante contém tudo — texto, páginas, parágrafos, níveis de confiança e a possibilidade de salvar como um PDF pesquisável:

// Replace split PerformOCR / ExtractText pattern
public OcrResult ProcessDocument(string pdfPath)
{
    // One call, immutable result, all data available
    return new IronTesseract().Read(pdfPath);
}

// Callers decide what they need from the result
var result = service.ProcessDocument("contract.pdf");
var fullText = result.Text;
var confidence = result.Confidence;
result.SaveAsSearchablePdf("contract-searchable.pdf");
C#

Problema 6: O código de registro da licença da comunidade permanece após a migração.

OCR Syncfusion: A chamada Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense() na inicialização do aplicativo registra a licença da suite. Essa chamada muitas vezes está em Program.cs, Startup.cs, ou em um inicializador estático. Após remover os pacotes da Syncfusion , esta linha causa um erro de compilação.

Solução: Exclua a chamada SyncfusionLicenseProvider.RegisterLicense() e substitua pela inicialização de licença do IronOCR. Remova também qualquer lógica de elegibilidade para licença comunitária, referências à documentação de conformidade ou comentários sobre limites de receita e número de funcionários — nenhum desses conceitos se aplica ao IronOCR:

// Remover (causes compile error after package removal)
// Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("SYNCFUSION-KEY");

// Add at application startup
IronOcr.License.LicenseKey = "YOUR-IRONOCR-KEY";
C#

Lista de verificação para migração de OCR da Syncfusion

Pré-migração

Antes de fazer alterações, audite o código-fonte para identificar todo o uso do OCR da Syncfusion :

# Find all Syncfusion namespace imports
grep -r "using Syncfusion" --include="*.cs" .

# Find OCRProcessor usage
grep -r "OCRProcessor\|PerformOCR\|PdfLoadedDocument\|ExtractText" --include="*.cs" .

# Find tessdata path references
grep -r "TessDataPath\|tessdata\|traineddata" --include="*.cs" .

# Find Syncfusion license registration
grep -r "SyncfusionLicenseProvider\|RegisterLicense" --include="*.cs" .

# Find csproj tessdata copy rules
grep -r "tessdata\|traineddata" --include="*.csproj" .

# Find Dockerfile tessdata layers
grep -r "tessdata" Dockerfile* docker-compose*.yml .
SHELL

Faça um inventário dos resultados antes de escrever qualquer código. Observe quais arquivos contêm chamadas de OCR, quais contêm validação do tessdata e quais definições de pipeline fazem referência à pasta tessdata.

Migração de código

  1. Remova Syncfusion.PDF.OCR.Net.Core, Syncfusion.Pdf.Net.Core, e pacotes relacionados de todos os arquivos .csproj.
  2. Execute dotnet add package IronOcr em cada projeto que realiza OCR.
  3. Instale pacotes de idioma via NuGet para quaisquer idiomas não-ingleses usados: dotnet add package IronOcr.Languages.[Language].
  4. Exclua a constante private const string TessDataPath de todas as classes de serviço.
  5. Exclua todos os métodos de validação tessdata (ValidateTessdata() e guardas similares).
  6. Substitua SyncfusionLicenseProvider.RegisterLicense() por IronOcr.License.LicenseKey = "YOUR-KEY" na inicialização do aplicativo.
  7. Substitua using Syncfusion.OCRProcessor; usando Syncfusion.Pdf; using Syncfusion.Pdf.Parsing; with using IronOcr;.
  8. Substitua cada inicialização new OCRProcessor(TessDataPath) por new IronTesseract().
  9. Substitua cadeias PdfLoadedDocument + processor.PerformOCR() + page.ExtractText() por ocr.Read(path).Text.
  10. Substitua os sinalizadores de idioma bit a bit da Syncfusion (Languages.English). | Chamadas Idiomas.Francêsplusocr.AddSecondaryLanguage()`.
  11. Substitua document.Save(stream) após PerformOCR() por result.SaveAsSearchablePdf(path) para saída de PDF pesquisável.
  12. Substitua as idas e voltas de conversão de imagem para PDF por input.LoadImage(imagePath) ou ocr.Read(imagePath) diretos.
  13. Remova entradas CopyToOutputDirectory tessdata de todos os arquivos .csproj.
  14. Remova as etapas de download do tessdata de todas as definições de pipeline CI/CD.
  15. Remova camadas COPY tessdata de todos os Dockerfiles.

Pós-migração

  • Verifique se o OCR de PDF produz o conteúdo de texto esperado nos mesmos documentos de amostra usados ​​antes da migração.
  • Verificar se o OCR de imagens (JPG, PNG, BMP) funciona sem qualquer etapa de conversão para PDF.
  • Confirme se os documentos multilíngues são reconhecidos corretamente usando os pacotes de idiomas NuGet instalados.
  • Teste a saída em PDF pesquisável abrindo o arquivo gerado em um visualizador de PDF e confirmando se a seleção de texto e a pesquisa funcionam corretamente.
  • Execute a aplicação em um novo contêiner Docker criado a partir do Dockerfile atualizado para confirmar que não ocorrem erros de inicialização relacionados ao tessdata.
  • Confirme que o aplicativo inicia sem uma chamada Syncfusion.Licensing ou qualquer referência a namespace da Syncfusion.
  • Verifique se result.Confidence retorna um valor plausível (tipicamente 80–99% para documentos limpos) para confirmar que o motor de OCR está ativo.
  • Teste o processamento em lote paralelo executando chamadas OCR simultâneas e verificando se não ocorrem exceções de threading ou resultados corrompidos.
  • Comparar a precisão da extração de texto em digitalizações de baixa qualidade ou rotacionadas antes e depois da migração, observando a melhoria obtida com o pipeline de pré-processamento automático.

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

A complexidade de implantação cai para um único pacote NuGet. Após a migração, cada ambiente — estação de trabalho de desenvolvedor, runner de CI, contêiner de staging, servidor de produção — requer exatamente uma coisa: o pacote NuGet IronOcr restaurado pelo sistema de build. Não existe pasta tessdata. Não há caminho de sistema de arquivos para configurar. Sem scripts para download de arquivos de idioma. Sem camadas do Dockerfile contendo 100 a 500 MB de dados binários. As imagens de contêiner são menores, os pipelines de CI são mais simples e os novos ambientes são provisionados corretamente na primeira compilação, sem intervenção manual.

Os custos de licenciamento tornam-se previsíveis e não recorrentes. A compra única de uma licença perpétua substitui o ciclo anual de renovação por desenvolvedor. Uma equipe de cinco desenvolvedores que adquire o IronOCR Professional (US$ 2.999) passa a ser proprietária da biblioteca por tempo indeterminado, com um ano de atualizações incluído. Não há limites de receita a monitorar, nem limites de número de funcionários a acompanhar, nem disposições para auditoria, nem documentação de conformidade a manter. Eventos de crescimento — novos contratados, grandes contratos, rodadas de financiamento — não desencadeiam revisões de licenciamento.

O pipeline de OCR lida com documentos degradados sem dependências externas. Deskew, denoise, aprimoramento de contraste, binarização e escalamento de resolução estão disponíveis como métodos em OcrInput. Não é necessária nenhuma biblioteca de imagens separada. Documentos com ligeira rotação, ruído do scanner ou baixo contraste, que anteriormente exigiam uma etapa de pré-processamento usando System.Drawing ou SkiaSharp, agora podem ser tratados na mesma chamada do IronOCR. O guia de correção da qualidade da imagem e a página de recursos de pré-processamento documentam todos os filtros disponíveis e seus efeitos na precisão do reconhecimento.

Saída estruturada permite inteligência documental em nível de campo. O objeto OcrResult expõe a estrutura completa do documento — páginas, parágrafos, linhas, palavras e caracteres — com coordenadas da caixa delimitadora e pontuações de confiança por token. Aplicações que anteriormente analisavam sequências de texto concatenadas para encontrar limites de campos agora podem usar diretamente os dados de coordenadas de parágrafos e palavras. Os fluxos de trabalho de processamento de faturas, extração de formulários e classificação de documentos obtêm acesso a informações espaciais que o modelo de nível de página da Syncfusion não consegue fornecer. A página de casos de uso de OCR de PDF aborda padrões comuns de inteligência de documentos.

O processamento batch paralelo escala sem infraestrutura. Criar uma instância IronTesseract por thread é a estratégia completa de threading — sem pool de instâncias, sem gerenciamento de semáforo, sem restrições de processamento sequencial. Um serviço de batch processando 500 documentos por hora pode saturar os núcleos de CPU disponíveis com Parallel.ForEach e uma única linha de sincronização. A arquitetura de mecanismo autocontida significa que cada thread opera de forma independente, sem estado mutável compartilhado.

Mais de 125 idiomas estão disponíveis sem a necessidade de gerenciamento de arquivos binários. Cada pacote de idiomas é instalado como um pacote NuGet através do gerenciador de pacotes padrão. O gerenciamento de versões, a aquisição de atualizações e a resolução de dependências são tratados pelas mesmas ferramentas que gerenciam todas as outras dependências do projeto. Adicionar OCR em japonês ou árabe a um serviço requer um único comando dotnet add package, não um download manual de um repositório GitHub seguido por atualizações no pipeline de implantação. O índice de idiomas lista todos os scripts suportados com os respectivos comandos de instalação.

Observe: Syncfusion e Tesseract são marcas registradas de seus respectivos proprietários. Este site não é afiliado, endossado ou patrocinado pelo Google ou Syncfusion. 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.