Saltar al pie de página
COMPARAR CON OTROS COMPONENTES

AWS vs Google Vision (Comparación de características de OCR)

Dynamsoft Label Recognizer hace una cosa excepcionalmente bien: la extracción de la zona de lectura mecánica (MRZ) de los pasaportes, el escaneo del número de identificación del vehículo (VIN) de los vehículos y la lectura de etiquetas estructuradas de los embalajes industriales, y se niega a hacer cualquier otra cosa. Esa especialización tan limitada se convierte en un problema presupuestario en el momento en que su aplicación necesita un OCR general para documentos, porque entonces tendrá que licenciar Reconocedor de etiquetas Dynamsoft para MRZ, Dynamsoft Barcode Reader para códigos QR, Dynamsoft Document Normalizer para la detección de bordes, y aún así tendrá que buscar una cuarta biblioteca para gestionar documentos de página completa. IronOCR cubre todas esas capacidades en un solo paquete NuGet en $999 perpetuo.

Comprender el reconocedor de etiquetas de Dynamsoft

Dynamsoft Corporation, con sede en Vancouver, Canadá, desarrolló su producto Label Recognizer en torno a una propuesta específica: el reconocimiento fiable de texto estructurado legible por máquina en formatos restringidos. El paquete NuGet del producto es Dynamsoft.DotNet.LabelRecognizer, y su licencia comercial opera exclusivamente en suscripciones anuales — no existe opción perpetua. Contacte con Dynamsoft para precios actuales.

El modelo de reconocimiento de la biblioteca se basa en plantillas. Configuras tareas de reconocimiento a través de una API de configuración JSON (AppendSettingsFromString) y luego llamas a RecognizeFile o RecognizeByFile contra archivos de imagen. Los resultados se presentan como colecciones de líneas que contienen cadenas de texto sin formato. Analizar esas cadenas para convertirlas en datos estructurados significativos (desplazamientos de campo, conversiones de fecha, validación de dígitos de control) es enteramente responsabilidad suya.

Características arquitectónicas clave de Dynamsoft Label Recognizer:

  • Motor de reconocimiento basado en plantillas: los patrones MRZ, VIN y de etiquetas requieren configuración de plantilla JSON antes del reconocimiento.
  • Salida de texto bruto solamente: RecognizeFile devuelve objetos LineResult con cadenas de texto; sin análisis sintáctico de campos estructurados
  • Entrada solo de imágenes: No hay soporte nativo para PDF; Los archivos PDF requieren una conversión externa a imágenes antes de su procesamiento.
  • Licencia de suscripción anual: Niveles por dispositivo y por servidor disponibles; contacte con Dynamsoft para precios actuales; no one-time purchase
  • Producto independiente para cada función: la lectura de códigos de barras, la normalización de documentos y la optimización de la cámara requieren cada una un producto con licencia independiente.
  • Cobertura lingüística limitada: Centrada en formatos MRZ con caracteres latinos; carece de un amplio soporte de documentos multilingües

La API de configuración de tiempo de ejecución JSON

Cada flujo de trabajo de Reconocedor de etiquetas Dynamsoft comienza con un paso de configuración de plantilla. El reconocimiento MRZ, por ejemplo, requiere cargar un documento JSON que declare los parámetros de reconocimiento, los modelos de caracteres y las referencias de región antes de que se pueda realizar cualquier procesamiento de imagen:

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

La salida de RecognizeFile es texto MRZ bruto como P<GBRSMITH<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<<<. Para obtener Surname = "SMITH", GivenNames = "JOHN", DocumentNumber, DateOfBirth, y ExpiryDate como propiedades tipadas, implementas un analizador TD1/TD2/TD3 por ti mismo. La documentación de Dynamsoft y los archivos fuente en este repositorio estiman que ese analizador tiene aproximadamente 150 líneas de código de análisis — manejando desfases de caracteres, << separadores de nombres, desambiguación de año de dos dígitos, y validación de dígitos de control — ninguno de los cuales Dynamsoft provee.

Comprender IronOCR

