Saltar al pie de página
COMPARAR CON OTROS COMPONENTES

Aspose.BarCode for .NET frente a IronBarcode: Comparación de bibliotecas de códigos de barras C#

Todos los desarrolladores que han utilizado Aspose.BarCode han escrito alguna versión de esta línea: new BarCodeReader(path, DecodeType.Code128). Funciona bien cuando sabes qué formato tiene la imagen. Cuando no es así -cuando un documento procede de un sistema externo, de un proveedor que ha cambiado el formato de sus etiquetas o de una carga del usuario-, o bien se adivina una lista de tipos de descodificación o se recurre a DecodeType.AllSupportedTypes, que es notablemente más lento. El requisito de especificación de formato no es un obstáculo insuperable, pero supone una fricción diaria que se acumula en cada operación de lectura de tu código fuente.

La historia del PDF es la historia del presupuesto. Si procesa BARCODES de documentos PDF, Aspose.BarCode no puede hacerlo por sí solo. Necesitas Aspose.PDF para .NET para convertir primero las páginas en imágenes. Aspose.PDF es otra suscripción: entre 999 y 4995 dólares al año, además de lo que ya pagas por Aspose.BarCode. Dos suscripciones para un flujo de trabajo que la mayoría de los desarrolladores consideran una sola tarea.

IronBarcode detecta automáticamente el formato de los códigos de barras, lee archivos PDF de forma nativa en un único paquete y ofrece una Licencia perpetua a partir de 749 $. Esta comparación examina ambas bibliotecas en detalle para que puedas tomar una decisión fundamentada.

Comprender Aspose.BarCode

Aspose lleva años creando bibliotecas de procesamiento de documentos para .NET, Java y otras plataformas. Aspose.BarCode es uno de los muchos productos de la familia, junto con Aspose.Words, Aspose.Cells, Aspose.PDF, Aspose.Slides y una docena más. Para los equipos que ya pagan por Aspose.Total —el paquete que incluye todos los productos de Aspose—, Aspose.BarCode se incluye sin coste adicional. Para los equipos que solo necesitan una biblioteca de códigos de barras, el modelo de suscripción es más difícil de justificar.

Aspose.BarCode admite más de 60 simbologías de códigos de barras, lo que la convierte en la lista de formatos más completa de cualquier biblioteca comercial de códigos de barras para .NET. Esa amplitud es el principal punto fuerte de la biblioteca. La superficie de la API es, en consecuencia, amplia, y la verbosidad de la API aumenta con las características. Generar un código de barras Código 128 básico requiere instanciar un BarcodeGenerator, establecer XDimension, BarHeight y otros parámetros, y luego llamar a Save con un argumento de formato explícito. La lectura requiere especificar qué tipos de decodificación buscar, llamar a ReadBarCodes() e iterar FoundBarCodes. Ambas operaciones funcionan correctamente; simplemente son más prolijas de lo necesario.

Características arquitectónicas clave de Aspose.BarCode:

  • Modelo de lectura de primer formato: Cada operación de lectura requiere especificar DecodeType explícitamente. La alternativa DecodeType.AllSupportedTypes es significativamente más lenta que una lista específica porque el descodificador ejecuta secuencialmente todas las simbologías conocidas.
  • API basada en instancias: Tanto BarCodeReader como BarcodeGenerator son objetos instanciados que implementan IDisposable. Si no se incluyen en bloques using, se producirán fugas de recursos.
  • Sin compatibilidad nativa con PDF: Aspose.BarCode no puede abrir ni renderizar documentos PDF directamente. La lectura de BARCODES de archivos PDF requiere Aspose.PDF, un producto de suscripción independiente con un precio de entre 999 y 4995 dólares al año.
  • Jerarquía de Parámetros Profunda: La personalización se maneja a través de generator.Parameters.Barcode.* cadenas de propiedades - una jerarquía de objetos de varios niveles que requiere memorización.
  • Solo licencias de suscripción: todos los niveles son suscripciones anuales. No hay ninguna opción de licencia perpetua disponible como producto independiente.
  • Activación de licencia basada en archivo: Los despliegues de producción requieren un archivo .lic accesible en una ruta conocida, lo que añade un paso de despliegue para entornos Dockery Kubernetes.

El modelo de lectura "Format-First"

La API de lectura de Aspose.BarCode se basa en el supuesto de que el usuario conoce el formato del código de barras:

// Aspose.BarCode: must specify format or use slow AllSupportedTypes
using Aspose.BarCode.BarCodeRecognition;

