Saltar al pie de página
COMPARAR CON OTROS COMPONENTES

Cómo Escanear Códigos de Barras en ZXing Para Desarrolladores en C#

Accusoft BarcodeXpressvs IronBarcode: Licencias, Rendimiento, y Compromisos de API

Cuando evalúas una biblioteca de códigos de barras mediante su versión de prueba, esperas comprobar si realmente funciona con tus imágenes antes de comprometerte a comprarla. Accusoft BarcodeXpressno ofrece esa opción. En modo de evaluación, los valores de códigos de barras decodificados se estampan con la cadena " UNLICENSED accusoft.com " y los códigos de barras 2D generados llevan el mismo sello. Puedes verificar que la biblioteca encuentra un código de barras, pero no puedes verificar que lo lea correctamente. Se trata de una situación en la que hay que comprometerse antes de verificar, y es un punto de fricción importante incluso antes de haber analizado los precios.

Comprender Accusoft BarcodeXpress

Accusoft lleva décadas desarrollando software de gestión de imágenes de documentos para entornos Enterprise . BarcodeXpress forma parte de una familia de productos más amplia que incluye PrizmDoc, ImageGear y Accusoft Imaging. Los equipos que ya utilizan estos productos se encuentran con una interfaz de programación de aplicaciones (API) familiar y pueden apoyarse en una cuenta de Accusoft ya existente. Para el uso independiente de códigos de barras, este contexto ofrece menos valor.

El SDK principal está disponible como un paquete NuGet for .NET Core. La API es basada en instancias: creas un objeto BarcodeXpress, configuras la propiedad Licensing, luego utilizas objetos secundarios reader y writer para operaciones reales. El sistema de licencias de doble clave distingue a BarcodeXpress de la mayoría de las alternativas.

Características arquitectónicas clave de BarcodeXpress:

  • API basada en instancias: Cada operación requiere una instancia BarcodeXpress; los métodos estáticos de conveniencia no forman parte del diseño
  • Licenciamiento de dos capas: el licenciamiento del SDK (SetSolutionName + SetSolutionKey) y el licenciamiento OEM/runtime (SetOEMLicenseKey) son sistemas separados que requieren compras separadas
  • Estampado en modo de evaluación: En modo de evaluación, los valores decodificados se estampan con " UNLICENSED accusoft.com " (y los códigos de barras 2D generados se estampan con la misma cadena), lo que hace imposible la prueba de precisión previa a la compra
  • Especificación de formato manual: El lector requiere la configuración explícita de BarcodeTypes para enumerar qué simbologías buscar; no se detectan formatos no especificados
  • Límite estándar de 40 PPM: La edición estándar limita el procesamiento a 40 páginas por minuto, un límite que la mayoría de los equipos encuentran después de la implementación en lugar de antes.
  • No hay soporte nativo para PDF: los archivos PDF deben ser pre-renderizados a imágenes utilizando una biblioteca separada antes de que el lector pueda procesarlos.
  • Mínimo cinco licencias de ejecución: Incluso una implementación en un solo servidor requiere la compra de al menos cinco licencias de ejecución.

Explicación del sistema de dos teclas

BarcodeXpress divide la concesión de licencias en dos capas conceptualmente separadas:

// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;

// Constructor takes the path to the runtime files (e.g. ".").
var barcodeXpress = new BarcodeXpress(".");

// Step 1: SDK license (for development).
// SetSolutionName and SetSolutionKey are methods, not properties.
// SetSolutionKey takes four 32-bit integers (not a parsed long).
barcodeXpress.Licensing.SetSolutionName("YourCompanyName");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);

// Step 2: OEM/runtime license (for production — minimum 5 purchased).
try
{
    barcodeXpress.Licensing.SetOEMLicenseKey("YourOEMLicenseString");
}
catch (Exception ex)
{
    // Without a valid OEM license, the SDK runs in stamped evaluation mode.
    Console.WriteLine($"OEM license activation failed: {ex.Message}");
}
// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;

// Constructor takes the path to the runtime files (e.g. ".").
var barcodeXpress = new BarcodeXpress(".");

// Step 1: SDK license (for development).
// SetSolutionName and SetSolutionKey are methods, not properties.
// SetSolutionKey takes four 32-bit integers (not a parsed long).
barcodeXpress.Licensing.SetSolutionName("YourCompanyName");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);

// Step 2: OEM/runtime license (for production — minimum 5 purchased).
try
{
    barcodeXpress.Licensing.SetOEMLicenseKey("YourOEMLicenseString");
}
catch (Exception ex)
{
    // Without a valid OEM license, the SDK runs in stamped evaluation mode.
    Console.WriteLine($"OEM license activation failed: {ex.Message}");
}
Imports Accusoft.BarcodeXpressSdk

' BarcodeXpress: two separate license keys required

' Constructor takes the path to the runtime files (e.g. ".").
Dim barcodeXpress As New BarcodeXpress(".")