IronOCR es una biblioteca OCR comercial .NET, basada en un motor Tesseract 5 optimizado con una capa de API administrada que se encarga del preprocesamiento, los formatos de entrada, la salida estructurada y el análisis especializado de documentos. La instalación es un solo comando NuGet: dotnet add package IronOcr. Sin gestión de binarios nativos, sin configuración de carpetas tessdata, sin archivos de configuración de plantillas.

Características clave:

  • Uso general y especializado: Administra OCR de documentos de página completa, PDF de varias páginas, lotes de imágenes escaneadas y formatos especializados (pasaportes, códigos de barras, matrículas) del mismo paquete.
  • Proceso de preprocesamiento automático: corrección de inclinación, reducción de ruido, ajuste de contraste, binarización y mejora de la resolución se ejecutan sin configuración manual en entradas de baja calidad.
  • Compatibilidad nativa con PDF: Lea directamente archivos PDF escaneados y digitales, incluidos los protegidos con contraseña, sin necesidad de conversiones externas.
  • Jerarquía de salida estructurada: Los resultados muestran páginas, párrafos, líneas, palabras y cuadros delimitadores de caracteres con puntuaciones de confianza.
  • Lectura de códigos de barras incorporada: Activa ocr.Configuration.ReadBarCodes = true y los códigos de barras se extraen junto con el texto en la misma pasada
  • Más de 125 paquetes de idiomas: Cada idioma se instala como un paquete NuGet independiente; no es necesario gestionar la carpeta tessdata
  • Licencias perpetuas: $999 Lite, $1,499 Plus, $2,999 Professional — compra única, todas las plataformas, todas las características incluidas
  • Implementación multiplataforma: Windows, Linux, macOS, Docker, AWS y Azure funcionan con el mismo paquete sin necesidad de configuración específica para cada plataforma.

Comparación de características

Característica Reconocedor de etiquetas Dynamsoft IronOCR
OCR de documentos generales No soportado Soporte completo
Extracción de MRZ Especializado (texto sin formato) Integrado con campos analizados
Entrada nativa de PDF No soportado
Lectura de códigos de barras Producto independiente (lector de códigos de barras Dynamsoft) Incorporado (ReadBarCodes)
Salida en PDF con capacidad de búsqueda No soportado
Soporte de idiomas Limitado (Zona de Reparación de Mercancías Latina) más de 125 idiomas
Modelo de licencia Suscripción anual únicamente Opciones perpetuas + suscripción
Productos necesarios para una cobertura completa 3+ 1

Comparación detallada de características

Característica Reconocedor de etiquetas Dynamsoft IronOCR
Alcance del reconocimiento
OCR de documentos generales No soportado
Reconocimiento de MRZ Especializado Sí (ReadPassport)
reconocimiento del VIN Especializado Sí (mediante OCR estándar)
Lectura de etiquetas industriales Especializado
Reconocimiento de escritura a mano No soportado
Extracción de tablas No soportado
Formatos de entrada
Archivos de imagen (JPG, PNG, TIFF)
PDF (nativo) No soportado
PDF protegido con contraseña No soportado
Matriz de bytes / flujo
Documentos de varias páginas agregación manual Sí (nativo)
Formatos de salida
Texto sin formato Sí (líneas sin formato)
Campos estructurados (analizados) No se proporciona Sí (Páginas, Líneas, Palabras)
PDF con función de búsqueda No soportado
hOCR No soportado
Puntuaciones de confianza Por línea Por palabra, línea y página
Preprocesamiento
Preprocesamiento automático Básico Sí (canalización inteligente)
Corrección de inclinación/rotación Limitado
Eliminación de ruido Limitado
Mejora del contraste Limitado
Normalización de DPI No se proporciona
Capacidades de integración
Lectura de códigos de barras Producto separado Incorporado en
Normalización de documentos Producto separado No es necesario
OCR basado en la región Sí (mediante plantillas) Sí (CropRectangle)
Procesamiento paralelo seguro para subprocesos
Plataforma y despliegue
Windows
Linux
macOS
Docker
Azure / AWS
Aislado de la red / sin conexión
Licencias y costos
Suscripción anual Sí (contacte con Dynamsoft para precios) Opcional
Licencia perpetua No disponible Sí ($999 una vez)
Paquete único para todas las funciones. No (3 o más productos)
Prueba gratuita 30 días

