Ir para o conteúdo do rodapé
COMPARAR COM OUTROS COMPONENTES

AWS vs Google Vision (Comparação de Recursos de OCR)

O Reconhecedor de rótulos Dynamsoft faz uma coisa excepcionalmente bem — extração de MRZ de passaportes, leitura de VIN de veículos e leitura estruturada de etiquetas de embalagens industriais — e se recusa a fazer qualquer outra coisa. Essa especialização restrita se torna um problema de orçamento no momento em que seu aplicativo precisa de OCR de documentos em geral, pois aí você acaba licenciando o Reconhecedor de rótulos Dynamsoft para MRZ, o Dynamsoft Barcode Reader para códigos QR, o Dynamsoft Document Normalizer para detecção de bordas e ainda precisa procurar uma quarta biblioteca para lidar com documentos de página inteira. IronOCR cobre todas essas capacidades em um único pacote NuGet no $999 perpétuo.

Entendendo o Reconhecedor de Rótulos da Dynamsoft

A Dynamsoft Corporation, com sede em Vancouver, Canadá, desenvolveu seu produto Label Recognizer em torno de uma proposta específica: o reconhecimento confiável de texto estruturado legível por máquina em formatos restritos. O pacote NuGet do produto é Dynamsoft.DotNet.LabelRecognizer, e seu licenciamento comercial opera exclusivamente em assinaturas anuais — não existe opção perpétua. Entre em contato com a Dynamsoft para preços atuais.

O modelo de reconhecimento da biblioteca é baseado em modelos predefinidos. Você configura tarefas de reconhecimento por meio de uma API de configurações JSON (AppendSettingsFromString) e depois chama RecognizeFile ou RecognizeByFile em arquivos de imagem. Os resultados são retornados como coleções de linhas contendo sequências de texto bruto. Analisar essas sequências de caracteres e transformá-las em dados estruturados significativos — deslocamentos de campos, conversões de data, validação de dígitos verificadores — é de sua inteira responsabilidade.

Principais características arquitetônicas do Dynamsoft Label Recognizer:

  • Mecanismo de reconhecimento baseado em modelos: os padrões MRZ, VIN e de etiquetas exigem configuração de modelo JSON antes do reconhecimento.
  • Saída de texto bruto apenas: RecognizeFile retorna objetos LineResult com cadeias de texto; sem análise de campo estruturado
  • Entrada somente de imagem: Sem suporte nativo para PDF; Os arquivos PDF exigem conversão externa em imagens antes do processamento.
  • Licenciamento por assinatura anual: Níveis por dispositivo e por servidor disponíveis; entre em contato com a Dynamsoft para preços atuais. no one-time purchase
  • Produtos separados para cada funcionalidade: Leitura de código de barras, normalização de documentos e otimização de câmera exigem produtos licenciados separadamente.
  • Cobertura linguística limitada: Focado em formatos MRZ com caracteres latinos; carece de amplo suporte a documentos multilíngues

API de Configurações de Tempo de Execução JSON

Todo fluxo de trabalho do Reconhecedor de rótulos Dynamsoft começa com uma etapa de configuração de modelo. O reconhecimento de MRZ, por exemplo, requer o carregamento de um documento JSON que declara os parâmetros de reconhecimento, os modelos de caracteres e as referências de região antes que qualquer processamento de imagem possa ocorrer:

using Dynamsoft.DLR;

public class DynamsoftMrzService : IDisposable
{
    private readonly LabelRecognizer _recognizer;

    public DynamsoftMrzService(string licenseKey)
    {
        // Static license initialization — must precede instance creation
        LabelRecognizer.InitLicense(licenseKey);
        _recognizer = new LabelRecognizer();

        // MRZ requires specific template configuration loaded as JSON
        string mrzTemplate = @"{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }";
        _recognizer.AppendSettingsFromString(mrzTemplate);
    }

    public string ExtractRawMrz(string passportImagePath)
    {
        var results = _recognizer.RecognizeFile(passportImagePath);

        // Returns raw MRZ text lines only — no field parsing
        var mrzLines = new StringBuilder();
        foreach (var result in results)
        {
            foreach (var lineResult in result.LineResults)
            {
                mrzLines.AppendLine(lineResult.Text);
            }
        }
        return mrzLines.ToString().Trim();
    }

    public void Dispose() => _recognizer?.Dispose();
}
using Dynamsoft.DLR;

public class DynamsoftMrzService : IDisposable
{
    private readonly LabelRecognizer _recognizer;

    public DynamsoftMrzService(string licenseKey)
    {
        // Static license initialization — must precede instance creation
        LabelRecognizer.InitLicense(licenseKey);
        _recognizer = new LabelRecognizer();

        // MRZ requires specific template configuration loaded as JSON
        string mrzTemplate = @"{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }";
        _recognizer.AppendSettingsFromString(mrzTemplate);
    }

    public string ExtractRawMrz(string passportImagePath)
    {
        var results = _recognizer.RecognizeFile(passportImagePath);

        // Returns raw MRZ text lines only — no field parsing
        var mrzLines = new StringBuilder();
        foreach (var result in results)
        {
            foreach (var lineResult in result.LineResults)
            {
                mrzLines.AppendLine(lineResult.Text);
            }
        }
        return mrzLines.ToString().Trim();
    }

    public void Dispose() => _recognizer?.Dispose();
}
Imports Dynamsoft.DLR
Imports System.Text

Public Class DynamsoftMrzService
    Implements IDisposable

    Private ReadOnly _recognizer As LabelRecognizer

    Public Sub New(licenseKey As String)
        ' Static license initialization — must precede instance creation
        LabelRecognizer.InitLicense(licenseKey)
        _recognizer = New LabelRecognizer()

        ' MRZ requires specific template configuration loaded as JSON
        Dim mrzTemplate As String = "{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }"
        _recognizer.AppendSettingsFromString(mrzTemplate)
    End Sub

    Public Function ExtractRawMrz(passportImagePath As String) As String
        Dim results = _recognizer.RecognizeFile(passportImagePath)

        ' Returns raw MRZ text lines only — no field parsing
        Dim mrzLines As New StringBuilder()
        For Each result In results
            For Each lineResult In result.LineResults
                mrzLines.AppendLine(lineResult.Text)
            Next
        Next
        Return mrzLines.ToString().Trim()
    End Function

    Public Sub Dispose() Implements IDisposable.Dispose
        _recognizer?.Dispose()
    End Sub
End Class
$vbLabelText   $csharpLabel

A saída do RecognizeFile é texto bruto MRZ como P<GBRSMITH<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<<<. Para obter Surname = "SMITH", GivenNames = "JOHN", DocumentNumber, DateOfBirth e ExpiryDate como propriedades tipadas, você implementa um analisador TD1/TD2/TD3 você mesmo. A documentação e os arquivos-fonte da Dynamsoft neste repositório estimam esse analisador em aproximadamente 150 linhas de código de análise — lidando com deslocamentos de caracteres, separadores de nome <<, desambiguação de ano de dois dígitos e validação de dígito de verificação — nenhum dos quais a Dynamsoft fornece.

Entendendo o IronOCR