' Step 1: SDK license (for development).
' SetSolutionName and SetSolutionKey are methods, not properties.
' SetSolutionKey takes four 32-bit integers (not a parsed long).
barcodeXpress.Licensing.SetSolutionName("YourCompanyName")
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)

' Step 2: OEM/runtime license (for production — minimum 5 purchased).
Try
    barcodeXpress.Licensing.SetOEMLicenseKey("YourOEMLicenseString")
Catch ex As Exception
    ' Without a valid OEM license, the SDK runs in stamped evaluation mode.
    Console.WriteLine($"OEM license activation failed: {ex.Message}")
End Try
$vbLabelText   $csharpLabel

El par SetSolutionKey activa el propio SDK. La llamada SetOEMLicenseKey activa las capacidades de despliegue de producción. Ambos deben estar presentes y ser válidos para que un despliegue de producción devuelva valores de código de barras sin el sello " UNLICENSED accusoft.com ".

En la revisión de código, este patrón produce una pregunta predecible: "¿Por qué tenemos dos activaciones de licencia separadas?" La respuesta: que Accusoft trata el licenciamiento del SDK y el licenciamiento de implementación como productos separados con facturación separada, no siempre es obvia desde la propia API. Los equipos que mantienen este código seis meses después de su configuración inicial a menudo necesitan consultar la documentación para comprender qué clave corresponde a cada función.

Sin una licencia OEM válida, SetOEMLicenseKey lanza una excepción y el SDK vuelve al modo de evaluación. Los equipos generalmente envuelven la activación en try/catch para que la falla se registre ruidosamente en lugar de producir silenciosamente valores de códigos de barras estampados en producción:

try
{
    barcodeXpress.Licensing.SetOEMLicenseKey(oemKey);
}
catch (Exception ex)
{
    // In evaluation mode, barcode values are stamped with
    // " UNLICENSED accusoft.com " in the output.
    throw new InvalidOperationException(
        "OEM license activation failed — barcode values will be stamped", ex);
}
try
{
    barcodeXpress.Licensing.SetOEMLicenseKey(oemKey);
}
catch (Exception ex)
{
    // In evaluation mode, barcode values are stamped with
    // " UNLICENSED accusoft.com " in the output.
    throw new InvalidOperationException(
        "OEM license activation failed — barcode values will be stamped", ex);
}
Try
    barcodeXpress.Licensing.SetOEMLicenseKey(oemKey)
Catch ex As Exception
    ' In evaluation mode, barcode values are stamped with
    ' " UNLICENSED accusoft.com " in the output.
    Throw New InvalidOperationException("OEM license activation failed — barcode values will be stamped", ex)
End Try
$vbLabelText   $csharpLabel

Este guardia es el patrón que los equipos añaden cuando se dan cuenta de que la salida en modo de evaluación estampa silenciosamente los resultados en lugar de lanzar durante la decodificación.

Entendiendo IronBarcode

IronBarcode es una biblioteca de códigos de barras .NET independiente sin dependencias externas más allá de su paquete NuGet . Gestiona tanto la generación como la lectura mediante métodos de fábrica estáticos, lo que significa que no hay que gestionar el ciclo de vida de las instancias ni realizar llamadas a constructores dispersas por el código de la aplicación.

El modelo de licencia de clave única significa que lo que se prueba en modo de prueba es lo que se ejecuta en producción; la única diferencia es una marca de agua en las imágenes de códigos de barras generadas durante la prueba. Los valores decodificados siempre están completos, lo que significa que puede comprobar la precisión de la lectura en sus documentos reales antes de decidir si realiza la compra.

Características clave de IronBarcode:

  • Diseño de API estático: BarcodeReader.Read() y BarcodeWriter.CreateBarcode() son métodos estáticos sin estado, no se requiere gestión de instancias
  • Clave de licencia única: Una sola clave cubre tanto el desarrollo como la implementación en producción; no existe una capa de licencia de ejecución independiente
  • Valores de prueba completos: El modo de prueba devuelve todos los valores decodificados; La marca de agua se aplica solo a las imágenes de salida generadas, no a los resultados de lectura.
  • Detección automática de formato: IronBarcode detecta automáticamente la simbología en todos los formatos compatibles; no se necesita enumeración BarcodeTypes
  • Soporte nativo de PDF: BarcodeReader.Read("document.pdf") procesa archivos PDF directamente sin un paso de renderizado adicional
  • Sin límite de rendimiento: La velocidad de procesamiento solo está limitada por la capacidad del hardware y la red, no por un límite impuesto por el software.
  • Diseño seguro para subprocesos: Los métodos estáticos sin estado pueden ser llamados concurrentemente desde cualquier número de subprocesos sin aislamiento de instancia.

Comparación de características

