Saltar al pie de página
VIDEOS

Cómo Personalizar y Agregar Logos a Códigos QR en C# | IronBracode

Migrating from Código de barras Syncfusion to IronBarcode

Esta guía proporciona un camino de migración completo desde los controles de código de barras de Syncfusion — SfBarcode para WinForms y WPF, SfBarcodeGenerator para Blazor y MAUI — a IronBarcode. Cubre las razones estructurales por las que los equipos realizan esta transición, una guía rápida paso a paso para reemplazar los paquetes NuGet y la configuración de licencias, ejemplos de código completos de antes y después para cada escenario común y una lista de verificación de migración para auditar una base de código existente. Si el proyecto también utiliza otros componentes de Syncfusion (cuadrículas, gráficos, planificadores), esos paquetes y sus registros no se verán afectados; solo cambiará el código específico del código de barras.

¿Por qué migrar desde Syncfusion Barcode?

Brecha de lectura: SfBarcode y SfBarcodeGenerator son controles de generación sin capacidad de lectura. No hay método .Read() o .Scan() en ninguna de las clases. Cuando un proyecto requiere leer códigos de barras de imágenes cargadas, documentos escaneados o archivos PDF, el control de códigos de barras de Syncfusion no ofrece ninguna solución. La documentación de Syncfusion recomienda a los equipos utilizar el lector de códigos de barras OPX como solución, que es un producto comercial independiente que debe adquirirse, licenciarse y mantenerse por separado.

OPX como envoltorio de pago para software libre: el lector de códigos de barras OPX utiliza internamente ZXing .NET , una biblioteca de lectura de códigos de barras de código abierto publicada bajo la licencia Apache 2.0. Apache 2.0 es una licencia permisiva; cualquier desarrollador .NET puede instalar ZXing.Net directamente con dotnet add package ZXing.Net y usarlo en aplicaciones comerciales sin costo. Un flujo de trabajo completo de lectura y generación de Syncfusion requiere dos productos de Syncfusion separados, dos acuerdos de licencia y dos superficies de API, mientras que la capacidad de lectura podría haberse obtenido directamente de la biblioteca gratuita que OPX envuelve.

Requisitos para la Licencia Comunitaria: La Licencia Comunitaria de Syncfusion exige que se cumplan cuatro condiciones de forma simultánea y continua: ingresos brutos anuales inferiores a 1.000.000 $, cinco o menos desarrolladores, diez o menos empleados en total y capital externo total recaudado inferior a 3.000.000 $. Las organizaciones gubernamentales no son elegibles, independientemente de su tamaño. El incumplimiento de cualquiera de estas condiciones genera una obligación inmediata de obtener una licencia comercial. Una ronda de financiación Serie A suele elevar el capital recaudado por encima de los 3.000.000 de dólares el día de su cierre, lo que activa una tasa de licencia independientemente del tamaño del equipo o de los ingresos. La transición comercial va de $0 a una suscripción anual por desarrollador a Essential Studio — y esa suscripción cubre toda la suite, no solo el componente de código de barras. La ruta publicada por Syncfusion es una cotización personalizada de ventas.

Rotación de claves específica de la versión: Las claves de licencia de Syncfusion están vinculadas a rangos de versiones específicos de Essential Studio. La actualización de la versión 24.x a la 25.x requiere obtener una nueva clave del portal de la cuenta, actualizar esa clave en el almacén de secretos de cada entorno de implementación y volver a implementar para evitar que aparezcan marcas de agua de prueba en los resultados de producción. Para los equipos con ciclos de lanzamiento frecuentes o múltiples objetivos de implementación, esta rotación se convierte en una carga operativa recurrente desproporcionada con respecto al requisito subyacente de generar una imagen de código de barras.

El problema fundamental

La arquitectura de control de Syncfusion hace que la generación programática de archivos sea indirecta. La producción de un archivo de código de barras con SfBarcode requiere preasignar un Bitmap, llamar a DrawToBitmap y luego guardar el mapa de bits, un patrón de renderizado de WinForms que lleva el tiempo de ejecución de Windows Forms como dependencia:

// Syncfusion SfBarcode: indirect file output through DrawToBitmap
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");

var barcode = new SfBarcode();
barcode.Text = "SHIP-2024-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.Width = 400;
barcode.Height = 150;

using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("shipping-label.png", ImageFormat.Png);
// Reading: not possible — requires separate OPX purchase
// Syncfusion SfBarcode: indirect file output through DrawToBitmap
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");

var barcode = new SfBarcode();
barcode.Text = "SHIP-2024-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.Width = 400;
barcode.Height = 150;

using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("shipping-label.png", ImageFormat.Png);
// Reading: not possible — requires separate OPX purchase
Imports Syncfusion.Licensing
Imports System.Drawing
Imports System.Drawing.Imaging