IronOCR é uma biblioteca OCR comercial para .NET, construída sobre um mecanismo Tesseract 5 otimizado, com uma camada de API gerenciada que lida com pré-processamento, formatos de entrada, saída estruturada e análise especializada de documentos. A instalação é um único comando NuGet: dotnet add package IronOcr. Sem gerenciamento de binários nativos, sem configuração de pastas tessdata, sem arquivos de configuração de modelo.

Principais características:

  • Uso geral e especializado: Processa OCR de documentos de página inteira, PDFs com várias páginas, lotes de imagens digitalizadas e formatos especializados (passaportes, códigos de barras, placas de veículos) a partir do mesmo pacote.
  • Pipeline de pré-processamento automático: correção de distorção, redução de ruído, ajuste de contraste, binarização e aprimoramento de resolução são executados sem configuração manual em entradas de baixa qualidade.
  • Suporte nativo a PDF: Leia PDFs digitalizados e arquivos digitais diretamente, incluindo arquivos protegidos por senha, sem etapas de conversão externas.
  • Hierarquia de saída estruturada: os resultados exibem Páginas, Parágrafos, Linhas, Palavras e caixas delimitadoras de caracteres com pontuações de confiança.
  • Leitura incorporada de código de barras: Ative ocr.Configuration.ReadBarCodes = true e códigos de barras são extraídos junto com o texto na mesma passagem.
  • Mais de 125 pacotes de idiomas: Cada idioma é instalado como um pacote NuGet separado; Não é necessário gerenciar a pasta tessdata.
  • Licenciamento perpétuo: $999 Lite, $1,499 Plus, $2,999 Professional — compra única, todas as plataformas, todos os recursos incluídos.
  • Implantação multiplataforma: Windows, Linux, macOS, Docker, AWS e Azure funcionam com o mesmo pacote, sem necessidade de configuração específica para cada plataforma.

Comparação de recursos

Recurso Reconhecedor de rótulos Dynamsoft IronOCR
OCR de documentos gerais Não suportado Suporte total
Extração de MRZ Especializado (texto bruto) Integrado com campos analisados
Entrada nativa de PDF Não suportado Sim
Leitura de código de barras Produto separado (Leitor de código de barras Dynamsoft) Incorporado (ReadBarCodes)
Saída em PDF pesquisável Não suportado Sim
Suporte linguístico Limitado (Latin MRZ) Mais de 125 idiomas
Modelo de licenciamento Somente assinatura anual Opções de assinatura perpétua +
Produtos necessários para cobertura completa 3+ 1

Comparação Detalhada de Recursos

Recurso Reconhecedor de rótulos Dynamsoft IronOCR
Escopo de reconhecimento
OCR de documentos gerais Não suportado Sim
reconhecimento MRZ Especializado Sim (ReadPassport)
reconhecimento de VIN Especializado Sim (via OCR padrão)
Leitura de rótulos industriais Especializado Sim
reconhecimento de escrita manual Não suportado Sim
Extração de tabela Não suportado Sim
Formatos de entrada
Arquivos de imagem (JPG, PNG, TIFF) Sim Sim
PDF (nativo) Não suportado Sim
PDF protegido por senha Não suportado Sim
Matriz/fluxo de bytes Sim Sim
Documentos com várias páginas Agregação manual Sim (nativo)
Formatos de saída
Texto simples Sim (linhas brutas) Sim
Campos estruturados (analisados) Não fornecido Sim (Páginas, Linhas, Palavras)
PDF pesquisável Não suportado Sim
hOCR Não suportado Sim
Pontuações de confiança Por linha Por palavra, linha e página
Pré-processamento
Pré-processamento automático Básico Sim (duto inteligente)
Correção de inclinação/rotação Limitado Sim
Remoção de ruído Limitado Sim
Aprimoramento de contraste Limitado Sim
Normalização de DPI Não fornecido Sim
Capacidades de integração
Leitura de código de barras Produto separado Embutido
Normalização de documentos Produto separado Não é necessário
OCR baseado em região Sim (através de modelos) Sim (CropRectangle)
Processamento paralelo seguro para threads Sim Sim
Plataforma e Implantação
Windows Sim Sim
Linux Sim Sim
macOS Sim Sim
Docker Sim Sim
Azure / AWS Sim Sim
Isolado da internet / offline Sim Sim
Licenciamento e Custo
Assinatura anual Sim (entre em contato com a Dynamsoft para preços) Opcional
Licença perpétua Não disponível Sim ($999 compra única)
Pacote único com todas as funcionalidades Não (3+ produtos) Sim
Teste grátis 30 dias Sim

Escopo de especialista versus generalista

A decisão arquitetônica mais importante tomada pela Dynamsoft foi construir uma solução especializada, e não generalista. Essa decisão tem consequências diretas para qualquer aplicação que comece com leitura de MRZ ou de etiquetas, mas que eventualmente precise de mais recursos.

Abordagem Dynamsoft

O Reconhecedor de rótulos Dynamsoft lida exatamente com o que seus modelos JSON descrevem e nada além disso. Um aplicativo de processamento de passaportes desenvolvido em Dynamsoft precisa de três produtos para poder lidar com um fluxo de trabalho de documentos do mundo real:

// Dynamsoft passport processing — MULTIPLE PRODUCTS REQUIRED

using Dynamsoft.DLR;  // Label Recognizer — for MRZ (annual subscription)
using Dynamsoft.DBR;  // Barcode Reader — for any barcodes (additional license)
// Plus: a separate OCR library — for full page text (more budget)

public class DynamsoftPassportProcessor : IDisposable
{
    private readonly LabelRecognizer _mrzRecognizer;
    private readonly BarcodeReader _barcodeReader;
    // private readonly SomeOtherOcrLibrary _fullTextOcr;  // third product

    public DynamsoftPassportProcessor(
        string mrzLicenseKey,
        string barcodeLicenseKey)
    {
        // License each product independently
        LabelRecognizer.InitLicense(mrzLicenseKey);
        _mrzRecognizer = new LabelRecognizer();

        // Configure MRZ template — JSON required before any recognition
        string mrzTemplate = @"{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ_Passport"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }";
        _mrzRecognizer.AppendSettingsFromString(mrzTemplate);

        // Second product, second license key
        BarcodeReader.InitLicense(barcodeLicenseKey);
        _barcodeReader = new BarcodeReader();
    }

    public PassportResult ProcessPassport(string imagePath)
    {
        // Step 1: Extração de MRZ — raw text only, no field parsing
        var mrzResults = _mrzRecognizer.RecognizeFile(imagePath);
        var mrzText = new StringBuilder();
        foreach (var r in mrzResults)
            foreach (var line in r.LineResults)
                mrzText.AppendLine(line.Text);

        // Step 2: Parse MRZ manually — your 150-line TD3 parser here
        var parsedMrz = ParseMrzManually(mrzText.ToString());

        // Step 3: Barcodes — second product, second API
        var barcodeResults = _barcodeReader.DecodeFile(imagePath);

        // Step 4: Full page text — THIRD library, no Dynamsoft option
        // var fullText = _fullTextOcr.ReadImage(imagePath);

        return new PassportResult
        {
            ParsedMrz = parsedMrz,
            Barcodes = barcodeResults.Select(b => b.BarcodeText).ToList(),
            FullPageText = null  // requires a fourth product
        };
    }

    public void Dispose()
    {
        _mrzRecognizer?.Dispose();
        _barcodeReader?.Dispose();
    }
}
// Dynamsoft passport processing — MULTIPLE PRODUCTS REQUIRED