Ámbito de especialización frente a ámbito generalista

La decisión arquitectónica más importante que tomó Dynamsoft fue crear una solución especializada, no generalista. Esta decisión tiene consecuencias directas para cualquier aplicación que comience con MRZ o lectura de etiquetas, pero que eventualmente necesite más funcionalidades.

Enfoque de Dynamsoft

Dynamsoft Label Recognizer gestiona exactamente lo que describen sus plantillas JSON y nada más. Una aplicación de procesamiento de pasaportes basada en Dynamsoft necesita tres productos antes de poder gestionar un flujo de trabajo de documentos 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: Extracción 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: Extracción 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: Extracción 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
        _mrzRecognizer?.Dispose()
        _barcodeReader?.Dispose()
    End Sub
End Class
$vbLabelText   $csharpLabel

El código anterior todavía no admite la entrada de archivos PDF. Si el escaneo del pasaporte llega en formato PDF en lugar de JPEG, deberá agregar una biblioteca de renderizado de PDF antes de que se ejecute todo esto. La integración total para un flujo de trabajo de pasaporte real: cuatro productos, cuatro claves de licencia, cuatro superficies de mantenimiento.

Enfoque de IronOCR

IronOCR gestiona el mismo flujo de trabajo de pasaportes (análisis MRZ, OCR de página completa, códigos de barras y entrada de PDF) desde un único paquete:

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

Un paquete, una clave de licencia, una API. La documentación de IronOCR, tanto para la guía de lectura de pasaportes como para la función de lectura de códigos de barras , abarca ambas dentro del mismo contexto de producto, ya que se trata del mismo producto.

Costo y complejidad de múltiples productos

La construcción de un escáner de inventario de almacén demuestra la divergencia del modelo de costos de la manera más clara. El sistema debe leer las etiquetas de los productos (texto), escanear códigos de barras (QR/EAN) y procesar los archivos PDF de envío adjuntos. En el caso de Dynamsoft, se trata de tres productos con licencia independiente y patrones de inicialización separados.

Enfoque de 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

Los archivos PDF de envío aún requieren un cuarto producto: Dynamsoft no cuenta con una función OCR nativa para PDF. Licencia anual para tres productos Dynamsoft en el nivel por servidor: $5,997+/año. Si se añade una biblioteca de PDF, el coste asciende a más de 6.300 dólares al año antes incluso de escribir una sola línea de lógica de negocio.

Enfoque de 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

IronOCR cubre tanto la documentación OCR basada en regiones como la guía de entrada de PDF sin necesidad de productos adicionales.

Modelo de despliegue

Ambas bibliotecas funcionan de forma local, sin transmisión de datos de documentos a través de la nube. Las principales diferencias en el despliegue radican en los patrones de inicialización, la gestión de archivos de configuración y el contenido que cada biblioteca incluye en su artefacto de despliegue.

Enfoque de Dynamsoft

Dynamsoft requiere llamadas de inicialización estática en la clase SDK antes de crear cualquier instancia. Cada producto tiene su propio patrón de inicialización, y la clave de licencia activa únicamente ese producto específico. Los archivos de configuración de plantillas — los documentos JSON de configuración para MRZ, VIN, o patrones de etiquetas personalizados — deben estar presentes y correctamente referenciados en tiempo de ejecución. Un despliegue que incluye Label Recognizer y Barcode Reader gestiona dos flujos de activación, dos conjuntos de plantillas, y dos cadenas Dispose.

Para implementaciones en almacenes o quioscos, la dependencia del archivo de configuración agrega un artefacto de implementación más allá de los binarios. Las plantillas JSON son archivos separados, no compilados en el paquete. Configura mal la ruta de la plantilla en un nuevo servidor y el reconocimiento devuelve silenciosamente resultados vacíos o arroja un error en tiempo de ejecución durante la llamada AppendSettingsFromString.

Enfoque de IronOCR

IronOCR se implementa como un único paquete NuGet . La activación de la licencia es una asignación de cadena de una sola línea:

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

No hay archivos de plantilla. Sin gestión binaria nativa. No hay carpeta tessdata. La guía de despliegue en Docker requiere solo libgdiplus en Linux— una línea apt-get install en el 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"]