Característica Accusoft BarcodeXpress IronBarcode
Modelo de licencia Licencia del SDK + licencia de tiempo de ejecución independiente Llave perpetua única
Comportamiento del modo de evaluación Valores de código de barras estampados con " UNLICENSED accusoft.com " Se devuelven los valores completos; la marca de agua solo aparece en la salida generada.
Límite de rendimiento (estándar) 40 páginas por minuto Sin límite de rendimiento
Compatibilidad con PDF Requiere una biblioteca PDF externa para la extracción de imágenes. Nativo — BarcodeReader.Read("doc.pdf")
Estilo API Configuración detallada basada en instancias Métodos de fábrica estáticos, API fluida
Seguridad de los hilos Se requiere una instancia por hilo. Métodos estáticos sin estado: intrínsecamente seguros para subprocesos.
Punto de entrada de precios SDK de $1960+ + tiempo de ejecución de $2500+ (mínimo 5) $749 perpetuo (Lite, 1 desarrollador)

Comparación detallada de características

Característica Accusoft BarcodeXpress IronBarcode
Licencias
Modelo de licencia Clave SDK + clave de tiempo de ejecución Llave perpetua única
Licencias de tiempo de ejecución mínimas 5 (incluso para 1 servidor) No existe el concepto de licencia de tiempo de ejecución.
Modo de evaluación Valores estampados con " UNLICENSED accusoft.com " Valores completos, marca de agua solo en las imágenes de salida.
Licencia perpetua No es estándar; contacte con ventas. Sí, todos los niveles
Renovación anual Requerido para soporte Opcional
Lectura
Detección automática de formato Manual: debe especificar los tipos de código de barras. Automático en todos los formatos compatibles.
Lectura de PDF Requiere una biblioteca PDF externa. Nativo
Múltiples códigos de barras por imagen Sí, con configuración de BarcodeTypes Sí, con opción de ExpectMultipleBarcodes
Propiedades del resultado BarcodeValue, BarcodeType Value, Format, Confidence, PageNumber
límite de rendimiento 40 ppm (Edición estándar) Sin límite en ningún nivel
Generación
Generación del código 128 Sí, a través de writer.BarcodeType Sí, a través de BarcodeWriter.CreateBarcode()
Generación de código QR Sí, a través de QRCodeWriter.CreateQrCode()
Código QR con logotipo Se requiere superposición manual de imágenes AddBrandLogo("logo.png") incorporado
Formatos de salida Guardar archivo PNG, JPG, PDF, datos binarios, flujo
Plataforma y despliegue
.NET Framework SDK heredado independiente .NET Framework4.6.2 o superior
.NET Core / .NET 5+ Sí (SDK de .NET Core ) .NET Core 3.1+, .NET 5/6/7/8/9
Linux/Docker Sí — Windows x64/x86, Linux x64, macOS x64/ARM
Configuración de licencia de Docker Archivo de licencia o servidor de licencias Variable de entorno
Integración de CI/CD Se requieren tanto claves SDK como de tiempo de ejecución. Un secreto
Procesamiento por lotes
Seguridad de los hilos Se requiere una instancia por hilo. Sin estado — Paralelo.Para cada seguro
Procesamiento por lotes en paralelo Requiere gestión de instancias por hilo. Soporte para Paralelo Directo.ForEach

Arquitectura de licencias

La diferencia en la complejidad de las licencias entre BarcodeXpress e IronBarcode se hace más evidente al escribir el código de inicialización que se ejecutará en producción.

Enfoque de BarcodeXpress

using Accusoft.BarcodeXpressSdk;

public class BarcodeService
{
    private readonly BarcodeXpress _barcodeXpress;

    public BarcodeService()
    {
        _barcodeXpress = new BarcodeXpress(".");

        // Layer 1: SDK license
        _barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
        _barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);

        // Layer 2: OEM/runtime license — separate purchase, minimum 5
        try
        {
            _barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException(
                "OEM license activation failed — barcode values will be stamped", ex);
        }
    }
}
using Accusoft.BarcodeXpressSdk;

public class BarcodeService
{
    private readonly BarcodeXpress _barcodeXpress;

    public BarcodeService()
    {
        _barcodeXpress = new BarcodeXpress(".");

        // Layer 1: SDK license
        _barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
        _barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);

        // Layer 2: OEM/runtime license — separate purchase, minimum 5
        try
        {
            _barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException(
                "OEM license activation failed — barcode values will be stamped", ex);
        }
    }
}
Imports Accusoft.BarcodeXpressSdk

Public Class BarcodeService
    Private ReadOnly _barcodeXpress As BarcodeXpress

    Public Sub New()
        _barcodeXpress = New BarcodeXpress(".")

        ' Layer 1: SDK license
        _barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
        _barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)

        ' Layer 2: OEM/runtime license — separate purchase, minimum 5
        Try
            _barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString")
        Catch ex As Exception
            Throw New InvalidOperationException("OEM license activation failed — barcode values will be stamped", ex)
        End Try
    End Sub
End Class
$vbLabelText   $csharpLabel

Este constructor existe completamente para gestionar dos activaciones de licencia separadas antes de que cualquier operación de código de barras pueda tener lugar. El try/catch alrededor de SetOEMLicenseKey no es opcional, sin él, el servicio devolverá silenciosamente valores estampados en cualquier entorno donde la clave OEM falte o esté mal configurada.

