LEADTOOLS BarCode vs IronBarcode: Comparación de bibliotecas de códigos de barras C#
Para usar Código de barras de LEADTOOLS en Docker, debes montar un archivo de licencia en tu contenedor en una ruta específica. Ese archivo debe acompañar a cada despliegue. Las variables de entorno no son suficientes. Cada implementación de LEADTOOLS supone un problema de gestión de archivos.
Esto no es una crítica a la ingeniería de LEADTOOLS, sino que refleja una arquitectura de licencias de hace 30 años, diseñada antes de que existieran los contenedores. Pero en 2026, cuando su canalización de CI/CD necesita construir y enviar una imagen de contenedor, o bien está incrustando un archivo .LIC en la imagen o montándolo como un volumen en tiempo de ejecución. De cualquier manera, su biblioteca de código de barras requiere acceso al sistema de archivos antes de que se inicialice. Este es el compromiso subyacente que explora esta comparación.
Comprensión del código de barras de LEADTOOLS
LEADTOOLS Barcode forma parte del completo SDK de procesamiento de imágenes de documentos de LEAD Technologies, que se encuentra en continuo desarrollo desde 1990. El módulo de códigos de barras admite más de 40 simbologías y se integra perfectamente con el ecosistema LEADTOOLS para OCR, procesamiento de formularios, manipulación de PDF y visualización de imágenes. Esa integración del ecosistema resulta realmente valiosa cuando una aplicación requiere todas esas capacidades de un único proveedor. Cuando el requisito es el escaneo de códigos de barras en un microservicio independiente o una aplicación específica, la misma integración representa una sobrecarga que debe tenerse en cuenta en cada implementación.
La arquitectura de la biblioteca refleja su antigüedad. LEADTOOLS fue diseñado en una época de gestión explícita de recursos, configuración manual y licencias basadas en sistemas de archivos. Cada una de esas decisiones de diseño tenía sentido en su contexto. En el desarrollo moderno de .NET (cargas de trabajo en contenedores, canalizaciones de CI/CD, sistemas de gestión de secretos), esas mismas decisiones crean fricciones que los equipos deben sortear activamente.
La implementación de Código de barras de LEADTOOLS requiere como mínimo cinco paquetes NuGet . La extracción de códigos de barras PDF añade un sexto paquete. En Windows, el entorno de ejecución MSVC++ 2017 debe estar presente en el sistema. El archivo de salida publicado de una aplicación de códigos de barras LEADTOOLS ocupa aproximadamente 148 MB.
Características arquitectónicas clave del código de barras LEADTOOLS:
- Arquitectura de licencia basada en archivos: Requiere un archivo
.LICfísicamente presente en el disco en una ruta conocida, además de una cadena de clave de desarrollador. Ambos deben ser accesibles en tiempo de ejecución para que la biblioteca se inicialice. - Modelo de licencia de dos niveles: Las licencias de desarrollo y las licencias de implementación tienen precios y se obtienen por separado. Para obtener presupuestos de implementación en producción, es necesario contactar con el departamento de ventas de LEADTOOLS.
- Instalación multipaquete: Una instalación mínima compatible con código de barras requiere
Leadtools.Barcode,Leadtools,Leadtools.Codecs,Leadtools.Codecs.PngyLeadtools.Codecs.Jpeg. Cada formato de imagen adicional requiere su propio paquete de códecs. - Dependencia de tiempo de ejecución nativo: Las implementaciones en Windows requieren el entorno de ejecución MSVC++ 2017 además del entorno de ejecución .NET .
- Declaración explícita de simbología: La lectura de códigos de barras requiere pasar una matriz de valores
BarcodeSymbologyenum que especifiquen los formatos que se van a escanear. Los formatos omitidos no serán detectados. - Secuencia de Inicialización por Capas: Después de cargar el archivo de licencia, la aplicación debe verificar que la licencia no ha caducado y que cada característica requerida - lectura 1D, lectura 2D, escritura - está desbloqueada individualmente antes de crear un
BarcodeEngine. - Más de 40 simbologías compatibles: Amplia cobertura de formatos para códigos de barras 1D y 2D como parte de una plataforma de procesamiento de imágenes integral.
Arquitectura de licencias basada en archivos
La inicialización de LEADTOOLS requiere aproximadamente 20 líneas de código antes de que se pueda ejecutar la primera operación de código de barras. La secuencia abarca la resolución de rutas de archivo, la verificación de caducidad y la comprobación de bloqueos por función:
// LEADTOOLS: Más de 20 líneas before the first barcode operation
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: Más de 20 líneas before the first barcode operation
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
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()
Este bloque de inicialización debe ejecutarse correctamente antes de que pueda funcionar cualquier operación de lectura o escritura de códigos de barras. Si el archivo .LIC está ausente, la ruta es incorrecta, o los permisos del archivo son incorrectos, LEADTOOLS no se inicializará - no silenciosamente, sino con un error que detiene la operación.
Entendiendo IronBarcode
IronBarcode es una biblioteca de códigos de barras .NET especializada, diseñada específicamente para leer y generar códigos de barras en aplicaciones .NET . En lugar de ser un módulo dentro de un SDK de procesamiento de imágenes más amplio, IronBarcode aborda la funcionalidad de códigos de barras como su propósito principal. La biblioteca se distribuye como un único paquete NuGet que incluye compatibilidad con todos los formatos de imagen, extracción nativa de códigos de barras PDF y corrección de errores basada en aprendizaje automático, sin necesidad de paquetes de códecs adicionales ni dependencias de tiempo de ejecución nativas.
IronBarcode utiliza un diseño de API estática. Las operaciones de lectura y escritura están disponibles como llamadas a métodos estáticos en BarcodeReader y BarcodeWriter sin necesidad de crear instancias o inicializar objetos. La activación de la licencia es una asignación de cadena única. La biblioteca detecta automáticamente los formatos de código de barras en las más de 50 simbologías compatibles, lo que elimina la necesidad de enumerar los formatos esperados antes de cada operación de lectura.
La biblioteca está diseñada para .NET Standard 2.0y versiones posteriores, y ofrece compatibilidad con .NET Framework 4.6.2+, .NET 5, .NET 6, .NET 7, .NET 8 y .NET 9. No se requiere ningún entorno de ejecución nativo específico de la plataforma en ningún sistema operativo compatible.
Características clave de IronBarcode:
- Licencias mediante clave de cadena: La activación de la licencia requiere la asignación de una única cadena. La clave puede provenir de una variable de entorno, un archivo de configuración, un gestor de secretos o cualquier fuente que proporcione un valor de cadena.
- Single NuGet Package: Todo el soporte de formato de imagen, extracción de PDF y capacidades de código de barras están incluidos en
IronBarcode. No se requieren paquetes de códecs adicionales. - API Fluent estática:
BarcodeReader.Read()yBarcodeWriter.CreateBarcode()son puntos de entrada estáticos. No es necesario crear instancias de motor ni objetos de códec. - Detección automática de formato: lee las más de 50 simbologías compatibles sin necesidad de que el usuario especifique los formatos esperados.
- Compatibilidad integrada con PDF: La extracción de códigos de barras de PDF está incluida en el paquete básico sin necesidad de instalación adicional.
- Más de 50 simbologías compatibles: Cubre todos los formatos principales de códigos de barras 1D y 2D, incluidos Code 128, Code 39, QR Code, Data Matrix, PDF417, EAN-13 y UPC-A.
- Corrección de errores mediante aprendizaje automático: La corrección de imágenes basada en aprendizaje automático mejora la precisión de lectura en imágenes de códigos de barras dañadas o de baja calidad.
Comparación de características
La siguiente tabla destaca las diferencias fundamentales entre Código de barras de LEADTOOLS e IronBarcode:
| Característica | Código de barras de LEADTOOLS | IronBarcode |
|---|---|---|
| Modelo de licencia | Archivo + clave (dos niveles) | Solo clave (nivel único) |
| Huella del SDK | Más de 5 paquetes + entorno de ejecución nativo | 1 paquete |
| Código de inicialización | Más de 20 líneas | 1 línea |
| Despliegue de Docker | Se requiere montar el archivo | Variable de entorno |
| Extracción de códigos de barras PDF | Paquete separado | Incorporado en |
| Formato de detección automática | Limitado | Sí |
| Simbologías totales | Más de 40 años | Más de 50 |
| Corrección de errores de aprendizaje automático | No | Sí |
Comparación detallada de características
| Característica | Código de barras de LEADTOOLS | IronBarcode |
|---|---|---|
| Licencias | ||
| Modelo de licencia | Archivo + clave de desarrollador | Solo clave de cadena |
| Niveles de licencia | Desarrollo + Despliegue (por separado) | Licencia perpetua única |
| Precios de implementación | Contacto de ventas | Precios publicados |
| Licencia en variable de entorno | Parcial (solo la clave, el archivo aún es necesario) | Sí |
| Licencia en el gestor de secretos | El archivo aún es necesario | Sí (solo cadena de texto) |
| Instalación | ||
| Se requieren paquetes NuGet | 5+ | 1 |
| dependencia de tiempo de ejecución nativa | MSVC++ 2017 (Windows) | Ninguno |
| paquete de soporte PDF | Separado (Leadtools.Codecs.Pdf) |
Se incluye |
| Tamaño de salida publicado | ~148 MB | ~39 MB |
| Lectura | ||
| simbologías 1D | Más de 25 años | 30+ |
| Simbologías 2D | 15+ | 15+ |
| Formato de detección automática | Limitado | Sí |
| Se requiere una declaración explícita de la simbología. | Sí | No |
| Extracción de códigos de barras PDF | Sí (paquete aparte) | Sí (integrado) |
| Corrección de errores de aprendizaje automático | No | Sí |
| Detección de múltiples códigos de barras | Sí | Sí |
| Generación | ||
| Generación del código 128 | Sí | Sí |
| Generación de código QR | Sí | Sí |
| Logotipo de código QR para la marca | No | Sí |
| API de generación fluida | No | Sí |
| Formatos de salida | PNG, JPEG, BMP | PNG, JPEG, BMP, SVG, HTML, PDF |
| Diseño de API | ||
| Estilo API | Grafo de objetos heredado | Flujo estático |
| Líneas de inicialización | Más de 20 años | 1 |
| capa de carga de imágenes | Códecs ráster (por separado) | Automático |
| Plataforma | ||
| Plataforma cruzada | Parcial (dependencias nativas) | Completo (.NET Standard) |
| Compatibilidad con Docker/contenedores | Se requiere montar el archivo | Variable de entorno |
| .NET Standard 2.0 | Sí | Sí |
| .NET 8 / .NET 9 | Sí | Sí |
Arquitectura de licencias
La arquitectura de licencias es la diferencia más importante entre estas dos bibliotecas para los equipos que implementan soluciones en infraestructuras modernas.
Enfoque de LEADTOOLS
La licencia de LEADTOOLS requiere un archivo .LIC físicamente presente en el sistema de archivos en una ruta conocida, además de una cadena de clave de desarrollador pasada a RasterSupport.SetLicense. Después de llamar a SetLicense, la aplicación debe verificar que la licencia no ha caducado y que cada función del código de barras está desbloqueada individualmente. Sólo después de pasar todas las comprobaciones podrá crearse un BarcodeEngine:
// LEADTOOLS: Más de 20 líneas before the first barcode operation
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: Más de 20 líneas before the first barcode operation
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
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()
Este modelo basado en archivos es anterior a los sistemas modernos de gestión de secretos. El archivo .LIC debe estar disponible en todos los entornos en los que se ejecute la aplicación: máquinas de desarrolladores, agentes de compilación CI, servidores de preparación y hosts de producción.
Enfoque IronBarcode
La inicialización de la licencia de IronBarcode es una sola línea:
// IronBarcode: done
IronBarCode.License.LicenseKey = "YOUR-KEY";
// IronBarcode: done
IronBarCode.License.LicenseKey = "YOUR-KEY";
Esa clave puede provenir de una variable de entorno, un archivo de configuración o un gestor de secretos; en definitiva, de cualquier lugar de donde pueda provenir una cadena de texto. No hay ningún archivo que localizar, ninguna comprobación de caducidad que escribir y ningún bloqueo de función que verificar. Para configuración de licencias y opciones de despliegue, la documentación cubre todos los patrones: variables de entorno, appsettings.json, Azure Key Vault, y más.
Implementación de contenedores y Docker
La diferencia en la arquitectura de la licencia se hace evidente al escribir un Dockerfile.
Enfoque de LEADTOOLS
El despliegue de LEADTOOLS en Docker requiere copiar el archivo .LIC en la imagen del contenedor o montarlo como un volumen en tiempo de ejecución:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY publish/ .
# The license file must be physically present in the container
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"]
Este enfoque conlleva complicaciones posteriores. Para rotar o revocar una clave de licencia, es necesario reconstruir la imagen o volver a montar el volumen. El proceso CI/CD debe comprobar el archivo .LIC o descodificarlo a partir de un secreto codificado en base64 en el momento de la compilación. Los secretos de Kubernetes diseñados para pares de cadenas clave-valor ahora deben almacenar el contenido de los archivos. Los equipos que utilizan contenedores efímeros deben resolver el problema del aprovisionamiento de archivos en cada nuevo nodo.
Enfoque IronBarcode
IronBarcode no requiere ningún archivo en el contenedor:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY publish/ .
ENV IRONBARCODE_LICENSE=your-license-key
ENTRYPOINT ["dotnet", "YourApp.dll"]
El modelo de variables de entorno funciona de forma nativa con secretos de Docker, secretos de Kubernetes, AWS Secrets Manager, Azure Key Vault y HashiCorp Vault; es decir, con cualquier sistema que pueda inyectar una cadena en el entorno de un contenedor. Existe una guía completa de implementación de Docker y Linux que abarca tanto las imágenes base de Alpine como las de Debian.
Lectura de códigos de barras
Enfoque de LEADTOOLS
La lectura de LEADTOOLS requiere la creación de una instancia RasterCodecs para cargar la imagen, una instancia BarcodeEngine para escanearla y una matriz explícita de valores BarcodeSymbology que especifiquen qué formatos buscar. Si se omite una simbología de la matriz, LEADTOOLS no detectará códigos de barras de ese tipo:
// LEADTOOLS: codec, engine, explicit symbology list
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
using var codecs = new RasterCodecs();
using var image = codecs.Load(imagePath);
var engine = new BarcodeEngine();
var symbologies = new[]
{
BarcodeSymbology.Code128,
BarcodeSymbology.QR,
BarcodeSymbology.DataMatrix,
BarcodeSymbology.EAN13,
BarcodeSymbology.UPCA
};
var barcodes = engine.Reader.ReadBarcodes(
image,
LogicalRectangle.Empty,
0,
symbologies);
return barcodes.Select(b => b.Value).ToArray();
// LEADTOOLS: codec, engine, explicit symbology list
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
using var codecs = new RasterCodecs();
using var image = codecs.Load(imagePath);
var engine = new BarcodeEngine();
var symbologies = new[]
{
BarcodeSymbology.Code128,
BarcodeSymbology.QR,
BarcodeSymbology.DataMatrix,
BarcodeSymbology.EAN13,
BarcodeSymbology.UPCA
};
var barcodes = engine.Reader.ReadBarcodes(
image,
LogicalRectangle.Empty,
0,
symbologies);
return barcodes.Select(b => b.Value).ToArray();
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs
Dim barcodes As IEnumerable(Of BarcodeData)
Using codecs As New RasterCodecs()
Using image As RasterImage = codecs.Load(imagePath)
Dim engine As New BarcodeEngine()
Dim symbologies As BarcodeSymbology() = {
BarcodeSymbology.Code128,
BarcodeSymbology.QR,
BarcodeSymbology.DataMatrix,
BarcodeSymbology.EAN13,
BarcodeSymbology.UPCA
}
barcodes = engine.Reader.ReadBarcodes(
image,
LogicalRectangle.Empty,
0,
symbologies)
End Using
End Using
Return barcodes.Select(Function(b) b.Value).ToArray()
Enfoque IronBarcode
IronBarcode detecta automáticamente los formatos en las más de 50 simbologías compatibles. La ruta del archivo se pasa directamente; No se requiere ninguna capa de carga de imágenes ni matriz de simbología:
// IronBarcode: auto-detect, no object setup
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value).ToArray();
// IronBarcode: auto-detect, no object setup
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value).ToArray();
Imports IronBarCode
Dim results = BarcodeReader.Read(imagePath)
Return results.Select(Function(r) r.Value).ToArray()
Para obtener más detalles sobre las opciones de lectura, el ajuste de la velocidad frente a la precisión y el manejo de imágenes difíciles, la guía de lectura de códigos de barras a partir de imágenes cubre toda la superficie de la API.
Generación de códigos de barras
Enfoque de LEADTOOLS
La generación de códigos de barras LEADTOOLS requiere crear un objeto BarcodeData con simbología, valor y límites - luego crear un RasterImage en blanco con dimensiones de píxel explícitas, profundidad de bits, orden de bytes y perspectiva de vista - luego rellenarlo con un fondo blanco usando FillCommand - luego llamar a engine.Writer.WriteBarcode() - luego guardar con RasterCodecs. Se trata de cinco operaciones distintas que abarcan múltiples tipos de objetos:
// LEADTOOLS: 5 operations, Más de 25 años lines
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
var engine = new BarcodeEngine();
var barcodeData = new BarcodeData(BarcodeSymbology.Code128)
{
Value = data,
Bounds = new LeadRect(0, 0, 400, 100)
};
using var image = new RasterImage(
RasterMemoryFlags.Conventional,
400, 100, 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, outputPath, RasterImageFormat.Png, 0);
// LEADTOOLS: 5 operations, Más de 25 años lines
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
var engine = new BarcodeEngine();
var barcodeData = new BarcodeData(BarcodeSymbology.Code128)
{
Value = data,
Bounds = new LeadRect(0, 0, 400, 100)
};
using var image = new RasterImage(
RasterMemoryFlags.Conventional,
400, 100, 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, outputPath, RasterImageFormat.Png, 0);
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs
Dim engine As New BarcodeEngine()
Dim barcodeData As New BarcodeData(BarcodeSymbology.Code128) With {
.Value = data,
.Bounds = New LeadRect(0, 0, 400, 100)
}
Using image As New RasterImage(
RasterMemoryFlags.Conventional,
400, 100, 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, outputPath, RasterImageFormat.Png, 0)
End Using
End Using
Enfoque IronBarcode
IronBarcode gestiona internamente la creación de imágenes, el relleno de fondo y la codificación:
// IronBarcode: one method chain
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng(outputPath);
// IronBarcode: one method chain
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng(outputPath);
Imports IronBarcode
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng(outputPath)
Para crear imágenes de códigos de barras , la API de IronBarcode expone el estilo, los márgenes, la rotación y la conversión de formato a través de una cadena fluida en lugar de una serie de objetos de configuración imperativos.
Referencia de mapeo de API
| Código de barras de LEADTOOLS | 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, rect, 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(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 |
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 |
Cuando los equipos consideran pasar de Código de barras de LEADTOOLS a IronBarcode
Implementación en contenedores y en la nube
Los equipos que migran cargas de trabajo a Docker, Kubernetes o entornos sin servidor se topan con el modelo de licencias basado en archivos como un problema operativo concreto. Cada nueva instancia de contenedor, cada nueva región de nube y cada nuevo entorno deben tener el archivo .LIC aprovisionado y accesible antes de que se inicie la aplicación. Los sistemas de gestión de secretos diseñados para secretos con valores de cadena no admiten correctamente los artefactos basados en archivos. Los equipos que han estandarizado la inyección de variables de entorno para la configuración descubren que LEADTOOLS requiere un paso de aprovisionamiento independiente que existe fuera de su flujo de trabajo habitual de secretos. Cuando aumenta el volumen de implementaciones (escalado automático, implementación azul-verde, replicación multirregión), el coste operativo del aprovisionamiento de archivos aumenta en consecuencia.
Gestión de dependencias y huella del SDK
Cuando la lectura o generación de códigos de barras es el requisito principal o único de un servicio, la instalación de LEADTOOLS, que consta de cinco paquetes, y la dependencia de MSVC++ 2017 Runtime representan una sobrecarga que afecta al tamaño de la imagen del contenedor, la latencia de arranque en frío en las funciones sin servidor y los tiempos de compilación en las canalizaciones de CI/CD. Los equipos que desarrollan microservicios ligeros o funciones de estilo Lambda descubren que incorporar un SDK de procesamiento de imágenes completo para abordar una necesidad específica de códigos de barras crea una superficie de dependencia difícil de justificar en las revisiones de código y de arquitectura. Cuando una futura actualización de la plataforma requiera probar un cambio en una dependencia de tiempo de ejecución nativa, ese trabajo recae en el equipo que mantiene el servicio.
Transparencia en los precios
Los equipos de desarrollo que necesitan presupuestar un proyecto antes de comenzar el desarrollo no pueden obtener una imagen completa de los costos a partir de los precios publicados por LEADTOOLS. Las licencias de desarrollo tienen un precio de entre 1295 y 1469 dólares por desarrollador al año, pero las licencias de implementación en producción para aplicaciones de servidor se cotizan por separado a través del departamento de ventas. Un equipo de cinco desarrolladores que realiza envíos a tres servidores de producción debe obtener un presupuesto personalizado antes de poder confirmar que LEADTOOLS se ajusta a su presupuesto. Los equipos que prefieren tomar decisiones de compra basándose en los precios publicados —comparando opciones, obteniendo aprobación interna o planificando presupuestos plurianuales— descubren que este modelo requiere una conversación con el departamento de ventas antes de que se complete la evaluación.
Requisitos que solo admiten códigos de barras
Las aplicaciones que necesitan leer o generar códigos de barras sin requerir OCR, imágenes DICOM, anotación de documentos u otras capacidades del Suite LEADTOOLS están pagando por una plataforma más amplia de lo que exigen sus necesidades. El valor de integración de LEADTOOLS —la capacidad de transferir datos entre sus módulos de OCR, códigos de barras y procesamiento de documentos— es real, pero solo se aplica cuando se utilizan activamente varias funcionalidades de ese Suite . Cuando el requisito se limita al escaneo de códigos de barras en una API web o a su generación en un proceso de procesamiento de documentos, una biblioteca de códigos de barras específica satisface el requisito directamente sin tener que asumir la complejidad de una plataforma de imágenes integral.
Consideraciones comunes sobre la migración
Reemplazo de inicialización de licencia
Todo el bloque de inicialización de LEADTOOLS (ruta de archivo, comprobación de caducidad y verificación de bloqueo por función) se reemplaza por una sola línea. La clave de licencia de IronBarcode se puede almacenar en cualquier sistema de gestión de secretos que almacene cadenas de caracteres.
// Replace the entire LEADTOOLS initialization block with:
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
// Replace the entire LEADTOOLS initialization block with:
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
' Replace the entire LEADTOOLS initialization block with:
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
Patrón de variable de entorno de Docker
La línea COPY LEADTOOLS.LIC en cualquier archivo Dockerfile se elimina por completo. La licencia se proporciona a través de una variable de entorno en tiempo de ejecución, que funciona con todos los mecanismos estándar de inyección de secretos:
# Remove: COPY LEADTOOLS.LIC /app/license/LEADTOOLS.LIC
# Remove: ENV LEADTOOLS_LICENSE_PATH=/app/license/LEADTOOLS.LIC
# Add:
ENV IRONBARCODE_LICENSE=your-license-key
Retirada de paquetes
Los cinco paquetes LEADTOOLS —y el códec PDF opcional— se eliminan y se reemplazan por un único paquete:
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
# If added:
dotnet remove package Leadtools.Codecs.Pdf
dotnet add package IronBarcode
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
# If added:
dotnet remove package Leadtools.Codecs.Pdf
dotnet add package IronBarcode
Funcionalidades adicionales de IronBarcode
Además de las capacidades descritas en las secciones anteriores, IronBarcode ofrece las siguientes características relevantes para los escenarios comunes de códigos de barras en .NET :
- Extracción de códigos de barras de PDF: Lee códigos de barras de documentos PDF de varias páginas con iteración automática de páginas e informes
PageNumberde cada resultado, sin necesidad de bucles de páginas. - Corrección de errores basada en aprendizaje automático : El preprocesamiento de imágenes mediante aprendizaje automático mejora la precisión de lectura en imágenes de códigos de barras dañadas, de bajo contraste o rotadas sin necesidad de configuración adicional.
- Procesamiento por lotes asíncrono:
BarcodeReader.ReadAsync()admite la lectura asíncrona, lo que permite un procesamiento por lotes de alto rendimiento sin hilos de bloqueo. - QR Code Logo Branding:
QRCodeWriterpermite incrustar una imagen de logotipo en el centro de un código QR con una sola llamada a un método, utilizando la corrección de errores integrada para mantener la capacidad de escaneo. - Salida SVG y HTML:
BarcodeWriterpuede dar salida a los códigos de barras generados como archivos SVG escalables o como elementos HTML en línea, además de formatos de imagen de trama. - Ajuste de BarcodeReaderOptions : La velocidad de lectura, las sugerencias de simbología esperadas, la detección de múltiples códigos de barras y el preprocesamiento de imágenes se pueden configurar por lectura sin afectar el estado global.
Compatibilidad con .NET y preparación para el futuro
IronBarcode está diseñado para .NET Standard 2.0, lo que proporciona compatibilidad con .NET Framework 4.6.2 y versiones posteriores, .NET 5, .NET 6, .NET 7, .NET 8 y .NET 9. La biblioteca no tiene requisitos de tiempo de ejecución nativos específicos de la plataforma, lo que permite su implementación en Windows, Linux y macOS sin pasos de aprovisionamiento adicionales. A medida que la adopción de .NET 10 avance hasta 2026, el ritmo de lanzamientos regulares de IronBarcode garantiza la compatibilidad con las versiones actuales y futuras de .NET . El diseño de la API estática y el modelo de distribución de paquete único se mantienen estables entre versiones, por lo que las actualizaciones de versión no requieren cambios en el código de inicialización de la aplicación ni en la configuración de implementación.
Conclusión
LEADTOOLS Barcode e IronBarcode representan diferentes puntos en el espacio de diseño para las bibliotecas de códigos de barras .NET . LEADTOOLS es un módulo dentro de un SDK de procesamiento de imágenes integral con 30 años de antigüedad, que presenta una arquitectura de licencias basada en archivos, una instalación de múltiples paquetes y un diseño de API heredado que refleja las normas de ingeniería de la época en la que fue creado. IronBarcode es una biblioteca de códigos de barras diseñada específicamente para .NET moderno, con una instalación de paquete único, licencia por clave de cadena y una API estática que no requiere objetos de inicialización.
LEADTOOLS Barcode es la opción adecuada cuando una aplicación ya utiliza LEADTOOLS para otras funciones, como OCR, imágenes DICOM, anotación de documentos o reconocimiento de formularios. En estos contextos, añadir la funcionalidad de códigos de barras mediante el mismo SDK permite ampliar una inversión existente sin necesidad de un nuevo proveedor ni de una nueva relación de licencias. Las organizaciones con acuerdos Enterprise LEADTOOLS vigentes pueden encontrar funcionalidades de códigos de barras disponibles a un coste marginal bajo. Para las aplicaciones que realmente necesitan la amplitud de la plataforma de imágenes LEADTOOLS, el valor de la integración entre módulos es innegable.
IronBarcode es la opción adecuada cuando la lectura o generación de códigos de barras es el requisito principal o único de un servicio, cuando la aplicación se implementa en contenedores o infraestructura nativa de la nube, o cuando el equipo necesita precios predecibles antes de comenzar el desarrollo. El modelo de licenciamiento mediante instalación de paquete único y variables de entorno se ajusta a la forma en que se configuran, implementan y escalan los servicios .NET modernos. La API estática fluida reduce el código de inicialización y operación que requiere la funcionalidad de códigos de barras.
La diferencia práctica entre ambas bibliotecas se hace más evidente en los escenarios de implementación. Cuando un equipo agrega un nuevo entorno, migra a una nueva región en la nube o rota una credencial de licencia, IronBarcode requiere actualizar una cadena en un administrador de secretos. LEADTOOLS requiere el aprovisionamiento de un archivo. Esta distinción no es una crítica a la ingeniería de LEADTOOLS, sino una descripción de los requisitos de cada arquitectura. Los equipos que realicen una evaluación honesta deberían aplicar esa descripción directamente a su modelo de implementación y decidir cuál se ajusta mejor a sus necesidades.
Preguntas Frecuentes
¿Qué es LEADTOOLS BarCode?
LEADTOOLS Barcode es una biblioteca de códigos de barras .NET para generar y leer códigos de barras en aplicaciones C#. Es una de las varias alternativas que los desarrolladores evalúan cuando seleccionan una solución de código de barras para proyectos .NET.
¿Cuáles son las principales diferencias entre LEADTOOLS Barcode e IronBarcode?
IronBarcode utiliza una API estática y sin estado que no requiere gestión de instancias, mientras que LEADTOOLS Barcode suele requerir la creación y configuración de instancias antes de su uso. IronBarcode también ofrece compatibilidad nativa con PDF, detección automática de formato y licencia de clave única en todos los entornos.
¿Es IronBarcode más fácil de licenciar que LEADTOOLS BarCode?
IronBarcode utiliza una única clave de licencia que cubre tanto el desarrollo como los despliegues de producción. Esto simplifica las canalizaciones de CI/CD y las configuraciones de Docker en comparación con los sistemas de licencias que separan las claves de SDK de las claves de tiempo de ejecución.
¿Soporta IronBarcode todos los formatos de código de barras que soporta LEADTOOLS Barcode?
IronBarcode es compatible con más de 30 simbologías de códigos de barras, incluidos QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 y muchos más. La autodetección de formatos significa que no se requiere una enumeración explícita de formatos.
¿Es IronBarcode compatible con la lectura nativa de códigos de barras en PDF?
Sí. IronBarcode lee códigos de barras directamente desde archivos PDF utilizando BarcodeReader.Read("document.pdf") sin necesidad de una biblioteca de renderizado de PDF independiente. Los resultados por página incluyen el número de página, el formato del código de barras, el valor y la puntuación de confianza.
¿Cómo gestiona IronBarcode el procesamiento por lotes en comparación con LEADTOOLS Barcode?
Los métodos estáticos de IronBarcode no tienen estado y son naturalmente seguros para subprocesos, lo que permite el uso directo de Parallel.ForEach sin gestión de instancias por subproceso. No hay límite de rendimiento en ningún nivel de precios.
¿Qué versiones de .NET admite IronBarcode ?
IronBarcode es compatible con .NET Framework 4.6.2+, .NET Core 3.1 y .NET 5, 6, 7, 8 y 9 en un único paquete NuGet. Las plataformas de destino incluyen Windows x64/x86, Linux x64 y macOS x64/ARM.
¿Cómo instalo IronBarcode en un proyecto .NET?
Instale IronBarcode a través de NuGet: ejecute 'Install-Package IronBarCode' en la consola del gestor de paquetes, o 'dotnet add package IronBarCode' en la CLI. No se necesitan instaladores SDK ni archivos de ejecución adicionales.
¿Puedo evaluar IronBarcode antes de comprarlo, a diferencia de LEADTOOLS?
Sí. El modo de prueba de IronBarcode devuelve los valores completos de los códigos de barras descodificados; sólo las imágenes de salida generadas reciben una marca de agua. Puede comprobar la precisión de la lectura en sus propios documentos antes de comprometerse con la compra.
¿Cuál es la diferencia de precio entre LEADTOOLS Barcode e IronBarcode?
IronBarcode cuesta a partir de 749 dólares por una licencia perpetua de desarrollador único que cubre el desarrollo y la producción. Los detalles de precios y opciones de volumen están disponibles en la página de licencias de IronBarcode. No se requiere una licencia de ejecución por separado.
¿Es fácil migrar de LEADTOOLS Barcode a IronBarcode?
La migración de LEADTOOLS Barcode a IronBarcode implica principalmente la sustitución de las llamadas a la API basadas en instancias por los métodos estáticos de IronBarcode, la eliminación de la repetición de licencias y la actualización de los nombres de las propiedades de los resultados. La mayoría de las migraciones implican reducir código en lugar de añadirlo.
¿IronBarcode genera códigos QR con logotipos?
Sí. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") incrusta una imagen de marca en un código QR de forma nativa con corrección de errores configurable. Los códigos QR coloreados también son compatibles con ChangeBarCodeColor().

