Cómo Leer Códigos de Barras Desde Imágenes en C#
Migración de Código de barras a IronBarcode
Esta guía abarca el proceso completo de migración de Código de barras a IronBarcode para desarrolladores .NET . La migración consolida dos paquetes en uno, reemplaza la línea de procesamiento del codificador-renderizador con una única llamada de método, y colapsa todas las importaciones de espacios de nombre específicos del formato — using Barcoder.Code128, using Barcoder.Qr, using Barcoder.DataMatrix — en un solo using IronBarCode;. El tipo IBarcode y los tipos ImageRenderer / ImageRendererOptions se eliminan por completo. Si la lectura era una capacidad faltante que te llevó a agregar una segunda biblioteca junto a Barcoder, IronBarcode cubre la lectura de manera nativa con BarcodeReader.Read().
¿Por qué migrar desde Barcoder?
Los equipos que migran desde Código de barras informan de los siguientes factores desencadenantes:
Nota importante: Código de barras es una biblioteca que solo genera código y no tiene capacidad de decodificación. Cuando una aplicación necesita verificar códigos de barras entrantes, procesar documentos escaneados o leer códigos de barras de archivos PDF cargados, Código de barras no ofrece ninguna solución. Agregar una segunda biblioteca para la lectura crea una base de código dividida con dos dependencias NuGet , dos API que mantener y dos historiales de versiones que rastrear. IronBarcode gestiona tanto la generación como la lectura a través del mismo paquete.
Compatibilidad con .NET Framework interrumpida: Barcoder.Renderer.Image eliminó el soporte para .NET Framework. Los equipos que ejecutan servicios o aplicaciones de escritorio en .NET Framework 4.x y que actualizan el paquete de renderizado de imágenes durante el mantenimiento rutinario de dependencias se encuentran con un fallo de compilación. IronBarcode es compatible con .NET Framework desde la versión 4.6.2 hasta la .NET 9 sin necesidad de empaquetado condicional para diferentes plataformas.
Desviación de versión de paquete: Barcoder y Barcoder.Renderer.Image son paquetes NuGet versionados independientemente. Actualizar uno sin el otro durante una actualización de dependencias puede generar incompatibilidades. En repositorios con múltiples proyectos, garantizar la coherencia de las versiones de cada motor de renderizado en todos los proyectos supone una carga de coordinación que aumenta con el tamaño del equipo.
Se están añadiendo varios formatos: Un proyecto que empieza con Code128 y luego añade QR y después DataMatrix, debe añadir una nueva importación de espacio de nombres y aprender una clase de codificador diferente con distintos parámetros de método para cada formato. IronBarcode utiliza un enum BarcodeEncoding — agregar un formato es un cambio de una sola palabra en una llamada existente. No hay nuevo espacio de nombres, ni nueva clase, ni firma de método diferente.
Requisitos de MAUI y despliegue en la nube: Código de barras no documenta la compatibilidad con MAUI, Docker, AWS Lambda ni despliegues en Azure. Los equipos que desarrollan aplicaciones móviles multiplataforma o sistemas de procesamiento de códigos de barras sin servidor descubren que los objetivos documentados de Código de barras no cubren estos escenarios.
El problema fundamental
El editor de códigos de barras vincula la selección de formato a las importaciones de espacios de nombres y fuerza una canalización de renderizado para cada operación de salida. Cambiar de formato o tipo de salida requiere modificaciones estructurales en el código:
// Barcoder: 3 namespaces, encoder-specific class, renderer pipeline, stream management
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2,
BarHeightFor1DBarcode = 50
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
// Barcoder: 3 namespaces, encoder-specific class, renderer pipeline, stream management
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2,
BarHeightFor1DBarcode = 50
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO
Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 2,
.BarHeightFor1DBarcode = 50
})
Using stream As FileStream = File.OpenWrite("barcode.png")
renderer.Render(barcode, stream)
End Using
IronBarcode expresa la misma operación que una única llamada encadenada:
// IronBarcode: 1 namespace, 1 method, 1 output call
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
// IronBarcode: 1 namespace, 1 method, 1 output call
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
.SaveAsPng("barcode.png")
IronBarcode vs Barcoder: Comparación de características
| Característica | Código de barras | IronBarcode |
|---|---|---|
| Se requieren paquetes NuGet | 2 mínimo (Barcoder + Barcoder.Renderer.Image) | 1 (IronBarcode) |
| Generación de BarCodes | Sí | Sí |
| Lectura/decodificación de códigos de barras | No | Sí |
| Clases de codificadores por formato | Sí — Code128Encoder, QrEncoder, DataMatrixEncoder, etc. |
No — enum BarcodeEncoding |
| Importaciones de espacios de nombres por formato | Sí — Barcoder.Code128, Barcoder.Qr, Barcoder.DataMatrix |
No — solo using IronBarCode |
| Métodos de salida en el objeto de resultado | No — IBarcode no tiene métodos de guardado |
Sí — GeneratedBarcode tiene SaveAsPng, ToPngBinaryData, ToStream |
| Lectura de PDF | No | Sí — BarcodeReader.Read(path) |
| Código QR con logotipo | No | Sí — .AddBrandLogo(path) |
| Compatibilidad con .NET Framework | Renderizador de imágenes insertado | .NET Framework 4.6.2 o superior |
| Compatibilidad con .NET 9 | Actividad poco clara o limitada | Sí |
| Soporte de MAUI | No | Sí — iOS, Android, Windows, macOS |
| Docker / Azure / AWS Lambda | No documentado | Sí |
| Licencia | MIT (código abierto) | Commercial — Lite $999, Plus $1,499, Professional $2,999, Unlimited $5,999 |
| Control de velocidad de lectura | No | Sí — enum ReadingSpeed |
| Detección de múltiples códigos de barras | No | Sí — opción ExpectMultipleBarcodes |
Inicio rápido: Migración de Código de barras a IronBarcode
Paso 1: Sustituir el paquete NuGet
Elimine todos los paquetes de Código de barras de su proyecto:
dotnet remove package Barcoder
dotnet remove package Barcoder.Renderer.Image
dotnet remove package Barcoder
dotnet remove package Barcoder.Renderer.Image
Si también agregaste el renderizador SVG:
dotnet remove package Barcoder.Renderer.Svg
dotnet remove package Barcoder.Renderer.Svg
Instalar IronBarcode:
dotnet add package IronBarcode
dotnet add package IronBarcode
Paso 2: Actualizar los espacios de nombres
Elimina todas las declaraciones using Barcoder.* de cada archivo en el proyecto:
// Remove all of these
using Barcoder;
using Barcoder.Code128;
using Barcoder.Qr;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
using Barcoder.Ean;
using Barcoder.Pdf417;
// ... and any other Barcoder.* namespaces in your project
// Remove all of these
using Barcoder;
using Barcoder.Code128;
using Barcoder.Qr;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
using Barcoder.Ean;
using Barcoder.Pdf417;
// ... and any other Barcoder.* namespaces in your project
Reemplaza todas ellas con una sola directiva using:
using IronBarCode;
using IronBarCode;
Imports IronBarCode
Paso 3: Inicializar licencia
Agrega la inicialización de la licencia al inicio de la aplicación — Program.cs, Startup.cs, o MauiProgram.cs:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Puedes obtener una clave de prueba gratuita en ironsoftware.com .
Ejemplos de migración de código
Generación de código 128
Enfoque de código de barras:
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2,
BarHeightFor1DBarcode = 50
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2,
BarHeightFor1DBarcode = 50
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO
Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 2,
.BarHeightFor1DBarcode = 50
})
Using stream As FileStream = File.OpenWrite("barcode.png")
renderer.Render(barcode, stream)
End Using
Enfoque de IronBarcode :
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
.SaveAsPng("barcode.png")
El Code128Encoder, ImageRenderer, ImageRendererOptions, y la gestión de flujo se eliminan por completo. El formato se especifica como BarcodeEncoding.Code128 en la clase unificada BarcodeWriter. Los métodos de salida existen directamente en el objeto GeneratedBarcode devuelto. La documentación de IronBarcode sobre la generación de códigos de barras abarca la personalización del estilo, los márgenes y los colores.
Generación de códigos QR
Enfoque de código de barras:
using Barcoder;
using Barcoder.Qr;
using Barcoder.Renderers;
IBarcode barcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 4
});
using var stream = File.OpenWrite("qr.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.Qr;
using Barcoder.Renderers;
IBarcode barcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 4
});
using var stream = File.OpenWrite("qr.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Qr
Imports Barcoder.Renderers
Dim barcode As IBarcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M)
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 4
})
Using stream = File.OpenWrite("qr.png")
renderer.Render(barcode, stream)
End Using
Enfoque de IronBarcode :
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
Imports IronBarCode
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.SaveAsPng("qr.png")
El segundo parámetro para CreateQrCode es la dimensión de salida en píxeles. El nivel de corrección de errores viene configurado por defecto con un valor razonable y es configurable si es necesario. IronBarcode también admite una operación que no es posible en Barcoder: incrustar un logotipo de marca en el centro del código QR:
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
Imports IronBarCode
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.AddBrandLogo("logo.png") _
.SaveAsPng("qr-branded.png")
Generación de DataMatrix
Enfoque de código de barras:
using Barcoder;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
IBarcode barcode = DataMatrixEncoder.Encode("ITEM-XYZ-001");
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 5
});
using var stream = File.OpenWrite("datamatrix.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
IBarcode barcode = DataMatrixEncoder.Encode("ITEM-XYZ-001");
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 5
});
using var stream = File.OpenWrite("datamatrix.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.DataMatrix
Imports Barcoder.Renderers
Imports System.IO
Dim barcode As IBarcode = DataMatrixEncoder.Encode("ITEM-XYZ-001")
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 5
})
Using stream As FileStream = File.OpenWrite("datamatrix.png")
renderer.Render(barcode, stream)
End Using
Enfoque de IronBarcode :
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix)
.SaveAsPng("datamatrix.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix)
.SaveAsPng("datamatrix.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix) _
.SaveAsPng("datamatrix.png")
El patrón es idéntico a Code128 — solo cambia el valor BarcodeEncoding. No se importa ningún espacio de nombres nuevo, no hay una clase diferente, no hay una firma de método diferente.
Controlar el tamaño de salida
Barcoder utiliza PixelSize como un multiplicador de escala en el tamaño del módulo del código de barras y BarHeightFor1DBarcode para altura 1D — no hay una API directa de ancho/alto.
Enfoque de código de barras:
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 3,
BarHeightFor1DBarcode = 80
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 3,
BarHeightFor1DBarcode = 80
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports System.IO
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 3,
.BarHeightFor1DBarcode = 80
})
Using stream As FileStream = File.OpenWrite("barcode.png")
renderer.Render(barcode, stream)
End Using
Enfoque de IronBarcode :
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("barcode.png")
.ResizeTo(width, height) toma dimensiones de píxeles explícitas. Se encadena con otros métodos de salida en el mismo objeto GeneratedBarcode.
Obtener datos binarios en lugar de un archivo.
Enfoque de código de barras:
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2
});
using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2
});
using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO
Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 2
})
Using ms As New MemoryStream()
renderer.Render(barcode, ms)
Dim pngBytes As Byte() = ms.ToArray()
End Using
Enfoque de IronBarcode :
using IronBarCode;
byte[] pngBytes = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ToPngBinaryData();
using IronBarCode;
byte[] pngBytes = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ToPngBinaryData();
Imports IronBarCode
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128).ToPngBinaryData()
El patrón MemoryStream y ToArray() se reemplaza por una única llamada de método encadenada en GeneratedBarcode.
Lectura de códigos de barras (nueva funcionalidad)
El lector de códigos de barras no tiene API de lectura. Si previamente agregaste una segunda biblioteca para lectura, puedes eliminarla. IronBarcode lee archivos, matrices de bytes, flujos de datos y archivos PDF con el mismo paquete utilizado para su generación.
Enfoque de IronBarcode :
using IronBarCode;
// Read from image file
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Format: {result.Format}");
}
// Read from PDF natively — no image extraction step, no extra dependency
var pdfResults = BarcodeReader.Read("invoice.pdf");
// Read multiple barcodes from one image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-sheet.png", options);
foreach (var result in multiResults)
Console.WriteLine(result.Value);
// Read from a stream directly
using var fileStream = File.OpenRead("barcode.png");
var streamResults = BarcodeReader.Read(fileStream);
using IronBarCode;
// Read from image file
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Format: {result.Format}");
}
// Read from PDF natively — no image extraction step, no extra dependency
var pdfResults = BarcodeReader.Read("invoice.pdf");
// Read multiple barcodes from one image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-sheet.png", options);
foreach (var result in multiResults)
Console.WriteLine(result.Value);
// Read from a stream directly
using var fileStream = File.OpenRead("barcode.png");
var streamResults = BarcodeReader.Read(fileStream);
Imports IronBarCode
' Read from image file
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
Console.WriteLine($"Value: {result.Value}")
Console.WriteLine($"Format: {result.Format}")
Next
' Read from PDF natively — no image extraction step, no extra dependency
Dim pdfResults = BarcodeReader.Read("invoice.pdf")
' Read multiple barcodes from one image
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim multiResults = BarcodeReader.Read("warehouse-sheet.png", options)
For Each result In multiResults
Console.WriteLine(result.Value)
Next
' Read from a stream directly
Using fileStream = File.OpenRead("barcode.png")
Dim streamResults = BarcodeReader.Read(fileStream)
End Using
La documentación de IronBarcode sobre la lectura de códigos de barras abarca archivos PDF de varias páginas, lectura de regiones de interés y opciones de optimización del rendimiento.
Salida SVG
Enfoque de código de barras:
using Barcoder.Renderers;
var svgRenderer = new SvgRenderer();
using var stream = File.OpenWrite("barcode.svg");
svgRenderer.Render(barcode, stream);
using Barcoder.Renderers;
var svgRenderer = new SvgRenderer();
using var stream = File.OpenWrite("barcode.svg");
svgRenderer.Render(barcode, stream);
Imports Barcoder.Renderers
Dim svgRenderer = New SvgRenderer()
Using stream = File.OpenWrite("barcode.svg")
svgRenderer.Render(barcode, stream)
End Using
Enfoque de IronBarcode :
using IronBarCode;
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
.SaveAsSvg("barcode.svg");
using IronBarCode;
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
.SaveAsSvg("barcode.svg");
Imports IronBarCode
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) _
.SaveAsSvg("barcode.svg")
El paquete Barcoder.Renderer.Svg se puede eliminar una vez que todos los sitios de renderizado SVG estén migrados.
Referencia de mapeo de la API de Código de barras a IronBarcode
| Código de barras | IronBarcode |
|---|---|
Code128Encoder.Encode("data", false) |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
QrEncoder.Encode("data", ErrorCorrectionLevel.M) |
QRCodeWriter.CreateQrCode("data", 500) |
DataMatrixEncoder.Encode("data") |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix) |
new ImageRenderer(new ImageRendererOptions { ... }) |
No es necesario |
renderer.Render(barcode, fileStream) |
.SaveAsPng(path) |
renderer.Render(barcode, memoryStream) + ms.ToArray() |
.ToPngBinaryData() |
IBarcode |
GeneratedBarcode |
PixelSize = 2, BarHeightFor1DBarcode = 50 |
.ResizeTo(width, height) |
SvgRenderer + renderer.Render(barcode, stream) |
.SaveAsSvg(path) |
| No se puede leer la API | BarcodeReader.Read(path / stream / bytes / pdf) |
2 paquetes — Barcoder + Barcoder.Renderer.Image |
1 paquete — IronBarcode |
Espacio de nombres de formato por codificador (Barcoder.Code128, Barcoder.Qr, etc.) |
Enum BarcodeEncoding, único espacio de nombres |
Problemas comunes de migración y soluciones
Problema 1: IBarcode no tiene métodos para guardar datos.
Barcoder: El código que almacena una variable IBarcode y la pasa a un renderizador más tarde sigue un patrón de renderizado diferido. Cualquier método auxiliar que acepte IBarcode y llame a renderer.Render() debe ser refactorizado.
Solución: Cambia las referencias de tipo IBarcode a GeneratedBarcode. El objeto GeneratedBarcode lleva sus métodos de salida con él — pásalo a cualquier método que necesite guardar o serializar el resultado:
// IronBarcode — GeneratedBarcode carries output methods
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128);
SaveBarcodeToFile(barcode, "output.png");
static void SaveBarcodeToFile(GeneratedBarcode barcode, string path)
{
barcode.SaveAsPng(path);
}
// IronBarcode — GeneratedBarcode carries output methods
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128);
SaveBarcodeToFile(barcode, "output.png");
static void SaveBarcodeToFile(GeneratedBarcode barcode, string path)
{
barcode.SaveAsPng(path);
}
Imports IronBarCode
Dim barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
SaveBarcodeToFile(barcode, "output.png")
Private Sub SaveBarcodeToFile(barcode As GeneratedBarcode, path As String)
barcode.SaveAsPng(path)
End Sub
Una búsqueda de renderer.Render( en toda la solución localizará todos los sitios de renderizado diferido.
Problema 2: PixelSize no tiene un equivalente directo.
Barcoder: PixelSize es un multiplicador de escala en el tamaño del módulo natural del código de barras. Las dimensiones de salida dependen de la longitud del contenido, el formato y el multiplicador en combinación. BarHeightFor1DBarcode controla la altura 1D independientemente. No existe una especificación directa de ancho/alto.
Solución: Mide la salida de píxeles real que produce el código Código de barras existente y pasa esos valores a .ResizeTo(width, height):
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
.ResizeTo(300, 80)
.SaveAsPng("barcode.png");
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
.ResizeTo(300, 80)
.SaveAsPng("barcode.png");
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) _
.ResizeTo(300, 80) _
.SaveAsPng("barcode.png")
Problema 3: Formato de importación de espacios de nombres Acumulativo
Barcoder: Cada formato de código de barras utilizado en un proyecto agrega una directiva using Barcoder.[Format] a cada archivo que lo usa. Un proyecto que utiliza Code128, QR y DataMatrix generalmente tiene tres importaciones específicas del formato por archivo además de using Barcoder y using Barcoder.Renderers.
Solución: Realiza una búsqueda de todas las declaraciones using Barcoder y reemplázalas todas con using IronBarCode;:
grep -rn "using Barcoder" --include="*.cs" .
grep -rn "using Barcoder" --include="*.cs" .
Cada resultado es una línea para eliminar, reemplazada por la única directiva using IronBarCode; una vez por archivo.
Problema 4: Errores de sincronización de la versión del paquete
Barcoder: Construir después de actualizar solo uno de los paquetes Barcoder o Barcoder.Renderer.Image puede producir errores de resolución de tipo porque los dos paquetes pueden no ser compatibles en diferentes combinaciones de versiones.
Solución: Después de eliminar ambos paquetes Código de barras e instalar IronBarcode, hay un paquete y una versión. Se eliminan los conflictos de bloqueo de paquetes en esta categoría. Verifica que el archivo .csproj contenga solo la referencia IronBarcode y no queden referencias Barcoder.* antes de construir.
Lista de verificación para la migración de lectores de códigos de barras
Tareas previas a la migración
Antes de realizar cambios, revise su código fuente para identificar todos los usos de Barcoder:
grep -rn "using Barcoder" --include="*.cs" .
grep -rn "Code128Encoder\.Encode" --include="*.cs" .
grep -rn "QrEncoder\.Encode" --include="*.cs" .
grep -rn "DataMatrixEncoder\.Encode" --include="*.cs" .
grep -rn "ImageRenderer\|ImageRendererOptions" --include="*.cs" .
grep -rn "SvgRenderer" --include="*.cs" .
grep -rn "renderer\.Render(" --include="*.cs" .
grep -rn "IBarcode" --include="*.cs" .
grep -rn "ErrorCorrectionLevel" --include="*.cs" .
grep -rn "using Barcoder" --include="*.cs" .
grep -rn "Code128Encoder\.Encode" --include="*.cs" .
grep -rn "QrEncoder\.Encode" --include="*.cs" .
grep -rn "DataMatrixEncoder\.Encode" --include="*.cs" .
grep -rn "ImageRenderer\|ImageRendererOptions" --include="*.cs" .
grep -rn "SvgRenderer" --include="*.cs" .
grep -rn "renderer\.Render(" --include="*.cs" .
grep -rn "IBarcode" --include="*.cs" .
grep -rn "ErrorCorrectionLevel" --include="*.cs" .
Documenta todos los lugares donde IBarcode se almacena como un tipo de variable o se pasa como un parámetro de método — estos son los sitios de renderizado diferido que requieren más atención. Anota todos los valores PixelSize y BarHeightFor1DBarcode y mide las dimensiones de salida correspondientes.
Tareas de actualización de código
- Eliminar el paquete NuGet
Barcoderde todos los proyectos - Eliminar el paquete NuGet
Barcoder.Renderer.Imagede todos los proyectos - Eliminar el paquete NuGet
Barcoder.Renderer.Svgsi está presente - Instalar el paquete NuGet
IronBarcode - Agregar
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";al inicio de la aplicación - Reemplazar todas las declaraciones
using Barcoder.*conusing IronBarCode; - Reemplazar
Code128Encoder.Encode(...)conBarcodeWriter.CreateBarcode(..., BarcodeEncoding.Code128) - Reemplazar
QrEncoder.Encode(...)conQRCodeWriter.CreateQrCode(..., size) - Reemplazar
DataMatrixEncoder.Encode(...)conBarcodeWriter.CreateBarcode(..., BarcodeEncoding.DataMatrix) - Eliminar todas las construcciones
new ImageRenderer(new ImageRendererOptions {...}) - Reemplazar
renderer.Render(barcode, fileStream)con.SaveAsPng(path)enGeneratedBarcode - Reemplazar
renderer.Render(barcode, memoryStream)+ms.ToArray()con.ToPngBinaryData() - Reemplazar el uso de
SvgRenderercon.SaveAsSvg(path) - Cambiar las referencias de tipo
IBarcodeaGeneratedBarcode - Reemplazar las opciones
PixelSize/BarHeightFor1DBarcodecon.ResizeTo(width, height)
Pruebas posteriores a la migración
- Verifique que cada formato de código de barras generado se escanee correctamente con un escáner estándar o con el lector propio de IronBarcode.
- Comparar las dimensiones de salida visual con la salida previa a la migración — confirma que los valores
.ResizeTo()producen tamaños equivalentes - Pruebe la salida del código QR con un escáner de teléfono para confirmar que el nivel de corrección de errores sea adecuado.
- Verifique que la salida SVG se muestre correctamente en el navegador y en la impresora si su proyecto utiliza SVG.
- Si eliminaste una segunda biblioteca de lectura, verifica que
BarcodeReader.Read()produzca valores decodificados equivalentes para las mismas entradas - Pruebe la lectura de PDF si su proyecto procesa documentos PDF; confirme que los PDF de varias páginas se leen todas correctamente.
- Ejecutar una construcción con cero referencias
Barcoder.*restantes — los errores del compilador indican sitios de migración omitidos
Principales ventajas de migrar a IronBarcode
Dependencia de paquete unificada: Un paquete NuGet reemplaza a dos (o tres, si también se utilizó el renderizador SVG). Una sola versión para controlar, un solo registro de cambios para supervisar y sin problemas de compatibilidad entre paquetes durante las actualizaciones de dependencias. La .csproj y la packages.lock.json complejidad disminuyen inmediatamente.
Capacidad de lectura nativa: Las aplicaciones que antes requerían una segunda biblioteca para la lectura de códigos de barras ahora pueden integrarse en IronBarcode. BarcodeReader.Read() acepta archivos de imagen, arreglos de bytes, transmisiones y PDFs a través de la misma API, con detección de múltiples códigos de barras y ajuste de velocidad de lectura integrado.
Selección de Formato como Configuración: Agregar un nuevo formato de código de barras a un proyecto existente es un cambio de una palabra en el valor enum BarcodeEncoding en una llamada CreateBarcode existente. No se ha importado ningún espacio de nombres nuevo, ni se ha añadido ninguna clase de codificador nueva, ni se ha añadido ningún paquete nuevo. Esto facilita la expansión del formato a medida que evolucionan los requisitos del producto.
Dimensiones de Salida Explícitas: .ResizeTo(width, height) reemplaza el sistema de multiplicador indirecto PixelSize con una especificación de píxeles explícita. La relación entre el código y el resultado es directa y predecible, independientemente de la longitud del contenido del código de barras o del tamaño del módulo específico del formato.
Cobertura de plataforma ampliada: IronBarcode es compatible con .NET Framework 4.6.2 hasta .NET 9, implementaciones de MAUI en iOS, Android, Windows y macOS, e implementación documentada en Docker, AWS Lambda y Azure Functions. Los equipos cuyos requisitos de plataforma se expanden más allá de .NET Core no encontrarán la brecha de soporte del marco que afecta a Barcoder.Renderer.Image.
Mantenimiento activo y compatibilidad futura: IronBarcode publica actualizaciones periódicas con cronogramas de compatibilidad con .NET documentados. El ritmo de liberación activa mantiene la biblioteca alineada con las versiones actuales de .NET, lo cual no está asegurado desde una biblioteca con actividad de liberación reciente limitada.
Preguntas Frecuentes
¿Por qué debería migrar de Barcoder a IronBarcode?
Entre las razones más comunes se incluyen la simplificación de licencias (eliminando la complejidad de SDK + clave de tiempo de ejecución), la eliminación de límites de rendimiento, la obtención de compatibilidad nativa con PDF, la mejora de la implementación de Docker/CI/CD y la reducción de la repetición de API en el código de producción.
¿Cómo puedo sustituir las llamadas a la API de Barcoder por IronBarcode?
Sustituya la creación de instancias y la repetición de licencias por IronBarCode.License.LicenseKey = "key". Sustituya las llamadas al lector por BarcodeReader.Read(path) y las llamadas al escritor por BarcodeWriter.CreateBarcode(data, encoding). Los métodos estáticos no requieren gestión de instancias.
¿Cuánto cambia el código al migrar de Barcoder a IronBarcode?
La mayoría de las migraciones se traducen en menos líneas de código. Se eliminan la repetición de licencias, los constructores de instancias y la configuración explícita de formatos. Las operaciones básicas de lectura/escritura se traducen a equivalentes IronBarcode más cortos con objetos de resultado más limpios.
¿Necesito tener instalados Barcoder e IronBarcode durante la migración?
No. La mayoría de las migraciones son sustituciones directas en lugar de operaciones paralelas. Migre una clase de servicio cada vez, sustituya la referencia NuGet y actualice los patrones de instanciación y llamada a la API antes de pasar a la siguiente clase.
¿Cuál es el nombre del paquete NuGet para IronBarcode?
El paquete es 'IronBarCode' (con B y C mayúsculas). Instálalo con 'Install-Package IronBarCode' o 'dotnet add package IronBarCode'. La directiva using en el código es 'using IronBarCode;'.
¿Cómo simplifica IronBarcode el despliegue de Docker en comparación con BarCoder?
IronBarcode es un paquete NuGet sin archivos SDK externos ni configuración de licencia montada. En Docker, establezca la variable de entorno IRONBARCODE_LICENSE_KEY y el paquete se encargará de la validación de la licencia al inicio.
¿IronBarcode detecta automáticamente todos los formatos de código de barras tras migrar desde Barcoder?
Sí, IronBarcode detecta automáticamente la simbología de todos los formatos compatibles. No es necesaria la enumeración explícita de BarcodeTypes. Si ya se conoce el formato y el rendimiento es importante, BarcodeReaderOptions permite restringir el espacio de búsqueda como optimización.
¿Puede IronBarcode leer códigos de barras de PDF sin una biblioteca independiente?
Sí. BarcodeReader.Read("document.pdf") procesa archivos PDF de forma nativa. Los resultados incluyen PageNumber, Format, Value y Confidence para cada código de barras encontrado. No es necesario ningún paso externo de procesamiento de PDF.
¿Cómo gestiona IronBarcode el procesamiento paralelo de códigos de barras?
Los métodos estáticos de IronBarcode no tienen estado y son seguros para los hilos. Utilice Parallel.ForEach directamente sobre listas de archivos sin gestión de instancias por subproceso. BarcodeReaderOptions.MaxParallelThreads controla el presupuesto interno de hilos.
¿Qué propiedades de los resultados cambian al migrar de BarCoder a IronBarcode?
Cambios de nombre comunes: BarcodeValue se convierte en Value, BarcodeType se convierte en Format. Los resultados de IronBarcode también añaden Confidence y PageNumber. Una búsqueda y sustitución en toda la solución gestiona los cambios de nombre en el código de procesamiento de resultados existente.
¿Cómo configuro las licencias de IronBarcode en un proceso CI/CD?
Almacene IRONBARCODE_LICENSE_KEY como un secreto de canalización y asigne IronBarCode.License.LicenseKey en el código de inicio de la aplicación. Un secreto cubre todos los entornos, incluidos los de desarrollo, prueba, montaje y producción.
¿Admite IronBarcode la generación de códigos QR con estilos personalizados?
Sí. QRCodeWriter.CreateQrCode() admite colores personalizados mediante ChangeBarCodeColor(), incrustación de logotipos mediante AddBrandLogo(), niveles de corrección de errores configurables y múltiples formatos de salida, incluidos PNG, JPG, PDF y stream.