var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
reader.ReadBarCodes();
foreach (var result in reader.FoundBarCodes)
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
// Aspose.BarCode: must specify format or use slow AllSupportedTypes
using Aspose.BarCode.BarCodeRecognition;

var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
reader.ReadBarCodes();
foreach (var result in reader.FoundBarCodes)
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
Imports Aspose.BarCode.BarCodeRecognition

' Aspose.BarCode: must specify format or use slow AllSupportedTypes
Dim reader As New BarCodeReader("barcode.png", DecodeType.Code128)
reader.ReadBarCodes()
For Each result In reader.FoundBarCodes
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
Next
$vbLabelText   $csharpLabel

Cuando se conoce el formato, este patrón funciona bien. El problema es "cuando se conoce el formato". Un sistema de compras que procesa facturas de proveedores no puede garantizar que todos los proveedores utilicen el mismo tipo de BarCode. Un sistema de gestión de documentos que acepta archivos subidos por los usuarios no puede predecir qué formato ha utilizado un escáner. En esos casos, DecodeType.AllSupportedTypes es la alternativa, y es significativamente más lenta que una lista de tipos de decodificación específica.

El decodificador también debe estar disponible:

using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
$vbLabelText   $csharpLabel

No utilizar using supone una fuga de recursos. El BarcodeGenerator también implementa el IDisposable, aunque las consecuencias de no disponerlo son menos graves. En ambos casos, estás gestionando los ciclos de vida de los objetos que una API de fábrica estática manejaría automáticamente.

Entendiendo IronBarcode

IronBarcode utiliza métodos de fábrica estáticos tanto para la lectura como para la escritura. No hay ninguna instancia que construir, configurar o eliminar. La API de lectura es independiente del formato por defecto, y la misma llamada funciona independientemente de si el archivo de origen es un PNG, JPEG, TIFF o PDF.

IronBarcode ha sido desarrollado y es mantenido por Iron Software, una empresa dedicada exclusivamente a las herramientas de desarrollo .NET. La biblioteca se ha diseñado partiendo del principio de que la lectura de BarCodes no debe requerir un conocimiento previo del formato del BarCode: el motor de detección de la biblioteca determina el formato a partir del contenido de la imagen. Para la generación, una cadena de métodos fluida sustituye a la jerarquía de parámetros de varios niveles habitual en otras bibliotecas.

Características clave de IronBarcode:

  • Detección automática de formato: BarcodeReader.Read() identifica la simbología del código de barras a partir del contenido de la imagen sin necesidad de que el usuario especifique un DecodeType equivalente.
  • API estática sin estado: Todas las operaciones de lectura y escritura son métodos estáticos. No hay instancias desechables que gestionar, y la API es naturalmente segura para subprocesos, lo que permite su uso simultáneo.
  • Soporte nativo de PDF: BarcodeReader.Read("doc.pdf") lee directamente desde archivos PDF sin ningún paquete adicional o paso de renderizado. Los resultados incluyen result.PageNumber.
  • Fluent Generation API: BarcodeWriter.CreateBarcode() devuelve un objeto encadenable. La personalización utiliza el encadenamiento de métodos en lugar de una jerarquía de propiedades.
  • Modelo de licencia perpetua: Todos los niveles ofrecen una compra única sin necesidad de renovación anual.
  • Activación de licencia basada en cadenas: La clave de licencia se establece a través de IronBarCode.License.LicenseKey, compatible con variables de entorno y gestores secretos de CI/CD.

Comparación de características

Característica Aspose.BarCode IronBarcode
Detección de formato Manual - debe especificar DecodeType o utilizar AllSupportedTypes lento Automático en todos los formatos compatibles.
Recuento de símbolos Más de 60 Más de 50
Compatibilidad con PDF Sin compatibilidad nativa: requiere una licencia de Aspose.PDF independiente Nativo - BarcodeReader.Read("doc.pdf") integrado en el paquete
Modelo de precios Solo por suscripción — 999-4995 $/año Licencia perpetua desde 749 $ (pago único)
Licencia perpetua No disponible Sí, todos los niveles
Estilo API Configuración detallada basada en instancias Métodos de fábrica estáticos, API fluida
Requisito de IDisposable Sí - BarCodeReader y BarcodeGenerator No — métodos estáticos sin estado
Seguridad de los hilos Se requieren instancias independientes por cada subproceso Sin estado: naturalmente seguro para el uso simultáneo

Comparación detallada de características

