Saltar al pie de página
VIDEOS

Cómo Crear Código de Barras a Partir de Datos en C#

Migrating from Código de barras de HERRAMIENTAS DE PLOMO to IronBarcode

Esta guía abarca la migración completa de Código de barras de HERRAMIENTAS DE PLOMO a IronBarcode para desarrolladores .NET . Se aborda la eliminación de los paquetes NuGet de HERRAMIENTAS DE PLOMO y una dependencia de tiempo de ejecución nativa, el reemplazo de la secuencia de inicialización de licencia de HERRAMIENTAS DE PLOMO basada en archivos con una clave de cadena, y la traducción de patrones de lectura y escritura de HERRAMIENTAS DE PLOMO en la API fluida estática de IronBarcode. Se proporcionan ejemplos de código para cada escenario de migración principal, junto con una tabla de asignación de API, una lista de verificación estructurada y orientación sobre los problemas que surjan durante la transición.

¿Por qué migrar desde HERRAMIENTAS DE PLOMO Barcode?

Implementación de licencia basada en archivos: La licencia de HERRAMIENTAS DE PLOMO requiere que un archivo .LIC esté físicamente presente en disco en una ruta conocida en cada máquina donde se ejecute la aplicación. Las estaciones de trabajo de los desarrolladores, los agentes de compilación de CI, los servidores de pruebas y los contenedores de producción requieren que el archivo se aprovisione antes de que la aplicación se inicialice. Este es un modelo operativo fundamentalmente diferente al de los secretos basados ​​en cadenas, que se integran perfectamente en las variables de entorno, los gestores de secretos y la configuración de la canalización de CI/CD. Cada nuevo entorno que se añade a una topología de despliegue (una nueva región en la nube, un nuevo grupo de nodos de Kubernetes, una nueva incorporación de desarrolladores) requiere un paso de aprovisionamiento de archivos que las licencias basadas en cadenas de texto no requieren.

Huella del SDK: La instalación de código de barras de HERRAMIENTAS DE PLOMO requiere el paquete Leadtools.Barcode de NuGet (que incluye Leadtools, Leadtools.Codecs, y dependencias relacionadas). La extracción de códigos de barras PDF añade Leadtools.Pdf. En Windows, el entorno de ejecución de MSVC++ 2017 es una dependencia nativa independiente. El tamaño de salida publicado de una aplicación de códigos de barras HERRAMIENTAS DE PLOMO es de aproximadamente 148 MB. Las aplicaciones que solo necesitan leer o generar códigos de barras soportan todo el peso de una plataforma de procesamiento de imágenes integral (infraestructura OCR, arquitectura de códec de formato y capacidades de visualización de documentos), independientemente de si se utilizan o no esas funciones.

Diseño de API heredada: Las operaciones con códigos de barras de HERRAMIENTAS DE PLOMO requieren la construcción de múltiples objetos en una secuencia específica antes de que se pueda realizar cualquier trabajo. Leer un código de barras requiere una instancia de RasterCodecs para cargar la imagen y una instancia de BarcodeEngine para escanearla, con un array explícito BarcodeSymbology declarando qué formatos buscar. Generar un código de barras requiere construir un objeto BarcodeData, crear un RasterImage en blanco con parámetros explícitos de píxeles, llenarlo con un color de fondo usando FillCommand, escribir el código de barras sobre él y guardar con RasterCodecs. Esa API refleja los patrones de diseño de su época. IronBarcode realiza las mismas operaciones mediante llamadas a métodos estáticos que aceptan rutas de archivo directamente.

Transparencia de Precios: Las licencias de despliegue de HERRAMIENTAS DE PLOMO para servidores de producción se cotizan por separado a través de las ventas de HERRAMIENTAS DE PLOMO y no se publican en su sitio web. Los equipos que necesitan un cuadro de costos completo antes de comenzar el desarrollo deben comprometerse con las ventas antes de confirmar que HERRAMIENTAS DE PLOMO se ajusta a su presupuesto. IronBarcode ofrece una licencia perpetua de una sola vez que cubre el desarrollo y el despliegue juntos, sin necesidad de una licencia de producción separada.

El problema fundamental

La secuencia de inicialización de HERRAMIENTAS DE PLOMO requiere más de 20 líneas y cuatro pasos de verificación antes de que se pueda crear un BarcodeEngine. IronBarcode reemplaza toda la secuencia con una sola asignación:

// LEADTOOLS: file path, expiry check, three feature lock checks, engine creation
using Leadtools;
using Leadtools.Barcode;

RasterSupport.SetLicense(
    @"C:\LEADTOOLS23\Support\Common\License\LEADTOOLS.LIC",
    "your-developer-key-here");