' Syncfusion SfBarcode: indirect file output through DrawToBitmap
SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY")

Dim barcode As New SfBarcode()
barcode.Text = "SHIP-2024-001"
barcode.Symbology = BarcodeSymbolType.Code128A
barcode.Width = 400
barcode.Height = 150

Using bitmap As New Bitmap(barcode.Width, barcode.Height)
    barcode.DrawToBitmap(bitmap, barcode.ClientRectangle)
    bitmap.Save("shipping-label.png", ImageFormat.Png)
End Using
' Reading: not possible — requires separate OPX purchase
$vbLabelText   $csharpLabel

IronBarcode genera archivos directamente y los lee con el mismo paquete:

// IronBarcode: direct generation and reading in one package
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

// Generate
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128)
    .ResizeTo(400, 150)
    .SaveAsPng("shipping-label.png");

// Read — same package, no additional product required
var results = BarcodeReader.Read("shipping-label.png");
foreach (var result in results)
    Console.WriteLine($"{result.Format}: {result.Value}");
// IronBarcode: direct generation and reading in one package
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

// Generate
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128)
    .ResizeTo(400, 150)
    .SaveAsPng("shipping-label.png");

// Read — same package, no additional product required
var results = BarcodeReader.Read("shipping-label.png");
foreach (var result in results)
    Console.WriteLine($"{result.Format}: {result.Value}");
Imports IronBarCode

' IronBarcode: direct generation and reading in one package
License.LicenseKey = "YOUR-LICENSE-KEY"

' Generate
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128) _
    .ResizeTo(400, 150) _
    .SaveAsPng("shipping-label.png")

' Read — same package, no additional product required
Dim results = BarcodeReader.Read("shipping-label.png")
For Each result In results
    Console.WriteLine($"{result.Format}: {result.Value}")
Next
$vbLabelText   $csharpLabel

IronBarcode vs Syncfusion Barcode: Comparación de características

Característica Código de barras Syncfusion IronBarcode
Generación de códigos de barras Sí — Control de interfaz de usuario (WinForms, WPF, Blazor, MAUI) Sí, API estática, todos los entornos
Lectura de códigos de barras No, se requiere un lector de códigos de barras OPX independiente. Sí, el mismo paquete.
OPX utiliza envoltorios de lectura de productos ZXing .NET (Apache 2.0). N/A
Salida de código de barras PDF No, requiere Syncfusion.Pdf adicionalmente Sí — SaveAsPdf() incorporado
Lectura de códigos de barras PDF No Sí, nativo
Generación del lado del servidor / sin interfaz gráfica Requiere tiempo de ejecución de WinForms (DrawToBitmap) Nativo: sin dependencia de interfaz de usuario.
Implementación en Docker/Linux Limitado Soporte completo
API mínima de ASP.NET Core No cuenta con soporte directo. Soporte completo
Código QR con logotipo integrado No Sí — .AddBrandLogo()
Detección automática de formato en lectura N/A
Comunidad / nivel gratuito Licencia comunitaria (cuatro condiciones simultáneas) Prueba gratuita de 30 días (solo con marca de agua)
Modelo de licencia comercial Suscripción anual (Estudio Esencial) Perpetua (única vez, ver ironsoftware.com/csharp/barcode/licensing)
Alcance de la clave de licencia Depende de la versión y se actualiza con las principales actualizaciones de NuGet. Versión estable dentro de la versión principal
Pasos para registrarse en la plataforma 3-4 pasos (Registrar licencia + Agregar SyncfusionBlazor + Configurar SyncfusionCore + importaciones de Razor ) Una línea, todas las plataformas
Gama de formatos 1D Código 128, Código 39, EAN, UPC, Codabar y otros. Todos los formatos de Syncfusion , Plus de PDF417, Aztec, MaxiCode, GS1, USPS IMb y más de 50.
Gama de formatos 2D Código QR, DataMatrix Código QR, DataMatrix, PDF417, Micro PDF417, Aztec, MaxiCode

Inicio rápido

Paso 1: Sustituir paquetes NuGet

Retire el paquete de códigos de barras de Syncfusion para la plataforma que esté utilizando. Si el proyecto está dirigido a varias plataformas, ejecute la eliminación para cada una:

# Blazor
dotnet remove package Syncfusion.Blazor.BarcodeGenerator

# WinForms
dotnet remove package Syncfusion.SfBarcode.Windows

# WPF
dotnet remove package Syncfusion.SfBarcode.WPF

# MAUI
dotnet remove package Syncfusion.Maui.Barcode
# Blazor
dotnet remove package Syncfusion.Blazor.BarcodeGenerator