using Dynamsoft.DLR;  // Label Recognizer — for MRZ (annual subscription)
using Dynamsoft.DBR;  // Barcode Reader — for any barcodes (additional license)
// Plus: a separate OCR library — for full page text (more budget)

public class DynamsoftPassportProcessor : IDisposable
{
    private readonly LabelRecognizer _mrzRecognizer;
    private readonly BarcodeReader _barcodeReader;
    // private readonly SomeOtherOcrLibrary _fullTextOcr;  // third product

    public DynamsoftPassportProcessor(
        string mrzLicenseKey,
        string barcodeLicenseKey)
    {
        // License each product independently
        LabelRecognizer.InitLicense(mrzLicenseKey);
        _mrzRecognizer = new LabelRecognizer();

        // Configure MRZ template — JSON required before any recognition
        string mrzTemplate = @"{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ_Passport"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }";
        _mrzRecognizer.AppendSettingsFromString(mrzTemplate);

        // Second product, second license key
        BarcodeReader.InitLicense(barcodeLicenseKey);
        _barcodeReader = new BarcodeReader();
    }

    public PassportResult ProcessPassport(string imagePath)
    {
        // Step 1: Extração de MRZ — raw text only, no field parsing
        var mrzResults = _mrzRecognizer.RecognizeFile(imagePath);
        var mrzText = new StringBuilder();
        foreach (var r in mrzResults)
            foreach (var line in r.LineResults)
                mrzText.AppendLine(line.Text);

        // Step 2: Parse MRZ manually — your 150-line TD3 parser here
        var parsedMrz = ParseMrzManually(mrzText.ToString());

        // Step 3: Barcodes — second product, second API
        var barcodeResults = _barcodeReader.DecodeFile(imagePath);

        // Step 4: Full page text — THIRD library, no Dynamsoft option
        // var fullText = _fullTextOcr.ReadImage(imagePath);

        return new PassportResult
        {
            ParsedMrz = parsedMrz,
            Barcodes = barcodeResults.Select(b => b.BarcodeText).ToList(),
            FullPageText = null  // requires a fourth product
        };
    }

    public void Dispose()
    {
        _mrzRecognizer?.Dispose();
        _barcodeReader?.Dispose();
    }
}
Imports Dynamsoft.DLR  ' Label Recognizer — for MRZ (annual subscription)
Imports Dynamsoft.DBR  ' Barcode Reader — for any barcodes (additional license)
' Plus: a separate OCR library — for full page text (more budget)

Public Class DynamsoftPassportProcessor
    Implements IDisposable

    Private ReadOnly _mrzRecognizer As LabelRecognizer
    Private ReadOnly _barcodeReader As BarcodeReader
    ' Private ReadOnly _fullTextOcr As SomeOtherOcrLibrary  ' third product

    Public Sub New(mrzLicenseKey As String, barcodeLicenseKey As String)
        ' License each product independently
        LabelRecognizer.InitLicense(mrzLicenseKey)
        _mrzRecognizer = New LabelRecognizer()

        ' Configure MRZ template — JSON required before any recognition
        Dim mrzTemplate As String = "{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ_Passport"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }"
        _mrzRecognizer.AppendSettingsFromString(mrzTemplate)

        ' Second product, second license key
        BarcodeReader.InitLicense(barcodeLicenseKey)
        _barcodeReader = New BarcodeReader()
    End Sub

    Public Function ProcessPassport(imagePath As String) As PassportResult
        ' Step 1: Extração de MRZ — raw text only, no field parsing
        Dim mrzResults = _mrzRecognizer.RecognizeFile(imagePath)
        Dim mrzText = New StringBuilder()
        For Each r In mrzResults
            For Each line In r.LineResults
                mrzText.AppendLine(line.Text)
            Next
        Next

        ' Step 2: Parse MRZ manually — your 150-line TD3 parser here
        Dim parsedMrz = ParseMrzManually(mrzText.ToString())

        ' Step 3: Barcodes — second product, second API
        Dim barcodeResults = _barcodeReader.DecodeFile(imagePath)

        ' Step 4: Full page text — THIRD library, no Dynamsoft option
        ' Dim fullText = _fullTextOcr.ReadImage(imagePath)

        Return New PassportResult With {
            .ParsedMrz = parsedMrz,
            .Barcodes = barcodeResults.Select(Function(b) b.BarcodeText).ToList(),
            .FullPageText = Nothing  ' requires a fourth product
        }
    End Function

    Public Sub Dispose() Implements IDisposable.Dispose
        If _mrzRecognizer IsNot Nothing Then _mrzRecognizer.Dispose()
        If _barcodeReader IsNot Nothing Then _barcodeReader.Dispose()
    End Sub
End Class
$vbLabelText   $csharpLabel

O código acima ainda não lida com entrada de PDF. Se a digitalização do passaporte chegar em formato PDF em vez de JPEG, você deverá adicionar uma biblioteca de renderização de PDF antes de executar qualquer uma dessas etapas. A integração total para um fluxo de trabalho de passaporte real: quatro produtos, quatro chaves de licença, quatro superfícies de manutenção.

Abordagem IronOCR

O IronOCR lida com o mesmo fluxo de trabalho de passaportes — análise de MRZ, OCR de página inteira, códigos de barras e entrada de PDF — em um único pacote:

using IronOcr;

public class IronOcrPassportProcessor
{
    private readonly IronTesseract _ocr;

    public IronOcrPassportProcessor()
    {
        _ocr = new IronTesseract();
        _ocr.Configuration.ReadBarCodes = true;  // barcodes included
    }

    public CompletePassportResult ProcessPassport(string imagePath)
    {
        // Structured MRZ fields — no manual parsing required
        var mrzData = _ocr.ReadPassport(imagePath);

        // Full page OCR + barcodes in the same call
        var fullResult = _ocr.Read(imagePath);

        return new CompletePassportResult
        {
            // MRZ fields are already parsed properties
            DocumentType    = mrzData.DocumentType,
            IssuingCountry  = mrzData.IssuingCountry,
            Surname         = mrzData.Surname,
            GivenNames      = mrzData.GivenNames,
            PassportNumber  = mrzData.DocumentNumber,
            Nationality     = mrzData.Nationality,
            DateOfBirth     = mrzData.DateOfBirth,
            ExpiryDate      = mrzData.ExpiryDate,
            RawMrz          = mrzData.MRZ,

            // Full page text from same package
            FullPageText    = fullResult.Text,

            // Barcodes alongside text — no separate product
            Barcodes        = fullResult.Barcodes.Select(b => b.Value).ToList(),

            Confidence      = fullResult.Confidence
        };
    }
}
using IronOcr;

public class IronOcrPassportProcessor
{
    private readonly IronTesseract _ocr;

    public IronOcrPassportProcessor()
    {
        _ocr = new IronTesseract();
        _ocr.Configuration.ReadBarCodes = true;  // barcodes included
    }