Enfoque IronBarcode

using IronBarCode;

// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
using IronBarCode;

// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

' In Program.vb or startup configuration
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Esa es la configuración completa del licenciamiento. No hay desbloqueo de tiempo de ejecución separado, sin nombre de solución, sin llamada UnlockRuntime de dos argumentos. En Docker, esto se convierte en una variable de entorno que se lee al iniciar. En una canalización de CI/CD, es un secreto. En un orquestador de contenedores, se trata de una variable de entorno que se inyecta en el pod.

Lectura de códigos de barras

La lectura de códigos de barras revela la diferencia entre las filosofías de configuración de ambas bibliotecas: BarcodeXpress requiere una enumeración de formato explícita y una API de configuración basada en propiedades, mientras que IronBarcode detecta automáticamente todo con una sola llamada a un método.

Enfoque de BarcodeXpress

La lectura con BarcodeXpress requiere cargar la imagen en un System.Drawing.Bitmap, asignar el conjunto de simbologías a reader.BarcodeTypes como un System.Array de valores BarcodeType, y llamar a Analyze(bitmap) para recuperar resultados. El SDK no lee PDFs directamente - los formatos de entrada documentados son TIFF, JPEG, PNG, y BMP:

using Accusoft.BarcodeXpressSdk;
using System.Drawing;

public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
    var barcodeXpress = new BarcodeXpress(".");
    barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
    barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
    barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");

    using var bitmap = new Bitmap(imagePath);

    // BarcodeTypes is a System.Array of BarcodeType values (not a [Flags]
    // enum). Pass Enum.GetValues to scan for everything, or assign a
    // narrower array to restrict the search space.
    barcodeXpress.reader.BarcodeTypes = new[]
    {
        BarcodeType.Code128Barcode,
        BarcodeType.DataMatrixBarcode,
        BarcodeType.QRCodeBarcode
    };

    Result[] results = barcodeXpress.reader.Analyze(bitmap);
    return results.Select(r => r.BarcodeValue);
}
using Accusoft.BarcodeXpressSdk;
using System.Drawing;

public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
    var barcodeXpress = new BarcodeXpress(".");
    barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
    barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
    barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");

    using var bitmap = new Bitmap(imagePath);

    // BarcodeTypes is a System.Array of BarcodeType values (not a [Flags]
    // enum). Pass Enum.GetValues to scan for everything, or assign a
    // narrower array to restrict the search space.
    barcodeXpress.reader.BarcodeTypes = new[]
    {
        BarcodeType.Code128Barcode,
        BarcodeType.DataMatrixBarcode,
        BarcodeType.QRCodeBarcode
    };

    Result[] results = barcodeXpress.reader.Analyze(bitmap);
    return results.Select(r => r.BarcodeValue);
}
Imports Accusoft.BarcodeXpressSdk
Imports System.Drawing

Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
    Dim barcodeXpress = New BarcodeXpress(".")
    barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
    barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
    barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString")

    Using bitmap As New Bitmap(imagePath)
        ' BarcodeTypes is a System.Array of BarcodeType values (not a [Flags]
        ' enum). Pass Enum.GetValues to scan for everything, or assign a
        ' narrower array to restrict the search space.
        barcodeXpress.Reader.BarcodeTypes = New BarcodeType() {
            BarcodeType.Code128Barcode,
            BarcodeType.DataMatrixBarcode,
            BarcodeType.QRCodeBarcode
        }

        Dim results As Result() = barcodeXpress.Reader.Analyze(bitmap)
        Return results.Select(Function(r) r.BarcodeValue)
    End Using
End Function
$vbLabelText   $csharpLabel

Analyze toma un Bitmap y devuelve un Result[]. Si un documento contiene un formato no presente en el array BarcodeTypes, no se encontrará. Esto se convierte en una carga de mantenimiento cuando cambian las fuentes de los documentos. Los PDFs requieren pre-renderización a imágenes con una biblioteca separada antes de que puedan ser alimentados en Analyze.

Enfoque IronBarcode

using IronBarCode;

public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
    var results = BarcodeReader.Read(imagePath);
    return results.Select(r => r.Value);
}
using IronBarCode;

public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
    var results = BarcodeReader.Read(imagePath);
    return results.Select(r => r.Value);
}
Imports IronBarCode

Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
    Dim results = BarcodeReader.Read(imagePath)
    Return results.Select(Function(r) r.Value)
End Function
$vbLabelText   $csharpLabel

IronBarcode detecta automáticamente el formato en todas las simbologías compatibles. Si la imagen contiene un código Code 128, un código QR y un DataMatrix, los tres se incluyen en la colección de resultados sin necesidad de modificar ninguna configuración. Para un mayor control sobre el comportamiento de lectura, la clase BarcodeReaderOptions expone ajustes de velocidad, número de subprocesos y compatibilidad con múltiples códigos de barras.