if (RasterSupport.KernelExpired)
    throw new InvalidOperationException("LEADTOOLS license has expired");

if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead))
    throw new InvalidOperationException("1D barcode reading is locked");

if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead))
    throw new InvalidOperationException("2D barcode reading is locked");

if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite))
    throw new InvalidOperationException("Barcode writing is locked");

var engine = new BarcodeEngine();
// LEADTOOLS: file path, expiry check, three feature lock checks, engine creation
using Leadtools;
using Leadtools.Barcode;

RasterSupport.SetLicense(
    @"C:\LEADTOOLS23\Support\Common\License\LEADTOOLS.LIC",
    "your-developer-key-here");

if (RasterSupport.KernelExpired)
    throw new InvalidOperationException("LEADTOOLS license has expired");

if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead))
    throw new InvalidOperationException("1D barcode reading is locked");

if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead))
    throw new InvalidOperationException("2D barcode reading is locked");

if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite))
    throw new InvalidOperationException("Barcode writing is locked");

var engine = new BarcodeEngine();
Imports Leadtools
Imports Leadtools.Barcode

' LEADTOOLS: file path, expiry check, three feature lock checks, engine creation
RasterSupport.SetLicense("C:\LEADTOOLS23\Support\Common\License\LEADTOOLS.LIC", "your-developer-key-here")

If RasterSupport.KernelExpired Then
    Throw New InvalidOperationException("LEADTOOLS license has expired")
End If

If RasterSupport.IsLocked(RasterSupportType.Barcode1DRead) Then
    Throw New InvalidOperationException("1D barcode reading is locked")
End If

If RasterSupport.IsLocked(RasterSupportType.Barcode2DRead) Then
    Throw New InvalidOperationException("2D barcode reading is locked")
End If

If RasterSupport.IsLocked(RasterSupportType.BarcodeWrite) Then
    Throw New InvalidOperationException("Barcode writing is locked")
End If

Dim engine As New BarcodeEngine()
$vbLabelText   $csharpLabel
// IronBarcode: one line, no file required
using IronBarCode;

IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
// IronBarcode: one line, no file required
using IronBarCode;

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

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

Comparación de características entre IronBarcode y HERRAMIENTAS DE PLOMO Barcode

Característica Código de barras de HERRAMIENTAS DE PLOMO IronBarcode
Modelo de licencia Archivo + clave de desarrollador Solo clave de cadena
Se requieren paquetes NuGet 5+ 1
dependencia de tiempo de ejecución nativa MSVC++ 2017 (Windows) None
Tamaño de salida publicado ~148 MB ~39 MB
Simbologías totales admitidas Más de 40 años Más de 50
Formato de código de barras de detección automática Limitado
Extracción de códigos de barras PDF Se requiere un paquete aparte Incorporado en
Corrección de errores de aprendizaje automático No
Logotipo de código QR para la marca No
Despliegue de Docker Se requiere montar el archivo Variable de entorno
Código de inicialización Más de 20 líneas 1 línea
Estilo API Grafo de objetos heredado Flujo estático
Plataforma cruzada Parcial (dependencias nativas) Completo (.NET Standard)
Precios de licencias de implementación Contactar con el departamento de ventas (información no publicada) Incluido en la compra perpetua

Inicio rápido: Migración de códigos de barras de HERRAMIENTAS DE PLOMO a IronBarcode

Paso 1: Eliminar los paquetes de LEADTOOLS

Elimine todos los paquetes HERRAMIENTAS DE PLOMO del proyecto:

dotnet remove package Leadtools.Barcode
dotnet remove package Leadtools
dotnet remove package Leadtools.Codecs
dotnet remove package Leadtools.Codecs.Png
dotnet remove package Leadtools.Codecs.Jpeg
dotnet remove package Leadtools.Barcode
dotnet remove package Leadtools
dotnet remove package Leadtools.Codecs
dotnet remove package Leadtools.Codecs.Png
dotnet remove package Leadtools.Codecs.Jpeg
SHELL

Si se agregó el códec PDF para la extracción de códigos de barras de archivos PDF:

dotnet remove package Leadtools.Pdf
dotnet remove package Leadtools.Pdf
SHELL

En las implementaciones de Windows Server, el entorno de ejecución MSVC++ 2017 se puede eliminar de los scripts de aprovisionamiento una vez finalizada la migración. IronBarcode no tiene dependencias de tiempo de ejecución nativas en ninguna plataforma.

Paso 2: Instalar IronBarcode

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

Este paquete único incluye compatibilidad con todos los formatos de imagen, extracción nativa de códigos de barras PDF, corrección de errores mediante aprendizaje automático y las más de 50 simbologías compatibles. No se requieren paquetes de códecs adicionales.