El mismo paquete es compatible con Linux , AWS Lambda y Azure App Service sin necesidad de configuración específica para cada plataforma. Para los equipos que utilizan pipelines de CI/CD, no hay archivos de plantilla que controlar mediante control de versiones o que desplegar como artefactos por separado.

Referencia de mapeo de API

Reconocedor de etiquetas Dynamsoft Equivalente a IronOCR
LabelRecognizer.InitLicense(key) IronOcr.License.LicenseKey = key
new LabelRecognizer() new IronTesseract()
_recognizer.AppendSettingsFromString(json) No es necesario: el motor se configura automáticamente.
_recognizer.RecognizeFile(path) ocr.Read(path)
_recognizer.RecognizeByFile(path, "") ocr.Read(path)
result.LineResults[i].Text result.Lines[i].Text
Analizador manual TD3 MRZ (más de 150 líneas) ocr.ReadPassport(path).Surname etc.
BarcodeReader.InitLicense(key) (producto separado) ocr.Configuration.ReadBarCodes = true
_barcodeReader.DecodeFile(path) result.Barcodes (misma llamada que OCR)
barcode.BarcodeFormatString barcode.Format.ToString()
barcode.BarcodeText barcode.Value
DocumentNormalizer.InitLicense(key) (producto separado) No es necesario
Sin soporte para PDF ocr.Read("document.pdf")
No se genera un archivo PDF con capacidad de búsqueda. result.SaveAsSearchablePdf(path)
recognizer.Dispose() using var ocr = new IronTesseract()

Cuando los equipos consideran migrar de Dynamsoft a IronOCR

El ámbito de aplicación se amplía más allá de las zonas de riesgo médico o las etiquetas.

La mayoría de las migraciones ocurren cuando un proyecto comienza de forma limitada —"solo leer pasaportes MRZ"— y luego llegan los requisitos del producto. El cliente quiere archivar los pasaportes escaneados como archivos PDF con capacidad de búsqueda. El equipo de cumplimiento normativo quiere procesar mediante OCR los sellos de visado. La cola de soporte tiene incidencias relacionadas con archivos PDF que Dynamsoft no puede procesar. En ese caso, el equipo mantiene Dynamsoft para MRZ, Plus de una segunda biblioteca OCR para todo lo demás. Dos acuerdos de licencia, dos planes de mantenimiento, dos patrones de API en el mismo código base.IronOCR maneja el requerimiento original de MRZ a través de ReadPassport() y los requerimientos ampliados a través de la misma instancia IronTesseract. Los equipos que pasan de un sistema de dos bibliotecas a un solo paquete suelen reportar una reducción del 30-40% en el código de la capa de integración.

Los costos de suscripción anual no son sostenibles.

Los costos de licenciamiento multiproducto de Dynamsoft se acumulan anualmente — contacte con Dynamsoft para precios actuales. Durante varios años, las tarifas de suscripción anual combinadas para múltiples productos pueden exceder sustancialmente el costo único de $999 de IronOCR. El modelo de licencia perpetua es más importante para productos con un ciclo de vida comercial definido — un sistema de procesamiento de documentos gubernamental que funcionará durante siete años no quiere una dependencia de renovación anual con un proveedor especializado para un componente central.

Se requiere ingresar un archivo PDF.

Dynamsoft Label Recognizer no tiene soporte nativo para PDF. Cada documento en formato PDF requiere un paso de preprocesamiento: convertir cada página en una imagen, procesar la imagen con Dynamsoft, recopilar y volver a ensamblar los resultados. Ese proceso añade una dependencia de renderizado de PDF, un bucle de iteración de página y un problema de mapeo de coordenadas si es necesario correlacionar los resultados del reconocimiento con la geometría original del PDF.IronOCR lee PDFs de forma nativa — ocr.Read("passport-scans.pdf") procesa cada página, y result.Pages te da acceso por página a texto, palabras, y puntajes de confianza. Para los equipos en los que el 20 % o más de los datos de entrada llegan en formato PDF, la solución alternativa de Dynamsoft supone una carga de mantenimiento considerable cada vez que se actualiza la biblioteca de representación de PDF.

El impuesto a la integración de múltiples productos es demasiado alto.