# WinForms
dotnet remove package Syncfusion.SfBarcode.Windows

# WPF
dotnet remove package Syncfusion.SfBarcode.WPF

# MAUI
dotnet remove package Syncfusion.Maui.Barcode
SHELL

Si no quedan otros paquetes de Syncfusion en el proyecto después de eliminar el paquete de códigos de barras, elimine también el paquete de licencias:

dotnet remove package Syncfusion.Licensing
dotnet remove package Syncfusion.Licensing
SHELL

Instala IronBarcode : un único paquete para todas las plataformas.

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

Paso 2: Actualizar los espacios de nombres

Elimine los espacios de nombres de códigos de barras de Syncfusion y agregue el espacio de nombres de IronBarcode :

// Remove these (barcode-specific; leave others if non-barcode Syncfusion controls remain)
using Syncfusion.Windows.Forms.Barcode;
using Syncfusion.Licensing;
// @using Syncfusion.Blazor.BarcodeGenerator  (in _Imports.razor)

// Add this
using IronBarCode;
// Remove these (barcode-specific; leave others if non-barcode Syncfusion controls remain)
using Syncfusion.Windows.Forms.Barcode;
using Syncfusion.Licensing;
// @using Syncfusion.Blazor.BarcodeGenerator  (in _Imports.razor)

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

Paso 3: Inicializar licencia

Elimine el registro de licencia de Syncfusion y la configuración de la plataforma del inicio de la aplicación. Luego, agregue una única línea de licencia de IronBarcode en la misma ubicación de inicio:

// Remove from Program.cs / App.xaml.cs / MauiProgram.cs:
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
builder.Services.AddSyncfusionBlazor();         // Blazor only — remove if no other Syncfusion controls
builder.ConfigureSyncfusionCore();              // MAUI only — remove if no other Syncfusion controls

// Add at the same startup point:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Remove from Program.cs / App.xaml.cs / MauiProgram.cs:
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
builder.Services.AddSyncfusionBlazor();         // Blazor only — remove if no other Syncfusion controls
builder.ConfigureSyncfusionCore();              // MAUI only — remove if no other Syncfusion controls

// Add at the same startup point:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Remove from Program.vb / App.xaml.vb / MauiProgram.vb:
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY")
builder.Services.AddSyncfusionBlazor()         ' Blazor only — remove if no other Syncfusion controls
builder.ConfigureSyncfusionCore()              ' MAUI only — remove if no other Syncfusion controls

' Add at the same startup point:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Para pipelines de CI/CD y contenedores Docker, almacene la clave en una variable de entorno:

IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
Imports System

IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
$vbLabelText   $csharpLabel

Ejemplos de migración de código

Conversión de SfBarcode a BarcodeWriter en WinForms

La migración de WinForms elimina la indirectación DrawToBitmap y la reemplaza con una cadena de salida de archivo directa. El patrón de Syncfusion requiere preasignar un Bitmap de dimensiones conocidas; IronBarcode calcula las dimensiones como parte de la llamada de generación.

Enfoque de Syncfusion :

using Syncfusion.Windows.Forms.Barcode;
using System.Drawing;
using System.Drawing.Imaging;

Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");

var barcode = new SfBarcode();
barcode.Text = "ORD-20240315-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.BarHeight = 100;
barcode.NarrowBarWidth = 1;
barcode.ShowText = true;
barcode.Width = 400;
barcode.Height = 150;

using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("order-label.png", ImageFormat.Png);
using Syncfusion.Windows.Forms.Barcode;
using System.Drawing;
using System.Drawing.Imaging;

Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");

var barcode = new SfBarcode();
barcode.Text = "ORD-20240315-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.BarHeight = 100;
barcode.NarrowBarWidth = 1;
barcode.ShowText = true;
barcode.Width = 400;
barcode.Height = 150;

using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("order-label.png", ImageFormat.Png);
Imports Syncfusion.Windows.Forms.Barcode
Imports System.Drawing
Imports System.Drawing.Imaging

Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY")

Dim barcode As New SfBarcode()
barcode.Text = "ORD-20240315-001"
barcode.Symbology = BarcodeSymbolType.Code128A
barcode.BarHeight = 100
barcode.NarrowBarWidth = 1
barcode.ShowText = True
barcode.Width = 400
barcode.Height = 150

Using bitmap As New Bitmap(barcode.Width, barcode.Height)
    barcode.DrawToBitmap(bitmap, barcode.ClientRectangle)
    bitmap.Save("order-label.png", ImageFormat.Png)
End Using
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

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

BarcodeWriter.CreateBarcode("ORD-20240315-001", BarcodeEncoding.Code128)
    .ResizeTo(400, 150)
    .AddBarcodeText()
    .SaveAsPng("order-label.png");