Paso 3: Inicializar la licencia

Reemplace todo el bloque de inicialización de HERRAMIENTAS DE PLOMO con una sola línea. Localice cada llamada a RasterSupport.SetLicense en la base de código — típicamente habrá exactamente una, al inicio de la aplicación — y reemplace toda la secuencia de inicialización circundante:

// Before: entire HERRAMIENTAS DE PLOMO initialization block (20+ lines)
// After:
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Before: entire HERRAMIENTAS DE PLOMO initialization block (20+ lines)
// After:
using IronBarCode;

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

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

La clave de licencia puede obtenerse de cualquier mecanismo de configuración con capacidad de cadena: una variable de entorno, appsettings.json, Azure Key Vault, AWS Secrets Manager, o un secreto de Kubernetes. Para obtener información sobre la configuración de licencias basada en el entorno, los patrones de implementación de Docker y todos los enfoques de configuración compatibles, consulte la documentación de configuración de la clave de licencia .

Ejemplos de migración de código

Lectura de códigos de barras a partir de imágenes

LEADTOOLS separa la carga de imágenes del escaneo de códigos de barras en dos capas de objetos distintas. Una instancia de RasterCodecs carga el archivo de imagen en un RasterImage, y una instancia de BarcodeEngine lo escanea. El llamante también debe proporcionar un array explícito de valores BarcodeSymbology; Los formatos que no figuren en la lista no serán detectados.

Enfoque de LEADTOOLS:

using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

using var codecs = new RasterCodecs();
using var image = codecs.Load("scan.png");

var engine = new BarcodeEngine();

var symbologies = new[]
{
    BarcodeSymbology.Code128,
    BarcodeSymbology.Code39,
    BarcodeSymbology.QR,
    BarcodeSymbology.DataMatrix,
    BarcodeSymbology.EAN13,
    BarcodeSymbology.UPCA
};

var barcodes = engine.Reader.ReadBarcodes(
    image,
    LogicalRectangle.Empty,
    0,
    symbologies);

foreach (var barcode in barcodes)
    Console.WriteLine($"{barcode.Symbology}: {barcode.Value}");
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

using var codecs = new RasterCodecs();
using var image = codecs.Load("scan.png");

var engine = new BarcodeEngine();

var symbologies = new[]
{
    BarcodeSymbology.Code128,
    BarcodeSymbology.Code39,
    BarcodeSymbology.QR,
    BarcodeSymbology.DataMatrix,
    BarcodeSymbology.EAN13,
    BarcodeSymbology.UPCA
};

var barcodes = engine.Reader.ReadBarcodes(
    image,
    LogicalRectangle.Empty,
    0,
    symbologies);

foreach (var barcode in barcodes)
    Console.WriteLine($"{barcode.Symbology}: {barcode.Value}");
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs

Dim codecs As New RasterCodecs()
Using codecs
    Dim image = codecs.Load("scan.png")
    Using image
        Dim engine As New BarcodeEngine()

        Dim symbologies = New BarcodeSymbology() {
            BarcodeSymbology.Code128,
            BarcodeSymbology.Code39,
            BarcodeSymbology.QR,
            BarcodeSymbology.DataMatrix,
            BarcodeSymbology.EAN13,
            BarcodeSymbology.UPCA
        }

        Dim barcodes = engine.Reader.ReadBarcodes(
            image,
            LogicalRectangle.Empty,
            0,
            symbologies)

        For Each barcode In barcodes
            Console.WriteLine($"{barcode.Symbology}: {barcode.Value}")
        Next
    End Using
End Using
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

var results = BarcodeReader.Read("scan.png");

foreach (var result in results)
    Console.WriteLine($"{result.Format}: {result.Value}");
using IronBarCode;

var results = BarcodeReader.Read("scan.png");

foreach (var result in results)
    Console.WriteLine($"{result.Format}: {result.Value}");
Imports IronBarCode

Dim results = BarcodeReader.Read("scan.png")

For Each result In results
    Console.WriteLine($"{result.Format}: {result.Value}")
Next
$vbLabelText   $csharpLabel

IronBarcode acepta la ruta del archivo directamente, carga la imagen internamente y detecta automáticamente los formatos en las más de 50 simbologías compatibles sin necesidad de que el usuario enumere los tipos esperados. Para una configuración avanzada (ajuste de la velocidad de lectura, detección de múltiples códigos de barras y manejo de imágenes de baja calidad), consulte la guía de lectura de códigos de barras a partir de imágenes .

Generación de un código de barras Code 128

La generación de HERRAMIENTAS DE PLOMO requiere construir un objeto BarcodeData, asignar un RasterImage en blanco con flags de memoria explícitos, profundidad de píxeles y orden de bytes, llenar la imagen con un color de fondo, escribir el código de barras sobre él, y luego guardar con RasterCodecs. IronBarcode realiza todos esos pasos a través de una única cadena de métodos fluidos.