Característica Aspose.BarCode IronBarcode
Generación
Estilo API new BarcodeGenerator(EncodeTypes.X, "data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.X)
Modelo de personalización generator.Parameters.Barcode.* jerarquía de propiedades Cadena de métodos fluidos (.ResizeTo(), .ChangeBarCodeColor())
Código QR con logotipo Superposición manual de GDI+ tras la generación .AddBrandLogo("logo.png") construido en
Salida en bytes generator.GenerateBarCodeImage() .ToPngBinaryData()
BarCodes en color generator.Parameters.Barcode.BarColor .ChangeBarCodeColor(Color.X)
Lectura
Especificaciones de formato Requerido (DecodeType) No es obligatorio — automático
Recurso de reserva para formatos desconocidos DecodeType.AllSupportedTypes (lento) Misma llamada: no se necesita modo de reserva
Optimización del rendimiento 12+ QualitySettings parámetros ReadingSpeed enum - tres niveles
Lector desechable Sí - using var reader = new BarCodeReader(...) No — llamada estática, no hay objeto que desechar
Acceso a los resultados reader.FoundBarCodesdespués de llamar a ReadBarCodes() Valor de retorno de BarcodeReader.Read()
Propiedad de valor del código de barras result.CodeText result.Value
Propiedad de formato de nombre result.CodeTypeName result.Format.ToString()
Soporte para PDF
Lectura nativa de PDF No
Requerido para PDF Aspose.PDF (entre 999 y 4995 dólares adicionales al año) Sin paquete adicional
Número de página en los resultados N/A result.PageNumber
Licencias
Modelo de licencia Solo suscripción, renovación anual Compra única y perpetua
Desarrollador único $999/año 749 $ una sola vez
10 desarrolladores $4,995/año (Licencia de sitio) $2,999 pago único (Professional)
Desarrolladores ilimitados $14,985/año (OEM) $5,999 pago único (ilimitado)
Soporte para PDF incluido No — suscripción independiente a Aspose.PDF
Plataforma y despliegue
Activación de licencia .lic ruta del archivo Clave de cadena: variable de entorno
Despliegue de Docker Debe copiar .lic archivo en la imagen o montarlo Variable de entorno: no se requiere ningún archivo.
.NET Framework Sí (4.6.2+)
.NET Core / .NET 5+ Sí (.NET Core 3.1+, .NET 5/6/7/8/9)
Windows Sí (x64/x86)
Linux Sí (x64)
macOS Sí (x64/ARM)
Docker
Azure / AWS Lambda

API de generación

La API de generación es donde la diferencia en la verbosidad entre las dos bibliotecas se hace más visible en el código cotidiano.

Enfoque de código de barras de Aspose.

Aspose.BarCode utiliza una clase BarcodeGenerator con una jerarquía Parameters para la configuración. Una llamada de generación mínima requiere tres pasos: instanciación, llamada de guardado y especificación de formato. El uso real suele requerir navegar por generator.Parameters.Barcode.*:

using Aspose.BarCode.Generation;
using System.Drawing;

var generator = new BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345");

// Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2;
generator.Parameters.Barcode.BarHeight.Pixels = 100;
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial";
generator.Parameters.Barcode.Padding.Left.Pixels = 10;
generator.Parameters.Barcode.Padding.Right.Pixels = 10;
generator.Parameters.BackColor = Color.White;
generator.Parameters.Resolution = 300;

generator.Save("barcode.png", BarCodeImageFormat.Png);
using Aspose.BarCode.Generation;
using System.Drawing;

var generator = new BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345");

// Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2;
generator.Parameters.Barcode.BarHeight.Pixels = 100;
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial";
generator.Parameters.Barcode.Padding.Left.Pixels = 10;
generator.Parameters.Barcode.Padding.Right.Pixels = 10;
generator.Parameters.BackColor = Color.White;
generator.Parameters.Resolution = 300;

generator.Save("barcode.png", BarCodeImageFormat.Png);
Imports Aspose.BarCode.Generation
Imports System.Drawing

Dim generator As New BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345")

' Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2
generator.Parameters.Barcode.BarHeight.Pixels = 100
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial"
generator.Parameters.Barcode.Padding.Left.Pixels = 10
generator.Parameters.Barcode.Padding.Right.Pixels = 10
generator.Parameters.BackColor = Color.White
generator.Parameters.Resolution = 300

generator.Save("barcode.png", BarCodeImageFormat.Png)
$vbLabelText   $csharpLabel

Cada personalización navega en generator.Parameters.Barcode.*, que es una jerarquía de objetos de varios niveles. No es complejo una vez que lo has memorizado, pero requiere memorización.

Enfoque IronBarcode

IronBarcode reemplaza la jerarquía de parámetros con una cadena de métodos fluida. La configuración predeterminada produce resultados correctos para la mayoría de los casos de uso, y la personalización se expresa en línea:

using IronBarCode;

// Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");

// Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");

// Get as bytes instead of saving to disk
byte[] pngData = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ToPngBinaryData();
using IronBarCode;

// Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");

// Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");

// Get as bytes instead of saving to disk
byte[] pngData = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ToPngBinaryData();
Imports IronBarCode

' Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .SaveAsPng("barcode.png")

' Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ResizeTo(400, 100) _
    .SaveAsPng("barcode.png")

' Get as bytes instead of saving to disk
Dim pngData As Byte() = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

Para los códigos QR, la API de generación de QR de IronBarcode incluye soporte para logotipos de marca sin necesidad de composición manual de imágenes:

using IronBarCode;
using IronSoftware.Drawing;

// With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");

// With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded-high-ecc.png");

// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
    .ChangeBarCodeColor(Color.DarkBlue)
    .SaveAsPng("qr-colored.png");
using IronBarCode;
using IronSoftware.Drawing;

// With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");

// With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded-high-ecc.png");

// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
    .ChangeBarCodeColor(Color.DarkBlue)
    .SaveAsPng("qr-colored.png");
Imports IronBarCode
Imports IronSoftware.Drawing

' With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded.png")

' With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode( _
    "https://example.com", _
    500, _
    QRCodeWriter.QrErrorCorrectionLevel.Highest) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded-high-ecc.png")

' Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300) _
    .ChangeBarCodeColor(Color.DarkBlue) _
    .SaveAsPng("qr-colored.png")
$vbLabelText   $csharpLabel

Aspose.BarCode requiere el dibujo manual de GDI+ para superponer un logotipo en un código QR: generar la imagen del código de barras y, a continuación, utilizar System.Drawing.Graphics para componer el logotipo centrado sobre ella. El AddBrandLogo de IronBarcode se encarga de ello en una sola llamada y establece automáticamente la corrección de errores adecuada.

Lectura de códigos de barras PDF

Para muchos equipos, esta es la comparación más importante. La lectura de códigos de barras en documentos PDF es un flujo de trabajo común: facturas entrantes, etiquetas de envío guardadas como PDF, archivos de documentos escaneados.

Enfoque de código de barras de Aspose.

Aspose.BarCode no tiene soporte nativo para PDF. Para leer un código de barras de un PDF con Aspose, necesita Aspose.PDF para cargar el PDF y convertir las páginas en imágenes, y Aspose.BarCode para escanear esas imágenes generadas. Ambos son productos de suscripción. Ambos requieren activación de licencia. En conjunto, estaríamos hablando de entre 1.998 y 9.990 dólares al año por lo que la mayoría de los desarrolladores consideran una sola funcionalidad.

// Requires both Aspose.PDF (separate license) and Aspose.BarCode
using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.BarCode.BarCodeRecognition;
using System.IO;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var barcodeValues = new List<string>();

    // Step 1: Load and render the PDF using Aspose.PDF
    var pdfDocument = new Aspose.Pdf.Document(pdfPath);
    var resolution = new Resolution(300);
    var device = new PngDevice(resolution);

    for (int pageNum = 1; pageNum <= pdfDocument.Pages.Count; pageNum++)
    {
        using var pageStream = new MemoryStream();
        device.Process(pdfDocument.Pages[pageNum], pageStream);
        pageStream.Seek(0, SeekOrigin.Begin);

        // Step 2: Scan the rendered image for barcodes using Aspose.BarCode
        using var reader = new BarCodeReader(pageStream, DecodeType.AllSupportedTypes);
        foreach (var result in reader.ReadBarCodes())
        {
            barcodeValues.Add(result.CodeText);
        }
    }

    return barcodeValues;
}
// Requires both Aspose.PDF (separate license) and Aspose.BarCode
using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.BarCode.BarCodeRecognition;
using System.IO;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var barcodeValues = new List<string>();

    // Step 1: Load and render the PDF using Aspose.PDF
    var pdfDocument = new Aspose.Pdf.Document(pdfPath);
    var resolution = new Resolution(300);
    var device = new PngDevice(resolution);

    for (int pageNum = 1; pageNum <= pdfDocument.Pages.Count; pageNum++)
    {
        using var pageStream = new MemoryStream();
        device.Process(pdfDocument.Pages[pageNum], pageStream);
        pageStream.Seek(0, SeekOrigin.Begin);

        // Step 2: Scan the rendered image for barcodes using Aspose.BarCode
        using var reader = new BarCodeReader(pageStream, DecodeType.AllSupportedTypes);
        foreach (var result in reader.ReadBarCodes())
        {
            barcodeValues.Add(result.CodeText);
        }
    }

    return barcodeValues;
}
Imports Aspose.Pdf
Imports Aspose.Pdf.Devices
Imports Aspose.BarCode.BarCodeRecognition
Imports System.IO

Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
    Dim barcodeValues As New List(Of String)()

    ' Step 1: Load and render the PDF using Aspose.PDF
    Dim pdfDocument As New Aspose.Pdf.Document(pdfPath)
    Dim resolution As New Resolution(300)
    Dim device As New PngDevice(resolution)

    For pageNum As Integer = 1 To pdfDocument.Pages.Count
        Using pageStream As New MemoryStream()
            device.Process(pdfDocument.Pages(pageNum), pageStream)
            pageStream.Seek(0, SeekOrigin.Begin)

            ' Step 2: Scan the rendered image for barcodes using Aspose.BarCode
            Using reader As New BarCodeReader(pageStream, DecodeType.AllSupportedTypes)
                For Each result In reader.ReadBarCodes()
                    barcodeValues.Add(result.CodeText)
                Next
            End Using
        End Using
    Next

    Return barcodeValues
