¿Qué biblioteca de códigos de barras C# debería utilizar para el desarrollo .NET ?
Cada desarrollador que ha usado Aspose.BarCode ha escrito alguna versión de esta línea: new BarCodeReader(path, DecodeType.Code128). Funciona bien cuando sabes qué formato tiene la imagen. Cuando no lo haces, —cuando un documento proviene de un sistema externo, un proveedor que cambió su formato de etiqueta, o una carga de usuario— tienes que adivinar una lista de tipos de decodificación o usar DecodeType.AllSupportedTypes, lo cual es típicamente más lento según la guía de Aspose. 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. Necesita Aspose.PDF for .NET para renderizar las páginas a imágenes primero. Aspose.PDF es un producto de suscripción separado además de lo que ya está pagando 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 80 simbologías de códigos de barras, una de las listas de formatos más completas en cualquier biblioteca comercial de códigos de barras .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 básico Code 128 requiere instanciar un BarcodeGenerator, configurar XDimension, BarHeight, y otros parámetros, y luego llamar a Save con un argumento de formato explícito. Leer requiere especificar qué tipos de decodificación buscar y luego iterar sobre los resultados devueltos por ReadBarCodes(). Ambas operaciones funcionan correctamente; simplemente son más prolijas de lo necesario.
Características arquitectónicas clave de Aspose.BarCode:
- Modelo de lectura primero formato: Cada operación de lectura requiere especificar
DecodeTypeexplícitamente. La función de reservaDecodeType.AllSupportedTypeses típicamente más lenta que una lista dirigida porque el decodificador pasa por cada simbología conocida de manera secuencial. - API basada en instancias: Tanto
BarCodeReadercomoBarcodeGeneratorson objetos instanciados que implementanIDisposable. Deben ser envueltos en bloquesusingpara liberar recursos nativos. - Sin compatibilidad nativa con PDF: Aspose.BarCode no puede abrir ni renderizar documentos PDF directamente. Leer códigos de barras de PDFs requiere Aspose.PDF, un producto de suscripción independiente.
- Jerarquía profunda de parámetros: La personalización se maneja a través de cadenas de propiedades
generator.Parameters.Barcode.*—una jerarquía de objetos multinivel que requiere memorización. - Licencias de Suscripción: Según los precios publicados de Aspose, los niveles por desarrollador y sitio son suscripciones anuales; no se lista una opción perpetua independiente.
- Activación de licencia basada en archivo: Los despliegues de producción requieren un archivo
.licaccesible en una ruta conocida, lo cual agrega 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:
using Aspose.BarCode.BarCodeRecognition;
var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
foreach (var result in reader.ReadBarCodes())
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
using Aspose.BarCode.BarCodeRecognition;
var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
foreach (var result in reader.ReadBarCodes())
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
Imports Aspose.BarCode.BarCodeRecognition
Dim reader As New BarCodeReader("barcode.png", DecodeType.Code128)
For Each result In reader.ReadBarCodes()
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
Next
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 opción de reserva, y es típicamente más lenta que una lista dirigida de tipos de decodificación.
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);
No usar using es una fuga de recursos. El BarcodeGenerator también implementa IDisposable, aunque las consecuencias de no disponerlo son menos severas. 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 es desarrollado y mantenido por Iron Software, una empresa centrada en herramientas para desarrolladores .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 requerir que el llamador especifique un equivalenteDecodeType. - 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 de archivos PDF sin necesidad de un paquete adicional o paso de renderizado. Los resultados incluyenresult.PageNumber. - API de generación fluida:
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 mediante
IronBarCode.License.LicenseKey, compatible con variables de entorno y gestores de secretos CI/CD.
Comparación de características
| Característica | Aspose.BarCode | IronBarcode |
|---|---|---|
| Detección de formato | Manual — debe especificar DecodeType o usar AllSupportedTypes lento |
Automático en todos los formatos compatibles. |
| Recuento de símbolos | Más de 80 | Más de 50 |
| Compatibilidad con PDF | Sin compatibilidad nativa: requiere una licencia de Aspose.PDF independiente | Nativo — BarcodeReader.Read("doc.pdf") incorporado en el paquete |
| Modelo de precios | Solo suscripción — niveles anuales desde $999/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 | API Estática — ver documentación de IronBarcode para orientación sobre hilos |
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 | Jerarquía de propiedades generator.Parameters.Barcode.* |
Cadena de métodos fluida (.ResizeTo(), .ChangeBarCodeColor()) |
| Código QR con logotipo | Superposición manual de GDI+ tras la generación | .AddBrandLogo("logo.png") incorporado |
| 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 | Conjunto de parámetros QualitySettings |
Enumeración ReadingSpeed — tres niveles |
| Lector desechable | Sí — using var reader = new BarCodeReader(...) |
No — llamada estática, no hay objeto que desechar |
| Acceso a los resultados | Iterar reader.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 | Sí |
| Requerido para PDF | Aspose.PDF (suscripción independiente) | 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) |
| Despliegues ilimitados (10 desarrolladores) | $13,986/año (Site OEM) | $5,999 pago único (ilimitado) |
| Soporte para PDF incluido | No — suscripción independiente a Aspose.PDF | Sí |
| Plataforma y despliegue | ||
| Activación de licencia | Ruta de archivo .lic |
Clave de cadena: variable de entorno |
| Despliegue de Docker | Debe copiar el archivo .lic en la imagen o montarlo |
Variable de entorno: no se requiere ningún archivo. |
| .NET Framework | Sí | Sí (4.6.2+) |
| .NET Core / .NET 5+ | Sí | Sí (.NET Core 3.1+, .NET 5/6/7/8) |
| Windows | Sí | Sí (x64/x86) |
| Linux | Sí | Sí (x64) |
| macOS | Sí | Sí (x64/ARM) |
| Docker | Sí | Sí |
| Azure / AWS Lambda | Sí | Sí |
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 usa una clase BarcodeGenerator con una jerarquía Parameters para 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 típicamente requiere navegar dentro de 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)
Cada personalización navega dentro de generator.Parameters.Barcode.*, que es una jerarquía de objetos multinivel. 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()
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")
Aspose.BarCode no incluye un asistente de un solo llamado de logo de marca para códigos QR; el enfoque documentado es generar la imagen del código de barras y luego superponer el logotipo sobre ella (por ejemplo, con System.Drawing.Graphics). El AddBrandLogo de IronBarcode maneja la composición en una llamada y ajusta automáticamente la corrección de errores de manera apropiada.
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. Está pagando dos suscripciones anuales por lo que la mayoría de los desarrolladores piensan como una sola capacidad.
// 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
Eso son dos configuraciones de licencia, dos declaraciones using de dos namespaces, una tubería de renderizado, gestión de memoria de flujos, y un bucle anidado. También usa DecodeType.AllSupportedTypes porque en el punto de extracción de imagen típicamente no se sabe qué formato usa 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. Llamas a Read con una ruta que termina en .pdf, y devuelve resultados de códigos de barras que incluyen result.PageNumber, así sabes 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
// 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
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 no sabe qué formato de código de barras contiene una imagen, las dos bibliotecas manejan la situación de manera diferente.
Enfoque de código de barras de Aspose.
DecodeType.AllSupportedTypes es la solución de Aspose para escenarios 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;
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;
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
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
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 quieres ajustar los compromisos de rendimiento frente a precisión, la opción ReadingSpeed lo hace sin requerir conocimiento del 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
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)
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 (escaneo lento y exhaustivo) |
Automático: siempre rápido, la misma llamada para todos los formatos. |
reader.ReadBarCodes() |
(part of BarcodeReader.Read — returns results directly) |
Iterar reader.ReadBarCodes() |
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 = "YOUR-LICENSE-KEY" |
new Aspose.BarCode.Metered() + .SetMeteredKey() |
(not needed — single key covers all environments) |
generator.GenerateBarCodeImage() |
.ToPngBinaryData() o .SaveAsPng() |
QREncodeMode.Auto + QRErrorLevel.LevelH + superposición de logotipo manual |
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 Aspose en la pila, pagar $999/año por desarrollador (o $4,995/año en el nivel Site) por funcionalidad de código de barras provoca 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 equipos que utilizan Aspose.Total — donde Aspose.BarCode se incluye con muchos otros productos Aspose — la historia es diferente. 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 requerimiento inmediato pero implica una segunda suscripción anual. Encontrar un renderizador de terceros agrega 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 fue construida suponiendo entradas de Code 128 y un cliente carga una etiqueta DataMatrix, un DecodeType.Code128 codificado devolverá silenciosamente sin resultados. Cambiar a DecodeType.AllSupportedTypes corrige la exactitud pero introduce un costo de rendimiento.
Los equipos que se han enfrentado a este problema —agregando más y más valores DecodeType a su configuración de lector a medida que nuevos formatos aparecen en producción— a menudo terminan manteniendo una lista que necesita actualizarse cada vez que se agrega 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 cambiar de paquete es el renombramiento de result.CodeText a 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" .
result.CodeText se convierte en result.Value. result.CodeTypeName se convierte en result.Format.ToString(). La propiedad result.Format es un valor enum BarcodeEncoding, que también permite comparaciones tipificadas donde sea necesario.
Eliminación de DecodeType
Cada referencia DecodeType.* en la base de código puede ser eliminada:
grep -r "DecodeType\." --include="*.cs" .
grep -r "DecodeType\." --include="*.cs" .
Si se enumeró un DecodeType específico para mejorar el rendimiento en un formato conocido, ReadingSpeed.Faster en BarcodeReaderOptions proporciona un beneficio similar sin requerir conocimiento del formato.
Cambio en la inicialización de la licencia
Aspose.BarCode usa 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"))
Remove el archivo .lic del repositorio y los artefactos de construcción. En Docker, quita la línea COPY Aspose.BarCode.lic y reemplaza con una entrada ENV IRONBARCODE_LICENSE.
Correspondencia entre tipos de codificación y codificación de códigos de barras
EncodeTypes.QR se asocia con BarcodeEncoding.QRCode — la diferencia de nombres es donde los equipos más a menudo encuentran el primer error de compilación después de migrar código de generación. La mayoría de los mapeos son equivalentes directos con nombres consistentes.
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:
- Detección de múltiples códigos de barras por imagen:
ExpectMultipleBarcodes = truedevuelve todos los códigos de barras encontrados en una sola imagen, con coordenadas de posición para cada uno. - Inserción de BarCodes en archivos PDF: Escribe BarCodes directamente en páginas PDF existentes sin necesidad de una biblioteca de PDF independiente.
- Lectura de TIFF de múltiples fotogramas: Lee BarCodes de todos los fotogramas de un TIFF de varias páginas en una sola llamada.
- Códigos QR personalizados: el color, el logotipo y el nivel de corrección de errores se configuran a través de la cadena Fluent sin necesidad de procesamiento de imágenes externo.
- Compatibilidad con Azure Functions y AWS Lambda: las implementaciones sin servidor son compatibles en ambas plataformas con la licencia estándar.
- Codificación de datos binarios: Codifica matrices de bytes directamente en BarCodes de Data Matrix o PDF417 para casos de uso de carga útil binaria.
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, y 8. La biblioteca recibe actualizaciones regulares alineadas con el calendario de lanzamientos de .NET de Microsoft. Aspose.BarCode soporta un rango de versiones .NET comparable, por lo que ninguna biblioteca presenta una ventaja de compatibilidad en 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. Cuando Aspose.Total ya está licenciado, Aspose.BarCode no añade costo marginal, y su lista de más de 80 simbologías es una de las más amplias disponibles en cualquier biblioteca comercial de códigos de barras .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 for .NET?
Aspose.BarCode for .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().