using IronBarCode;

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

BarcodeWriter.CreateBarcode("ORD-20240315-001", BarcodeEncoding.Code128)
    .ResizeTo(400, 150)
    .AddBarcodeText()
    .SaveAsPng("order-label.png");
Imports IronBarCode

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

BarcodeWriter.CreateBarcode("ORD-20240315-001", BarcodeEncoding.Code128) _
    .ResizeTo(400, 150) _
    .AddBarcodeText() _
    .SaveAsPng("order-label.png")
$vbLabelText   $csharpLabel

BarcodeSymbolType.Code128A se asigna a BarcodeEncoding.Code128. La secuencia DrawToBitmap + Bitmap.Save se colapsa en .SaveAsPng(). Si el código de barras debe mostrarse dentro de un PictureBox de WinForms en lugar de guardarse en el disco, use .ToPngBinaryData() para cargar la imagen en el control. La gama completa de formatos de código de barras 1D en IronBarcode va mucho más allá de la lista de formatos compatibles con el control Syncfusion .

Generador de códigos de barras Blazor a punto final de API mínimo

La migración de Blazor es un cambio estructural, más que una sustitución línea por línea. SfBarcodeGenerator es un componente Razor que se renderiza en el navegador a través de la capa de JavaScript de Syncfusion. IronBarcode no tiene ningún componente Razor ; Es una biblioteca del lado del servidor. El patrón de reemplazo consiste en un punto final de API mínimo en el servidor que devuelve bytes de código de barras, a los que se hace referencia en la página Razor como origen de la imagen.

Enfoque de Syncfusion :

@page "/fulfillment"
@using Syncfusion.Blazor.BarcodeGenerator

<SfBarcodeGenerator
    Width="300px"
    Height="150px"
    Type="BarcodeType.Code128"
    Value="@orderNumber">
    <BarcodeGeneratorDisplayText Visibility="true"></BarcodeGeneratorDisplayText>
</SfBarcodeGenerator>

@code {
    private string orderNumber = "ORD-20240315-001";
}

Enfoque de IronBarcode :

Agregue un punto de generación en Program.cs:

using IronBarCode;

app.MapGet("/barcode/{value}", (string value) =>
{
    var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
        .ResizeTo(300, 150)
        .AddBarcodeText()
        .ToPngBinaryData();

    return Results.File(bytes, "image/png");
});
using IronBarCode;

app.MapGet("/barcode/{value}", (string value) =>
{
    var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
        .ResizeTo(300, 150)
        .AddBarcodeText()
        .ToPngBinaryData();

    return Results.File(bytes, "image/png");
});
Imports IronBarCode

app.MapGet("/barcode/{value}", Function(value As String)
    Dim bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) _
        .ResizeTo(300, 150) _
        .AddBarcodeText() _
        .ToPngBinaryData()

    Return Results.File(bytes, "image/png")
End Function)
$vbLabelText   $csharpLabel

Haga referencia al punto final en el componente Razor :

@page "/fulfillment"

<img src="/barcode/@orderNumber" alt="Order barcode: @orderNumber" />

@code {
    private string orderNumber = "ORD-20240315-001";
}

Este punto final se puede probar de forma independiente, es reutilizable desde cualquier cliente HTTP y es compatible con Blazor Server, Blazor WebAssembly con un backend de API alojado y cualquier otro frontend web.

Generación de códigos QR

El componente QR de Syncfusion también se renderiza en el navegador sin ninguna ruta de salida del lado del servidor. IronBarcode genera códigos QR en el servidor con salida directa a archivos.

Enfoque de Syncfusion :

@using Syncfusion.Blazor.BarcodeGenerator

<SfQRCodeGenerator
    Width="300px"
    Height="300px"
    Value="https://example.com/product/ABC-123">
    <QRCodeGeneratorDisplayText Visibility="false">
    </QRCodeGeneratorDisplayText>
</SfQRCodeGenerator>

Enfoque de IronBarcode :

using IronBarCode;

// Standard QR code
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 300,
    QRCodeWriter.QrErrorCorrectionLevel.High)
    .SaveAsPng("product-qr.png");

// QR code with embedded brand logo — not available in Syncfusion
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("company-logo.png")
    .SaveAsPng("product-qr-branded.png");
using IronBarCode;

// Standard QR code
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 300,
    QRCodeWriter.QrErrorCorrectionLevel.High)
    .SaveAsPng("product-qr.png");

// QR code with embedded brand logo — not available in Syncfusion
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("company-logo.png")
    .SaveAsPng("product-qr-branded.png");
Imports IronBarCode

' Standard QR code
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 300, QRCodeWriter.QrErrorCorrectionLevel.High) _
    .SaveAsPng("product-qr.png")