Enfoque de LEADTOOLS:

using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

var engine = new BarcodeEngine();

var barcodeData = new BarcodeData()
{
    Symbology = BarcodeSymbology.Code128,
    Value = "ITEM-98765",
    Bounds = new LeadRect(0, 0, 500, 120)
};

using var image = new RasterImage(
    RasterMemoryFlags.Conventional,
    500, 120, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    null, IntPtr.Zero, 0);

new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, barcodeData, null);

using var codecs = new RasterCodecs();
codecs.Save(image, "item-barcode.png", RasterImageFormat.Png, 0);
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

var engine = new BarcodeEngine();

var barcodeData = new BarcodeData()
{
    Symbology = BarcodeSymbology.Code128,
    Value = "ITEM-98765",
    Bounds = new LeadRect(0, 0, 500, 120)
};

using var image = new RasterImage(
    RasterMemoryFlags.Conventional,
    500, 120, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    null, IntPtr.Zero, 0);

new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, barcodeData, null);

using var codecs = new RasterCodecs();
codecs.Save(image, "item-barcode.png", RasterImageFormat.Png, 0);
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs

Dim engine As New BarcodeEngine()

Dim barcodeData As New BarcodeData() With {
    .Symbology = BarcodeSymbology.Code128,
    .Value = "ITEM-98765",
    .Bounds = New LeadRect(0, 0, 500, 120)
}

Using image As New RasterImage(
    RasterMemoryFlags.Conventional,
    500, 120, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    Nothing, IntPtr.Zero, 0)

    Dim fillCommand As New FillCommand(RasterColor.White)
    fillCommand.Run(image)
    engine.Writer.WriteBarcode(image, barcodeData, Nothing)

    Using codecs As New RasterCodecs()
        codecs.Save(image, "item-barcode.png", RasterImageFormat.Png, 0)
    End Using
End Using
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128)
    .ResizeTo(500, 120)
    .SaveAsPng("item-barcode.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128)
    .ResizeTo(500, 120)
    .SaveAsPng("item-barcode.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128) _
    .ResizeTo(500, 120) _
    .SaveAsPng("item-barcode.png")
$vbLabelText   $csharpLabel

Para obtener una guía completa sobre el tamaño, el estilo, el control de márgenes y los formatos de salida compatibles, consulte la sección sobre cómo crear imágenes de códigos de barras .

Generación de un código QR con logotipo personalizado

La generación de códigos QR en HERRAMIENTAS DE PLOMO sigue el mismo patrón de construcción RasterImage de varios pasos que otros tipos de códigos de barras. IronBarcode proporciona QRCodeWriter con un método AddBrandLogo dedicado para incrustar un logotipo en el centro de un código QR.

Enfoque de LEADTOOLS:

using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

var engine = new BarcodeEngine();

var qrData = new BarcodeData()
{
    Symbology = BarcodeSymbology.QR,
    Value = "https://example.com/product/12345",
    Bounds = new LeadRect(0, 0, 400, 400)
};

using var image = new RasterImage(
    RasterMemoryFlags.Conventional,
    400, 400, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    null, IntPtr.Zero, 0);

new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, qrData, null);

using var codecs = new RasterCodecs();
codecs.Save(image, "product-qr.png", RasterImageFormat.Png, 0);
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

var engine = new BarcodeEngine();

var qrData = new BarcodeData()
{
    Symbology = BarcodeSymbology.QR,
    Value = "https://example.com/product/12345",
    Bounds = new LeadRect(0, 0, 400, 400)
};

using var image = new RasterImage(
    RasterMemoryFlags.Conventional,
    400, 400, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    null, IntPtr.Zero, 0);

new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, qrData, null);

using var codecs = new RasterCodecs();
codecs.Save(image, "product-qr.png", RasterImageFormat.Png, 0);
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs

Dim engine As New BarcodeEngine()

Dim qrData As New BarcodeData() With {
    .Symbology = BarcodeSymbology.QR,
    .Value = "https://example.com/product/12345",
    .Bounds = New LeadRect(0, 0, 400, 400)
}

Using image As New RasterImage(
    RasterMemoryFlags.Conventional,
    400, 400, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    Nothing, IntPtr.Zero, 0)

    Dim fillCommand As New FillCommand(RasterColor.White)
    fillCommand.Run(image)
    engine.Writer.WriteBarcode(image, qrData, Nothing)

    Using codecs As New RasterCodecs()
        codecs.Save(image, "product-qr.png", RasterImageFormat.Png, 0)
    End Using