    public CompletePassportResult ProcessPassport(string imagePath)
    {
        // Structured MRZ fields — no manual parsing required
        var mrzData = _ocr.ReadPassport(imagePath);

        // Full page OCR + barcodes in the same call
        var fullResult = _ocr.Read(imagePath);

        return new CompletePassportResult
        {
            // MRZ fields are already parsed properties
            DocumentType    = mrzData.DocumentType,
            IssuingCountry  = mrzData.IssuingCountry,
            Surname         = mrzData.Surname,
            GivenNames      = mrzData.GivenNames,
            PassportNumber  = mrzData.DocumentNumber,
            Nationality     = mrzData.Nationality,
            DateOfBirth     = mrzData.DateOfBirth,
            ExpiryDate      = mrzData.ExpiryDate,
            RawMrz          = mrzData.MRZ,

            // Full page text from same package
            FullPageText    = fullResult.Text,

            // Barcodes alongside text — no separate product
            Barcodes        = fullResult.Barcodes.Select(b => b.Value).ToList(),

            Confidence      = fullResult.Confidence
        };
    }
}
Imports IronOcr

Public Class IronOcrPassportProcessor
    Private ReadOnly _ocr As IronTesseract

    Public Sub New()
        _ocr = New IronTesseract()
        _ocr.Configuration.ReadBarCodes = True ' barcodes included
    End Sub

    Public Function ProcessPassport(imagePath As String) As CompletePassportResult
        ' Structured MRZ fields — no manual parsing required
        Dim mrzData = _ocr.ReadPassport(imagePath)

        ' Full page OCR + barcodes in the same call
        Dim fullResult = _ocr.Read(imagePath)

        Return New CompletePassportResult With {
            ' MRZ fields are already parsed properties
            .DocumentType = mrzData.DocumentType,
            .IssuingCountry = mrzData.IssuingCountry,
            .Surname = mrzData.Surname,
            .GivenNames = mrzData.GivenNames,
            .PassportNumber = mrzData.DocumentNumber,
            .Nationality = mrzData.Nationality,
            .DateOfBirth = mrzData.DateOfBirth,
            .ExpiryDate = mrzData.ExpiryDate,
            .RawMrz = mrzData.MRZ,

            ' Full page text from same package
            .FullPageText = fullResult.Text,

            ' Barcodes alongside text — no separate product
            .Barcodes = fullResult.Barcodes.Select(Function(b) b.Value).ToList(),

            .Confidence = fullResult.Confidence
        }
    End Function
End Class
$vbLabelText   $csharpLabel

Um pacote, uma chave de licença, uma API. Tanto o guia de leitura de passaportes quanto o recurso de leitura de código de barras são abordados na documentação do IronOCR no mesmo contexto do produto, pois se trata do mesmo produto.

Custo e complexidade de múltiplos produtos

A construção de um scanner de inventário para armazém demonstra a divergência do modelo de custos de forma mais clara. O sistema precisa ler rótulos de produtos (texto), escanear códigos de barras (QR/EAN) e processar PDFs de remessa anexados. Com a Dynamsoft, são três produtos licenciados separadamente, com padrões de inicialização distintos.

Abordagem Dynamsoft

// Dynamsoft warehouse scanner — THREE products, THREE license keys

using Dynamsoft.DLR;  // Label Recognizer — product labels
using Dynamsoft.DBR;  // Barcode Reader — product barcodes
using Dynamsoft.DDN;  // Document Normalizer — document edge detection

public class DynamsoftWarehouseScanner : IDisposable
{
    private readonly LabelRecognizer _labelRecognizer;
    private readonly BarcodeReader _barcodeReader;
    private readonly DocumentNormalizer _documentNormalizer;

    public DynamsoftWarehouseScanner(
        string labelLicenseKey,
        string barcodeLicenseKey,
        string documentLicenseKey)
    {
        LabelRecognizer.InitLicense(labelLicenseKey);
        _labelRecognizer = new LabelRecognizer();

        BarcodeReader.InitLicense(barcodeLicenseKey);
        _barcodeReader = new BarcodeReader();

        DocumentNormalizer.InitLicense(documentLicenseKey);
        _documentNormalizer = new DocumentNormalizer();
    }

    public WarehouseItemResult ScanItem(string imagePath)
    {
        // Three separate API calls, three result types to aggregate manually
        var labelResults   = _labelRecognizer.RecognizeFile(imagePath);
        var barcodeResults = _barcodeReader.DecodeFile(imagePath);
        var docResults     = _documentNormalizer.Normalize(imagePath);

        // Merge three result sets into one model — your code
        return AggregateResults(labelResults, barcodeResults, docResults);
    }

    public void Dispose()
    {
        _labelRecognizer?.Dispose();
        _barcodeReader?.Dispose();
        _documentNormalizer?.Dispose();
    }
}
// Dynamsoft warehouse scanner — THREE products, THREE license keys

using Dynamsoft.DLR;  // Label Recognizer — product labels
using Dynamsoft.DBR;  // Barcode Reader — product barcodes
using Dynamsoft.DDN;  // Document Normalizer — document edge detection

public class DynamsoftWarehouseScanner : IDisposable
{
    private readonly LabelRecognizer _labelRecognizer;
    private readonly BarcodeReader _barcodeReader;
    private readonly DocumentNormalizer _documentNormalizer;

    public DynamsoftWarehouseScanner(
        string labelLicenseKey,
        string barcodeLicenseKey,
        string documentLicenseKey)
    {
        LabelRecognizer.InitLicense(labelLicenseKey);
        _labelRecognizer = new LabelRecognizer();

        BarcodeReader.InitLicense(barcodeLicenseKey);
        _barcodeReader = new BarcodeReader();

        DocumentNormalizer.InitLicense(documentLicenseKey);
        _documentNormalizer = new DocumentNormalizer();
    }

    public WarehouseItemResult ScanItem(string imagePath)
    {
        // Three separate API calls, three result types to aggregate manually
        var labelResults   = _labelRecognizer.RecognizeFile(imagePath);
        var barcodeResults = _barcodeReader.DecodeFile(imagePath);
        var docResults     = _documentNormalizer.Normalize(imagePath);

        // Merge three result sets into one model — your code
        return AggregateResults(labelResults, barcodeResults, docResults);
    }

    public void Dispose()
    {
        _labelRecognizer?.Dispose();
        _barcodeReader?.Dispose();
        _documentNormalizer?.Dispose();
    }
}
Imports Dynamsoft.DLR  ' Label Recognizer — product labels
Imports Dynamsoft.DBR  ' Barcode Reader — product barcodes
Imports Dynamsoft.DDN  ' Document Normalizer — document edge detection

Public Class DynamsoftWarehouseScanner
    Implements IDisposable

    Private ReadOnly _labelRecognizer As LabelRecognizer
    Private ReadOnly _barcodeReader As BarcodeReader
    Private ReadOnly _documentNormalizer As DocumentNormalizer

    Public Sub New(labelLicenseKey As String, barcodeLicenseKey As String, documentLicenseKey As String)
        LabelRecognizer.InitLicense(labelLicenseKey)
        _labelRecognizer = New LabelRecognizer()

        BarcodeReader.InitLicense(barcodeLicenseKey)
        _barcodeReader = New BarcodeReader()

        DocumentNormalizer.InitLicense(documentLicenseKey)
        _documentNormalizer = New DocumentNormalizer()
    End Sub

    Public Function ScanItem(imagePath As String) As WarehouseItemResult
        ' Three separate API calls, three result types to aggregate manually
        Dim labelResults = _labelRecognizer.RecognizeFile(imagePath)
        Dim barcodeResults = _barcodeReader.DecodeFile(imagePath)
        Dim docResults = _documentNormalizer.Normalize(imagePath)

        ' Merge three result sets into one model — your code
        Return AggregateResults(labelResults, barcodeResults, docResults)
    End Function

    Public Sub Dispose() Implements IDisposable.Dispose
        _labelRecognizer?.Dispose()
        _barcodeReader?.Dispose()
        _documentNormalizer?.Dispose()
    End Sub