' QR code with embedded brand logo — not available in Syncfusion
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
    .AddBrandLogo("company-logo.png") _
    .SaveAsPng("product-qr-branded.png")
$vbLabelText   $csharpLabel

Reemplazo de lectura OPX

Si el proyecto utilizó Barcode Reader OPX, o si pospuso un requisito de lectura para una futura compra de OPX, IronBarcode reemplaza esa dependencia con el paquete que ya está instalado. Sin producto secundario, sin segunda licencia.

Enfoque Syncfusion (lector de código de barras OPX):

// Requires separate Código de barras Syncfusion Reader OPX purchase
// OPX wraps ZXing.Net internally (Apache 2.0 — free to use directly)
using Syncfusion.BarcodeReader;

var reader = new BarcodeReader();
var results = reader.ReadBarcodes("warehouse-scan.png");
foreach (var result in results)
    Console.WriteLine($"Value: {result.Value}");
// Requires separate Código de barras Syncfusion Reader OPX purchase
// OPX wraps ZXing.Net internally (Apache 2.0 — free to use directly)
using Syncfusion.BarcodeReader;

var reader = new BarcodeReader();
var results = reader.ReadBarcodes("warehouse-scan.png");
foreach (var result in results)
    Console.WriteLine($"Value: {result.Value}");
Imports Syncfusion.BarcodeReader

Dim reader As New BarcodeReader()
Dim results = reader.ReadBarcodes("warehouse-scan.png")
For Each result In results
    Console.WriteLine($"Value: {result.Value}")
Next
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

// Included in the same NuGet package as generation — no second product required
var results = BarcodeReader.Read("warehouse-scan.png");
foreach (var result in results)
{
    Console.WriteLine($"Format: {result.Format}");
    Console.WriteLine($"Value: {result.Value}");
    Console.WriteLine($"Confidence: {result.Confidence}%");
}
using IronBarCode;

// Included in the same NuGet package as generation — no second product required
var results = BarcodeReader.Read("warehouse-scan.png");
foreach (var result in results)
{
    Console.WriteLine($"Format: {result.Format}");
    Console.WriteLine($"Value: {result.Value}");
    Console.WriteLine($"Confidence: {result.Confidence}%");
}
Imports IronBarCode

' Included in the same NuGet package as generation — no second product required
Dim results = BarcodeReader.Read("warehouse-scan.png")
For Each result In results
    Console.WriteLine($"Format: {result.Format}")
    Console.WriteLine($"Value: {result.Value}")
    Console.WriteLine($"Confidence: {result.Confidence}%")
Next
$vbLabelText   $csharpLabel

La documentación sobre lectura de códigos de barras abarca la lectura de matrices de bytes para controladores de carga, el ajuste de velocidad frente a precisión y la detección de múltiples códigos de barras.

Generación de códigos de barras PDF

Los controles de código de barras de Syncfusion no tienen ruta de salida a PDF. IronBarcode trata el formato PDF como un formato de salida de primera clase.

Enfoque de Syncfusion :

// No direct path — requires combining Syncfusion.Barcode.WinForms and Syncfusion.Pdf
// Step 1: Generate to Bitmap via DrawToBitmap
// Step 2: Load Syncfusion PDF document
// Step 3: Insert bitmap as image element
// Two packages, two APIs, two license obligations
// No direct path — requires combining Syncfusion.Barcode.WinForms and Syncfusion.Pdf
// Step 1: Generate to Bitmap via DrawToBitmap
// Step 2: Load Syncfusion PDF document
// Step 3: Insert bitmap as image element
// Two packages, two APIs, two license obligations
' No direct path — requires combining Syncfusion.Barcode.WinForms and Syncfusion.Pdf
' Step 1: Generate to Bitmap via DrawToBitmap
' Step 2: Load Syncfusion PDF document
' Step 3: Insert bitmap as image element
' Two packages, two APIs, two license obligations
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

// Generate directly to PDF — no secondary library required
BarcodeWriter.CreateBarcode("PALLET-2024-0891", BarcodeEncoding.Code128)
    .ResizeTo(400, 150)
    .SaveAsPdf("pallet-label.pdf");

// Read barcodes from an existing PDF
var pdfResults = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in pdfResults)
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
using IronBarCode;

// Generate directly to PDF — no secondary library required
BarcodeWriter.CreateBarcode("PALLET-2024-0891", BarcodeEncoding.Code128)
    .ResizeTo(400, 150)
    .SaveAsPdf("pallet-label.pdf");

// Read barcodes from an existing PDF
var pdfResults = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in pdfResults)
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
Imports IronBarCode