Cada producto adicional de Dynamsoft es una llamada de inicialización estática separada, una cadena Dispose separada, y un archivo de configuración JSON separado a gestionar. Los equipos que han integrado tres productos de Dynamsoft informan que la complejidad de la integración es el principal coste de mantenimiento, no la calidad del reconocimiento. La rotación de claves de licencia, las actualizaciones de la versión del SDK y la implementación de archivos de plantilla deben coordinarse simultáneamente en los tres productos. El modelo de paquete único de IronOCR significa que hay una sola versión para actualizar, una sola clave de licencia para rotar y una sola interfaz API para mantener, independientemente de cuántas funciones de OCR utilice la aplicación.

Se necesitan documentos internacionales.

Dynamsoft Label Recognizer se basa en formatos MRZ de caracteres latinos según el documento 9303 de la OACI. Las aplicaciones que procesan documentos de identidad en idiomas CJK, pasaportes en escritura árabe o etiquetas de envío multilingües alcanzan rápidamente los límites de cobertura lingüística.IronOCR distribuye más de 125 paquetes de idiomas como paquetes NuGet individuales: árabe, chino simplificado, chino tradicional, japonés, coreano y más. Cada uno se instala a través de dotnet add package IronOcr.Languages.Arabic sin cambiar el código de reconocimiento. La guía multilingüe explica cómo lograr el reconocimiento multilingüe simultáneo con tan solo unas líneas de configuración.

Consideraciones comunes sobre la migración

Sustitución del analizador MRZ

El paso de migración más inmediato es reemplazar la combinación Dynamsoft RecognizeFile + analizador TD3 manual con ReadPassport. La ruta de extracción de Dynamsoft devuelve texto bruto como P<GBRSMITH<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<< y requiere más de 150 líneas de análisis de desfase de caracteres para el formato TD3. El reemplazo de 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

El analizador manual se elimina por completo. La detección de formato TD1 (tarjetas de identificación), TD2 (visas), y TD3 (pasaportes) es automática dentro de ReadPassport. El manual de instrucciones para la lectura del pasaporte documenta cada campo devuelto.

Consolidación de la inicialización de múltiples productos

Las aplicaciones multiproducto de Dynamsoft tienen múltiples llamadas estáticas InitLicense al inicio, cada una requiriendo su propia clave. Consolida estos elementos en una única línea de licencia de IronOCR y elimina los bloques de inicialización por producto:

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

Las llamadas Dynamsoft Dispose existentes en las clases de servicio deben reemplazarse con bloques using estándar en instancias IronTesseract, o una sola instancia reutilizada registrada en el contenedor DI. La guía de configuración de IronTesseract abarca ambos patrones.

Agregar compatibilidad con PDF

La nueva funcionalidad más común que adquieren los equipos durante la migración es la entrada nativa de archivos PDF, algo que Dynamsoft nunca ofreció. Tras eliminar el bucle de conversión de PDF a imagen, la lectura nativa de PDF no requiere cambios en el código más allá de la ruta 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 equipos que también necesitan producir archivos PDF archivables y buscables a partir de entradas escaneadas, SaveAsSearchablePdf es una llamada de método única. El documento PDF con instrucciones y función de búsqueda detalla las opciones de salida.

Preprocesamiento para la calidad de las etiquetas industriales

El motor de plantillas de Dynamsoft está optimizado para condiciones de etiquetado controladas. Para imágenes degradadas (etiquetas desgastadas, embalajes de bajo contraste, escaneos industriales distorsionados), el proceso de preprocesamiento de IronOCR soluciona el problema. La guía de corrección de la calidad de imagen cubre cada filtro. Para flujos de trabajo específicos de etiquetas, Deskew y Contrast son los más útiles:

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 adicionales de IronOCR

Funcionalidades no cubiertas en las secciones anteriores que los equipos utilizan con frecuencia después de la migración:

Compatibilidad con .NET y preparación para el futuro