End Class
$vbLabelText   $csharpLabel

Os PDFs de remessa ainda exigem um quarto produto — o Dynamsoft não possui OCR nativo para PDF. Licenciamento anual para três produtos Dynamsoft por servidor: a partir de US$ 5.997 por ano. Adicione uma biblioteca de PDFs e você já estará gastando mais de US$ 6.300 por ano, antes mesmo de escrever uma única linha de código de negócios.

Abordagem IronOCR

using IronOcr;

public class IronOcrWarehouseScanner
{
    private readonly IronTesseract _ocr;

    public IronOcrWarehouseScanner()
    {
        _ocr = new IronTesseract();
        _ocr.Configuration.ReadBarCodes = true;  // barcodes in same pass
    }

    public WarehouseItemResult ScanItem(string imagePath)
    {
        // One call: text + barcodes + structured word positions
        var result = _ocr.Read(imagePath);

        return new WarehouseItemResult
        {
            AllText    = result.Text,
            Barcodes   = result.Barcodes.Select(b => new BarcodeInfo
                         { Format = b.Format.ToString(), Value = b.Value }).ToList(),
            Confidence = result.Confidence
        };
    }

    public string ScanLabelRegion(string imagePath, int x, int y, int width, int height)
    {
        // Target a specific label area — no template JSON required
        var region = new CropRectangle(x, y, width, height);
        using var input = new OcrInput();
        input.LoadImage(imagePath, region);
        input.Deskew();
        input.Contrast();

        return _ocr.Read(input).Text;
    }

    public string ProcessShipmentPdf(string pdfPath)
    {
        // Native PDF — no external library, no page conversion loop
        return _ocr.Read(pdfPath).Text;
    }
}
using IronOcr;

public class IronOcrWarehouseScanner
{
    private readonly IronTesseract _ocr;

    public IronOcrWarehouseScanner()
    {
        _ocr = new IronTesseract();
        _ocr.Configuration.ReadBarCodes = true;  // barcodes in same pass
    }

    public WarehouseItemResult ScanItem(string imagePath)
    {
        // One call: text + barcodes + structured word positions
        var result = _ocr.Read(imagePath);

        return new WarehouseItemResult
        {
            AllText    = result.Text,
            Barcodes   = result.Barcodes.Select(b => new BarcodeInfo
                         { Format = b.Format.ToString(), Value = b.Value }).ToList(),
            Confidence = result.Confidence
        };
    }

    public string ScanLabelRegion(string imagePath, int x, int y, int width, int height)
    {
        // Target a specific label area — no template JSON required
        var region = new CropRectangle(x, y, width, height);
        using var input = new OcrInput();
        input.LoadImage(imagePath, region);
        input.Deskew();
        input.Contrast();

        return _ocr.Read(input).Text;
    }

    public string ProcessShipmentPdf(string pdfPath)
    {
        // Native PDF — no external library, no page conversion loop
        return _ocr.Read(pdfPath).Text;
    }
}
Imports IronOcr

Public Class IronOcrWarehouseScanner
    Private ReadOnly _ocr As IronTesseract

    Public Sub New()
        _ocr = New IronTesseract()
        _ocr.Configuration.ReadBarCodes = True ' barcodes in same pass
    End Sub

    Public Function ScanItem(imagePath As String) As WarehouseItemResult
        ' One call: text + barcodes + structured word positions
        Dim result = _ocr.Read(imagePath)

        Return New WarehouseItemResult With {
            .AllText = result.Text,
            .Barcodes = result.Barcodes.Select(Function(b) New BarcodeInfo With {
                .Format = b.Format.ToString(),
                .Value = b.Value
            }).ToList(),
            .Confidence = result.Confidence
        }
    End Function

    Public Function ScanLabelRegion(imagePath As String, x As Integer, y As Integer, width As Integer, height As Integer) As String
        ' Target a specific label area — no template JSON required
        Dim region = New CropRectangle(x, y, width, height)
        Using input As New OcrInput()
            input.LoadImage(imagePath, region)
            input.Deskew()
            input.Contrast()

            Return _ocr.Read(input).Text
        End Using
    End Function

    Public Function ProcessShipmentPdf(pdfPath As String) As String
        ' Native PDF — no external library, no page conversion loop
        Return _ocr.Read(pdfPath).Text
    End Function
End Class
$vbLabelText   $csharpLabel

Para a documentação de OCR baseada em região e o guia de entrada de PDF , o IronOCR abrange ambos sem a necessidade de produtos adicionais.

Modelo de Implantação

Ambas as bibliotecas funcionam localmente, sem transmissão de dados de documentos para a nuvem. As principais diferenças de implementação envolvem padrões de inicialização, gerenciamento de arquivos de configuração e o que cada biblioteca inclui em seu artefato de implementação.

Abordagem Dynamsoft

A Dynamsoft exige chamadas de inicialização estática na classe SDK antes de criar qualquer instância. Cada produto possui seu próprio padrão de inicialização, e a chave de licença ativa apenas esse produto específico. Arquivos de configuração de template — os documentos de configurações JSON para MRZ, VIN ou padrões de etiquetas personalizadas — devem estar presentes e ser corretamente referenciados em tempo de execução. Uma implantação que inclui Reconhecedor de Etiquetas e Leitor de Código de Barras gerencia dois fluxos de ativação, dois conjuntos de templates e duas cadeias Dispose.

Para implantações em armazéns ou quiosques, a dependência do arquivo de configuração adiciona um artefato de implantação além dos binários. Os modelos JSON são arquivos separados, não compilados no pacote. Configurar incorretamente o caminho do template em um novo servidor e o reconhecimento retorna silenciosamente resultados vazios ou lança uma exceção em tempo de execução durante a chamada AppendSettingsFromString.

Abordagem IronOCR

O IronOCR é distribuído como um único pacote NuGet . A ativação da licença consiste na atribuição de uma única linha de código:

// Application startup — one line, works for all features
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
// Application startup — one line, works for all features
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
' Application startup — one line, works for all features
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
$vbLabelText   $csharpLabel

Não há arquivos de modelo. Sem gerenciamento nativo de binários. Não existe pasta tessdata. O guia de implantação do Docker requer apenas libgdiplus noLinux— uma linha apt-get install no Dockerfile.

FROM mcr.microsoft.com/dotnet/aspnet:8.0
RUN apt-get update && apt-get install -y libgdiplus
COPY --from=build /app/publish /app
WORKDIR /app
ENTRYPOINT ["dotnet", "YourApp.dll"]

O mesmo pacote é compatível com Linux , AWS Lambda e Azure App Service sem necessidade de configuração específica para cada plataforma. Para equipes que executam pipelines de CI/CD, não há arquivos de modelo para controlar versões ou implantar artefatos separadamente.

Referência de Mapeamento de API