End Using
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com/product/12345", 400, QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("brand-logo.png")
    .SaveAsPng("product-qr.png");
using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com/product/12345", 400, QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("brand-logo.png")
    .SaveAsPng("product-qr.png");
Imports IronBarCode

QRCodeWriter.CreateQrCode("https://example.com/product/12345", 400, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
    .AddBrandLogo("brand-logo.png") _
    .SaveAsPng("product-qr.png")
$vbLabelText   $csharpLabel

Extracción de códigos de barras de documentos PDF

La extracción de códigos de barras PDF en HERRAMIENTAS DE PLOMO requiere el paquete Leadtools.Pdf por separado, configuración de carga de PDF explícita, una consulta manual de conteo de páginas y un bucle sobre cada página. Cada página debe cargarse individualmente como un RasterImage antes de escanear. IronBarcode incluye compatibilidad con PDF en el paquete base y gestiona internamente la iteración de páginas.

Enfoque de LEADTOOLS:

using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

// Requires: dotnet add package Leadtools.Pdf
using var codecs = new RasterCodecs();
codecs.Options.Pdf.Load.Resolution = 300;
codecs.Options.Pdf.Load.DisplayDepth = 24;

var engine = new BarcodeEngine();
var results = new List<string>();
int pageCount = codecs.GetTotalPages("shipment.pdf");

for (int page = 1; page <= pageCount; page++)
{
    using var image = codecs.Load(
        "shipment.pdf", 0,
        CodecsLoadByteOrder.BgrOrGray,
        page, page);

    var barcodes = engine.Reader.ReadBarcodes(
        image, LogicalRectangle.Empty, 0, null);

    foreach (var barcode in barcodes)
        results.Add($"Page {page}: {barcode.Value}");
}
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

// Requires: dotnet add package Leadtools.Pdf
using var codecs = new RasterCodecs();
codecs.Options.Pdf.Load.Resolution = 300;
codecs.Options.Pdf.Load.DisplayDepth = 24;

var engine = new BarcodeEngine();
var results = new List<string>();
int pageCount = codecs.GetTotalPages("shipment.pdf");

for (int page = 1; page <= pageCount; page++)
{
    using var image = codecs.Load(
        "shipment.pdf", 0,
        CodecsLoadByteOrder.BgrOrGray,
        page, page);

    var barcodes = engine.Reader.ReadBarcodes(
        image, LogicalRectangle.Empty, 0, null);

    foreach (var barcode in barcodes)
        results.Add($"Page {page}: {barcode.Value}");
}
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs

' Requires: dotnet add package Leadtools.Pdf
Using codecs As New RasterCodecs()
    codecs.Options.Pdf.Load.Resolution = 300
    codecs.Options.Pdf.Load.DisplayDepth = 24

    Dim engine As New BarcodeEngine()
    Dim results As New List(Of String)()
    Dim pageCount As Integer = codecs.GetTotalPages("shipment.pdf")

    For page As Integer = 1 To pageCount
        Using image = codecs.Load("shipment.pdf", 0, CodecsLoadByteOrder.BgrOrGray, page, page)
            Dim barcodes = engine.Reader.ReadBarcodes(image, LogicalRectangle.Empty, 0, Nothing)

            For Each barcode In barcodes
                results.Add($"Page {page}: {barcode.Value}")
            Next
        End Using
    Next
End Using
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

var results = BarcodeReader.Read("shipment.pdf");

foreach (var result in results)
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
using IronBarCode;

var results = BarcodeReader.Read("shipment.pdf");

foreach (var result in results)
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
Imports IronBarCode

Dim results = BarcodeReader.Read("shipment.pdf")

For Each result In results
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
$vbLabelText   $csharpLabel

Despliegue de Docker

El requisito de gestión de archivos que define cada implementación de HERRAMIENTAS DE PLOMO en Docker se elimina por completo al migrar a IronBarcode.

Enfoque de LEADTOOLS:

FROM mcr.microsoft.com/dotnet/aspnet:8.0

WORKDIR /app
COPY publish/ .

# License file must be physically present in the container image
COPY LEADTOOLS.LIC /app/license/LEADTOOLS.LIC

ENV LEADTOOLS_LICENSE_PATH=/app/license/LEADTOOLS.LIC
ENV LEADTOOLS_DEVELOPER_KEY=your-developer-key

ENTRYPOINT ["dotnet", "YourApp.dll"]

Enfoque de IronBarcode :

FROM mcr.microsoft.com/dotnet/aspnet:8.0

WORKDIR /app
COPY publish/ .

ENV IRONBARCODE_LICENSE=your-license-key

ENTRYPOINT ["dotnet", "YourApp.dll"]

La clave de licencia se inyecta en tiempo de ejecución del contenedor a través de secretos de Docker, secretos de Kubernetes o cualquier mecanismo de variable de entorno. No se requiere ningún paso de aprovisionamiento de archivos. La guía de implementación de Docker y Linux abarca imágenes base de Alpine y Debian, compilaciones de varias etapas y patrones de implementación de Kubernetes.

Referencia de mapeo de la API de códigos de barras de HERRAMIENTAS DE PLOMO a IronBarcode

HERRAMIENTAS DE PLOMO IronBarcode Notas
RasterSupport.SetLicense(path, key) IronBarCode.License.LicenseKey = "key" Solo la clave; no se necesita archivo.
RasterSupport.KernelExpired (removed) No se necesita comprobar la fecha de caducidad.
RasterSupport.IsLocked(RasterSupportType.Barcode1DRead) (removed) Todas las funciones incluidas
RasterSupport.IsLocked(RasterSupportType.Barcode2DRead) (removed) Todas las funciones incluidas
RasterSupport.IsLocked(RasterSupportType.BarcodeWrite) (removed) Todas las funciones incluidas
new BarcodeEngine() Estático: ninguna instancia BarcodeReader, BarcodeWriter son estáticos
new RasterCodecs() (removed) Pasar la ruta del archivo directamente
codecs.Load(imagePath) (removed) Pasar la ruta del archivo directamente
engine.Reader.ReadBarcodes(image, LogicalRectangle.Empty, 0, symbologies) BarcodeReader.Read(imagePath) Detecta automáticamente las simbologías.
BarcodeData.Value result.Value Mismo nombre de propiedad
BarcodeData.Symbology result.Format Propiedad renombrada
new BarcodeData() { Symbology = BarcodeSymbology.Code128 } BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) Creación fluida
BarcodeSymbology.Code128 BarcodeEncoding.Code128 Cambio de espacio de nombres
BarcodeSymbology.QR BarcodeEncoding.QRCode Cambio de nombre
BarcodeSymbology.DataMatrix BarcodeEncoding.DataMatrix El mismo nombre
BarcodeSymbology.PDF417 BarcodeEncoding.PDF417 El mismo nombre
BarcodeSymbology.EAN13 BarcodeEncoding.EAN13 El mismo nombre
BarcodeSymbology.UPCA BarcodeEncoding.UPCA El mismo nombre
BarcodeSymbology.Interleaved2of5 BarcodeEncoding.Interleaved2of5 El mismo nombre
BarcodeSymbology.Codabar BarcodeEncoding.Codabar El mismo nombre
engine.Writer.WriteBarcode(image, data, null) + codecs.Save(...) .SaveAsPng(path) Una cadena de métodos
new RasterImage(...) + new FillCommand(RasterColor.White).Run(image) (removed) Interno a IronBarcode