IronOCR está diseñado para .NET 8 y .NET 9 como entornos de ejecución compatibles de primera clase, con compatibilidad total con versiones anteriores hasta .NET Framework 4.6.2 y .NET Core 3.1. La biblioteca se distribuye como un único paquete NuGet que resuelve automáticamente el binario de plataforma correcto para Windowsx64, Windowsx86, Linuxx64, macOSx64 y macOSARM a través del gráfico de identificadores de tiempo de ejecución de NuGet, sin referencias de paquetes condicionales ni archivos de proyecto específicos de la plataforma. Reconocedor de etiquetas Dynamsoft también es compatible con los entornos de ejecución .NET modernos, pero su modelo multiproducto implica que la compatibilidad de cada producto con .NET debe verificarse y actualizarse de forma independiente. El ritmo de desarrollo activo de IronOCR mantiene las actualizaciones de los paquetes NuGet alineadas con cada ciclo de lanzamiento de .NET , y el modelo de paquete único significa que la compatibilidad con .NET 10, prevista para finales de 2026, se aplicará de manera uniforme a todas las características sin necesidad de un seguimiento por producto.

Conclusión

Dynamsoft Label Recognizer es un especialista con gran capacidad técnica. Para un quiosco que procesa únicamente códigos MRZ de pasaportes, o una estación de línea de montaje que lee solo códigos VIN, su motor de reconocimiento basado en plantillas realiza la tarea específica de forma fiable. El problema es que las aplicaciones reales rara vez se limitan a un ámbito específico. Es necesario que las páginas de datos de los pasaportes se procesen mediante OCR (reconocimiento óptico de caracteres). Las etiquetas de envío llegan en formato PDF. Los sistemas de inventario necesitan códigos de barras y texto en la misma pasada. Cada ampliación del alcance conlleva la necesidad de adquirir otro producto de Dynamsoft, adquirir otra licencia anual y mantener otra interfaz API.

El modelo de costes lo deja claro. Los totales multianuales para MRZ más la lectura de códigos de barras en un equipo de desarrollo que utiliza el modelo de suscripción anual de Dynamsoft se acumulan significativamente.IronOCR cubre ambas capacidades — además de PDF nativo, salida de PDF buscable, OCR de documento completo, 125+ idiomas, y preprocesamiento — en $999 único. La migración en sí es en gran medida mecánica: reemplaza RecognizeFile con ocr.Read, elimina el analizador TD3 MRZ manual, habilita ReadBarCodes = true, y elimina el bucle de renderizado de PDF externo.

La diferencia arquitectónica no radica solo en el costo. El diseño de Dynamsoft obliga a los equipos a pensar en términos de productos en lugar de capacidades, a preguntarse "¿qué producto de Dynamsoft maneja esto?" antes de escribir cualquier código. El diseño de IronOCR invierte ese principio: una instancia, una configuración, un objeto de resultado, independientemente del contenido del documento. Esa diferencia se acentúa a lo largo de la vida de un proyecto a medida que aumentan los requisitos.

Para los equipos que desarrollan aplicaciones desde cero y que necesitan cualquier combinación de reconocimiento de zonas de lectura mecánica (MRZ), lectura de códigos de barras, OCR general de documentos o procesamiento de PDF, el modelo todo en uno de IronOCR elimina desde el principio el problema de la coordinación de múltiples productos. Para los equipos que actualmente utilizan varios productos de Dynamsoft junto con una biblioteca OCR independiente, la ruta de migración consolida esa interfaz en una única dependencia. El centro de documentación de IronOCR abarca todas las funciones aquí comentadas, con ejemplos de código funcionales y guías de implementación.

Por favor notaDynamsoft y Tesseract son marcas registradas de sus respectivos propietarios. Este sitio no está afiliado con, respaldado por, o patrocinado por Dynamsoft o Google. Todos los nombres de producto, logotipos y marcas son propiedad de sus respectivos dueños. Las comparaciones son solo para fines informativos y reflejan información públicamente disponible en el momento de la redacción.

Preguntas Frecuentes

¿Qué es Dynamsoft OCR SDK?

Dynamsoft OCR SDK es una solución de OCR utilizada por desarrolladores y empresas para extraer texto de imágenes y documentos. Es una de las diversas opciones de OCR evaluadas junto con IronOCR for .NET para el desarrollo de aplicaciones.

¿Cómo se compara IronOCR con Dynamsoft OCR SDK para desarrolladores .NET?