La lectura nativa de PDF también está disponible mediante el mismo método:

using IronBarCode;

// NativoPDF support — no separate library needed
var results = BarcodeReader.Read("invoice-batch.pdf");

foreach (var result in results)
{
    Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}");
}
using IronBarCode;

// NativoPDF support — no separate library needed
var results = BarcodeReader.Read("invoice-batch.pdf");

foreach (var result in results)
{
    Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}");
}
Imports IronBarCode

' NativoPDF support — no separate library needed
Dim results = BarcodeReader.Read("invoice-batch.pdf")

For Each result In results
    Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}")
Next
$vbLabelText   $csharpLabel

BarcodeXpress no lee archivos PDF de forma nativa. Primero, debes convertir cada página en una imagen utilizando una biblioteca independiente y, a continuación, pasar esas imágenes al lector de BarcodeXpress. Eso añade una dependencia, un paso de conversión y un coste de licencia adicional dependiendo de la biblioteca PDF elegida.

Procesamiento por lotes y seguridad de los hilos

El procesamiento de códigos de barras de alto volumen pone de manifiesto la diferencia arquitectónica entre el modelo de instancia con estado de BarcodeXpress y la API estática sin estado de IronBarcode.

Enfoque de BarcodeXpress

BarcodeXpress está basado en instancias y su objeto reader mantiene estado. El procesamiento paralelo requiere una instancia por hilo, con la inicialización completa de la licencia de dos capas repetida en cada contexto de hilo:

using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;
using System.Drawing;

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

    foreach (var path in imagePaths)
    {
        using var bitmap = new Bitmap(path);

        _barcodeXpress.reader.BarcodeTypes = new[]
        {
            BarcodeType.Code128Barcode,
            BarcodeType.QRCodeBarcode
        };

        var barcodes = _barcodeXpress.reader.Analyze(bitmap);
        if (barcodes.Length > 0)
            results[path] = barcodes[0].BarcodeValue;
    }

    return results;
}
using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;
using System.Drawing;

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

    foreach (var path in imagePaths)
    {
        using var bitmap = new Bitmap(path);

        _barcodeXpress.reader.BarcodeTypes = new[]
        {
            BarcodeType.Code128Barcode,
            BarcodeType.QRCodeBarcode
        };

        var barcodes = _barcodeXpress.reader.Analyze(bitmap);
        if (barcodes.Length > 0)
            results[path] = barcodes[0].BarcodeValue;
    }

    return results;
}
Imports Accusoft.BarcodeXpressSdk
Imports System.Collections.Generic
Imports System.Drawing

Public Function ProcessBatch(imagePaths As IEnumerable(Of String)) As Dictionary(Of String, String)
    Dim results As New Dictionary(Of String, String)()

    For Each path In imagePaths
        Using bitmap As New Bitmap(path)
            _barcodeXpress.reader.BarcodeTypes = New BarcodeType() {
                BarcodeType.Code128Barcode,
                BarcodeType.QRCodeBarcode
            }

            Dim barcodes = _barcodeXpress.reader.Analyze(bitmap)
            If barcodes.Length > 0 Then
                results(path) = barcodes(0).BarcodeValue
            End If
        End Using
    Next

    Return results
End Function
$vbLabelText   $csharpLabel

La edición estándar también impone un límite de 40 páginas por minuto. Procesar un lote de 100.000 documentos a una velocidad de 40 páginas por minuto (PPM) lleva aproximadamente 41 horas. La edición Professional elimina este límite, pero a un coste más elevado por desarrollador, además de las licencias de ejecución ya adquiridas.

Enfoque IronBarcode

using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;

// IronBarcode — parallel batch with thread-safe static API
var files = Directory.GetFiles("/incoming/scans", "*.png");
var allResults = new ConcurrentBag<string>();

Parallel.ForEach(files, file =>
{
    var r = BarcodeReader.Read(file);
    foreach (var barcode in r)
        allResults.Add($"{file}: {barcode.Value}");
});
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;

// IronBarcode — parallel batch with thread-safe static API
var files = Directory.GetFiles("/incoming/scans", "*.png");
var allResults = new ConcurrentBag<string>();

Parallel.ForEach(files, file =>
{
    var r = BarcodeReader.Read(file);
    foreach (var barcode in r)
        allResults.Add($"{file}: {barcode.Value}");
});
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks

' IronBarcode — parallel batch with thread-safe static API
Dim files = Directory.GetFiles("/incoming/scans", "*.png")
Dim allResults = New ConcurrentBag(Of String)()

Parallel.ForEach(files, Sub(file)
    Dim r = BarcodeReader.Read(file)
    For Each barcode In r
        allResults.Add($"{file}: {barcode.Value}")
    Next
End Sub)
$vbLabelText   $csharpLabel

Debido a que los métodos estáticos de IronBarcode no mantienen estado, Parallel.ForEach sobre ellos es seguro sin necesidad de aislamiento de instancias. IronBarcode no impone ningún límite de rendimiento en ningún nivel de precios. Para ajustar el rendimiento de lectura, la clase BarcodeReaderOptions proporciona configuraciones de ReadingSpeed y MaxParallelThreads:

using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read("warehouse-scan.png", options);
using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read("warehouse-scan.png", options);
Imports IronBarCode

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True,
    .MaxParallelThreads = 4
}

Dim results = BarcodeReader.Read("warehouse-scan.png", options)
$vbLabelText   $csharpLabel

ReadingSpeed.Balanced es el predeterminado. Usa ReadingSpeed.Faster para pipelines de alto rendimiento donde los códigos de barras están limpios, o ReadingSpeed.Detailed para imágenes dañadas o de bajo contraste.

Referencia de mapeo de API

Accusoft BarcodeXpress IronBarcode
new BarcodeXpress(".") Métodos estáticos: no se requiere instancia.
Licensing.SetSolutionName("...") IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Licensing.SetSolutionKey(int, int, int, int) (removed — not needed)
Licensing.SetOEMLicenseKey(string) (removed — no separate runtime license concept)
try/catch alrededor de la activación OEM (removed — license is always either valid or not)
reader.Analyze(bitmap) (carga System.Drawing.Bitmap primero) BarcodeReader.Read(path)
reader.BarcodeTypes = new[] { BarcodeType.Code128Barcode, ... } (removed — auto-detection handles all formats)
result.BarcodeValue result.Value
result.BarcodeType result.Format
writer.BarcodeType = BarcodeType.Code128 BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
writer.BarcodeValue = "data" (first argument to CreateBarcode)
writer.SaveToFile(path) .SaveAsPng(path)
Límite estándar de 40 ppm Sin límite de rendimiento en ningún nivel.
Evaluación: valores estampados con " UNLICENSED accusoft.com " Versión de prueba: valores completos, marca de agua solo en las imágenes de salida.

Cuando los equipos consideran pasar de Accusoft BarcodeXpressa IronBarcode

Superando el límite de las 40 ppm

El límite de 40 páginas por minuto de la edición estándar parece generoso hasta que un equipo de negocios decide procesar por lotes al final del día las facturas archivadas de todo un año. Procesar un lote de 100.000 documentos a ese ritmo lleva aproximadamente 41 horas. Al pasar a la edición Professional , se elimina el límite, pero a un coste mayor por puesto de desarrollador, además de las licencias de ejecución ya adquiridas. Los equipos que descubren el límite de rendimiento después de firmar una orden de compra a menudo se encuentran con que el coste total de eliminarlo supera sustancialmente las estimaciones iniciales.

Complejidad de las licencias de la canalización CI/CD

Una configuración típica de CI/CD ejecuta las compilaciones en contenedores efímeros. Con BarcodeXpress, cada entorno de compilación necesita tener disponibles tanto el par de claves del SDK como las claves de desbloqueo en tiempo de ejecución, gestionadas como secretos independientes. Si la clave de ejecución falta o está mal configurada, la compilación puede tener éxito, pero las pruebas de integración devuelven valores ocultos: un modo de fallo silencioso que es fácil de pasar por alto en una canalización de pruebas si las aserciones de prueba no están escritas cuidadosamente en función del contenido real del código de barras.

Requisitos de implementación segura y aislada de la red

En algunos entornos, como los sistemas sanitarios que procesan historiales de pacientes, los flujos de trabajo de documentos gubernamentales y el procesamiento administrativo de las instituciones financieras, no se permite la validación de licencias para realizar llamadas salientes a la red. El sistema de licencias en tiempo de ejecución de BarcodeXpress utiliza la infraestructura de licencias de Accusoft, lo que puede suponer un problema de cumplimiento en entornos con estrictas restricciones de salida de red. Los equipos que operan en esos entornos suelen elegir bibliotecas cuya validación de licencias es totalmente local.

Implementación de contenedores y Docker

Normalmente, para usar BarcodeXpress en Docker, es necesario montar un archivo de licencia en el contenedor en una ruta conocida o configurar un servidor de licencias y apuntar el contenedor hacia él. Ambos enfoques añaden complejidad a la implementación: los archivos de licencia deben distribuirse y mantenerse sincronizados, y un servidor de licencias es una pieza adicional de infraestructura que mantener. Los equipos que migran a arquitecturas de microservicios o patrones de implementación sin servidor descubren que el enfoque de archivos de configuración no se traduce fácilmente en imágenes de contenedores inmutables.

Requisitos de precisión de la evaluación

Los equipos que necesitan validar la precisión de lectura de sus propios documentos antes de comprometerse con una compra consideran que el modo de evaluación de BarcodeXpress es fundamentalmente limitante. Las pruebas realizadas con escaneos de documentos reales —para comprobar si la biblioteca admite códigos de barras de bajo contraste, imágenes distorsionadas o páginas con varios códigos de barras— requieren valores decodificados completos. La salida parcialmente oculta solo revela que la biblioteca encontró un código de barras, no si lo leyó correctamente.