Problemas comunes de migración y soluciones

Problema 1: Referencias a archivos .LIC en CI/CD

LEADTOOLS: Los pipelines CI/CD que construyen o despliegan aplicaciones HERRAMIENTAS DE PLOMO deben aprovisionar el archivo .LIC — ya sea registrándolo en el control de código fuente, decodificándolo de un secreto base64, o montándolo como un artefacto de volumen. Cada etapa del proceso que ejecuta la aplicación necesita tener acceso al archivo.

Solución: Quite todo el manejo de archivos .LIC del pipeline. Reemplace con un secreto de cadena:

# Example: GitHub Actions environment variable
env:
  IRONBARCODE_LICENSE: ${{secrets.IRONBARCODE_LICENSE}}
# Example: GitHub Actions environment variable
env:
  IRONBARCODE_LICENSE: ${{secrets.IRONBARCODE_LICENSE}}
YAML

El valor de cadena se almacena en el almacén de secretos de CI/CD junto con otras credenciales de valor de cadena. No se requiere decodificación de archivos, aprovisionamiento de artefactos ni configuración de volumen.

Problema 2: Dependencia del entorno de ejecución de MSVC++ en Windows

LEADTOOLS: Las implementaciones de Windows Server requieren que el entorno de ejecución MSVC++ 2017 esté instalado en el host. Los scripts de aprovisionamiento, las imágenes base de contenedores y las AMI de Windows utilizadas para las implementaciones de HERRAMIENTAS DE PLOMO suelen incluir un paso para instalar este entorno de ejecución.

Solución: Elimine el paso de instalación de MSVC++ 2017 Runtime de todos los scripts de aprovisionamiento de Windows y las imágenes de contenedor. IronBarcode no tiene dependencias de tiempo de ejecución nativas. La imagen base dotnet/aspnet es suficiente sin paquetes adicionales de tiempo de ejecución.

Problema 3: Comprobaciones de bloqueo de características de RasterSupportType

