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()
// 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")
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 | Sí |
| Extracción de códigos de barras PDF | Se requiere un paquete aparte | Incorporado en |
| Corrección de errores de aprendizaje automático | No | Sí |
| Logotipo de código QR para la marca | No | Sí |
| 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
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
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
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"
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
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
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
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")
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
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")
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
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
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}}
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) ...
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)
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" .
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
- Elimine los cinco paquetes NuGet de HERRAMIENTAS DE PLOMO (y el códec PDF, si está presente).
- Instale
IronBarcodea través dedotnet add package IronBarcode - Reemplace todas las importaciones de nombres de espacio
using Leadtools.*conusing IronBarCode - Reemplace todo el bloque de inicialización
RasterSupport.SetLicenseconIronBarCode.License.LicenseKey = "key" - Quite todos los controles
RasterSupport.KernelExpired - Quite todos los controles
RasterSupport.IsLocked(RasterSupportType.*) - Quite todas las instancias de
new BarcodeEngine() - Quite todas las instancias de
new RasterCodecs()de las rutas de código de barras - Replique
codecs.Load(path)+engine.Reader.ReadBarcodes(image, ...)conBarcodeReader.Read(path) - Reemplace
new BarcodeData(...)+new RasterImage(...)+FillCommand+WriteBarcode+codecs.Save()conBarcodeWriter.CreateBarcode(...).SaveAsPng(path) - Reemplace las referencias de enumeración
BarcodeSymbology.*conBarcodeEncoding.*(nota:QRse convierte enQRCode) - Elimine las líneas
COPY LEADTOOLS.LICde todos los Dockerfiles - Elimine las declaraciones de variables de entorno
LEADTOOLS_LICENSE_PATHyLEADTOOLS_DEVELOPER_KEYde Dockerfiles y configuración de despliegue - Añada la variable de entorno
IRONBARCODE_LICENSEa Dockerfiles y configuración de secretos - 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
.LICy confirme que la aplicación se inicialice correctamente - Ejecute el pipeline CI/CD sin el paso de aprovisionamiento del archivo
.LICy 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.
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.