End Function
$vbLabelText   $csharpLabel

Se trata de dos configuraciones de licencia, dos sentencias using de dos namespaces, un pipeline de renderizado, gestión de flujos de memoria y un bucle anidado. También utiliza DecodeType.AllSupportedTypes porque en el punto de extracción de la imagen normalmente no se sabe qué formato utiliza el código de barras.

Enfoque IronBarcode

IronBarcode se encarga internamente del análisis de archivos PDF, la representación de páginas y la detección de códigos de barras. Se llama a Read con una ruta que termina en .pdf, y devuelve resultados de código de barras que incluyen result.PageNumberpara que sepa de qué página proviene cada uno. Sin segundo paquete, sin segunda licencia, sin código de renderizado.

using IronBarCode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var results = BarcodeReader.Read(pdfPath);
    return results.Select(r => r.Value).ToList();
}
using IronBarCode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var results = BarcodeReader.Read(pdfPath);
    return results.Select(r => r.Value).ToList();
}
Imports IronBarCode

Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
    Dim results = BarcodeReader.Read(pdfPath)
    Return results.Select(Function(r) r.Value).ToList()
End Function
$vbLabelText   $csharpLabel
// With page number context
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
// With page number context
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
Imports System

' With page number context
Dim results = BarcodeReader.Read("invoice-batch.pdf")
For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}")
Next
$vbLabelText   $csharpLabel

La documentación de IronBarcode sobre la lectura de archivos PDF abarca el procesamiento por lotes de varias páginas y las opciones de filtrado por rango de páginas.

Lectura de formatos de código de barras desconocidos

Cuando se desconoce el formato del código de barras que contiene una imagen, las dos bibliotecas gestionan la situación de forma muy diferente.

Enfoque de código de barras de Aspose.

DecodeType.AllSupportedTypes es la solución de Aspose para situaciones de formato desconocido. La propia documentación de Aspose reconoce que es más lento que especificar una lista de destino, porque el decodificador recorre secuencialmente todas las simbologías conocidas. Para el procesamiento de alto volumen —un almacén que escanea miles de etiquetas por minuto— esta diferencia de rendimiento no es insignificante.

using Aspose.BarCode.BarCodeRecognition;

// AllSupportedTypes scans for every known format — significantly slower
using var reader = new BarCodeReader("unknown-format.png");
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
}
using Aspose.BarCode.BarCodeRecognition;

// AllSupportedTypes scans for every known format — significantly slower
using var reader = new BarCodeReader("unknown-format.png");
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
}
Imports Aspose.BarCode.BarCodeRecognition

' AllSupportedTypes scans for every known format — significantly slower
Using reader As New BarCodeReader("unknown-format.png")
    reader.SetBarCodeReadType(DecodeType.AllSupportedTypes)
    For Each result In reader.ReadBarCodes()
        Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
    Next
End Using
$vbLabelText   $csharpLabel

Enfoque IronBarcode