LEADTOOLS: La secuencia de inicialización incluye controles de RasterSupport.IsLocked() para cada característica de código de barras — Barcodes1D, Barcodes2D, y BarcodeWrite. Estas comprobaciones son código de seguridad requerido por la arquitectura de HERRAMIENTAS DE PLOMO para verificar que el archivo de licencia cubra todas las funcionalidades necesarias.

Solución: Elimine todas las llamadas a RasterSupport.IsLocked(). IronBarcode incluye todas las funciones de lectura y escritura en una sola licencia. No existen estados de bloqueo por función y no se requiere ningún paso de verificación de funciones:

// Remove these lines entirely:
// if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite)) ...
// Remove these lines entirely:
// if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite)) ...
' Remove these lines entirely:
' If RasterSupport.IsLocked(RasterSupportType.Barcode1DRead) ...
' If RasterSupport.IsLocked(RasterSupportType.Barcode2DRead) ...
' If RasterSupport.IsLocked(RasterSupportType.BarcodeWrite) ...
$vbLabelText   $csharpLabel

Problema 4: Eliminación de la matriz de simbología de códigos de barras

LEADTOOLS: Cada llamada a engine.Reader.ReadBarcodes() requiere un parámetro explícito BarcodeSymbology[]. Los códigos de barras cuya simbología no esté incluida en la lista no serán detectados, lo que puede provocar lecturas fallidas silenciosas cuando se introduce un nuevo tipo de código de barras en un documento de entrada.

Solución: Eliminar la matriz de simbología. BarcodeReader.Read() detecta automáticamente todos los formatos compatibles. Si se necesita ajuste de rendimiento para un conjunto de formatos conocido, BarcodeReaderOptions proporciona sugerencias opcionales sin requerir enumeración exhaustiva:

// Optional: hint the reader for performance in format-known scenarios
var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("scan.png", options);
// Optional: hint the reader for performance in format-known scenarios
var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("scan.png", options);
Imports System

' Optional: hint the reader for performance in format-known scenarios
Dim options As New BarcodeReaderOptions With {
    .ExpectBarcodeTypes = BarcodeEncoding.Code128 Or BarcodeEncoding.QRCode
}
Dim results = BarcodeReader.Read("scan.png", options)
$vbLabelText   $csharpLabel

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

Tareas previas a la migración

Antes de realizar cualquier cambio, revise todo el uso de HERRAMIENTAS DE PLOMO en el código fuente:

grep -r "using Leadtools" --include="*.cs" .
grep -r "RasterSupport\|BarcodeEngine\|RasterCodecs" --include="*.cs" .
grep -r "BarcodeSymbology\|BarcodeData\|RasterImage" --include="*.cs" .
grep -r "LEADTOOLS.LIC\|SetLicense\|KernelExpired" --include="*.cs" .
grep -r "COPY LEADTOOLS.LIC\|LEADTOOLS_LICENSE_PATH" --include="*.dockerfile" --include="Dockerfile" .
grep -r "using Leadtools" --include="*.cs" .
grep -r "RasterSupport\|BarcodeEngine\|RasterCodecs" --include="*.cs" .
grep -r "BarcodeSymbology\|BarcodeData\|RasterImage" --include="*.cs" .
grep -r "LEADTOOLS.LIC\|SetLicense\|KernelExpired" --include="*.cs" .
grep -r "COPY LEADTOOLS.LIC\|LEADTOOLS_LICENSE_PATH" --include="*.dockerfile" --include="Dockerfile" .
SHELL

Documente la cantidad y la ubicación de los bloques de inicialización, los puntos de llamada de lectura, los puntos de llamada de escritura y las referencias al Dockerfile antes de comenzar a modificar el código.

Tareas de actualización de código

  1. Elimine los cinco paquetes NuGet de HERRAMIENTAS DE PLOMO (y el códec PDF, si está presente).
  2. Instale IronBarcode a través de dotnet add package IronBarcode
  3. Reemplace todas las importaciones de nombres de espacio using Leadtools.* con using IronBarCode
  4. Reemplace todo el bloque de inicialización RasterSupport.SetLicense con IronBarCode.License.LicenseKey = "key"
  5. Quite todos los controles RasterSupport.KernelExpired
  6. Quite todos los controles RasterSupport.IsLocked(RasterSupportType.*)
  7. Quite todas las instancias de new BarcodeEngine()
  8. Quite todas las instancias de new RasterCodecs() de las rutas de código de barras
  9. Replique codecs.Load(path) + engine.Reader.ReadBarcodes(image, ...) con BarcodeReader.Read(path)
  10. Reemplace new BarcodeData(...) + new RasterImage(...) + FillCommand + WriteBarcode + codecs.Save() con BarcodeWriter.CreateBarcode(...).SaveAsPng(path)
  11. Reemplace las referencias de enumeración BarcodeSymbology.* con BarcodeEncoding.* (nota: QR se convierte en QRCode)
  12. Elimine las líneas COPY LEADTOOLS.LIC de todos los Dockerfiles
  13. Elimine las declaraciones de variables de entorno LEADTOOLS_LICENSE_PATH y LEADTOOLS_DEVELOPER_KEY de Dockerfiles y configuración de despliegue
  14. Añada la variable de entorno IRONBARCODE_LICENSE a Dockerfiles y configuración de secretos
  15. Elimine la instalación de MSVC++ 2017 Runtime de los scripts de aprovisionamiento de Windows.

