Saltar al pie de página
VIDEOS

Cómo Configurar una Región de Recorte de Código de Barras en C#

Migrating from Código de barras de red to IronBarcode

Esta guía abarca la ruta de migración completa de Código de barras de red a IronBarcode , con pasos para eliminar paquetes, actualizaciones de espacios de nombres, ejemplos de traducción de API y una lista de verificación para localizar cada punto de llamada antes de que comience la migración. La guía aborda el escenario común en el que un proyecto comienza con Código de barras de red para generación de códigos de barras 1D y luego requiere formatos 2D, capacidad de lectura o aclaración de la obligación de licencia de SixLabors.ImageSharp, todo lo cual está fuera del alcance de NetBarcode.

¿Por qué migrar desde NetBarcode?

Límite de formato: El enum Type de Código de barras de red define exactamente 11 formatos de código de barras, todos lineales. No hay ninguna entrada para código QR, DataMatrix, PDF417 o Aztec. Cuando un proyecto añade el requisito de incluir un código QR, ya sea para enlaces de entrega sin contacto, enlaces directos para dispositivos móviles o un requisito de DataMatrix para la industria farmacéutica, Código de barras de red no puede satisfacerlo. La única solución dentro del diseño de la biblioteca es dejar de usarla para ese formato e introducir un paquete aparte. Cada requisito de formato adicional que cae fuera del enum de 11 entradas agrega otra biblioteca al árbol de dependencias.

Sin API de lectura: Código de barras de red genera imágenes de códigos de barras y no proporciona ningún método para decodificarlas. Un proyecto que necesite escanear etiquetas de envío de devolución, extraer valores de códigos de barras de facturas de proveedores o validar que un código de barras impreso coincida con sus datos de origen debe agregar una biblioteca de lectura independiente. La opción más común es integrar ZX en .NET , introduciendo una tercera interfaz API en un código base que ya contiene Código de barras de red y, normalmente, una biblioteca específica para códigos QR.

Licencia Comercial de ImageSharp: Código de barras de red depende de SixLabors.ImageSharp, que utiliza una licencia comercial dividida. El nivel gratuito se aplica a proyectos de código abierto y a empresas con ingresos anuales inferiores a un umbral definido. por encima de ese umbral se requiere una licencia comercial. Esta condición está integrada en la cadena de dependencias transitivas y NuGet no la detecta durante la instalación. Una empresa minorista o de logística que procese códigos de barras a gran escala —precisamente el caso de uso al que apunta NetBarcode— puede estar operando por encima del umbral sin haber evaluado la obligación.

Acumulación de múltiples bibliotecas: Los proyectos que recurren a QRCoder cuando se necesitan códigos QR y luego a ZXing .NET cuando se requiere lectura, acumulan tres dependencias separadas relacionadas con códigos de barras. Cada una tiene su propio calendario de lanzamientos, sus propias expectativas de versión de ImageSharp y su propia API que mantener. La consolidación en una única biblioteca que abarque la generación, la lectura, las imágenes 1D y 2D elimina el problema de la gestión de versiones entre diferentes bibliotecas.

El problema fundamental

Un proyecto que comienza solo con Código de barras de red y luego crece hasta requerir formatos 2D termina con este tipo de importación dividida:

// Código de barras de red for 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
// Código de barras de red for 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
Imports NetBarcode
Imports QRCoder
Imports System.IO

' Código de barras de red for 1D — one library, one API
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")

' QRCoder added separately for QR — second library, second API
Dim qrGenerator As New QRCodeGenerator()
Dim qrData As QRCodeData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim png As Byte() = New PngByteQRCode(qrData).GetGraphic(20)
File.WriteAllBytes("qr.png", png)
$vbLabelText   $csharpLabel

Tras migrar a IronBarcode, se obtienen los mismos dos resultados con una sola importación:

using IronBarCode;

BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
    .SaveAsPng("label.png")

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsPng("qr.png")
$vbLabelText   $csharpLabel

IronBarcode vs NetBarcode: Comparación de características

Característica Código de barras de red IronBarcode
Generación de códigos de barras 1D
Generación de códigos de barras 2D (QR, DataMatrix, PDF417, Aztec) No
Lectura de códigos de barras a partir de imágenes No
Lectura de códigos de barras en documentos PDF No
Recuento de formato 1D 11 30+
Recuento de formato 2D 0 8+
Simbologías totales 11 Más de 50
GS1-128, GS1 DataBar No
Formatos postales No
Salida SVG No
Procesamiento por lotes Manual Incorporado en
Dependencia de ImageSharp Sí (licencia dividida) No
Apoyo comercial Comunidad Profesional
Modelo de licencia MIT (+ condiciones de ImageSharp) Comercial

Inicio rápido: Migración de Código de barras de red a IronBarcode

Paso 1: Sustituir el paquete NuGet

Elimine Código de barras de red y su dependencia transitiva de ImageSharp:

dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
SHELL

Tenga en cuenta que SixLabors.ImageSharp puede reaparecer en la lista de paquetes restaurados si otros paquetes en el proyecto también lo referencian de forma transitiva. Después de la eliminación, ejecute dotnet list package --include-transitive para confirmar si ImageSharp permanece y si su condición de licencia comercial aún se aplica al proyecto.

Paso 2: Añadir IronBarcode

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

El nombre del paquete NuGet es IronBarcode; el espacio de nombres utilizado en el código es IronBarCode (note la C mayúscula).

Paso 3: Actualizar los espacios de nombres e inicializar la licencia.

Reemplace las directivas using antiguas en cada archivo que contenía llamadas a NetBarcode:

// Eliminar these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;

// Add this:
using IronBarCode;
// Eliminar these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;

// Add this:
using IronBarCode;
Imports IronBarCode
$vbLabelText   $csharpLabel

Agregue la inicialización de la licencia una vez en el inicio de la aplicación — en Program.cs, Startup.cs, o el punto de entrada del proyecto:

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Hay disponible una clave de prueba gratuita para su evaluación; La compra de una licencia elimina la marca de agua de prueba de las imágenes de códigos de barras generadas.

Ejemplos de migración de código

Generación de código 128

El patrón de uso más común de Código de barras de red se traduce directamente a IronBarcode con un cambio de constructor a método estático y un cambio de nombre del método.

Enfoque de NetBarcode:

using NetBarcode;

var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");
using NetBarcode;

var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");
Imports NetBarcode

Dim barcode As New Barcode("12345678901234", Type.Code128)
barcode.SaveImageFile("shipping-label.png")
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128) _
    .SaveAsPng("shipping-label.png")
$vbLabelText   $csharpLabel

El constructor new Barcode(data, Type.X) se convierte en BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X). El método SaveImageFile() se convierte en SaveAsPng(), SaveAsJpeg(), o SaveAsWindowsBitmap() dependiendo del formato de salida requerido. Todas las opciones disponibles para la generación de códigos de barras 1D están documentadas en las guías prácticas de IronBarcode .

EAN-13

Los tipos de códigos de barras de productos minoristas se asignan directamente entre bibliotecas mediante un cambio de nombre de constante y un cambio de nombre de método.

Enfoque de NetBarcode:

using NetBarcode;

var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product-ean.png");
using NetBarcode;

var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product-ean.png");
Imports NetBarcode

Dim ean13 As New Barcode("5901234123457", Type.EAN13)
ean13.SaveImageFile("product-ean.png")
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product-ean.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product-ean.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
    .SaveAsPng("product-ean.png")
$vbLabelText   $csharpLabel

Los nombres de las constantes de codificación coinciden con los nombres de los miembros de enum Type de Código de barras de red donde existen equivalentes directos. Tenga en cuenta que UPC-A (Type.UPCA), UPC-E (Type.UPCE), ITF (Type.ITF), y MSI (Type.MSI) no son parte del enum Type de Código de barras de red — si esos formatos son necesarios, IronBarcode los soporta nativamente a través de BarcodeEncoding.UPCA, BarcodeEncoding.UPCE, BarcodeEncoding.ITF, y BarcodeEncoding.MSI.

ObtenerImagen() a ToPngBinaryData()

El método GetImage() de Código de barras de red devuelve SixLabors.ImageSharp.Image<Rgba32>, lo que requiere importaciones explícitas de ImageSharp en el código de llamada y vincula la lógica descendente a la API de ImageSharp. IronBarcode expone métodos de salida binaria y de flujo directamente en el objeto GeneratedBarcode, eliminando por completo la dependencia de ImageSharp del código de llamada.

Enfoque de NetBarcode:

using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();

using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();

using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
Imports NetBarcode
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats
Imports System.IO

Dim barcode As New Barcode("12345", Type.Code128)
Dim image As Image(Of Rgba32) = barcode.GetImage()

Using stream As New MemoryStream()
    image.SaveAsPng(stream)
    Dim bytes As Byte() = stream.ToArray()
End Using
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);

// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();

// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);

// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();

// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
Imports IronBarCode

Dim barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)

' Retrieve bytes directly — no ImageSharp type in calling code
Dim bytes As Byte() = barcode.ToPngBinaryData()

' Or write to a stream directly
Using stream As New MemoryStream()
    barcode.SaveAsPng(stream)
End Using
$vbLabelText   $csharpLabel

El código que realizaba manipulaciones adicionales de ImageSharp en el resultado Image<Rgba32> — redimensionamiento, composición, conversión de formato — necesitará que esas operaciones se evalúen individualmente, ya que IronBarcode no expone un objeto ImageSharp.

Reemplazar Código de barras de red y QRCoder juntos

Los proyectos que utilizan Código de barras de red junto con QRCoder pueden reemplazar ambos a la vez. La generación 2D de IronBarcode utiliza el mismo método BarcodeWriter.CreateBarcode que su generación 1D; solo difiere la constante BarcodeEncoding. Consulte la guía de generación de códigos de barras 2D para obtener información sobre las opciones de codificación y configuración.

Enfoque de Código de barras de red y QRCoder:

using NetBarcode;
using QRCoder;

// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));
using NetBarcode;
using QRCoder;

// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));
Imports NetBarcode
Imports QRCoder

' 1D with NetBarcode
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")

' QR with QRCoder
Dim qrGenerator As New QRCodeGenerator()
Dim qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim qrCode As New PngByteQRCode(qrData)
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20))
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-label.png");
using IronBarCode;

// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-label.png");
Imports IronBarCode

' 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
    .SaveAsPng("label.png")

' QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsPng("qr.png")

' Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix) _
    .SaveAsPng("pharma-label.png")
$vbLabelText   $csharpLabel

Agregar capacidad de lectura

Si el proyecto también utiliza ZXing .NET para la lectura, esa dependencia se puede eliminar junto con NetBarcode. El BarcodeReader de IronBarcode maneja imágenes y documentos PDF con detección de formato automática.

Enfoque ZXing .NET :

using ZXing;
using ZXing.Common;
using ZXing.Rendering;

var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };

// Bitmap loading and format-specific handling required before decode call
using ZXing;
using ZXing.Common;
using ZXing.Rendering;

var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };

// Bitmap loading and format-specific handling required before decode call
Imports ZXing
Imports ZXing.Common
Imports ZXing.Rendering

Dim reader = New BarcodeReaderGeneric()
reader.Options = New DecodingOptions With {.TryHarder = True}

' Bitmap loading and format-specific handling required before decode call
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

// Read from an image file — automatic format detection
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
    Console.WriteLine($"{r.Format}: {r.Value}");
}

// Read from a PDF document — no separate PDF library needed
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var r in pdfResults)
{
    Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}");
}
using IronBarCode;

// Read from an image file — automatic format detection
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
    Console.WriteLine($"{r.Format}: {r.Value}");
}

// Read from a PDF document — no separate PDF library needed
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var r in pdfResults)
{
    Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}");
}
Imports IronBarCode

' Read from an image file — automatic format detection
Dim imageResults = BarcodeReader.Read("shipping-label.png")
For Each r In imageResults
    Console.WriteLine($"{r.Format}: {r.Value}")
Next

' Read from a PDF document — no separate PDF library needed
Dim pdfResults = BarcodeReader.Read("supplier-invoice.pdf")
For Each r In pdfResults
    Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}")
Next
$vbLabelText   $csharpLabel

La documentación completa sobre las opciones de lectura está disponible en la guía de lectura de códigos de barras a partir de imágenes , que abarca el ajuste de velocidad, la detección de múltiples códigos de barras y la configuración de corrección de imágenes.

Referencia de mapeo de la API de Código de barras de red a IronBarcode

Código de barras de red IronBarcode Notas
new Barcode(data, Type.Code128) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) Constructor → método estático
new Barcode(data, Type.EAN13) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN13) Mapeo directo
new Barcode(data, Type.Code39) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code39) Mapeo directo
new Barcode(data, Type.EAN8) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN8) Mapeo directo
new Barcode(data, Type.Codabar) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Codabar) Mapeo directo
new Barcode(data, Type.Code93) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code93) Mapeo directo
barcode.SaveImageFile("x.png") .SaveAsPng("x.png") renombrar método
barcode.SaveImageFile("x.jpg") .SaveAsJpeg("x.jpg") renombrar método
barcode.GetImage()Image<Rgba32> .ToPngBinaryData() o .SaveAsPng() No se muestra ningún tipo ImageSharp
No Type.QRCode BarcodeEncoding.QRCode Nueva capacidad
No Type.DataMatrix BarcodeEncoding.DataMatrix Nueva capacidad
No Type.PDF417 BarcodeEncoding.PDF417 Nueva capacidad
No Type.Aztec BarcodeEncoding.Aztec Nueva capacidad
No se puede leer la API BarcodeReader.Read(path) Nueva capacidad
using NetBarcode; using IronBarCode; Reemplazo de espacio de nombres
using SixLabors.ImageSharp; Eliminar Ya no es necesario
using SixLabors.ImageSharp.PixelFormats; Eliminar Ya no es necesario
using SixLabors.Fonts; Eliminar Ya no es necesario

La lista completa de constantes de codificación se encuentra en la referencia de formatos de código de barras compatibles .

Problemas comunes de migración y soluciones

Problema 1: La dependencia transitiva de ImageSharp persiste tras la eliminación del paquete.

Problema: Después de ejecutar dotnet remove package NetBarcode, dotnet restore muestra que SixLabors.ImageSharp aún está presente en el árbol de dependencias porque otro paquete en el proyecto también lo referencia.

Solución: Ejecute dotnet list package --include-transitive para identificar qué paquete aún está trayendo ImageSharp. Si solo es NetBarcode, eliminar la referencia explícita del paquete y restaurar debería eliminarlo. Si otro paquete es responsable, la dependencia de ImageSharp de ese paquete y su condición de licencia comercial permanecen en alcance independientemente de la eliminación de NetBarcode.

dotnet list package --include-transitive | grep -i imagesharp
dotnet list package --include-transitive | grep -i imagesharp
SHELL

Número 2: Imagen El tipo no se puede resolver después de la eliminación.

Problema: Después de eliminar el paquete SixLabors.ImageSharp, cualquier variable declarada como Image<Rgba32> o parámetro tipado como SixLabors.ImageSharp.Image<Rgba32> produce un error de compilación porque el tipo ya no está disponible.

Solución: Reemplace cada uso con el método de salida IronBarcode apropiado. Si la variable se utilizaba para obtener bytes, reemplácela por .ToPngBinaryData(). Si se escribía en un flujo, reemplácela por .SaveAsPng(stream). Si se guardaba en un archivo, reemplácela por .SaveAsPng(path).

// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);

// After — no external image type required
barcode.SaveAsPng(stream);
// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);

// After — no external image type required
barcode.SaveAsPng(stream);
' Before — requires SixLabors.ImageSharp reference
Dim img As Image(Of Rgba32) = barcode.GetImage()
img.SaveAsPng(stream)

' After — no external image type required
barcode.SaveAsPng(stream)
$vbLabelText   $csharpLabel

Problema 3: v1.8 Cambio importante Contexto

Problema: Las bases de código que fueron escritas contra Código de barras de red antes de la v1.8 pueden tener llamadas a GetImage() que almacenaban el resultado sin tipificación explícita, confiando en el tipo de retorno interno previo a la v1.8. Es posible que estas llamadas ya no funcionen después de una actualización de NetBarcode, independientemente de la migración a IronBarcode .

Solución: Utilice la migración de IronBarcode como una oportunidad para resolver cualquier ruptura previa a la v1.8 al mismo tiempo. Todas las ubicaciones de llamadas a GetImage() deben ser localizadas con una búsqueda en todo el proyecto y reemplazadas por el método de salida de IronBarcode adecuado durante el proceso de migración. Los comandos grep que aparecen en la lista de verificación de migración a continuación identifican estas ubicaciones.

Lista de verificación para la migración de NetBarcode

Pre-Migración

Realice una auditoría de todo el uso de Código de barras de red antes de realizar cualquier cambio:

grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
SHELL
  • Identificar todos los archivos que requieren un cambio en la directiva using.
  • Anote todas las ubicaciones de llamadas a GetImage() y cómo se usa el objeto Image<Rgba32> devuelto en la lógica descendente
  • Compruebe si QRCoder o ZXing .NET están presentes y si se pueden eliminar en la misma pasada.
  • Ejecute dotnet list package --include-transitive para documentar el estado actual de la dependencia de ImageSharp antes de la eliminación
  • Obtenga una clave de licencia de IronBarcode (hay disponible una clave de prueba gratuita sin necesidad de compra).

Actualización de código

  1. Ejecute dotnet remove package NetBarcode
  2. Ejecute dotnet remove package SixLabors.ImageSharp si no es usado por otros paquetes
  3. Ejecute dotnet add package IronBarcode
  4. Agregue IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; al inicio de la aplicación
  5. Reemplace using NetBarcode; por using IronBarCode; en cada archivo afectado
  6. Eliminé using SixLabors.ImageSharp;, using SixLabors.ImageSharp.PixelFormats; y using SixLabors.Fonts; de todos los archivos
  7. Traduzca cada llamada a new Barcode(data, Type.X) a BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X) usando la tabla de mapeo de API
  8. Reemplace SaveImageFile() con SaveAsPng() o el método específico de formato adecuado
  9. Reemplace las llamadas a GetImage() con ToPngBinaryData(), SaveAsPng(), o SaveAsPng(stream) según sea apropiado
  10. Si elimina QRCoder: reemplace las cadenas QRCodeGenerator + PngByteQRCode con BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
  11. Si elimina ZXing.Net: reemplace la configuración del lector con BarcodeReader.Read(path)

Pruebas posteriores a la migración

  • Compila el proyecto y confirma que no haya errores de compilación.
  • Ejecutar las pruebas unitarias existentes con la salida del código de barras generado.
  • Verificar visualmente las imágenes de los códigos de barras para comprobar que la simbología sea correcta y el contenido legible.
  • Verifique la salida del código QR si ese formato se agregó durante la migración.
  • Comprobar la funcionalidad de lectura si se ha añadido el escaneo de códigos de barras
  • Ejecute dotnet list package --include-transitive para confirmar que ImageSharp ya no está presente si se eliminó
  • Validar que la inicialización de la clave de licencia se ejecute antes de la primera operación de código de barras.

Principales ventajas de migrar a IronBarcode

Cobertura de formatos unificada: Después de la migración, los códigos QR, DataMatrix, PDF417, Aztec y todos los demás formatos 2D están disponibles a través de la misma llamada a la API utilizada para Code128 y EAN-13. No se necesita una segunda biblioteca cuando los requisitos de formato se expanden, y la constante BarcodeEncoding es la única que cambia entre tipos de formato.

Lectura integrada: BarcodeReader.Read() maneja archivos de imagen y documentos PDF con detección automática de formato. Los proyectos que antes requerían el uso de ZXing .NET para la lectura pueden eliminar esa dependencia y consolidarse en una única biblioteca de códigos de barras, lo que reduce la superficie de la API que los desarrolladores del proyecto deben aprender.

Sin obligación de ImageSharp: IronBarcode no tiene ninguna dependencia de SixLabors.ImageSharp. Después de la migración, la condición de licencia comercial dividida incrustada en las dependencias transitivas de Código de barras de red ya no se aplica al proyecto. Las revisiones de cumplimiento de licencias se simplifican porque las obligaciones de la biblioteca de códigos de barras se establecen directamente y no dependen del umbral de ingresos de una biblioteca de procesamiento de imágenes de terceros.

API pública estable: IronBarcode no expone tipos de terceros en su interfaz de API pública. El tipo de retorno GeneratedBarcode de BarcodeWriter.CreateBarcode es un tipo propio de IronBarcode, lo que significa que futuras actualizaciones en la renderización interna de IronBarcode no producirán cambios incompatibles en el código de llamada como lo hizo el cambio de tipo GetImage() de Código de barras de red v1.8.

Una sola dependencia que mantener: Reemplazar NetBarcode, QRCoder y ZXing .NET con IronBarcode reduce tres ciclos de actualización, tres conjuntos de notas de lanzamiento y tres posibles conflictos de versiones a uno solo. A medida que avanzan las versiones de .NET y se hacen necesarias las actualizaciones de dependencias, el trabajo de mantenimiento se simplifica al utilizar una sola biblioteca en lugar de tres.

Por favor notaNetBarcode, QRCoder y ZXing.NET son marcas registradas de sus respectivos propietarios. Este sitio no está afiliado, respaldado ni patrocinado por NetBarcode, QRCoder o ZXing.NET. Todos los nombres de producto, logotipos y marcas son propiedad de sus respectivos dueños. Las comparaciones son solo para fines informativos y reflejan información públicamente disponible en el momento de la redacción.

Preguntas Frecuentes

¿Por qué debería migrar de NetBarcode 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 NetBarcode 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 NetBarcode 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 NetBarcode 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 NetBarcode?

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 NetBarcode?

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 NetBarcode 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.

Curtis Chau
Escritor Técnico

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

Leer más

Equipo de soporte de Iron

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