No existe un "modo lento" ni un "modo rápido" basados ​​en el conocimiento del formato. El sistema de detección de IronBarcode utiliza el mismo algoritmo tanto si la imagen contiene un código 128 como un DataMatrix. Si desea ajustar las compensaciones entre rendimiento y precisión, la opción ReadingSpeed lo hace sin necesidad de conocer el formato:

using IronBarCode;

// The same call regardless of format — always auto-detects
var results = BarcodeReader.Read("unknown-format.png");
foreach (var result in results)
{
    Console.WriteLine($"{result.Format}: {result.Value}");
}
using IronBarCode;

// The same call regardless of format — always auto-detects
var results = BarcodeReader.Read("unknown-format.png");
foreach (var result in results)
{
    Console.WriteLine($"{result.Format}: {result.Value}");
}
Imports IronBarCode

' The same call regardless of format — always auto-detects
Dim results = BarcodeReader.Read("unknown-format.png")
For Each result In results
    Console.WriteLine($"{result.Format}: {result.Value}")
Next
$vbLabelText   $csharpLabel
using IronBarCode;

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

var results = BarcodeReader.Read("document.png", options);
using IronBarCode;

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

var results = BarcodeReader.Read("document.png", options);
Imports IronBarCode

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

Dim results = BarcodeReader.Read("document.png", options)
$vbLabelText   $csharpLabel

ReadingSpeed.Faster prioriza el rendimiento. ReadingSpeed.Detailed prioriza la precisión en imágenes dañadas o de bajo contraste. Ninguna de las dos opciones requiere que conozcas el formato de antemano. Consulte las opciones de lectura de IronBarcode para obtener el conjunto completo de parámetros de ajuste.

Referencia de mapeo de API