Reconhecedor de rótulos Dynamsoft Equivalente de IronOCR
LabelRecognizer.InitLicense(key) IronOcr.License.LicenseKey = key
new LabelRecognizer() new IronTesseract()
_recognizer.AppendSettingsFromString(json) Não é necessário — o motor é configurado automaticamente.
_recognizer.RecognizeFile(path) ocr.Read(path)
_recognizer.RecognizeByFile(path, "") ocr.Read(path)
result.LineResults[i].Text result.Lines[i].Text
Analisador TD3 MRZ manual (mais de 150 linhas) ocr.ReadPassport(path).Surname etc.
BarcodeReader.InitLicense(key) (produto separado) ocr.Configuration.ReadBarCodes = true
_barcodeReader.DecodeFile(path) result.Barcodes (mesma chamada que OCR)
barcode.BarcodeFormatString barcode.Format.ToString()
barcode.BarcodeText barcode.Value
DocumentNormalizer.InitLicense(key) (produto separado) Não é necessário
Sem suporte para PDF ocr.Read("document.pdf")
Não há saída em PDF pesquisável. result.SaveAsSearchablePdf(path)
recognizer.Dispose() using var ocr = new IronTesseract()

Quando as equipes consideram migrar do Dynamsoft para o IronOCR

O escopo da aplicação se expande para além de MRZ ou rótulos.

A maioria das migrações ocorre quando um projeto começa de forma restrita — "apenas leitura de passaportes MRZ" — e, em seguida, surgem os requisitos do produto. O cliente deseja arquivar os passaportes digitalizados como PDFs pesquisáveis. A equipe de conformidade deseja realizar a verificação OCR dos vistos. A fila de suporte contém chamados sobre PDFs que o Dynamsoft não consegue processar. Nesse ponto, a equipe mantém o Dynamsoft para MRZ, Plus de uma segunda biblioteca OCR para todo o resto. Dois contratos de licença, dois planos de manutenção, dois padrões de API na mesma base de código.IronOCR lida com o requisito original de MRZ através de ReadPassport() e os requisitos expandidos através da mesma instância IronTesseract. Equipes que migram de um sistema com duas bibliotecas para um único pacote geralmente relatam uma redução de 30 a 40% no código da camada de integração.

Os custos de assinatura anual não são sustentáveis.

Os custos de licenciamento multi-produto da Dynamsoft se acumulam anualmente — entre em contato com a Dynamsoft para preços atuais. Ao longo de vários anos, as taxas de assinatura anual combinadas para múltiplos produtos podem, substancialmente, exceder o custo único $999 do IronOCR. O modelo de licenciamento perpétuo é mais relevante para produtos com uma vida útil comercial definida — um sistema de processamento de documentos governamentais que funcionará por sete anos não deseja uma dependência de renovação anual de um fornecedor especializado para um componente central.

É necessário inserir um arquivo PDF.

O Reconhecedor de rótulos Dynamsoft não possui suporte nativo para PDF. Todo documento entregue em formato PDF requer uma etapa de pré-processamento: renderizar cada página em uma imagem, passar a imagem pelo Dynamsoft, coletar e remontar os resultados. Esse processo adiciona uma dependência de renderização de PDF, um loop de iteração de páginas e um problema de mapeamento de coordenadas caso seja necessário correlacionar os resultados do reconhecimento com a geometria original do PDF.IronOCR lê PDFs nativamente — ocr.Read("passport-scans.pdf") processa todas as páginas, e result.Pages oferece acesso por página ao texto, palavras e pontuações de confiança. Para equipes em que 20% ou mais das entradas chegam em formato PDF, a solução alternativa da Dynamsoft adiciona uma carga de manutenção significativa sempre que a biblioteca de renderização de PDF é atualizada.

O imposto sobre a integração de múltiplos produtos é muito alto.

Todo produto adicional da Dynamsoft é uma chamada de inicialização estática separada, uma cadeia Dispose separada, e um arquivo de configuração JSON separado para gerenciar. Equipes que integraram três produtos da Dynamsoft relatam que a superfície de integração é o principal custo de manutenção — e não a qualidade do reconhecimento. A rotação de chaves de licença, as atualizações de versão do SDK e a implantação de arquivos de modelo devem ser coordenadas simultaneamente nos três produtos. O modelo de pacote único do IronOCR significa uma única versão para atualizar, uma única chave de licença para alternar e uma única interface de API para manter, independentemente de quantas funcionalidades de OCR o aplicativo utilize.

São necessários documentos internacionais.

O Reconhecedor de rótulos Dynamsoft foi desenvolvido com base nos formatos MRZ de caracteres latinos, conforme o documento 9303 da OACI. Aplicativos que processam documentos de identidade em idiomas CJK, passaportes em alfabeto árabe ou etiquetas de remessa multilíngues atingem rapidamente os limites de cobertura de idiomas. O IronOCR inclui mais de 125 pacotes de idiomas como pacotes NuGet individuais — árabe, chinês simplificado, chinês tradicional, japonês, coreano e muito mais. Cada um instala via dotnet add package IronOcr.Languages.Arabic sem alterar o código de reconhecimento. O guia de múltiplos idiomas aborda o reconhecimento multilíngue simultâneo em poucas linhas de configuração.

Considerações Comuns de Migração

Substituindo o analisador MRZ

O passo de migração mais imediato é substituir a combinação do RecognizeFile da Dynamsoft + analisador TD3 manual por ReadPassport. O caminho de extração da Dynamsoft retorna texto bruto como P<GBRSMITH<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<< e requer mais de 150 linhas de análise de deslocamento de caracteres para o formato TD3. O substituto do IronOCR:

// Before: Dynamsoft raw extraction + manual 150-line parser
var results = _recognizer.RecognizeFile(imagePath);
var rawMrz = string.Join("\n", results.SelectMany(r => r.LineResults).Select(l => l.Text));
var parsed = MyTd3Parser.Parse(rawMrz);  // delete this file

// After:IronOCR parsed output directly
var passportData = new IronTesseract().ReadPassport(imagePath);
string surname  = passportData.Surname;
string docNum   = passportData.DocumentNumber;
DateTime? dob   = passportData.DateOfBirth;
// Before: Dynamsoft raw extraction + manual 150-line parser
var results = _recognizer.RecognizeFile(imagePath);
var rawMrz = string.Join("\n", results.SelectMany(r => r.LineResults).Select(l => l.Text));
var parsed = MyTd3Parser.Parse(rawMrz);  // delete this file

// After:IronOCR parsed output directly
var passportData = new IronTesseract().ReadPassport(imagePath);
string surname  = passportData.Surname;
string docNum   = passportData.DocumentNumber;
DateTime? dob   = passportData.DateOfBirth;
Imports System
Imports System.Linq

' Before: Dynamsoft raw extraction + manual 150-line parser
Dim results = _recognizer.RecognizeFile(imagePath)
Dim rawMrz = String.Join(vbCrLf, results.SelectMany(Function(r) r.LineResults).Select(Function(l) l.Text))
Dim parsed = MyTd3Parser.Parse(rawMrz)  ' delete this file

' After: IronOCR parsed output directly
Dim passportData = New IronTesseract().ReadPassport(imagePath)
Dim surname As String = passportData.Surname
Dim docNum As String = passportData.DocumentNumber
Dim dob As DateTime? = passportData.DateOfBirth
$vbLabelText   $csharpLabel