' Generate directly to PDF — no secondary library required
BarcodeWriter.CreateBarcode("PALLET-2024-0891", BarcodeEncoding.Code128) _
    .ResizeTo(400, 150) _
    .SaveAsPdf("pallet-label.pdf")

' Read barcodes from an existing PDF
Dim pdfResults = BarcodeReader.Read("shipping-manifest.pdf")
For Each result In pdfResults
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
$vbLabelText   $csharpLabel

La guía para la generación de PDF con códigos de barras abarca la creación de archivos PDF de varias páginas y la inserción de códigos de barras junto con el resto del contenido del documento.

Referencia de mapeo de la API de códigos de barras de Syncfusion a IronBarcode

Syncfusion IronBarcode
SyncfusionLicenseProvider.RegisterLicense("KEY") IronBarCode.License.LicenseKey = "key"
builder.Services.AddSyncfusionBlazor() No es necesario
builder.ConfigureSyncfusionCore() No es necesario
new SfBarcode() BarcodeWriter.CreateBarcode() (estático)
barcode.Text = "value" Primer parámetro de CreateBarcode()
barcode.Symbology = BarcodeSymbolType.Code128A BarcodeEncoding.Code128
barcode.Symbology = BarcodeSymbolType.QRBarcode QRCodeWriter.CreateQrCode()
barcode.BarHeight = 100 .ResizeTo(width, 100)
barcode.ShowText = true .AddBarcodeText()
barcode.DrawToBitmap(bitmap, rect) .SaveAsPng(path)
Manual BitmapMemoryStream .ToPngBinaryData()
<SfBarcodeGenerator Type="BarcodeType.Code128" Value="..."> BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) en el endpoint de API
<SfQRCodeGenerator Value="..."> QRCodeWriter.CreateQrCode(value, size) en el endpoint de API
BarcodeType.Code128 (enum Blazor) BarcodeEncoding.Code128
Lector de códigos de barras OPX (producto independiente, compatible con ZXing .NET) BarcodeReader.Read(path) — nativo, mismo paquete
No hay API de lectura en el control BarcodeReader.Read(path)
No hay salida PDF en el control .SaveAsPdf(path)
No se permite la lectura de archivos PDF. BarcodeReader.Read("document.pdf")

Problemas comunes de migración y soluciones

Problema 1: Marcas de agua de prueba después de la actualización de NuGet

Syncfusion: La actualización de Essential Studio 24.x a 25.x invalida la clave de licencia existente. Cualquier resultado generado antes de actualizar el almacén de secretos mostrará una marca de agua de prueba. Se trata de un fallo silencioso: la aplicación sigue funcionando, pero produce resultados que no cumplen con los requisitos.

Solución: Tras actualizar el paquete NuGet de IronBarcode , la clave de licencia no cambia dentro de una versión principal. No es necesario actualizar ni redistribuir los secretos para las versiones menores o de parches. Al actualizar a una nueva versión principal, actualice la clave una sola vez en el punto de entrada de la aplicación:

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

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

Problema 2: DrawToBitmap falla en entornos sin interfaz gráfica.

Syncfusion: SfBarcode.DrawToBitmap depende de la canalización de renderizado de Windows Forms. En un proceso ASP.NET Core, Azure Function o contenedor Docker de Linux, llamar a DrawToBitmap lanzará InvalidOperationException o producirá un mapa de bits en blanco porque no hay un bucle de mensajes de Windows Forms presente.

Solución: Reemplace con BarcodeWriter.CreateBarcode(). IronBarcode realiza la generación en código administrado sin ninguna dependencia de tiempo de ejecución de la interfaz de usuario:

// Works in ASP.NET Core, Azure Functions, Docker on Linux, console apps
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
    .ResizeTo(400, 150)
    .ToPngBinaryData();
// Works in ASP.NET Core, Azure Functions, Docker on Linux, console apps
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
    .ResizeTo(400, 150)
    .ToPngBinaryData();
' Works in ASP.NET Core, Azure Functions, Docker on Linux, console apps
Dim bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) _
    .ResizeTo(400, 150) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

Problema 3: SfBarcodeGenerator no tiene salida en el servidor.

Syncfusion: SfBarcodeGenerator es un componente Razor sin superficie de API del lado del servidor. Los intentos de utilizarlo en una acción de controlador o en un servicio en segundo plano no encontrarán ningún método aplicable para generar bytes de código de barras.

Solución: Crear un punto final de API mínimo que genere el código de barras en el servidor y lo devuelva como respuesta HTTP. Referencie el endpoint desde el componente Razor a través de una etiqueta <img src="...">:

app.MapGet("/barcode/{value}", (string value) =>
{
    var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
        .ResizeTo(300, 150)
        .ToPngBinaryData();
    return Results.File(bytes, "image/png");
});
app.MapGet("/barcode/{value}", (string value) =>
{
    var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
        .ResizeTo(300, 150)
        .ToPngBinaryData();
    return Results.File(bytes, "image/png");
});
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http