Pruebas posteriores a la migración

  • Verifique que todas las operaciones de lectura de códigos de barras devuelvan valores esperados en todos los tipos de simbología previamente cubiertos por el array BarcodeSymbology[]
  • Verifique que el código 128, el código QR y cualquier otro tipo de código de barras generado produzcan una salida válida y escaneable.
  • Confirme que la extracción de códigos de barras PDF funcione correctamente sin Leadtools.Pdf
  • Construya e inicie la imagen del contenedor sin montar ningún archivo .LIC y confirme que la aplicación se inicialice correctamente
  • Ejecute el pipeline CI/CD sin el paso de aprovisionamiento del archivo .LIC y confirme que todas las etapas se completen exitosamente
  • Verificar que el tamaño de salida publicado y el tiempo de descarga de la imagen del contenedor hayan mejorado.

Principales ventajas de migrar a IronBarcode

Arquitectura de despliegue simplificada: tras la migración, cada entorno (desarrollo, integración continua, pruebas, producción) recibe la licencia mediante el mismo mecanismo de secretos con valores de cadena que se utiliza para las claves de API, las contraseñas de bases de datos y otras credenciales. No se requiere aprovisionamiento de archivos, gestión de artefactos ni montaje de volúmenes. Agregar un nuevo entorno de despliegue es la misma operación que agregar cualquier otro secreto.

Superficie de dependencia reducida: un paquete NuGet reemplaza a cinco, y se elimina el requisito de MSVC++ 2017 Runtime. El tamaño de salida publicado por un servicio de códigos de barras se reduce de aproximadamente 148 MB a aproximadamente 39 MB. Las imágenes más pequeñas implican descargas de contenedores más rápidas, menores costes de almacenamiento en los registros de contenedores y tiempos de arranque en frío reducidos en entornos sin servidor y de escalado automático.

Inicio de la aplicación optimizado: La secuencia de inicialización de HERRAMIENTAS DE PLOMO de 20 líneas (resolución de la ruta del archivo, verificación de caducidad y tres comprobaciones de bloqueo por función) se reemplaza por una sola línea. El inicio de la aplicación es más rápido y la ruta del código de inicialización no tiene dependencias del sistema de archivos que puedan fallar en un nuevo entorno.

Detección integral de formatos: IronBarcode lee las más de 50 simbologías compatibles sin necesidad de que el usuario especifique los formatos esperados. El riesgo de lecturas silenciosas fallidas — causado por omitir una simbología de la matriz BarcodeSymbology[] de HERRAMIENTAS DE PLOMO — se elimina. Cuando aparece un nuevo tipo de código de barras en un documento de entrada, IronBarcode lo detecta sin necesidad de modificar el código.

Coste total predecible: La compra de una única licencia perpetua cubre el desarrollo, las pruebas y las implementaciones de producción ilimitadas, sin seguimiento de las implementaciones, sin necesidad de renovación anual y sin tener que obtener una licencia de producción por separado. Los equipos pueden confirmar el coste total de la biblioteca antes de comenzar el desarrollo, sin necesidad de una conversación de ventas.

Diseño moderno de la API: BarcodeReader.Read() y BarcodeWriter.CreateBarcode() son puntos de entrada estáticos que aceptan rutas de archivo directamente. La construcción de objetos multicapa que HERRAMIENTAS DE PLOMO requiere para leer y escribir (instancias de códec, instancias de motor, asignación de imágenes, relleno de fondo) se gestiona internamente. El código que lee y genera códigos de barras es más corto, más fácil de revisar y más fácil de probar.

Por favor notaLEADTOOLS es una marca registrada de su respectivo propietario. Este sitio no está afiliado, respaldado por, ni patrocinado por LEAD Technologies. 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 LEADTOOLS 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 LEADTOOLS 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 código cambia al migrar de LEADTOOLS 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 mantener instalados tanto LEADTOOLS Barcode 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 LEADTOOLS 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 después de migrar desde LEADTOOLS?

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 LEADTOOLS 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