O analisador sintático manual foi completamente eliminado. A detecção de formato TD1 (crachás), TD2 (vistos) e TD3 (passaportes) é automática dentro de ReadPassport. O guia de leitura de passaportes documenta cada campo preenchido.

Consolidação da Inicialização de Múltiplos Produtos

As aplicações multi-produtos da Dynamsoft têm múltiplas chamadas estáticas InitLicense na inicialização, cada uma exigindo sua própria chave. Consolide-os em uma única linha de licença do IronOCR e remova os blocos de inicialização por produto:

// Before: three static initializations
LabelRecognizer.InitLicense(mrzKey);
BarcodeReader.InitLicense(barcodeKey);
DocumentNormalizer.InitLicense(documentKey);

// After: one line, all capabilities enabled
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");

var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;  // barcodes included automatically
// Before: three static initializations
LabelRecognizer.InitLicense(mrzKey);
BarcodeReader.InitLicense(barcodeKey);
DocumentNormalizer.InitLicense(documentKey);

// After: one line, all capabilities enabled
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");

var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;  // barcodes included automatically
Imports System

' Before: three static initializations
LabelRecognizer.InitLicense(mrzKey)
BarcodeReader.InitLicense(barcodeKey)
DocumentNormalizer.InitLicense(documentKey)

' After: one line, all capabilities enabled
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")

Dim ocr As New IronTesseract()
ocr.Configuration.ReadBarCodes = True  ' barcodes included automatically
$vbLabelText   $csharpLabel

As chamadas Dispose existentes da Dynamsoft em classes de serviço devem ser substituídas por blocos using padrão em instâncias IronTesseract, ou uma única instância reutilizada registrada no contêiner DI. O guia de configuração do IronTesseract abrange ambos os padrões.

Adicionando suporte a PDF

A funcionalidade mais comum que as equipes adquirem durante a migração é a entrada nativa de PDF — algo que a Dynamsoft nunca ofereceu. Após a remoção do loop de conversão de PDF para imagem, a leitura nativa de PDFs não requer alterações de código além do caminho de entrada:

// Before: PDF rendering loop (50+ lines with external library)
var pdfDoc = PdfDocument.Load(pdfPath);
foreach (var page in pdfDoc.Pages)
{
    var bitmap = page.RenderAsBitmap(150);
    var results = _labelRecognizer.RecognizeFile(SaveBitmapToTemp(bitmap));
    // aggregate...
}

// After: native PDF — no loop, no external library
var result = new IronTesseract().Read(pdfPath);
string fullText = result.Text;
result.SaveAsSearchablePdf("searchable-output.pdf");
// Before: PDF rendering loop (50+ lines with external library)
var pdfDoc = PdfDocument.Load(pdfPath);
foreach (var page in pdfDoc.Pages)
{
    var bitmap = page.RenderAsBitmap(150);
    var results = _labelRecognizer.RecognizeFile(SaveBitmapToTemp(bitmap));
    // aggregate...
}

// After: native PDF — no loop, no external library
var result = new IronTesseract().Read(pdfPath);
string fullText = result.Text;
result.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr

' Before: PDF rendering loop (50+ lines with external library)
Dim pdfDoc = PdfDocument.Load(pdfPath)
For Each page In pdfDoc.Pages
    Dim bitmap = page.RenderAsBitmap(150)
    Dim results = _labelRecognizer.RecognizeFile(SaveBitmapToTemp(bitmap))
    ' aggregate...
Next

' After: native PDF — no loop, no external library
Dim result = New IronTesseract().Read(pdfPath)
Dim fullText As String = result.Text
result.SaveAsSearchablePdf("searchable-output.pdf")
$vbLabelText   $csharpLabel

Para as equipes que também precisam produzir arquivos PDF pesquisáveis a partir de entradas digitalizadas, SaveAsSearchablePdf é uma única chamada de método. O guia em PDF pesquisável detalha as opções de saída.

Pré-processamento para qualidade de rótulos industriais

O mecanismo de modelos da Dynamsoft é otimizado para condições de rotulagem controladas. Para imagens degradadas — etiquetas desgastadas, embalagens com baixo contraste, digitalizações industriais distorcidas — o pipeline de pré-processamento do IronOCR resolve o problema. O guia de correção da qualidade da imagem abrange cada filtro. Para fluxos de trabalho específicos de etiquetas, Deskew e Contrast são os mais úteis:

using var input = new OcrInput();
input.LoadImage(labelImagePath);
input.Deskew();    // correct rotation from handheld scanner
input.Contrast();  // recover faded label text
input.DeNoise();   // remove packaging texture interference

var labelText = new IronTesseract().Read(input).Text;
Console.WriteLine($"Confidence: {new IronTesseract().Read(input).Confidence}%");
using var input = new OcrInput();
input.LoadImage(labelImagePath);
input.Deskew();    // correct rotation from handheld scanner
input.Contrast();  // recover faded label text
input.DeNoise();   // remove packaging texture interference

var labelText = new IronTesseract().Read(input).Text;
Console.WriteLine($"Confidence: {new IronTesseract().Read(input).Confidence}%");
Imports IronOcr

Using input As New OcrInput()
    input.LoadImage(labelImagePath)
    input.Deskew()    ' correct rotation from handheld scanner
    input.Contrast()  ' recover faded label text
    input.DeNoise()   ' remove packaging texture interference

    Dim labelText = New IronTesseract().Read(input).Text
    Console.WriteLine($"Confidence: {New IronTesseract().Read(input).Confidence}%")
End Using
$vbLabelText   $csharpLabel

Funcionalidades adicionais do IronOCR

Funcionalidades não abordadas nas seções acima que as equipes costumam usar após a migração:

  • Reconhecimento de escrita à mão : Processa notas e anotações manuscritas juntamente com texto impresso — uma funcionalidade que a Dynamsoft não oferece.
  • Processamento de documentos digitalizados : PDFs digitalizados com várias páginas e pré-processamento automático por página.
  • Extração de tabelas : Detectar e extrair dados tabulares de faturas, manifestos e planilhas de dados.
  • Exportação hOCR : Exporte os resultados do reconhecimento como HTML com as coordenadas da caixa delimitadora para análise de layout posterior.
  • OCR assíncrono : reconhecimento não bloqueante para ASP.NET e aplicações de servidor de alto desempenho.
  • Acompanhamento do progresso : Monitore trabalhos em lote com várias páginas e utilize funções de retorno de chamada para acompanhar o progresso.
  • Índice com mais de 125 idiomas : Lista completa de pacotes NuGet de idiomas suportados, incluindo scripts não latinos. Leitura de cheques/MICR : Reconhecimento de caracteres de tinta magnética para processamento de documentos financeiros — mais um caso de uso especializado abordado em um único pacote.
  • Índices de confiança por palavra : Sinais de qualidade precisos para fluxos de trabalho automatizados de revisão de documentos

Compatibilidade com .NET e Preparação para o Futuro