app.MapGet("/barcode/{value}", Function(value As String)
                                   Dim bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) _
                                       .ResizeTo(300, 150) _
                                       .ToPngBinaryData()
                                   Return Results.File(bytes, "image/png")
                               End Function)
$vbLabelText   $csharpLabel

Problema 4: Falta de capacidad de lectura (OPX no adquirido)

Syncfusion: Los proyectos que aplazaron la lectura de códigos de barras porque aún no se había adquirido OPX no tienen código de lectura para migrar. Agregar la capacidad de lectura desde cero requiere la adquisición de OPX, su integración y un nuevo acuerdo de licencia.

Solución: La lectura de IronBarcode está incluida en el mismo paquete. No se requiere adquisición ni licencia adicional. Agregue BarcodeReader.Read(path) donde se requiera lectura:

var results = BarcodeReader.Read("incoming-scan.png");
var results = BarcodeReader.Read("incoming-scan.png");
Dim results = BarcodeReader.Read("incoming-scan.png")
$vbLabelText   $csharpLabel

Problema 5: Caducidad de la licencia comunitaria durante la migración

Syncfusion: Un equipo que utilice la Licencia Comunitaria y supere cualquier umbral de elegibilidad durante el período de migración, incluido el cierre de una ronda de financiación, puede encontrarse con que los controles de Syncfusion dejan de producir resultados válidos antes de que finalice la migración.

Solución: La prueba gratuita de 30 días de IronBarcode permite una evaluación completa sin condiciones de ingresos, plantilla o capital. La marca de agua de prueba aparece en la salida generada; Al activar una clave de licencia comprada, esta se elimina. El modelo de licencias de IronBarcode no establece umbrales de tamaño para las organizaciones.

Lista de verificación para la migración de códigos de barras de Syncfusion

Tareas previas a la migración

Audite el código fuente para localizar todos los archivos que hacen referencia al código de barras de Syncfusion :

grep -r "SyncfusionLicenseProvider.RegisterLicense\|AddSyncfusionBlazor\|ConfigureSyncfusionCore" --include="*.cs" .
grep -r "new SfBarcode\(\)\|SfBarcodeGenerator\|SfQRCodeGenerator" --include="*.cs" --include="*.razor" .
grep -r "BarcodeSymbolType\.\|BarcodeType\." --include="*.cs" --include="*.razor" .
grep -r "DrawToBitmap\|barcode\.Text\s*=" --include="*.cs" .
grep -r "Syncfusion\.Barcode\|Syncfusion\.Blazor\.BarcodeGenerator" --include="*.csproj" .
grep -r "SyncfusionLicenseProvider.RegisterLicense\|AddSyncfusionBlazor\|ConfigureSyncfusionCore" --include="*.cs" .
grep -r "new SfBarcode\(\)\|SfBarcodeGenerator\|SfQRCodeGenerator" --include="*.cs" --include="*.razor" .
grep -r "BarcodeSymbolType\.\|BarcodeType\." --include="*.cs" --include="*.razor" .
grep -r "DrawToBitmap\|barcode\.Text\s*=" --include="*.cs" .
grep -r "Syncfusion\.Barcode\|Syncfusion\.Blazor\.BarcodeGenerator" --include="*.csproj" .
SHELL

Documente lo siguiente antes de escribir cualquier código de migración:

  • Liste cada archivo que llame a SyncfusionLicenseProvider.RegisterLicense
  • Liste cada instanciación de SfBarcode y sus asignaciones de propiedades
  • Liste cada uso del componente Razor <SfBarcodeGenerator> y <SfQRCodeGenerator>
  • Liste cada llamada DrawToBitmap y la ruta de guardado o visualización posterior
  • Confirme si el lector de códigos de barras OPX está instalado; Si es así, enumere todas las llamadas de lectura.