Aspose.BarCode IronBarcode
new BarCodeGenerator(EncodeTypes.Code128, "data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
generator.Save("file.png", BarCodeImageFormat.Png) .SaveAsPng("file.png")
new BarCodeReader(path, DecodeType.Code128) BarcodeReader.Read(path)
DecodeType.AllSupportedTypes (exploración lenta y exhaustiva) Automático: siempre rápido, la misma llamada para todos los formatos.
reader.ReadBarCodes() (part of BarcodeReader.Read — returns results directly)
reader.FoundBarCodes Valor de retorno de BarcodeReader.Read
result.CodeText result.Value
result.CodeTypeName result.Format.ToString()
result.Confidence result.Confidence
Aspose.BarCode + Aspose.PDF for PDF reading BarcodeReader.Read("doc.pdf") - un paquete
license.SetLicense("Aspose.BarCode.lic") IronBarCode.License.LicenseKey = "key"
new Aspose.BarCode.Metered() + .SetMeteredKey() (not needed — single key covers all environments)
generator.GenerateBarCodeImage() .ToPngBinaryData()o .SaveAsPng()
QREncodeMode.Auto + QRErrorLevel.LevelH + sobreimpresión manual del logotipo QRCodeWriter.CreateQrCode().AddBrandLogo()

Cuando los equipos consideran migrar de Aspose.BarCode a IronBarcode

Existen varios escenarios que suelen llevar a los equipos de desarrollo a evaluar IronBarcode como una alternativa a Aspose.BarCode.

Llega la renovación de la suscripción.

La renovación anual de la suscripción es el momento en que los equipos suelen reconsiderar las decisiones relativas a la biblioteca. Si Aspose.BarCode es el único producto de Aspose en la pila, un precio de entre 999 y 4995 dólares al año por la funcionalidad de códigos de barras invita a realizar una comparación. La conversación suele ser: "Vamos a pagar esto todos los años para siempre". ¿Cuánto cuesta IronBarcode una sola vez? En el nivel Professional (2999 dólares para 10 desarrolladores), IronBarcode se amortiza en el primer año con la licencia del Sitio.

Para los equipos que utilizan Aspose.Total —donde Aspose.BarCode viene incluido con más de 20 productos— los cálculos son diferentes. El coste marginal de Aspose.BarCode dentro de ese paquete se aproxima a cero. Esos equipos tienen menos motivos para cambiar.

La compatibilidad con PDF se convierte en un requisito.

Muchos proyectos comienzan con la lectura de códigos de barras a partir de imágenes, y posteriormente añaden compatibilidad con PDF cuando alguna de las partes interesadas se da cuenta de que los documentos entrantes son archivos PDF en lugar de archivos de imagen. En ese momento, el equipo de Aspose.BarCode se enfrenta a una decisión: añadir Aspose.PDF (otra suscripción), buscar un generador de PDF de terceros o reevaluar la biblioteca de códigos de barras.

Agregar Aspose.PDF resuelve el problema inmediato, pero duplica el costo de la suscripción. Buscar un motor de renderizado de terceros añade una dependencia y un esfuerzo de integración. Reevaluar la biblioteca de códigos de barras y descubrir que IronBarcode lee archivos PDF de forma nativa por una tarifa única suele ser el resultado.

Escenarios de formato desconocido en la producción

Las aplicaciones de cara al cliente que aceptan la carga de documentos no pueden controlar el formato de código de barras que utiliza el documento cargado. Si la aplicación se construyó asumiendo entradas de Código 128 y un cliente carga una etiqueta DataMatrix, un DecodeType.Code128 codificado no devolverá ningún resultado. El cambio a DecodeType.AllSupportedTypes arregla la corrección pero introduce un coste de rendimiento.

Los equipos que se han encontrado con este problema -añadir más y más valores DecodeType a su configuración de lector a medida que aparecen nuevos formatos en producción- a menudo acaban manteniendo una lista que necesita actualizarse cada vez que se añade una nueva fuente de formato. La detección automática de IronBarcode hace que esa lista sea innecesaria.

Implementaciones en la nube y en contenedores

La licencia basada en archivos de Aspose.BarCode añade un paso de implementación: el archivo de licencia debe ser accesible en tiempo de ejecución desde una ruta que la aplicación pueda leer. En un flujo de trabajo GitOps, el archivo de licencia acaba en el control de código fuente (lo que supone un riesgo de seguridad) o debe insertarse a través de un volumen secreto montado. El enfoque basado en claves de IronBarcode encaja perfectamente en los secretos de Kubernetes y las variables secretas de CI/CD, sin necesidad de gestionar ningún archivo en la imagen del contenedor.

Consideraciones comunes sobre la migración

Los equipos que realizan la transición de Aspose.BarCode a IronBarcode se enfrentan a un pequeño conjunto de ajustes técnicos previsibles.

Asignación de nombres de propiedades

El error de compilación más común después de intercambiar paquetes es el cambio de nombre de result.CodeTexta result.Value. Una búsqueda en todo el código lo cubre rápidamente:

grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
SHELL

result.CodeText se convierte en result.Value. result.CodeTypeNamese convierte en result.Format.ToString(). La propiedad result.Format es un valor enum BarcodeEncoding, que también permite comparaciones tipográficas cuando sea necesario.

Eliminación de DecodeType

Se pueden eliminar todas las referencias DecodeType.* del código base:

grep -r "DecodeType\." --include="*.cs" .
grep -r "DecodeType\." --include="*.cs" .
SHELL

Si un DecodeType específico se enumeró para mejorar el rendimiento en un formato conocido, ReadingSpeed.Faster en BarcodeReaderOptions proporciona un beneficio similar sin requisitos de conocimiento del formato.

Cambio en la inicialización de la licencia

Aspose.BarCode utiliza un archivo .lic cargado a través de license.SetLicense(). IronBarcode utiliza una clave de cadena:

IronBarCode.License.LicenseKey =
    Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
    ?? throw new InvalidOperationException("IronBarcode license key not configured");
IronBarCode.License.LicenseKey =
    Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
    ?? throw new InvalidOperationException("IronBarcode license key not configured");
Imports IronBarCode
Imports System

License.LicenseKey = If(Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE"), Throw New InvalidOperationException("IronBarcode license key not configured"))
$vbLabelText   $csharpLabel

Eliminar el archivo .lic del repositorio y construir artefactos. En Docker, elimine la línea COPY Aspose.BarCode.lic y sustitúyala por una entrada ENV IRONBARCODE_LICENSE.

Correspondencia entre tipos de codificación y codificación de códigos de barras

EncodeTypes.QR se corresponde con BarcodeEncoding.QRCode - la diferencia de nomenclatura es donde los equipos se encuentran más a menudo con el primer error de compilación después de migrar el código de generación. El resto de correspondencias son equivalencias directas con una nomenclatura coherente.

Funcionalidades adicionales de IronBarcode

Más allá de los puntos de comparación fundamentales, IronBarcode ofrece capacidades que pueden ser relevantes dependiendo del contexto de la aplicación:

Compatibilidad con .NET y preparación para el futuro

IronBarcode es compatible con .NET Framework4.6.2+, .NET Core 3.1+ y .NET 5, 6, 7, 8 y 9. La biblioteca recibe actualizaciones periódicas alineadas con el ciclo de lanzamiento de .NET de Microsoft, lo que garantiza la compatibilidad con .NET 10, previsto para finales de 2026. Aspose.BarCode también es compatible con el mismo rango de versiones .NET, por lo que ninguna de las dos bibliotecas presenta una ventaja de compatibilidad con las versiones actuales. La diferencia significativa de cara al futuro es la licencia: una licencia perpetua de IronBarcode adquirida hoy cubre futuras versiones .NET sin coste adicional, mientras que las suscripciones a Aspose.BarCode requieren una renovación continua para acceder a las versiones actualizadas.

Conclusión

Aspose.BarCode e IronBarcode representan dos filosofías diferentes en el diseño de bibliotecas de códigos de barras. Aspose.BarCode se basa en una API explícita y basada en instancias, en la que el usuario especifica el formato, gestiona la vida útil de los objetos y configura cada operación a través de una jerarquía de propiedades. IronBarcode se basa en una API estática e independiente del formato, en la que la biblioteca gestiona internamente la detección, el ciclo de vida de los objetos y la representación de PDF. Ninguno de los dos enfoques es intrínsecamente correcto: la elección adecuada depende de las necesidades de la aplicación.

Aspose.BarCode es la mejor opción para los equipos que ya operan dentro del ecosistema de Aspose. Si ya se dispone de una licencia de Aspose.Total, Aspose.BarCode no supone ningún coste adicional, y su lista de más de 60 simbologías es la más amplia disponible en cualquier biblioteca comercial de códigos de barras para .NET. Para aplicaciones que requieran formatos poco habituales —MaxiCode, DotCode o simbologías postales específicas que no figuren en la lista de más de 50 de IronBarcode—, Aspose.BarCode puede ser la única opción viable. Su madurez y la amplitud de formatos son auténticos puntos fuertes.

Para los equipos que evalúan Aspose.BarCode como una compra independiente, el cálculo del valor es más difícil de realizar. El requisito de especificación de formato añade fricción a cada operación de lectura. La ausencia de compatibilidad nativa con PDF duplica el coste de la suscripción por una funcionalidad que IronBarcode incluye en su paquete básico. Además, el modelo de suscripción implica que el coste se acumula anualmente: 4995 $ al año para un equipo de 10 desarrolladores asciende a 24 975 $ en cinco años, en comparación con los 2999 $ que cuesta la compra única de IronBarcode Professional. La detección automática, la lectura nativa de PDF y la Licencia perpetua de IronBarcode resuelven estas tres preocupaciones en un único paquete.

La decisión final depende, en última instancia, de la adecuación al ecosistema y de los requisitos de simbología. Los equipos que trabajan estrechamente con los productos de Aspose, o aquellos que necesitan formatos que no figuran en la lista compatible de IronBarcode, deben utilizar Aspose.BarCode. Los equipos que deseen una licencia perpetua independiente, lectura nativa de PDF y una API que no requiera conocimientos de formato en cada lectura encontrarán en IronBarcode la opción más práctica.

Preguntas Frecuentes

¿Qué es Aspose.BarCode para .NET?

Aspose.BarCode para .NET es una biblioteca de códigos de barras .NET para generar y leer códigos de barras en aplicaciones C#. Es una de las 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 Aspose.BarCode for .NET e IronBarcode?

IronBarcode utiliza una API estática y sin estado que no requiere gestión de instancias, mientras que Aspose.BarCode for .NET 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 formatos y licencia de clave única en todos los entornos.

¿Es más fácil obtener la licencia de IronBarcode que la de Aspose.BarCode for .NET?

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.

¿Es IronBarcode compatible con todos los formatos de código de barras que admite Aspose.BarCode for .NET?

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 gestiona IronBarcode el procesamiento por lotes en comparación con Aspose.BarCode for .NET?

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 Aspose.BarCode?

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 Aspose.BarCode for .NET 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 Aspose.BarCode for .NET a IronBarcode?

La migración de Aspose.BarCode for .NET a IronBarcode consiste principalmente en sustituir las llamadas a la API basadas en instancias por métodos estáticos de IronBarcode, eliminar la repetición de licencias y actualizar 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().

Jordi Bardia
Ingeniero de Software
Jordi es más competente en Python, C# y C++. Cuando no está aprovechando sus habilidades en Iron Software, está programando juegos. Compartiendo responsabilidades para pruebas de productos, desarrollo de productos e investigación, Jordi agrega un valor inmenso a la mejora continua del producto. La experiencia variada lo mantiene ...
Leer más

Equipo de soporte de Iron

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