O IronOCR tem como alvo o .NET 8 e o .NET 9 como ambientes de execução suportados de primeira classe, com total compatibilidade retroativa com o .NET Framework 4.6.2 e o .NET Core 3.1. A biblioteca é distribuída como um único pacote NuGet que resolve automaticamente o binário correto paraWindowsx64,Windowsx86,Linuxx64,macOSx64 emacOSARM por meio do grafo de identificadores de tempo de execução do NuGet — sem referências condicionais de pacotes, sem arquivos de projeto específicos da plataforma. O Reconhecedor de rótulos Dynamsoft também oferece suporte a ambientes de execução .NET modernos, mas seu modelo multiproduto significa que a compatibilidade de cada produto com o .NET deve ser verificada e atualizada independentemente. O ritmo ativo de desenvolvimento do IronOCR mantém as atualizações do pacote NuGet alinhadas a cada ciclo de lançamento do .NET , e o modelo de pacote único significa que a compatibilidade com o .NET 10, prevista para o final de 2026, será aplicada uniformemente a todos os recursos, sem rastreamento por produto.

Conclusão

O Reconhecedor de rótulos Dynamsoft é um especialista tecnicamente capaz. Seja para um quiosque que processa apenas códigos MRZ de passaportes ou para uma estação de linha de montagem que lê apenas códigos VIN, seu mecanismo de reconhecimento baseado em modelos executa a tarefa específica de forma confiável. O problema é que as aplicações reais raramente permanecem restritas a um nicho específico. Os passaportes precisam ter suas páginas de dados completas digitalizadas por OCR. As etiquetas de envio chegam em formato PDF. Os sistemas de inventário precisam de código de barras e texto na mesma passagem. Cada expansão de escopo aciona outro produto da Dynamsoft, outra licença anual e outra superfície de API para manter.

O modelo de custos torna isso concreto. Os totais de vários anos para MRZ mais leitura de código de barras em uma equipe de desenvolvimento usando o modelo de assinatura anual da Dynamsoft se acumulam significativamente.IronOCR cobre ambas as capacidades — além de PDF nativo, saída PDF pesquisável, OCR de documento completo, mais de 125 idiomas e pré-processamento — no $999 único. A própria migração é amplamente mecânica: substitua RecognizeFile por ocr.Read, delete o analisador TD3 MRZ manual, habilite ReadBarCodes = true e remova o loop de renderização de PDF externo.

A diferença arquitetônica não se resume apenas ao custo. O design da Dynamsoft força as equipes a pensarem em termos de produtos, e não de funcionalidades — a perguntarem "qual produto da Dynamsoft resolve isso?" antes de escreverem qualquer código. O design do IronOCR inverte isso: uma instância, uma configuração, um objeto de resultado, independentemente do conteúdo do documento. Essa diferença se agrava ao longo da vida útil de um projeto, à medida que os requisitos aumentam.

Para equipes que desenvolvem aplicativos do zero e precisam de qualquer combinação de reconhecimento de MRZ, leitura de código de barras, OCR geral de documentos ou processamento de PDF, o modelo tudo-em-um do IronOCR elimina o problema de coordenação de múltiplos produtos desde o início. Para equipes que atualmente executam vários produtos Dynamsoft juntamente com uma biblioteca OCR separada, o caminho de migração consolida essa interface em uma única dependência. A central de documentação do IronOCR abrange todos os recursos discutidos aqui, com exemplos de código funcionais e guias de implantação.

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

Perguntas frequentes

O que é o SDK de OCR da Dynamsoft?

O SDK de OCR da Dynamsoft é uma solução de OCR usada por desenvolvedores e empresas para extrair texto de imagens e documentos. É uma das várias opções de OCR avaliadas juntamente com o IronOCR para desenvolvimento de aplicações .NET.

Como o IronOCR se compara ao SDK de OCR da Dynamsoft para desenvolvedores .NET?

IronOCR é uma biblioteca OCR .NET nativa do NuGet que utiliza o IronTesseract como mecanismo principal. Comparada ao SDK OCR da Dynamsoft, oferece implantação mais simples (sem instaladores de SDK), preço fixo e uma API C# limpa, sem interoperabilidade COM ou dependências de nuvem.

O IronOCR é mais fácil de configurar do que o SDK OCR da Dynamsoft?

O IronOCR é instalado por meio de um único pacote NuGet. Não há instaladores de SDK, arquivos de licença para copiar, componentes COM para registrar ou binários de tempo de execução separados para gerenciar. Todo o mecanismo de OCR está incluído no pacote.

Quais são as diferenças de precisão entre o SDK de OCR da Dynamsoft e o IronOCR?

O IronOCR alcança alta precisão de reconhecimento para documentos comerciais padrão, faturas, recibos e formulários digitalizados. Para documentos muito degradados ou com escritas incomuns, a precisão varia de acordo com a qualidade da fonte. O IronOCR inclui filtros de pré-processamento de imagem para melhorar o reconhecimento em entradas de baixa qualidade.

O IronOCR suporta extração de texto de PDFs?

Sim. O IronOCR extrai texto tanto de PDFs nativos quanto de imagens digitalizadas de PDFs em uma única chamada. Ele também suporta arquivos TIFF com várias páginas, imagens e fluxos de dados. Para PDFs digitalizados, o OCR é aplicado página por página, com objetos de resultado por página.

Como se compara o licenciamento do SDK de OCR da Dynamsoft ao do IronOCR?

O IronOCR utiliza uma licença perpétua com preço fixo, sem cobranças por página ou por digitalização. Organizações que processam grandes volumes de documentos pagam o mesmo valor de licença, independentemente do volume. Detalhes e preços por volume estão disponíveis na página de licenciamento do IronOCR.

Quais idiomas o IronOCR suporta?

O IronOCR suporta 127 idiomas através de pacotes de idiomas NuGet separados. Adicionar um idioma requer um único comando 'dotnet add package IronOcr.Languages.{Idioma}'. Não é necessário inserir arquivos manualmente nem configurar caminhos.

Como faço para instalar o IronOCR em um projeto .NET ?

Instale via NuGet: 'Install-Package IronOcr' no Console do Gerenciador de Pacotes ou 'dotnet add package IronOcr' na CLI. Pacotes de idiomas adicionais são instalados da mesma forma. Não é necessário instalar o SDK nativo.

O IronOCR é adequado para Docker e implantações em contêineres, ao contrário do Dynamsoft OCR?

Sim. O IronOCR funciona em contêineres Docker por meio de seu pacote NuGet. A chave de licença é definida por meio de uma variável de ambiente. Não são necessários arquivos de licença, caminhos de SDK ou montagens de volume para o próprio mecanismo de OCR.

Posso experimentar o IronOCR antes de comprar, em comparação com o Dynamsoft OCR?

Sim. O modo de avaliação do IronOCR processa documentos e retorna resultados de OCR com uma marca d'água sobreposta. Você pode verificar a precisão em seus próprios documentos antes de adquirir uma licença.

O IronOCR suporta leitura de código de barras juntamente com extração de texto?

O IronOCR concentra-se na extração de texto e OCR. Para leitura de código de barras, a Iron Software fornece o IronBarcode como uma biblioteca complementar. Ambos estão disponíveis individualmente ou como parte do pacote Iron Suite.

É fácil migrar do SDK de OCR da Dynamsoft para o IronOCR?

A migração do SDK OCR da Dynamsoft para o IronOCR normalmente envolve a substituição das sequências de inicialização pela instanciação do IronTesseract, a remoção do gerenciamento do ciclo de vida COM e a atualização das chamadas de API. A maioria das migrações reduz significativamente a complexidade do código.

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

Equipe de Suporte Iron

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