Consideraciones comunes sobre la migración

Gestión de instancias para llamadas estáticas

BarcodeXpress requiere que una instancia BarcodeXpress sea creada y licenciada antes de cualquier operación. Los métodos estáticos de IronBarcode no necesitan instanciarse. Los equipos que migran típicamente tienen una clase BarcodeService cuyo constructor es principalmente plantillas de licenciamiento — después de la migración, ese constructor puede ser eliminado por completo o reducido a la asignación de una sola clave de licencia.

Eliminación de enumeración de tipos de código de barras

Cada operación de lectura con BarcodeXpress requiere una asignación de Array BarcodeTypes para enumerar qué simbologías buscar. IronBarcode detecta automáticamente todos los formatos compatibles por defecto. Durante la migración, todas las asignaciones de reader.BarcodeTypes = ... se pueden eliminar sin reemplazo. Si hay una razón de rendimiento para restringir el espacio de búsqueda, BarcodeReaderOptions admite el filtrado de formato como una opción explícita en lugar de un predeterminado requerido.

Cambios en el nombre de la propiedad de resultado

Dos cambios de nombre de propiedad afectan a todo el código de procesamiento de resultados: result.BarcodeValue se convierte en result.Value, y result.BarcodeType se convierte en result.Format. Una función de búsqueda y reemplazo a nivel de toda la solución resuelve ambos problemas. Los resultados de IronBarcode también exponen result.Confidence y result.PageNumber, que no tienen equivalente en BarcodeXpress y se pueden usar para un filtrado adicional sin cambios en el código para el manejo de resultados existente.

Configuración de licencia de Docker

Las implementaciones de BarcodeXpress en Docker suelen usar un archivo de configuración de licencia montado. IronBarcode usa una variable de entorno. La migración implica eliminar la instrucción COPY para el archivo de configuración y agregar una sola asignación de variable de entorno. En Kubernetes, la clave de licencia se convierte en una referencia secreta en la especificación del pod en lugar de un volumen montado.

Funcionalidades adicionales de IronBarcode

Más allá de las características principales que se incluyen en esta comparación, IronBarcode ofrece funcionalidades que no forman parte de la oferta de BarcodeXpress:

  • Código QR con logo: QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") inserta una imagen de marca en un código QR de forma nativa, con un nivel de corrección de errores configurable para mantener la fiabilidad del escaneo
  • Impresión de códigos de barras en PDF : Escriba códigos de barras directamente en documentos PDF existentes sin necesidad de una biblioteca de PDF independiente.
  • Exportación por lotes : Procese documentos PDF completos en una sola llamada y reciba resultados por página con número de página, formato, valor y puntuación de confianza.

Compatibilidad con .NET y preparación para el futuro

IronBarcode es compatible con .NET Framework4.6.2 y versiones posteriores, .NET Core 3.1 y .NET 5, 6, 7, 8 y 9. Las plataformas compatibles incluyen Windows x64 y x86, Linux x64 y macOS x64 y ARM. BarcodeXpress for .NET Core es un SDK independiente de la edición heredada de .NET Framework; los equipos que actualicen el marco de trabajo de destino de su aplicación deben tenerlo en cuenta. El paquete único de IronBarcode cubre todos los entornos de ejecución compatibles. Las actualizaciones regulares rastrean nuevos lanzamientos de .NET a medida que se publican.

Conclusión

BarcodeXpress e IronBarcode representan dos filosofías de diseño diferentes para las bibliotecas comerciales de códigos de barras de .NET. BarcodeXpress trata el acceso al SDK y la implementación en producción como productos con licencia independientes, con facturación, sistemas de claves y requisitos mínimos de compra distintos. IronBarcode trata la biblioteca como un único producto con una única clave que abarca todos los entornos, desde el desarrollo hasta la producción.

BarcodeXpress es una opción razonable para los equipos que ya forman parte del ecosistema de productos de Accusoft: las organizaciones que utilizan PrizmDoc o ImageGear encontrarán familiar la API de BarcodeXpress y les resultará útil su relación con la cuenta de Accusoft para obtener un soporte técnico consolidado. Para esos equipos, el sistema de licencias de dos claves es un patrón operativo consolidado, más que un nuevo obstáculo. El SDK también es adecuado para entornos donde las fuentes de documentos están bien controladas y los requisitos de formato son estables, haciendo que la especificación manual de BarcodeTypes sea una configuración única aceptable en lugar de un mantenimiento contínuo.

IronBarcode es más adecuado para equipos que realizan implementaciones en contenedores, pipelines de CI/CD y entornos en la nube, donde la complejidad de la gestión de licencias afecta directamente a los gastos operativos. El modelo de detección automática, la API estática y la compatibilidad nativa con PDF reducen la superficie del código de integración, y el modelo de licencia de clave única simplifica la gestión de secretos en los entornos de desarrollo, prueba y producción. Para los equipos que necesitan evaluar la precisión de lectura antes de comprar, el resultado completo de la prueba —marca de agua en las imágenes generadas, no en los resultados de lectura— permite realizar una comparación real antes de la compra.