IronOCR es una biblioteca de OCR .NET nativa de NuGet que utiliza IronTesseract como motor principal. En comparación con el SDK de OCR de Dynamsoft, ofrece una implementación más sencilla (sin instaladores del SDK), precios de tarifa plana y una API de C# limpia sin interoperabilidad COM ni dependencias de la nube.

¿Es IronOCR más fácil de configurar que Dynamsoft OCR SDK?

IronOCR se instala mediante un único paquete NuGet. No hay instaladores de SDK, archivos de licencia que copiar, componentes COM que registrar ni binarios de ejecución independientes que gestionar. Todo el motor de OCR está incluido en el paquete.

¿Qué diferencias de precisión existen entre Dynamsoft OCR SDK y IronOCR?

IronOCR logra una alta precisión de reconocimiento para documentos comerciales estándar, facturas, recibos y formularios escaneados. Para documentos muy degradados o escrituras poco comunes, la precisión varía en función de la calidad de la fuente. IronOCR incluye filtros de preprocesamiento de imágenes para mejorar el reconocimiento en entradas de baja calidad.

¿Es IronOCR compatible con la extracción de texto en PDF?

Sí. IronOCR extrae texto tanto de PDF nativos como de imágenes PDF escaneadas en una sola llamada. También admite archivos TIFF de varias páginas, imágenes y secuencias. En el caso de los PDF escaneados, el OCR se aplica página a página con objetos de resultado por página.

¿Cómo se compara la licencia de Dynamsoft OCR SDK con IronOCR?

IronOCR utiliza una licencia perpetua de tarifa plana sin cargos por página o por escaneo. Las organizaciones que procesan grandes volúmenes de documentos pagan el mismo coste de licencia independientemente del volumen. Encontrará más información y precios por volumen en la página de licencias de IronOCR.

¿Qué idiomas admite IronOCR?

IronOCR es compatible con 127 idiomas a través de paquetes de idiomas NuGet independientes. Para añadir un idioma, basta con ejecutar el comando 'dotnet add package IronOcr.Languages.{Language}'. No es necesaria la colocación manual de archivos ni la configuración de rutas.

¿Cómo instalo IronOCR en un proyecto .NET ?

Instalación a través de NuGet: install-Package IronOcr' en la consola del gestor de paquetes o 'dotnet add package IronOcr' en la CLI. Los paquetes de idiomas adicionales se instalan del mismo modo. No se requiere ningún instalador nativo del SDK.

¿Es IronOCR adecuado para Docker y las implementaciones en contenedores, a diferencia de Dynamsoft OCR?

Sí. IronOCR funciona en contenedores Docker a través de su paquete NuGet. La clave de licencia se establece mediante una variable de entorno. No se requieren archivos de licencia, rutas de SDK ni montajes de volumen para el propio motor de OCR.

¿Puedo probar IronOCR antes de comprarlo, en comparación con Dynamsoft OCR?

Sí. El modo de prueba de IronOCR procesa documentos y devuelve resultados de OCR con una marca de agua superpuesta en la salida. Puede verificar la precisión en sus propios documentos antes de adquirir una licencia.

¿Admite IronOCR la lectura de códigos de barras junto con la extracción de texto?

IronOCR se centra en la extracción de texto y el reconocimiento óptico de caracteres. Para la lectura de códigos de barras, Iron Software ofrece IronBarcode como biblioteca complementaria. Ambas están disponibles por separado o como parte del paquete Iron Suite.

¿Es fácil migrar de Dynamsoft OCR SDK a IronOCR?

La migración de Dynamsoft OCR SDK a IronOCR suele implicar la sustitución de secuencias de inicialización por instanciación de IronTesseract, la eliminación de la gestión del ciclo de vida de COM y la actualización de las llamadas a la API. La mayoría de las migraciones reducen significativamente la complejidad del código.

Kannaopat Udonpant
Ingeniero de Software
Antes de convertirse en Ingeniero de Software, Kannapat completó un doctorado en Recursos Ambientales de la Universidad de Hokkaido en Japón. Mientras perseguía su grado, Kannapat también se convirtió en miembro del Laboratorio de Robótica de Vehículos, que es parte del Departamento de Ingeniería ...
Leer más

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame