Saltar al pie de página
VIDEOS

Cómo Usar Async y Multithread en Códigos de Barras Usando C#

Migrando de Codificador de códigos QR a IronBarcode

Esta guía está escrita para equipos de desarrollo cuyos proyectos comenzaron con Codificador de códigos QR y han crecido hasta requerir funcionalidades que van más allá de la generación de códigos QR. Codificador de códigos QR es una biblioteca de alta calidad y bien mantenida para el ámbito al que está destinada, y la migración no refleja su calidad. Se trata de una respuesta a requisitos —expansión de formato, lectura de códigos de barras, integración de PDF— que quedan fuera de las funciones para las que fue diseñado QRCoder. Esta guía abarca la ruta técnica completa desde Codificador de códigos QR hasta IronBarcode: reemplazo de paquetes, cambios de espacio de nombres, traducción de código para cada patrón común, un mapeo de equivalencias de API y soluciones a los problemas que surgen durante la transición.

¿Por qué migrar desde QRCoder?

Requisitos de formato más allá de QR: Codificador de códigos QR genera exclusivamente códigos QR. Los proyectos que crecen para requerir etiquetas Code 128 para logística, códigos EAN-13 para identificación de productos en retail, Matriz de datos para serialización farmacéutica o PDF417para cumplimiento de documentos gubernamentales deben introducir una biblioteca separada para cada formato adicional. A medida que aumenta el número de formatos requeridos, también aumenta el número de paquetes independientes, API y obligaciones de mantenimiento.

Requisitos de lectura de códigos de barras: Codificador de códigos QR no tiene una API de lectura de códigos de barras; por diseño, es una biblioteca exclusivamente de generación. Cualquier aplicación que necesite decodificar códigos QR a partir de imágenes entrantes, verificar códigos de barras en documentos escaneados o procesar etiquetas de envío debe agregar una biblioteca de lectura específica junto con QRCoder. Esa segunda biblioteca trae consigo su propia interfaz de programación de aplicaciones (API), su propio ciclo de actualización y sus propios problemas de compatibilidad con cada actualización de .NET .

Mantenimiento de múltiples bibliotecas: El patrón de acumulación realista para un proyecto basado en Codificador de códigos QR va desde Codificador de códigos QR para la generación de códigos QR a una biblioteca de códigos de barras 1D para etiquetas de envío y a una biblioteca de lectura para la decodificación. Gestionar tres o cuatro paquetes independientes implica realizar un seguimiento de las notas de lanzamiento por separado, resolver los conflictos de versiones cuando se actualiza alguno de ellos y mantener un conocimiento actualizado de las múltiples API en todo el equipo de desarrollo. La carga del mantenimiento se acumula con el tiempo de maneras que no son visibles en la estimación de integración inicial.

Compatibilidad con PDF: Tanto la inserción de códigos de barras en documentos PDF como la extracción de códigos de barras de archivos PDF entrantes están fuera del alcance de QRCoder. Los procesos de gestión documental —gestión de facturas, generación de etiquetas a partir de plantillas PDF, elaboración de informes de cumplimiento— se topan con este límite desde el principio. Es necesario añadir una biblioteca PDF específica junto con QRCoder, o bien la arquitectura debe enrutar la generación de códigos de barras y la generación de PDF a través de subsistemas separados.

El problema fundamental

QRCoder resuelve la generación de códigos QR de manera eficiente. En el momento en que cualquier requisito supere el nivel de complejidad QR, el código fuente debe comenzar a incorporar paquetes adicionales para cubrir cada deficiencia:

// Codificador de códigos QR handles QR generation well — but no further
using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10));

// Now the shipping team asks for Code 128 — add NetBarcode
// Now the warehouse needs to scan barcodes — add ZXing.Net
// Now a report needs a barcode in a PDF — add a PDF library
// Each addition: new namespace, new API, new maintenance cycle
// Codificador de códigos QR handles QR generation well — but no further
using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10));

// Now the shipping team asks for Code 128 — add NetBarcode
// Now the warehouse needs to scan barcodes — add ZXing.Net
// Now a report needs a barcode in a PDF — add a PDF library
// Each addition: new namespace, new API, new maintenance cycle
Imports QRCoder
Imports System.IO

Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M)
Dim qrCode As New PngByteQRCode(qrCodeData)
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10))

' Now the shipping team asks for Code 128 — add NetBarcode
' Now the warehouse needs to scan barcodes — add ZXing.Net
' Now a report needs a barcode in a PDF — add a PDF library
' Each addition: new namespace, new API, new maintenance cycle
$vbLabelText   $csharpLabel

IronBarcode consolida la generación, la lectura y la integración de PDF bajo una única API:

// IronBarcode — one library covers all of the above
using IronBarCode;

// Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// Read a barcode from an image — built in
var results = BarcodeReader.Read("incoming.png");
// IronBarcode — one library covers all of the above
using IronBarCode;

// Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// Read a barcode from an image — built in
var results = BarcodeReader.Read("incoming.png");
Imports IronBarCode

' Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode) _
    .SaveAsPng("qr.png")

' Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128) _
    .SaveAsPng("label.png")

' Read a barcode from an image — built in
Dim results = BarcodeReader.Read("incoming.png")
$vbLabelText   $csharpLabel

IronBarcode vs QRCoder: Comparación de funciones

Característica Codificador de códigos QR IronBarcode
Generación de código QR Sí, excelente
Micro QR No
Código 128 / Código 39 No
EAN-13 / UPC-A No
Matriz de datos No
PDF417 No
azteca No
Formatos totales 1 Más de 50
Lectura de códigos de barras No Sí — detección automática
Extracción de códigos de barras PDF No
Sellado de códigos de barras PDF No
Inserción de logotipo
Personalización de color
Salida SVG
Ayudantes del generador de carga útil No — construcción manual de cuerdas
Cero dependencias externas Autocontenido
Licencia MIT — sin restricciones Comercial — nivel Lite cubre un solo desarrollador

Inicio rápido: Migración de Codificador de códigos QR a IronBarcode

Paso 1: Sustituir el paquete NuGet

Eliminar Codificador de códigos QR del proyecto:

dotnet remove package QRCoder
dotnet remove package QRCoder
SHELL

Instalar IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

Si el proyecto utilizaba ZXing .NET junto con Codificador de códigos QR para la lectura de códigos de barras, ese paquete también se puede eliminar en esta etapa:

dotnet remove package ZXing.Net
dotnet remove package ZXing.Net
SHELL

Paso 2: Actualizar los espacios de nombres

Reemplace la importación del espacio de nombres Codificador de códigos QR con el espacio de nombres IronBarcode :

// Before (QRCoder)
using QRCoder;

// After (IronBarcode)
using IronBarCode;
// Before (QRCoder)
using QRCoder;

// After (IronBarcode)
using IronBarCode;
' Before (QRCoder)
Imports QRCoder

' After (IronBarcode)
Imports IronBarCode
$vbLabelText   $csharpLabel

Paso 3: Inicializar licencia

Agregue la inicialización de la licencia al inicio de la aplicación — Program.cs, Startup.cs o un constructor estático:

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

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

Se puede obtener una clave de prueba gratuita sin necesidad de registrarse. Las implementaciones en entornos de producción requieren la compra de una licencia.

Ejemplos de migración de código

Generación básica de códigos QR

El patrón más común de Codificador de códigos QR requiere tres objetos: una instancia QRCodeGenerator, un objeto intermedio QRCodeData y una clase de renderizador como PngByteQRCode. En IronBarcode, una única llamada estática reemplaza esta cadena.

Enfoque de QRCoder:

using QRCoder;

public class BarcodeService
{
    private readonly QRCodeGenerator _generator = new QRCodeGenerator();

    public byte[] GenerateQR(string content)
    {
        var qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M);
        var qrCode = new PngByteQRCode(qrCodeData);
        return qrCode.GetGraphic(10); // 10px per module
    }
}
using QRCoder;

public class BarcodeService
{
    private readonly QRCodeGenerator _generator = new QRCodeGenerator();

    public byte[] GenerateQR(string content)
    {
        var qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M);
        var qrCode = new PngByteQRCode(qrCodeData);
        return qrCode.GetGraphic(10); // 10px per module
    }
}
Imports QRCoder

Public Class BarcodeService
    Private ReadOnly _generator As New QRCodeGenerator()

    Public Function GenerateQR(content As String) As Byte()
        Dim qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M)
        Dim qrCode = New PngByteQRCode(qrCodeData)
        Return qrCode.GetGraphic(10) ' 10px per module
    End Function
End Class
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

public class BarcodeService
{
    public byte[] GenerateQR(string content)
    {
        return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode)
            .ResizeTo(200, 200)
            .ToPngBinaryData();
    }
}
using IronBarCode;

public class BarcodeService
{
    public byte[] GenerateQR(string content)
    {
        return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode)
            .ResizeTo(200, 200)
            .ToPngBinaryData();
    }
}
Imports IronBarCode

Public Class BarcodeService
    Public Function GenerateQR(content As String) As Byte()
        Return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode) _
            .ResizeTo(200, 200) _
            .ToPngBinaryData()
    End Function
End Class
$vbLabelText   $csharpLabel

BarcodeWriter es una clase estática; no se requiere instancia y no hay objeto de datos intermedio. El método ResizeTo(width, height) reemplaza el entero píxeles-por-módulo que acepta Codificador de códigos QR en GetGraphic. Donde Codificador de códigos QR dimensiona la salida por el conteo de módulos (por ejemplo, GetGraphic(10) para una imagen de 10px por módulo), IronBarcode toma dimensiones absolutas en píxeles.

Guardar códigos QR en un archivo

QRCoder separa los bytes en memoria de la salida del archivo únicamente en el paso de terminal; la cadena de renderizado es la misma. IronBarcode utiliza diferentes métodos de terminal en la misma cadena.

Enfoque de QRCoder:

using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var pngBytes = new PngByteQRCode(qrCodeData).GetGraphic(10);
File.WriteAllBytes("output.png", pngBytes);
using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var pngBytes = new PngByteQRCode(qrCodeData).GetGraphic(10);
File.WriteAllBytes("output.png", pngBytes);
Imports QRCoder
Imports System.IO

Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim pngBytes = New PngByteQRCode(qrCodeData).GetGraphic(10)
File.WriteAllBytes("output.png", pngBytes)
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

// Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .SaveAsPng("output.png");

// Or obtain bytes for in-memory use
byte[] pngBytes = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .ToPngBinaryData();
using IronBarCode;

// Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .SaveAsPng("output.png");

// Or obtain bytes for in-memory use
byte[] pngBytes = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .ToPngBinaryData();
Imports IronBarCode

' Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .ResizeTo(300, 300) _
    .SaveAsPng("output.png")

' Or obtain bytes for in-memory use
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .ResizeTo(300, 300) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

El método SaveAsPng es un terminal que escribe directamente al disco. ToPngBinaryData devuelve un byte[] para transmisión, respuestas HTTP o almacenamiento en base de datos.

Salida SVG

Enfoque de QRCoder:

using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("output.svg", svgContent);
using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("output.svg", svgContent);
Imports QRCoder
Imports System.IO

Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim svgContent As String = New SvgQRCode(qrCodeData).GetGraphic(10)
File.WriteAllText("output.svg", svgContent)
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsImage("output.svg");
using IronBarCode;

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsImage("output.svg");
Imports IronBarCode

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsImage("output.svg")
$vbLabelText   $csharpLabel

La clase de renderizador SvgQRCode y su llamada GetGraphic se combinan en un único método terminal SaveAsImage (pasar una extensión .svg produce salida SVG).

Mapeo del nivel de corrección de errores

QRCoder requiere selección explícita de ECC en cada llamada CreateQrCode usando el enum QRCodeGenerator.ECCLevel. IronBarcode aplica un valor predeterminado sensato al usar BarcodeWriter.CreateBarcode, y expone control explícito a través de QRCodeWriter.QrErrorCorrectionLevel.

Enfoque de QRCoder:

using QRCoder;

var generator = new QRCodeGenerator();

// Medium — suitable for most generation without logos
var dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);

// High — required when a logo will occlude part of the code
var dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
using QRCoder;

var generator = new QRCodeGenerator();

// Medium — suitable for most generation without logos
var dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);

// High — required when a logo will occlude part of the code
var dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
Imports QRCoder

Dim generator As New QRCodeGenerator()

' Medium — suitable for most generation without logos
Dim dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)

' High — required when a logo will occlude part of the code
Dim dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H)
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

// Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("default-ecc.png");

// Explicit level via QRCodeWriter
var qr = QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.SaveAsPng("high-ecc.png");
using IronBarCode;

// Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("default-ecc.png");

// Explicit level via QRCodeWriter
var qr = QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.SaveAsPng("high-ecc.png");
Imports IronBarCode

' Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsPng("default-ecc.png")

' Explicit level via QRCodeWriter
Dim qr = QRCodeWriter.CreateQrCode( _
    "https://example.com", _
    500, _
    QRCodeWriter.QrErrorCorrectionLevel.Highest _
)
qr.SaveAsPng("high-ecc.png")
$vbLabelText   $csharpLabel

El mapeo de niveles es: ECCLevel.LLow, ECCLevel.MMedium, ECCLevel.QHigh, ECCLevel.HHighest.

Inserción de logotipo

Ambas bibliotecas permiten la inserción de logotipos en códigos QR. Codificador de códigos QR enruta esto a través de la clase de renderizador QRCode (no PngByteQRCode) con parámetros System.Drawing.Bitmap. IronBarcode proporciona QRCodeWriter.CreateQrCodeWithLogo() como un método de fábrica dedicado que acepta rutas de archivo tanto para la URL como para el logo. La guía de personalización del código QR abarca opciones de tamaño, posicionamiento y combinación de colores para el logotipo.

Enfoque de QRCoder:

using QRCoder;
using System.Drawing;
using System.Drawing.Imaging;

var generator = new QRCodeGenerator();
// ECCLevel.H is required — the logo occludes part of the code
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);

var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", ImageFormat.Png);
using QRCoder;
using System.Drawing;
using System.Drawing.Imaging;

var generator = new QRCodeGenerator();
// ECCLevel.H is required — the logo occludes part of the code
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);

var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", ImageFormat.Png);
Imports QRCoder
Imports System.Drawing
Imports System.Drawing.Imaging

Dim generator As New QRCodeGenerator()
' ECCLevel.H is required — the logo occludes part of the code
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H)

Dim qrCode As New QRCode(qrCodeData)
Dim logoBitmap As New Bitmap("logo.png")
Dim qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap)
qrBitmap.Save("qr-logo.png", ImageFormat.Png)
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500)
    .SaveAsPng("qr-logo.png");
using IronBarCode;

QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500)
    .SaveAsPng("qr-logo.png");
Imports IronBarCode

QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500) _
    .SaveAsPng("qr-logo.png")
$vbLabelText   $csharpLabel

La dependencia System.Drawing.Bitmap se elimina — CreateQrCodeWithLogo acepta cadenas de ruta de archivo tanto para el contenido como para la imagen del logo. La corrección de errores se configura automáticamente al nivel requerido para la incrustación de logos; no se necesita configuración de ECC explícita.

Generador de carga útil. Migración WiFi

El PayloadGenerator.WiFi de Codificador de códigos QR formatea la cadena de carga útil QR estándar para WiFi. El formato de salida es un estándar público (WIFI:T:{auth};S:{ssid};P:{password};;) definido por la especificación del código QR. Al migrar, estas cadenas se pueden construir directamente.

Enfoque de QRCoder:

using QRCoder;

var wifi = new PayloadGenerator.WiFi(
    ssid: "OfficeNetwork",
    password: "SecurePass123",
    authenticationMode: PayloadGenerator.WiFi.Authentication.WPA
);
// wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;

var generator = new QRCodeGenerator();
var qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10));
using QRCoder;

var wifi = new PayloadGenerator.WiFi(
    ssid: "OfficeNetwork",
    password: "SecurePass123",
    authenticationMode: PayloadGenerator.WiFi.Authentication.WPA
);
// wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;

var generator = new QRCodeGenerator();
var qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10));
Imports QRCoder

Dim wifi = New PayloadGenerator.WiFi(
    ssid:="OfficeNetwork",
    password:="SecurePass123",
    authenticationMode:=PayloadGenerator.WiFi.Authentication.WPA
)
' wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;

Dim generator = New QRCodeGenerator()
Dim qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M)
Dim qrCode = New PngByteQRCode(qrData)
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10))
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

// Construct the standard WiFi QR string directly
string wifiPayload = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;";
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .SaveAsPng("wifi.png");
using IronBarCode;

// Construct the standard WiFi QR string directly
string wifiPayload = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;";
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .SaveAsPng("wifi.png");
Imports IronBarCode

' Construct the standard WiFi QR string directly
Dim wifiPayload As String = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;"
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode) _
    .ResizeTo(300, 300) _
    .SaveAsPng("wifi.png")
$vbLabelText   $csharpLabel

Para equipos con muchos tipos PayloadGenerator en uso (vCard, CalendarEvent, Geo, SMS), el enfoque es el mismo: identifique la cadena formateada que cada generador produce usando su salida .ToString(), luego construya esa cadena directamente o a través de un pequeño método de ayuda estático.

Referencia de mapeo de la API de Codificador de códigos QR a IronBarcode

Codificador de códigos QR IronBarcode Notas
new QRCodeGenerator() Clase estática: sin instancia BarcodeWriter no requiere instanciación
qrGenerator.CreateQrCode(data, ECCLevel.M) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) Reemplazo directo
new PngByteQRCode(qrCodeData) No es necesario La renderización forma parte de la cadena fluida.
qrCode.GetGraphic(20) devuelve byte[] .ToPngBinaryData() Tamaño vía .ResizeTo(w, h)
Patrón File.WriteAllBytes(path, bytes) .SaveAsPng(path) Método terminal en GeneratedBarcode
new SvgQRCode(qrCodeData).GetGraphic(10) .SaveAsImage(path) Pase la extensión .svg para salida SVG
new QRCode(qrCodeData).GetGraphic(...) QRCodeWriter.CreateQrCode(data, size, level) Se utiliza para personalizar el logotipo y el color.
QRCodeGenerator.ECCLevel.L QRCodeWriter.QrErrorCorrectionLevel.Low
QRCodeGenerator.ECCLevel.M QRCodeWriter.QrErrorCorrectionLevel.Medium Valor predeterminado cuando no se especifica.
QRCodeGenerator.ECCLevel.Q QRCodeWriter.QrErrorCorrectionLevel.High
QRCodeGenerator.ECCLevel.H QRCodeWriter.QrErrorCorrectionLevel.Highest Requerido para la inserción del logotipo
PayloadGenerator.WiFi(...).ToString() "WIFI:T:WPA;S:{ssid};P:{pass};;" Construir una cadena estándar directamente
PayloadGenerator.ContactData(...).ToString() "BEGIN:VCARD\n..." vCard es un estándar público.
No se puede leer la API BarcodeReader.Read(path) Nueva funcionalidad: no requiere biblioteca independiente.
Solo en formato QR Más de 50 formatos vía BarcodeEncoding.* Nueva capacidad

Problemas comunes de migración y soluciones

Problema 1: Cambio en el formato de la cadena del generador de carga útil

QRCoder: PayloadGenerator.WiFi, PayloadGenerator.ContactData y otros auxiliares producen cadenas formateadas automáticamente. El código pasa la salida .ToString() del objeto auxiliar a CreateQrCode.

Solución: Identifique la cadena que cada tipo PayloadGenerator produce; su formato está documentado en la especificación del código QR y es sencillo de reproducir. Para WiFi: WIFI:T:WPA;S:{ssid};P:{password};;. Para vCard: bloques estándar BEGIN:VCARD / END:VCARD. Escriba métodos auxiliares estáticos si muchos sitios de llamada utilizan el mismo tipo de carga útil:

public static string WifiPayload(string ssid, string password, string auth = "WPA")
    => $"WIFI:T:{auth};S:{ssid};P:{password};;";
public static string WifiPayload(string ssid, string password, string auth = "WPA")
    => $"WIFI:T:{auth};S:{ssid};P:{password};;";
Public Shared Function WifiPayload(ssid As String, password As String, Optional auth As String = "WPA") As String
    Return $"WIFI:T:{auth};S:{ssid};P:{password};;"
End Function
$vbLabelText   $csharpLabel

Problema 2: Asignación de enumeraciones ECCLevel

QRCoder: QRCodeGenerator.ECCLevel es un enum anidado con valores L, M, Q, H. Es un parámetro requerido en cada llamada CreateQrCode.

Solución: Mapee cada valor a su equivalente QRCodeWriter.QrErrorCorrectionLevel al usar la ruta QRCodeWriter. Al usar BarcodeWriter.CreateBarcode, el nivel ECC predeterminado es Medio automáticamente y no requiere parámetro. Actualizar cada sitio de llamadas:

// Codificador de códigos QR ECCLevel.H → IronBarcode QrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);

// Codificador de códigos QR ECCLevel.M → IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
// Codificador de códigos QR ECCLevel.H → IronBarcode QrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);

// Codificador de códigos QR ECCLevel.M → IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
' Codificador de códigos QR ECCLevel.H → IronBarcode QrErrorCorrectionLevel.Highest
Dim qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)

' Codificador de códigos QR ECCLevel.M → IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
$vbLabelText   $csharpLabel

Problema 3: Eliminación de la clase Renderer

QRCoder: Cada formato de salida requiere su propia instancia de clase de renderizador — PngByteQRCode, SvgQRCode, AsciiQRCode, Base64QRCode, QRCode. Estas clases aceptan QRCodeData y exponen GetGraphic con diferentes tipos de retorno.

Solución: Eliminar todas las instancias de la clase de renderizado. IronBarcode incorpora la salida de formato en los métodos de terminal de la cadena fluida. Reemplace new PngByteQRCode(data).GetGraphic(n) por .ToPngBinaryData() después de .ResizeTo(). Reemplace new SvgQRCode(data).GetGraphic(n) por .SaveAsImage(path) (pasando una extensión .svg). El objeto intermedio QRCodeData también desaparece — no es necesario en IronBarcode.

Problema 4: Eliminación de PngByteQRCode y dimensionamiento basado en módulos

QRCoder: PngByteQRCode.GetGraphic(int pixelsPerModule) dimensiona la salida por el número de píxeles por módulo QR. Las dimensiones de la imagen resultante dependen del número de módulos, que varía según la longitud del contenido y el nivel ECC.

Solución: Reemplace el dimensionamiento basado en módulos con ResizeTo(int width, int height) para dimensiones absolutas en píxeles. Si su código calcula el tamaño de salida esperado de forma dinámica a partir del número de módulos, cambie a un tamaño objetivo fijo que cumpla con sus requisitos de salida:

// Before: GetGraphic(20) — output size varies with content
var bytes = new PngByteQRCode(qrData).GetGraphic(20);

// After: fixed 400×400 regardless of content
byte[] bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
    .ResizeTo(400, 400)
    .ToPngBinaryData();
// Before: GetGraphic(20) — output size varies with content
var bytes = new PngByteQRCode(qrData).GetGraphic(20);

// After: fixed 400×400 regardless of content
byte[] bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
    .ResizeTo(400, 400)
    .ToPngBinaryData();
Imports System

' Before: GetGraphic(20) — output size varies with content
Dim bytes = New PngByteQRCode(qrData).GetGraphic(20)

' After: fixed 400×400 regardless of content
Dim bytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) _
    .ResizeTo(400, 400) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

Lista de verificación de migración de QRCoder

Tareas previas a la migración

Antes de realizar cualquier cambio, revise el código fuente para detectar cualquier uso de QRCoder:

# Find all Codificador de códigos QR namespace imports
grep -r "using QRCoder" --include="*.cs" .

# Find all generator and renderer instantiations
grep -r "QRCodeGenerator\|PngByteQRCode\|SvgQRCode\|AsciiQRCode\|QRCode\b" --include="*.cs" .

# Find all PayloadGenerator usages
grep -r "PayloadGenerator\." --include="*.cs" .

# Find ECCLevel references
grep -r "ECCLevel\." --include="*.cs" .

# Find ZXing.Net usage to remove at the same time
grep -r "using ZXing" --include="*.cs" .
# Find all Codificador de códigos QR namespace imports
grep -r "using QRCoder" --include="*.cs" .

# Find all generator and renderer instantiations
grep -r "QRCodeGenerator\|PngByteQRCode\|SvgQRCode\|AsciiQRCode\|QRCode\b" --include="*.cs" .

# Find all PayloadGenerator usages
grep -r "PayloadGenerator\." --include="*.cs" .

# Find ECCLevel references
grep -r "ECCLevel\." --include="*.cs" .

# Find ZXing.Net usage to remove at the same time
grep -r "using ZXing" --include="*.cs" .
SHELL
  • Documente todos los tipos PayloadGenerator en uso y anote sus formatos de salida de cadena
  • Anote todos los valores de nivel ECC en uso y sus ubicaciones de llamada.
  • Identifique cualquier código de lectura ZXing .NET que se haya emparejado con Codificador de códigos QR para su decodificación; esto se puede reemplazar al mismo tiempo.
  • Obtenga una clave de licencia de IronBarcode (hay claves de prueba disponibles sin necesidad de registro).

Tareas de actualización de código

  1. Ejecute dotnet remove package QRCoder
  2. Ejecute dotnet remove package ZXing.Net si solo se usaba para lectura junto con QRCoder
  3. Ejecute dotnet add package IronBarcode
  4. Agregue IronBarCode.License.LicenseKey = "YOUR-KEY"; al inicio de la aplicación
  5. Reemplace todas las importaciones using QRCoder; con using IronBarCode;
  6. Elimine todas las declaraciones de instancia new QRCodeGenerator()BarcodeWriter es estático
  7. Reemplace todos los patrones de cadena de renderizador generator.CreateQrCode(data, ECCLevel.X) + con cadenas BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
  8. Reemplace las llamadas .GetGraphic(n) con .ToPngBinaryData() y agregue .ResizeTo(w, h) antes del terminal
  9. Reemplace los patrones de guardado File.WriteAllBytes(path, bytes) con métodos terminales .SaveAsPng(path)
  10. Reemplace new SvgQRCode(data).GetGraphic(n) por .SaveAsImage(path) (pasar una extensión .svg)
  11. Reemplace PayloadGenerator.WiFi(...) y otras instancias de auxiliares con cadenas de formato directo
  12. Mapee cada valor QRCodeGenerator.ECCLevel a su equivalente QRCodeWriter.QrErrorCorrectionLevel
  13. Reemplace cualquier llamada BarcodeReaderGeneric.Decode(bitmap) de ZXing.Net por BarcodeReader.Read(path)
  14. Para la incrustación de logos, reemplace new QRCode(data).GetGraphic(n, ..., logoBitmap) por QRCodeWriter.CreateQrCodeWithLogo(data, logoPath, size)

Pruebas posteriores a la migración

  • Escanee todos los códigos QR generados con al menos dos aplicaciones de escaneo de códigos QR independientes para verificar su legibilidad.
  • Verifique que los códigos QR con logo se escaneen correctamente — confirme que el nivel de corrección de errores es Highest
  • Comparar la salida visual de los códigos generados con muestras previas a la migración donde se requiere consistencia en la apariencia.
  • Pruebe todos los reemplazos PayloadGenerator — confirme que las cadenas de carga útil de WiFi, vCard y otras se decodifiquen correctamente en los dispositivos de destino
  • Si ZXing.Net también fue removido, verifique que todas las rutas de lectura de códigos de barras funcionen a través de BarcodeReader.Read
  • Ejecute la aplicación en un entorno limpio para confirmar que no queden referencias residuales a Codificador de códigos QR o ZXing .NET que provoquen fallos de enlace.
  • Validar que la clave de licencia de IronBarcode se cargue correctamente en los entornos de producción y de prueba.

Principales ventajas de migrar a IronBarcode

Única API para Todas las Operaciones de Código de Barras: Después de la migración, cada tarea de código de barras — generación, lectura, estampado en PDF — usa el mismo espacio de nombres IronBarCode y los mismos puntos de entrada. Los desarrolladores que se unen al proyecto aprenden una sola API en lugar de tres. La revisión del código en todo el subsistema de códigos de barras se vuelve coherente. La búsqueda de documentación está centralizada.

Lectura de Códigos de Barras Sin una Segunda Biblioteca: BarcodeReader.Read maneja archivos de imagen, páginas PDF, flujos y bitmaps en memoria con detección automática de formato. La capacidad de lectura que antes requería ZXing .NET —con sus requisitos de especificación de formato y consideraciones de seguridad de subprocesos— está disponible de inmediato mediante una sola llamada a un método. La guía de lectura de códigos de barras a partir de imágenes abarca la detección de múltiples códigos de barras, el preprocesamiento de imágenes y el escaneo de páginas PDF.

Ampliación de Formatos Sin Dependencias Nuevas: Agregar Code 128, EAN-13, DataMatrix, PDF417u otro formato compatible después de la migración solo requiere un valor de parámetro BarcodeEncoding diferente. No hay nuevos paquetes que instalar, ni nuevas API que aprender, ni problemas de compatibilidad de versiones que gestionar. Los nuevos requisitos de formato se convierten en un cambio de una sola línea en lugar de una nueva integración de biblioteca.

Personalización Simplificada de Códigos QR: Incrustación de logos, cambios de color y control de zona tranquila están disponibles como métodos nombrados en el resultado QRCodeWriter. La dependencia System.Drawing.Bitmap que requiere Codificador de códigos QR para incrustación de logos se reemplaza con una simple cadena de ruta de archivo. La guía de personalización de estilo de código QR documenta todas las opciones de personalización disponibles.

Integración de PDF integrada: Los códigos de barras se pueden leer desde documentos PDF entrantes y se pueden insertar en archivos PDF existentes sin necesidad de añadir una biblioteca de PDF. Los flujos de trabajo de procesamiento de documentos que requerían una dependencia de PDF por separado ahora tienen la funcionalidad de código de barras y PDF consolidada.

Reducción de los costes de mantenimiento a largo plazo: Pasar de tres o cuatro paquetes independientes a uno solo elimina la acumulación de costes que supone el seguimiento de múltiples ciclos de lanzamiento, la resolución de conflictos de versiones entre bibliotecas y la actualización de múltiples conjuntos de pruebas a medida que avanzan las versiones de .NET . El coste de mantenimiento del subsistema de códigos de barras se reduce a la dependencia de un único paquete.

Por favor notaNetBarcode, Codificador de códigos QR y ZXing.NET son marcas registradas de sus respectivos propietarios. Este sitio no está afiliado, respaldado ni patrocinado por NetBarcode, Codificador de códigos QR 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 QRCoder.NET 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 QRCoder 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 QRCoder.NET 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 tanto QRCoder.NET como 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 QRCoder.NET?

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 después de migrar desde QRCoder?

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 QRCoder.NET 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