La diferencia de precio es significativa en todos los niveles. A nivel de desarrollador individual, la diferencia entre el SDK de BarcodeXpress Plus y las licencias de tiempo de ejecución mínimas y el nivel Lite de IronBarcode es considerable. Para los equipos en los que esa diferencia de coste es secundaria frente a la integración en el ecosistema de Accusoft, BarcodeXpress sigue siendo una opción coherente. Para los equipos que evalúan las bibliotecas de códigos de barras por sus propios méritos, la combinación de las limitaciones del modo de evaluación, las licencias de dos claves y los límites de rendimiento hacen de IronBarcode la opción más sencilla.

Por favor notaAccusoft es una marca registrada de su respectivo propietario. Este sitio no está afiliado a, respaldado por, o patrocinado por Accusoft. 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 Accusoft BarcodeXpress?

Accusoft BarcodeXpress es una biblioteca de códigos de barras .NET para generar y leer códigos de barras en aplicaciones C#. Es una de varias alternativas que los desarrolladores evalúan cuando seleccionan una solución de código de barras para proyectos .NET.

¿Cuáles son las principales diferencias entre Accusoft BarcodeXpress e IronBarcode?

IronBarcode utiliza una API estática y sin estado que no requiere gestión de instancias, mientras que Accusoft BarcodeXpress suele requerir la creación y configuración de instancias antes de su uso. IronBarcode también ofrece compatibilidad nativa con PDF, detección automática de formato y licencia de clave única en todos los entornos.

¿Es IronBarcode más fácil de licenciar que Accusoft BarcodeXpress?

IronBarcode utiliza una única clave de licencia que cubre tanto el desarrollo como los despliegues de producción. Esto simplifica las canalizaciones de CI/CD y las configuraciones de Docker en comparación con los sistemas de licencias que separan las claves de SDK de las claves de tiempo de ejecución.

¿Soporta IronBarcode todos los formatos de código de barras que soporta Accusoft BarcodeXpress?

IronBarcode es compatible con más de 30 simbologías de códigos de barras, incluidos QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 y muchos más. La autodetección de formatos significa que no se requiere una enumeración explícita de formatos.

¿Es IronBarcode compatible con la lectura nativa de códigos de barras en PDF?

Sí. IronBarcode lee códigos de barras directamente desde archivos PDF utilizando BarcodeReader.Read("document.pdf") sin necesidad de una biblioteca de renderizado de PDF independiente. Los resultados por página incluyen el número de página, el formato del código de barras, el valor y la puntuación de confianza.

¿Cómo maneja IronBarcode el procesamiento por lotes en comparación con Accusoft BarcodeXpress?

Los métodos estáticos de IronBarcode no tienen estado y son naturalmente seguros para subprocesos, lo que permite el uso directo de Parallel.ForEach sin gestión de instancias por subproceso. No hay límite de rendimiento en ningún nivel de precios.

¿Qué versiones de .NET admite IronBarcode ?

IronBarcode es compatible con .NET Framework 4.6.2+, .NET Core 3.1 y .NET 5, 6, 7, 8 y 9 en un único paquete NuGet. Las plataformas de destino incluyen Windows x64/x86, Linux x64 y macOS x64/ARM.

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

Instale IronBarcode a través de NuGet: ejecute 'Install-Package IronBarCode' en la consola del gestor de paquetes, o 'dotnet add package IronBarCode' en la CLI. No se necesitan instaladores SDK ni archivos de ejecución adicionales.

¿Puedo evaluar IronBarcode antes de comprarlo, a diferencia de Accusoft BarcodeXpress?

Sí. El modo de prueba de IronBarcode devuelve los valores completos de los códigos de barras descodificados; sólo las imágenes de salida generadas reciben una marca de agua. Puede comprobar la precisión de la lectura en sus propios documentos antes de comprometerse con la compra.

¿Cuál es la diferencia de precio entre Accusoft BarcodeXpress e IronBarcode?

IronBarcode cuesta a partir de 749 dólares por una licencia perpetua de desarrollador único que cubre el desarrollo y la producción. Los detalles de precios y opciones de volumen están disponibles en la página de licencias de IronBarcode. No se requiere una licencia de ejecución por separado.

¿Es fácil migrar de Accusoft BarcodeXpress a IronBarcode?

La migración de Accusoft BarcodeXpress a IronBarcode implica principalmente la sustitución de las llamadas a la API basadas en instancias por los métodos estáticos de IronBarcode, la eliminación de la repetición de licencias y la actualización de los nombres de las propiedades de los resultados. La mayoría de las migraciones implican reducir código en lugar de añadirlo.

¿IronBarcode genera códigos QR con logotipos?

Sí. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") incrusta una imagen de marca en un código QR de forma nativa con corrección de errores configurable. Los códigos QR coloreados también son compatibles con ChangeBarCodeColor().

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más

Equipo de soporte de Iron

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