Cómo Usar un Escáner de Códigos de Barras en Blazor | IronBarcode
Migrating from Spire.Barcode to IronBarcode
El BarcodeScanner.Scan() de Spire.Barcode requiere un argumento BarCodeType en cada llamada. A medida que el código fuente crece para gestionar diversas fuentes de documentos, nuevas etiquetas de proveedores y nuevos formatos de códigos de barras, este diseño genera bucles de adivinación de tipos que acumulan costes de mantenimiento con el tiempo. Esta guía abarca el proceso completo de transición de Spire.Barcode a IronBarcode: los motivos por los que los equipos realizan esta transición, los pasos necesarios para llevarla a cabo y los patrones de código anteriores y posteriores para cada operación común.
¿Por qué migrar desde Spire.Barcode?
Especificación de formato como sobrecarga: Cada llamada a BarcodeScanner.Scan() en Spire.Barcode requiere un valor de enumeración BarCodeType que el código llamante debe proporcionar. Las aplicaciones que procesan códigos de barras procedentes de fuentes desconocidas o de formato mixto deben mantener una lista de posibles tipos y recorrerla iterativamente hasta encontrar una coincidencia. Cada formato que se añade al flujo de trabajo requiere actualizar la matriz de candidatos, volver a probar la lógica de detección y confirmar que el orden de iteración no provoque que un formato oculte a otro. Estos costes generales aumentan en proporción a la diversidad de formatos.
Restricciones de evaluación de la versión gratuita: FreeSpire.Barcode degrada intencionadamente el rendimiento de lectura y limita el conjunto de simbología disponible en comparación con el producto comercial. Las pruebas de rendimiento y de cobertura de formato realizadas durante una evaluación de FreeSpire.Barcode no representan el comportamiento comercial de Spire.Barcode. Los equipos que se comprometen a realizar una compra basándose en una evaluación gratuita de la versión de prueba pueden descubrir, después de la compra, que el producto se comporta de manera diferente en producción, especialmente en lo que respecta al rendimiento y las simbologías compatibles.
PDF que requiere dos bibliotecas: Spire.Barcode no puede leer códigos de barras directamente desde archivos PDF. Los flujos de trabajo basados en PDF requieren el paquete Spire.PDF separado con su propia licencia, además de código escrito por el desarrollador para iterar páginas, extraer imágenes de cada página y enviar esas imágenes al escáner de código de barras. Una tarea que conceptualmente pertenece a la lectura de códigos de barras se divide entre dos productos, dos acuerdos de licencia y una cantidad significativa de código de infraestructura.
Complejidad del tipo de retorno: BarcodeScanner.Scan() devuelve string[], que contiene solo valores decodificados. El formato de código de barras detectado no se incluye en la devolución. Las aplicaciones que necesitan enrutar los resultados por formato —por ejemplo, enviar valores de códigos QR a un procesador y valores Code128 a otro— deben mantener una variable de tipo separada derivada del paso de iteración que produjo el resultado, lo que crea una gestión de estado adicional más allá del escaneo en sí.
El problema fundamental
El bucle de adivinanza de tipo es el síntoma más visible de la restricción mandatoria BarCodeType. En un código fuente de Spire.Barcode que procesa documentos de múltiples fuentes, este patrón aparece repetidamente:
// Spire.Barcode: growing candidate loop with silent misses
BarcodeScanner scanner = new BarcodeScanner();
var candidates = new[] { BarCodeType.Code128, BarCodeType.QRCode, BarCodeType.DataMatrix, BarCodeType.EAN13, BarCodeType.PDF417 };
string foundValue = null;
foreach (var type in candidates)
{
string[] found = scanner.Scan("barcode.png", type);
if (found.Length > 0)
{
foundValue = found[0];
break;
}
}
// Spire.Barcode: growing candidate loop with silent misses
BarcodeScanner scanner = new BarcodeScanner();
var candidates = new[] { BarCodeType.Code128, BarCodeType.QRCode, BarCodeType.DataMatrix, BarCodeType.EAN13, BarCodeType.PDF417 };
string foundValue = null;
foreach (var type in candidates)
{
string[] found = scanner.Scan("barcode.png", type);
if (found.Length > 0)
{
foundValue = found[0];
break;
}
}
Imports Spire.Barcode
Dim scanner As New BarcodeScanner()
Dim candidates = {BarCodeType.Code128, BarCodeType.QRCode, BarCodeType.DataMatrix, BarCodeType.EAN13, BarCodeType.PDF417}
Dim foundValue As String = Nothing
For Each type In candidates
Dim found As String() = scanner.Scan("barcode.png", type)
If found.Length > 0 Then
foundValue = found(0)
Exit For
End If
Next
IronBarcode elimina el bucle por completo. La detección de formato está integrada en la biblioteca:
// IronBarcode: single call, all formats, type included in result
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
Console.WriteLine($"{result.Format}: {result.Value}");
}
// IronBarcode: single call, all formats, type included in result
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
Console.WriteLine($"{result.Format}: {result.Value}");
}
Imports IronBarcode
' IronBarcode: single call, all formats, type included in result
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
IronBarcode vs Spire.Barcode: Comparación de características
| Característica | Spire.Barcode | IronBarcode |
|---|---|---|
| Detección automática de formato | No | Sí |
| Se requiere el parámetro BarCodeType | Sí | No |
| Formatear metadatos en el resultado | No | Sí |
| Lectura nativa de PDF | No (requiere Spire.PDF) | Sí |
| Biblioteca adicional para PDF | Spire.PDF (licencia aparte) | None |
| Rendimiento de lectura del nivel gratuito | Degradado intencionalmente | A toda velocidad |
| marcas de agua de nivel gratuito | Grande, cubre el código de barras | Pequeño, solo borde |
| Simbologías de niveles gratuitos | ~20 tipos | Más de 50 tipos |
| Registro para el nivel gratuito | Sí | No |
| Modelo API de generación | Objeto de configuración + generador | Fábrica estática con cadena fluida |
| Código QR con logotipo personalizado | Solo para el nivel comercial | Todos los niveles |
| Tipo de retorno de lectura | string[] |
BarcodeResults (con metadatos de tipo) |
| Recuento de simbología | 39+ (comercial) | Más de 50 |
| Modelo de licencia | Licencia perpetua por usuario + suscripción | Perpetuo con renovación opcional |
Inicio rápido
Paso 1: Sustituir el paquete NuGet
Elimine el paquete o los paquetes de Spire que esté utilizando actualmente:
# Remove whichever variant is installed
dotnet remove package FreeSpire.Barcode
# or
dotnet remove package Spire.Barcode
# If Spire.PDF was installed only for barcode extraction, remove it as well
dotnet remove package Spire.PDF
# Remove whichever variant is installed
dotnet remove package FreeSpire.Barcode
# or
dotnet remove package Spire.Barcode
# If Spire.PDF was installed only for barcode extraction, remove it as well
dotnet remove package Spire.PDF
Si Spire.PDF se utiliza para otras operaciones con documentos más allá de la extracción de código de barras, manténgalo y elimine solo las rutas de código relacionadas con códigos de barras.
Instalar IronBarcode:
dotnet add package IronBarcode
dotnet add package IronBarcode
Paso 2: Actualizar los espacios de nombres
Reemplace todas las importaciones del espacio de nombres de Spire con el espacio de nombres de IronBarcode:
// Remove:
using Spire.Barcode;
using Spire.Pdf;
// Add:
using IronBarCode;
// Remove:
using Spire.Barcode;
using Spire.Pdf;
// Add:
using IronBarCode;
Imports IronBarCode
Paso 3: Inicializar licencia
Sustituya la inicialización de la licencia de Spire por una única asignación de propiedad de IronBarcode al iniciar la aplicación. Consulte la página de licencias de IronBarcode para obtener información sobre los formatos clave y las opciones de implementación.
// Remove (FreeSpire registration):
Spire.Barcode.BarcodeSettings.ApplyKey("your-free-key");
// Remove (commercial Spire license):
Spire.License.LicenseProvider.SetLicenseKey("your-commercial-key");
// Add (IronBarcode):
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Remove (FreeSpire registration):
Spire.Barcode.BarcodeSettings.ApplyKey("your-free-key");
// Remove (commercial Spire license):
Spire.License.LicenseProvider.SetLicenseKey("your-commercial-key");
// Add (IronBarcode):
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Remove (FreeSpire registration):
Spire.Barcode.BarcodeSettings.ApplyKey("your-free-key")
' Remove (commercial Spire license):
Spire.License.LicenseProvider.SetLicenseKey("your-commercial-key")
' Add (IronBarcode):
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Para entornos Docker y CI, la clave de licencia se puede proporcionar desde una variable de entorno:
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
Imports System
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
Ejemplos de migración de código
Lectura de un código de barras de formato conocido
Una lectura de formato único en Spire.Barcode pasa explícitamente el tipo y recibe un string[].
Enfoque Spire.Barcode:
using Spire.Barcode;
BarcodeScanner scanner = new BarcodeScanner();
string[] results = scanner.Scan("shipping-label.png", BarCodeType.Code128);
if (results.Length > 0)
{
ProcessShipment(results[0]);
}
using Spire.Barcode;
BarcodeScanner scanner = new BarcodeScanner();
string[] results = scanner.Scan("shipping-label.png", BarCodeType.Code128);
if (results.Length > 0)
{
ProcessShipment(results[0]);
}
Imports Spire.Barcode
Dim scanner As New BarcodeScanner()
Dim results As String() = scanner.Scan("shipping-label.png", BarCodeType.Code128)
If results.Length > 0 Then
ProcessShipment(results(0))
End If
Enfoque de IronBarcode :
using IronBarCode;
var results = BarcodeReader.Read("shipping-label.png");
if (results.Any())
{
ProcessShipment(results.First().Value);
}
using IronBarCode;
var results = BarcodeReader.Read("shipping-label.png");
if (results.Any())
{
ProcessShipment(results.First().Value);
}
Imports IronBarCode
Dim results = BarcodeReader.Read("shipping-label.png")
If results.Any() Then
ProcessShipment(results.First().Value)
End If
Se elimina el parámetro BarCodeType. Si la lógica adicional necesita confirmar el formato detectado, results.First().Format lo proporciona sin requerir una variable de estado separada.
Colapsar un bucle de tipo de formato mixto
Cuando un código fuente de Spire.Barcode gestiona documentos que pueden contener varios formatos, el bucle de adivinación de tipos se acumula con el tiempo a medida que nuevos formatos entran en el flujo de trabajo.
Enfoque Spire.Barcode:
using Spire.Barcode;
BarcodeScanner scanner = new BarcodeScanner();
BarCodeType[] candidates = new[]
{
BarCodeType.Code128,
BarCodeType.QRCode,
BarCodeType.DataMatrix,
BarCodeType.EAN13,
BarCodeType.PDF417
};
List<string> allValues = new List<string>();
foreach (BarCodeType type in candidates)
{
string[] found = scanner.Scan("document-scan.png", type);
allValues.AddRange(found);
}
using Spire.Barcode;
BarcodeScanner scanner = new BarcodeScanner();
BarCodeType[] candidates = new[]
{
BarCodeType.Code128,
BarCodeType.QRCode,
BarCodeType.DataMatrix,
BarCodeType.EAN13,
BarCodeType.PDF417
};
List<string> allValues = new List<string>();
foreach (BarCodeType type in candidates)
{
string[] found = scanner.Scan("document-scan.png", type);
allValues.AddRange(found);
}
Imports Spire.Barcode
Dim scanner As New BarcodeScanner()
Dim candidates As BarCodeType() = {
BarCodeType.Code128,
BarCodeType.QRCode,
BarCodeType.DataMatrix,
BarCodeType.EAN13,
BarCodeType.PDF417
}
Dim allValues As New List(Of String)()
For Each type As BarCodeType In candidates
Dim found As String() = scanner.Scan("document-scan.png", type)
allValues.AddRange(found)
Next
Enfoque de IronBarcode :
using IronBarCode;
// The entire loop is replaced by a single call
var results = BarcodeReader.Read("document-scan.png");
List<string> allValues = results.Select(r => r.Value).ToList();
using IronBarCode;
// The entire loop is replaced by a single call
var results = BarcodeReader.Read("document-scan.png");
List<string> allValues = results.Select(r => r.Value).ToList();
Imports IronBarCode
' The entire loop is replaced by a single call
Dim results = BarcodeReader.Read("document-scan.png")
Dim allValues As List(Of String) = results.Select(Function(r) r.Value).ToList()
El sistema de lectura de imágenes de IronBarcode procesa las más de 50 simbologías en una sola pasada. Cuando se necesita ajustar la velocidad de lectura para el procesamiento por lotes de alto volumen, BarcodeReaderOptions proporciona ese control sin agregar ramas específicas de formato:
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var results = BarcodeReader.Read("document-scan.png", options);
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var results = BarcodeReader.Read("document-scan.png", options);
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim results = BarcodeReader.Read("document-scan.png", options)
Para obtener orientación sobre cómo seleccionar el valor ReadingSpeed adecuado, consulte la documentación de opciones de velocidad de lectura.
Generación de un código de barras
La generación de Spire.Barcode requiere instanciar un objeto BarcodeSettings, asignar cada propiedad individualmente, pasar la configuración a un BarCodeGenerator y luego llamar a GenerateImage() antes de escribir cualquier archivo.
Enfoque Spire.Barcode:
using Spire.Barcode;
BarcodeSettings settings = new BarcodeSettings();
settings.Type = BarCodeType.Code128;
settings.Data = "SHIP-9842-XZ";
settings.ShowText = true;
settings.TextMargin = 5;
settings.BarHeight = 60;
settings.Unit = GraphicsUnit.Pixel;
BarCodeGenerator generator = new BarCodeGenerator(settings);
Image barcodeImage = generator.GenerateImage();
barcodeImage.Save("shipping-label.png", ImageFormat.Png);
using Spire.Barcode;
BarcodeSettings settings = new BarcodeSettings();
settings.Type = BarCodeType.Code128;
settings.Data = "SHIP-9842-XZ";
settings.ShowText = true;
settings.TextMargin = 5;
settings.BarHeight = 60;
settings.Unit = GraphicsUnit.Pixel;
BarCodeGenerator generator = new BarCodeGenerator(settings);
Image barcodeImage = generator.GenerateImage();
barcodeImage.Save("shipping-label.png", ImageFormat.Png);
Imports Spire.Barcode
Imports System.Drawing
Imports System.Drawing.Imaging
Dim settings As New BarcodeSettings()
settings.Type = BarCodeType.Code128
settings.Data = "SHIP-9842-XZ"
settings.ShowText = True
settings.TextMargin = 5
settings.BarHeight = 60
settings.Unit = GraphicsUnit.Pixel
Dim generator As New BarCodeGenerator(settings)
Dim barcodeImage As Image = generator.GenerateImage()
barcodeImage.Save("shipping-label.png", ImageFormat.Png)
Enfoque de IronBarcode :
using IronBarCode;
BarcodeWriter.CreateBarcode("SHIP-9842-XZ", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("shipping-label.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("SHIP-9842-XZ", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("shipping-label.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("SHIP-9842-XZ", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("shipping-label.png")
El objeto mutable BarcodeSettings y la instancia BarCodeGenerator separada se reemplazan por una única llamada de fábrica estática con una cadena fluida. No hay riesgo de que la configuración se comparta accidentalmente en llamadas concurrentes porque cada invocación de CreateBarcode() es independiente.
Lectura de códigos de barras desde un documento PDF
Spire.Barcode no puede leer archivos PDF directamente. El enfoque basado en Spire requiere el paquete Spire.PDF separado para abrir el archivo, iterar sus páginas, extraer imágenes rasterizadas de cada página y luego pasar esas imágenes una por una al escáner de código de barras.
Enfoque Spire.Barcode:
using Spire.Pdf;
using Spire.Barcode;
var pdf = new PdfDocument();
pdf.LoadFromFile("invoices.pdf");
var scanner = new BarcodeScanner();
var extractedValues = new List<string>();
foreach (PdfPageBase page in pdf.Pages)
{
Image[] images = page.ExtractImages();
foreach (Image image in images)
{
string[] found = scanner.Scan(image, BarCodeType.QRCode);
extractedValues.AddRange(found);
}
}
using Spire.Pdf;
using Spire.Barcode;
var pdf = new PdfDocument();
pdf.LoadFromFile("invoices.pdf");
var scanner = new BarcodeScanner();
var extractedValues = new List<string>();
foreach (PdfPageBase page in pdf.Pages)
{
Image[] images = page.ExtractImages();
foreach (Image image in images)
{
string[] found = scanner.Scan(image, BarCodeType.QRCode);
extractedValues.AddRange(found);
}
}
Imports Spire.Pdf
Imports Spire.Barcode
Dim pdf As New PdfDocument()
pdf.LoadFromFile("invoices.pdf")
Dim scanner As New BarcodeScanner()
Dim extractedValues As New List(Of String)()
For Each page As PdfPageBase In pdf.Pages
Dim images() As Image = page.ExtractImages()
For Each image As Image In images
Dim found() As String = scanner.Scan(image, BarCodeType.QRCode)
extractedValues.AddRange(found)
Next
Next
Enfoque de IronBarcode :
using IronBarCode;
var results = BarcodeReader.Read("invoices.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} = {barcode.Value}");
}
using IronBarCode;
var results = BarcodeReader.Read("invoices.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} = {barcode.Value}");
}
Imports IronBarCode
Dim results = BarcodeReader.Read("invoices.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} = {barcode.Value}")
Next
IronBarcode lee documentos PDF directamente sin requerir Spire.PDF o cualquier gestión manual de páginas. El número de página de la que se extrajo cada código de barras está disponible en el objeto de resultados. Una vez que se reemplaza el código de lectura de PDF, se puede eliminar la referencia al paquete Spire.PDF y todas las importaciones using Spire.Pdf; del proyecto.
Referencia de mapeo de la API Spire.Barcode a IronBarcode
| Spire.Barcode | IronBarcode | Notas |
|---|---|---|
new BarcodeScanner() |
BarcodeReader.Read() (estático) |
No se necesita ninguna instancia de escáner |
scanner.Scan(path, BarCodeType.X) |
BarcodeReader.Read(path) |
Parámetro de tipo eliminado |
BarCodeType.Code128 (requerido) |
Detectado automáticamente | No se requiere equivalente |
BarCodeType.QRCode (requerido) |
Detectado automáticamente | No se requiere equivalente |
string[] results de Scan() |
Colección BarcodeResults |
Acceder a los valores a través de .Value |
results[0] (cadena) |
results[0].Value |
|
| Formato desconocido en el resultado | result.Format |
Tipo incluido en el objeto de resultado |
new BarcodeSettings() |
Parámetros en CreateBarcode() |
No se necesita ningún objeto de configuración |
settings.Type = BarCodeType.X |
BarcodeEncoding.X como segundo parámetro |
|
settings.Data = "value" |
Primer parámetro de CreateBarcode() |
|
new BarCodeGenerator(settings) |
No es necesario | La fábrica estática lo reemplaza |
generator.GenerateImage() |
.SaveAsPng() / .SaveAsJpeg() |
Métodos de salida específicos del formato |
BarcodeSettings.ApplyKey("key") |
IronBarCode.License.LicenseKey = "key" |
Establecer una vez al inicio |
Spire.License.LicenseProvider.SetLicenseKey("key") |
IronBarCode.License.LicenseKey = "key" |
Mismo reemplazo de una sola línea |
Spire.PDF (para lectura de PDF) |
No es necesario | Soporte nativo para PDF integrado |
Problemas comunes de migración y soluciones
Problema 1: Eliminación del parámetro BarCodeType
Spire.Barcode: scanner.Scan(path, BarCodeType.Code128) — el argumento de tipo es requerido por la firma del método. Eliminarlo provoca un error de compilación.
Solución: Reemplazar la llamada completa con BarcodeReader.Read(path). Buscar en el código base BarCodeType. para localizar cada ocurrencia. Los bucles de adivinanza de tipo (bloques foreach que iteran sobre una matriz de candidatos BarCodeType[]) pueden eliminarse en su totalidad; una única llamada a BarcodeReader.Read() reemplaza el bucle.
Problema 2: Tipo de retorno de string[]
Spire.Barcode: Scan() returns string[]. El código posterior que asigna esto a una variable string[] o lo pasa a un método que espera string[] fallará al compilar después de la migración.
Solución: Actualizar los sitios de llamada para trabajar con BarcodeResults. Para obtener un array de cadenas simple, utilize .Select(r => r.Value).ToArray(). Para acceder al primer resultado, utilize .First()?.Value. Si el formato detectado se necesita posteriormente, está disponible en el objeto resultado a través de .Format — no se requiere una variable de estado separada.
// If a plain string array is needed:
string[] texts = BarcodeReader.Read("barcode.png")
.Select(r => r.Value)
.ToArray();
// If only the first value is needed:
string first = BarcodeReader.Read("barcode.png").First()?.Value;
// If a plain string array is needed:
string[] texts = BarcodeReader.Read("barcode.png")
.Select(r => r.Value)
.ToArray();
// If only the first value is needed:
string first = BarcodeReader.Read("barcode.png").First()?.Value;
Imports System.Linq
' If a plain string array is needed:
Dim texts As String() = BarcodeReader.Read("barcode.png") _
.Select(Function(r) r.Value) _
.ToArray()
' If only the first value is needed:
Dim first As String = BarcodeReader.Read("barcode.png").FirstOrDefault()?.Value
Problema 3: Limpieza del paquete Spire.PDF
Spire.Barcode: Los flujos de trabajo de lectura de PDF dependen de Spire.PDF para el acceso a páginas y la extracción de imágenes. El proyecto hace referencia al paquete y contiene importaciones using Spire.Pdf; y usos de PdfDocument / PdfPageBase distribuidos en varios archivos.
Solución: Después de reemplazar todo el código de extracción de códigos de barras en PDF con BarcodeReader.Read("file.pdf"), realice una auditoría con grep para confirmar que no quedan referencias Spire.Pdf antes de eliminar el paquete:
grep -r "using Spire.Pdf" --include="*.cs" .
grep -r "Spire\.Pdf\|PdfPageBase\|ExtractImages" --include="*.cs" .
grep -r "using Spire.Pdf" --include="*.cs" .
grep -r "Spire\.Pdf\|PdfPageBase\|ExtractImages" --include="*.cs" .
Elimine el paquete solo cuando se hayan borrado todas las referencias:
dotnet remove package Spire.PDF
dotnet remove package Spire.PDF
Problema 4: Cambios en el espacio de nombres
Spire.Barcode: El espacio de nombres Spire.Barcode contiene BarcodeScanner, BarcodeSettings, BarCodeGenerator y BarCodeType. El espacio de nombres IronBarCode contiene BarcodeReader, BarcodeWriter, BarcodeEncoding y BarcodeReaderOptions.
Solución: Reemplazar using Spire.Barcode; por using IronBarCode; globalmente. El enum BarCodeType usado en la generación es reemplazado por BarcodeEncoding. El enum BarCodeType usado en la lectura no tiene equivalente en IronBarcode — simplemente se elimina, ya que la detección de formato es automática.
Lista de verificación para la migración de Spire.Barcode
Tareas previas a la migración
Antes de realizar cambios, revise el código fuente para identificar todos los usos de Spire.Barcode:
grep -r "using Spire.Barcode" --include="*.cs" .
grep -r "using Spire.Pdf" --include="*.cs" .
grep -r "BarcodeScanner\|BarcodeSettings\|BarCodeGenerator\|BarCodeType\." --include="*.cs" .
grep -r "ApplyKey\|SetLicenseKey" --include="*.cs" .
grep -r "ExtractImages\|PdfPageBase" --include="*.cs" .
grep -r "using Spire.Barcode" --include="*.cs" .
grep -r "using Spire.Pdf" --include="*.cs" .
grep -r "BarcodeScanner\|BarcodeSettings\|BarCodeGenerator\|BarCodeType\." --include="*.cs" .
grep -r "ApplyKey\|SetLicenseKey" --include="*.cs" .
grep -r "ExtractImages\|PdfPageBase" --include="*.cs" .
- Documentar todos los archivos que contienen matrices de candidatos
BarCodeType(bucles de adivinanza de tipo que deben eliminarse) - Identificar cualquier variable
string[]que reciba resultados deScan()y necesite actualizaciones de tipo - Confirmar si
Spire.PDFse utiliza para operaciones distintas a la extracción de códigos de barras
Tareas de actualización de código
- Eliminar el paquete NuGet
FreeSpire.BarcodeoSpire.Barcode - Eliminar el paquete NuGet
Spire.PDFsi la extracción de códigos de barras era su único uso - Instalar el paquete NuGet
IronBarcode - Reemplazar todos
using Spire.Barcode;conusing IronBarCode; - Eliminar todas las importaciones
using Spire.Pdf;donde ya no sean necesarias - Reemplazar la inicialización de licencias:
ApplyKey()oSetLicenseKey()conIronBarCode.License.LicenseKey = "key" - Eliminar todas las instancias
new BarcodeScanner() - Reemplazar todas las llamadas
scanner.Scan(path, BarCodeType.X)conBarcodeReader.Read(path) - Eliminar los bucles foreach que intentan adivinar el tipo de datos; reemplazar cada uno con una única llamada
BarcodeReader.Read() - Eliminar los bloques de iteración de página PDF y extracción de imágenes; reemplazar con
BarcodeReader.Read("file.pdf") - Actualizar las asignaciones de resultados
string[]para usar.Valueo.Select(r => r.Value).ToArray() - Reemplazar bloques
new BarcodeSettings()con cadenasBarcodeWriter.CreateBarcode(data, encoding) - Eliminar instancias
new BarCodeGenerator(settings) - Reemplazar
.GenerateImage()+image.Save()con.SaveAsPng()o.SaveAsJpeg() - Reemplazar valores del enum
BarCodeType.Xen la generación conBarcodeEncoding.X
Pruebas posteriores a la migración
- Confirmar que todos los formatos previamente escaneados vía el bucle de candidatos sean detectados correctamente por
BarcodeReader.Read() - Medir el rendimiento del procesamiento por lotes y confirmar que cumple con los requisitos de producción.
- Verificar que la extracción del código de barras del PDF produzca valores y números de página correctos.
- Confirme la calidad y la capacidad de escaneo del código de barras generado con un escáner físico o de software.
- Compruebe que la clave de licencia esté cargada correctamente en todos los entornos de despliegue (local, preproducción, producción, CI/CD).
- Ejecute los comandos grep audit de Tareas previas a la migración para confirmar que no queden referencias a Spire.
Principales ventajas de migrar a IronBarcode
Eliminación de la sobrecarga de mantenimiento de formatos: Tras la migración, no hay que mantener ninguna lista de tipos candidatos ni actualizar ningún bucle de detección de tipos cuando un nuevo formato de código de barras entra en el flujo de trabajo. BarcodeReader.Read() maneja el conjunto completo de simbología automáticamente, y el formato detectado se incluye en cada objeto de resultado para la ruta posterior.
Evaluación precisa antes de comprometerse: La versión de prueba de IronBarcode se ejecuta desde el mismo archivo binario que el producto con licencia, a máxima velocidad de lectura y con el conjunto completo de simbología. Los parámetros de rendimiento y las pruebas de cobertura de formato realizadas durante la evaluación de la fase de prueba se transfieren directamente a la producción. Los equipos pueden tomar una decisión de compra con la seguridad de que el comportamiento evaluado es el comportamiento que se implementará.
Soporte de PDF de paquete único: La extracción de códigos de barras de archivos PDF es manejada por la misma llamada BarcodeReader.Read() utilizada para imágenes. No se requiere ninguna biblioteca secundaria, ninguna licencia adicional ni código para la iteración manual de páginas. Los equipos que anteriormente mantenían tanto Spire.Barcode como Spire.PDF se reducen a una sola dependencia para todo el flujo de trabajo de códigos de barras.
Objetos de resultado con metadatos de formato: Cada entrada en una colección BarcodeResults lleva el valor decodificado, la simbología detectada, el número de página de origen para entradas PDF y la región delimitadora dentro de la imagen fuente. Las aplicaciones que necesitan enrutar, filtrar o registrar por formato tienen esa información disponible en el resultado sin necesidad de una gestión de estado adicional.
API de generación simplificada: El patrón de fábrica estática en BarcodeWriter.CreateBarcode() elimina el objeto mutable BarcodeSettings y la instancia BarCodeGenerator separada. Cada llamada de generación es independiente, lo que reduce el riesgo de que la configuración se filtre entre operaciones concurrentes.
Compatibilidad con versiones futuras: IronBarcode recibe actualizaciones periódicas que coinciden con las versiones del entorno de ejecución de .NET . A medida que la adopción de .NET 10 aumente hasta 2026, las actualizaciones de compatibilidad garantizarán que las bases de código migradas continúen compilándose y ejecutándose sin necesidad de realizar cambios en las bibliotecas con cada nueva versión de .NET .
Preguntas Frecuentes
¿Por qué debería migrar de Spire.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 Spire.Barcode por IronBarcode?
Sustituya la creación de instancias y la repetición de licencias por IronBarCode.License.LicenseKey = "key". Sustituya las llamadas al lector por BarcodeReader.Read(path) y las llamadas al escritor por BarcodeWriter.CreateBarcode(data, encoding). Los métodos estáticos no requieren gestión de instancias.
¿Cuánto cambia el código al migrar de Spire.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 Spire.Barcode e IronBarcode durante la migración?
No. La mayoría de las migraciones son sustituciones directas en lugar de operaciones paralelas. Migre una clase de servicio cada vez, sustituya la referencia NuGet y actualice los patrones de instanciación y llamada a la API antes de pasar a la siguiente clase.
¿Cuál es el nombre del paquete NuGet para IronBarcode?
El paquete es 'IronBarCode' (con B y C mayúsculas). Instálalo con 'Install-Package IronBarCode' o 'dotnet add package IronBarCode'. La directiva using en el código es 'using IronBarCode;'.
¿Cómo simplifica IronBarcode el despliegue de Docker en comparación con Spire.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 Spire.Barcode?
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 Spire.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.