Tareas de actualización de código

  1. Elimine el/los paquete(s) NuGet de código de barras de Syncfusion para cada plataforma en el proyecto.
  2. Eliminar el paquete NuGet Syncfusion.Licensing si no quedan otros controles de Syncfusion
  3. Instalar el paquete NuGet IronBarcode
  4. Reemplace SyncfusionLicenseProvider.RegisterLicense("KEY") con IronBarCode.License.LicenseKey = "KEY" en el punto de entrada de la aplicación
  5. Eliminar builder.Services.AddSyncfusionBlazor() si no quedan otros controles de Syncfusion
  6. Eliminar builder.ConfigureSyncfusionCore() si no quedan otros controles de Syncfusion
  7. Eliminar @using Syncfusion.Blazor y @using Syncfusion.Blazor.BarcodeGenerator de _Imports.razor si es aplicable
  8. Reemplazar using Syncfusion.Windows.Forms.Barcode y using Syncfusion.Licensing con using IronBarCode
  9. Reemplazar cada bloque new SfBarcode() + asignaciones de propiedades + DrawToBitmap con BarcodeWriter.CreateBarcode(value, BarcodeEncoding.X).ResizeTo(w, h).SaveAsPng(path)
  10. Reemplazar BarcodeSymbolType.Code128A (y equivalentes) con BarcodeEncoding.Code128
  11. Reemplazar BarcodeType.Code128 (enum Blazor) con BarcodeEncoding.Code128
  12. Reemplazar cada componente Razor <SfBarcodeGenerator> con un endpoint de API mínimo y una referencia <img src="..."> en el componente
  13. Reemplazar cada componente Razor <SfQRCodeGenerator> con un endpoint QRCodeWriter.CreateQrCode() y una referencia <img src="...">
  14. Reemplace todas las llamadas de lectura de OPX del lector de códigos de barras con BarcodeReader.Read(path)
  15. Agregue BarcodeReader.Read(path) donde previamente no había capacidad de lectura debido a que OPX no fue adquirido

Pruebas posteriores a la migración

  • Verifique que las imágenes de códigos de barras generadas sean válidas para el escaneo utilizando un escáner de hardware o una aplicación de lector de referencia.
  • Verifique que no aparezcan marcas de agua de prueba en la salida generada después de la activación de la clave de licencia.
  • Confirmar que BarcodeReader.Read() devuelve el valor y formato esperado para cada tipo de código de barras en uso
  • Probar la salida PDF con .SaveAsPdf() para confirmar que las dimensiones de la página y del código de barras coinciden con los requisitos de diseño
  • Pruebe el endpoint de la API mínima de Blazor directamente (a través del navegador o cliente HTTP) antes de probarlo dentro del componente Razor.
  • Confirmar que la implementación de Docker y Linux produce resultados idénticos a los de las máquinas de desarrollo de Windows.
  • Ejecutar una auditoría final grep para confirmar que no quedan referencias a SfBarcode, SfBarcodeGenerator, DrawToBitmap, BarcodeSymbolType o SyncfusionLicenseProvider

Principales ventajas de migrar a IronBarcode

Generación y lectura unificadas: tras la migración, tanto la generación como la lectura funcionan a través de un único paquete NuGet bajo una sola licencia. No hay ningún producto secundario que comprar, ninguna otra interfaz API que aprender, ni ninguna dependencia del envoltorio ZXing .NET que consuma un presupuesto de licencia que podría destinarse a la biblioteca de código abierto directa.

Eliminación de la rotación de claves específica de la versión: las claves de licencia de IronBarcode siguen siendo válidas para las actualizaciones menores y los parches dentro de una versión principal. Se elimina por completo la sobrecarga operativa que supone obtener una nueva clave, actualizar los secretos en cada entorno de implementación y volver a implementar para eliminar las marcas de agua de prueba en cada actualización importante de la versión de NuGet .

Implementación independiente de la plataforma: el mismo paquete IronBarcode y la misma API de generación funcionan en aplicaciones de escritorio WinForms, servicios ASP.NET Core , Azure Functions, aplicaciones de consola y contenedores Docker de Linux. La dependencia del tiempo de ejecución de Windows Forms introducida por DrawToBitmap se elimina, y las implementaciones de Blazor pasan de componentes renderizados en el navegador a endpoints de API del lado del servidor que son independientemente comprobables y agnósticos al cliente.

Compatibilidad nativa con PDF: Tanto la generación como la lectura se extienden al formato PDF de forma nativa. Generar un PDF con código de barras ya no requiere coordinar dos productos de Syncfusion ; La lectura de códigos de barras a partir de manifiestos y documentos de envío en formato PDF ya no requiere un paso de extracción de PDF por separado.

Economía de licencias predecible: el modelo de licencia perpetua de IronBarcode no impone umbrales de ingresos, plantilla, número de empleados ni capital. Los equipos que han superado los requisitos de elegibilidad para la Licencia Comunitaria de Syncfusion , o que prevén hacerlo, pasan a un modelo de licenciamiento en el que el crecimiento organizacional no genera un evento de cumplimiento.

Por favor notaSyncfusion y ZXing.NET son marcas registradas de sus respectivos propietarios. Este sitio no está afiliado, respaldado ni patrocinado por Syncfusion 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 Syncfusion Barcode 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 Syncfusion 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 Syncfusion Barcode 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 Syncfusion Barcode 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 Syncfusion Barcode?

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 la migración desde Syncfusion?

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 Syncfusion Barcode 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