Accusoft BarcodeXpress vs IronBarcode: Comparación de bibliotecas de códigos de barras C#
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 el modo de evaluación, los valores del código de barras decodificado aparecen parcialmente ocultos: "1234567890" se muestra como "1234...XXX". 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 para .NET Core. La API se basa en instancias: se crea un objeto BarcodeXpress, se configura la propiedad Licensing y, a continuación, se utilizan los objetos reader y writer hijos para las 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 - Licencia de dos capas: La licencia SDK (
SolutionName+SolutionKey) y la licencia de ejecución (UnlockRuntime) son sistemas independientes que requieren compras separadas - Modo de evaluación con valores distorsionados: En el modo de evaluación, los valores decodificados se degradan deliberadamente —"1234567890" se muestra como "1234...XXX"— lo que imposibilita las pruebas de precisión previas a la compra.
- Especificación de formato manual: El lector requiere una configuración explícita
BarcodeTypespara 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;
var barcodeXpress = new BarcodeXpress();
// Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"));
// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;
var barcodeXpress = new BarcodeXpress();
// Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"));
Imports Accusoft.BarcodeXpressSdk
Dim barcodeXpress As New BarcodeXpress()
' Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName"
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")
' Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"))
El par SolutionName y SolutionKey activa el propio SDK. La llamada UnlockRuntime, que toma su propia clave y su propia clave de solución como argumentos separados, activa las capacidades de despliegue en producción. Ambos deben estar presentes y ser válidos para que una implementación en producción devuelva valores de código de barras completos y sin ocultar.
En la revisión de código, este patrón produce una pregunta predecible: "¿Por qué estamos llamando a UnlockRuntime con dos claves diferentes?" La respuesta -que Accusoft trata la licencia SDK y la licencia 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.
La propiedad IsRuntimeUnlocked permite comprobar si la capa de tiempo de ejecución está activa:
if (!barcodeXpress.Licensing.IsRuntimeUnlocked)
{
// In this state, barcode values are partially obscured
// "1234567890" returns as "1234...XXX"
Console.WriteLine("Warning: runtime license not active");
}
if (!barcodeXpress.Licensing.IsRuntimeUnlocked)
{
// In this state, barcode values are partially obscured
// "1234567890" returns as "1234...XXX"
Console.WriteLine("Warning: runtime license not active");
}
If Not barcodeXpress.Licensing.IsRuntimeUnlocked Then
' In this state, barcode values are partially obscured
' "1234567890" returns as "1234...XXX"
Console.WriteLine("Warning: runtime license not active")
End If
Esta comprobación es la que añaden los equipos de seguridad cuando se dan cuenta de que la salida del modo de evaluación devuelve silenciosamente datos parciales en lugar de generar una excepción o fallar claramente.
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 estático de la API:
BarcodeReader.Read()yBarcodeWriter.CreateBarcode()son métodos estáticos sin estado - no requieren 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 es necesaria la enumeración
BarcodeTypes - Soporte nativo de PDF:
BarcodeReader.Read("document.pdf")procesa archivos PDF directamente sin un paso de renderizado separado - 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 del código de barras parcialmente ocultos ("1234...XXX") | 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 ocultos como "1234...XXX" | 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 la configuración BarcodeTypes |
Sí, con la opción 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í | Sí, a través de QRCodeWriter.CreateQrCode() |
| Código QR con logotipo | Se requiere superposición manual de imágenes | AddBrandLogo("logo.png") construido en |
| 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í | 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.SolutionName = "AcmeCorp";
_barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Layer 2: Runtime license — separate purchase, minimum 5
_barcodeXpress.Licensing.UnlockRuntime(
"RuntimeKey-XXXXXX",
Convert.ToInt64("98765432109876"));
// Guard against partial-value mode
if (!_barcodeXpress.Licensing.IsRuntimeUnlocked)
{
throw new InvalidOperationException(
"Runtime license not active — barcode values will be obscured");
}
}
}
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
_barcodeXpress = new BarcodeXpress();
// Layer 1: SDK license
_barcodeXpress.Licensing.SolutionName = "AcmeCorp";
_barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Layer 2: Runtime license — separate purchase, minimum 5
_barcodeXpress.Licensing.UnlockRuntime(
"RuntimeKey-XXXXXX",
Convert.ToInt64("98765432109876"));
// Guard against partial-value mode
if (!_barcodeXpress.Licensing.IsRuntimeUnlocked)
{
throw new InvalidOperationException(
"Runtime license not active — barcode values will be obscured");
}
}
}
Imports Accusoft.BarcodeXpressSdk
Public Class BarcodeService
Private ReadOnly _barcodeXpress As BarcodeXpress
Public Sub New()
_barcodeXpress = New BarcodeXpress()
' Layer 1: SDK license
_barcodeXpress.Licensing.SolutionName = "AcmeCorp"
_barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")
' Layer 2: Runtime license — separate purchase, minimum 5
_barcodeXpress.Licensing.UnlockRuntime("RuntimeKey-XXXXXX", Convert.ToInt64("98765432109876"))
' Guard against partial-value mode
If Not _barcodeXpress.Licensing.IsRuntimeUnlocked Then
Throw New InvalidOperationException("Runtime license not active — barcode values will be obscured")
End If
End Sub
End Class
Se trata de un constructor de 15 líneas cuya única función es gestionar dos sistemas de claves de licencia independientes antes de que pueda realizarse cualquier operación con códigos de barras. La protección IsRuntimeUnlocked no es opcional - sin ella, el servicio devolverá silenciosamente valores degradados en cualquier entorno en el que falte la clave de tiempo de ejecución o esté mal configurada.
Enfoque IronBarcode
using IronBarCode;
// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-KEY";
using IronBarCode;
// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-KEY";
Imports IronBarCode
' In Program.vb or startup configuration
IronBarCode.License.LicenseKey = "YOUR-KEY"
Esta es la configuración completa de la licencia. Sin 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 implica configurar el lector a través de SetPropertyValue, que toma una constante y un valor, y luego llamar a Analyze() para recuperar los resultados:
using Accusoft.BarcodeXpressSdk;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var barcodeXpress = new BarcodeXpress();
barcodeXpress.Licensing.SolutionName = "AcmeCorp";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"));
barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath);
barcodeXpress.reader.BarcodeTypes =
BarcodeType.LinearBarcode |
BarcodeType.DataMatrixBarcode |
BarcodeType.QRCodeBarcode;
var results = barcodeXpress.reader.Analyze();
return results.Select(r => r.BarcodeValue);
}
using Accusoft.BarcodeXpressSdk;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var barcodeXpress = new BarcodeXpress();
barcodeXpress.Licensing.SolutionName = "AcmeCorp";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"));
barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath);
barcodeXpress.reader.BarcodeTypes =
BarcodeType.LinearBarcode |
BarcodeType.DataMatrixBarcode |
BarcodeType.QRCodeBarcode;
var results = barcodeXpress.reader.Analyze();
return results.Select(r => r.BarcodeValue);
}
Imports Accusoft.BarcodeXpressSdk
Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
Dim barcodeXpress = New BarcodeXpress()
barcodeXpress.Licensing.SolutionName = "AcmeCorp"
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")
barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"))
barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath)
barcodeXpress.reader.BarcodeTypes = BarcodeType.LinearBarcode Or BarcodeType.DataMatrixBarcode Or BarcodeType.QRCodeBarcode
Dim results = barcodeXpress.reader.Analyze()
Return results.Select(Function(r) r.BarcodeValue)
End Function
La constante cycBxeSetFilename es la forma que tiene la API de especificar el archivo que se va a procesar. Este patrón (pasar un identificador constante más un valor a un método genérico SetPropertyValue) recuerda a las antiguas API basadas en COM. Si un documento contiene un formato no listado en BarcodeTypes, no será encontrado. Esto se convierte en una carga de mantenimiento cuando cambian las fuentes de los documentos.
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
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
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 tiene 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;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
_barcodeXpress.reader.SetPropertyValue(
BarcodeXpress.cycBxeSetFilename, path);
_barcodeXpress.reader.BarcodeTypes =
BarcodeType.LinearBarcode | BarcodeType.QRCodeBarcode;
var barcodes = _barcodeXpress.reader.Analyze();
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
_barcodeXpress.reader.SetPropertyValue(
BarcodeXpress.cycBxeSetFilename, path);
_barcodeXpress.reader.BarcodeTypes =
BarcodeType.LinearBarcode | BarcodeType.QRCodeBarcode;
var barcodes = _barcodeXpress.reader.Analyze();
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
Imports Accusoft.BarcodeXpressSdk
Imports System.Collections.Generic
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
_barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, path)
_barcodeXpress.reader.BarcodeTypes = BarcodeType.LinearBarcode Or BarcodeType.QRCodeBarcode
Dim barcodes = _barcodeXpress.reader.Analyze()
If barcodes.Length > 0 Then
results(path) = barcodes(0).BarcodeValue
End If
Next
Return results
End Function
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)
Debido a que los métodos estáticos de IronBarcode no tienen 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 la lectura, la clase BarcodeReaderOptions proporciona las opciones 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)
ReadingSpeed.Balanced es el predeterminado. Utilice ReadingSpeed.Faster para procesos de alto rendimiento en los que 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.SolutionName = "..." |
IronBarCode.License.LicenseKey = "key" |
Licensing.SolutionKey = longValue |
(removed — not needed) |
Licensing.UnlockRuntime(key, solutionKey) |
(removed — no runtime license concept) |
Licensing.IsRuntimeUnlocked |
(removed — license is always either valid or not) |
reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, path) |
BarcodeReader.Read(path) |
lector.TiposDeCódigoDeBarras = TipoDeCódigoDeBarrasLineal \| ... |
(removed — auto-detection handles all formats) |
reader.Analyze() |
(part of BarcodeReader.Read) |
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 ocultos como "1234...XXX" | 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 la creación de una instancia BarcodeXpress y la obtención de una licencia antes de cualquier operación. Los métodos estáticos de IronBarcode no necesitan instanciarse. Los equipos que migran suelen tener una clase BarcodeService cuyo constructor es en gran parte una repetición de la licencia; tras la migración, ese constructor puede eliminarse por completo o reducirse a una única asignación de clave de licencia.
Eliminación de enumeración de tipos de código de barras
Cada operación de lectura de BarcodeXpress requiere una BarcodeTypes asignación de bandera para enumerar qué simbologías buscar. IronBarcode detecta automáticamente todos los formatos compatibles por defecto. Durante la migración, todas las asignaciones reader.BarcodeTypes = ...pueden eliminarse 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 requisito por defecto.
Cambios en el nombre de la propiedad de resultado
Dos cambios de nombre de propiedades afectan a todo el código de procesamiento de resultados: result.BarcodeValuese convierte en result.Value, y result.BarcodeTypese 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 pueden utilizarse para filtrado adicional sin cambios de código en 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 consiste en eliminar la instrucción COPY para el archivo config y añadir una única 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 logotipo:
QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")incrusta 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 escaneado - 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 para .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 periódicas garantizan la compatibilidad con .NET 10, previsto para finales de 2026, y con futuras versiones de .NET a medida que se publiquen.
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 se adapta a entornos en los que las fuentes de los documentos están bien controladas y los requisitos de formato son estables, lo que hace que la especificación BarcodeTypes del manual sea una configuración aceptable de una sola vez en lugar de un mantenimiento continuo.
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.
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().

