Saltar al pie de página
VIDEOS

Una comparación de IronBarcode y la biblioteca ZXing Net

Migración del SDK de Scandit a IronBarcode

Scandit SDK es una plataforma de escaneo de cámaras diseñada para la detección de códigos de barras móviles en tiempo real. IronBarcode es una biblioteca de procesamiento de códigos de barras basada en archivos y del lado del servidor para .NET. Estas dos bibliotecas sirven para diferentes casos de uso principales, y la migración de una a otra solo es relevante en circunstancias específicas.

Esta guía describe la ruta de migración para los equipos que utilizan los paquetes .NET de Scandit para procesar archivos, PDF o flujos de documentos del lado del servidor; escenarios en los que la arquitectura de la canalización de la cámara de Scandit genera fricción en lugar de valor. Si su principal requisito es apuntar la cámara de un dispositivo móvil a objetos físicos y recibir información en tiempo real mediante superposiciones de realidad aumentada, Scandit sigue siendo la herramienta adecuada y esta guía no le será útil. Si necesita leer códigos de barras de imágenes cargadas, extraer datos de códigos de barras de documentos PDF o ejecutar la detección de códigos de barras en ASP.NET Core, Azure Functions, contenedores Docker o servicios de procesamiento en segundo plano, esta guía le proporciona una ruta de migración completa.

¿Por qué migrar desde Scandit SDK?

Sobrecarga de la canalización de la cámara: Cada integración de Scandit comienza con la misma secuencia de inicialización, independientemente de si hay una cámara presente en el entorno de implementación: construye un DataCaptureContext, configura BarcodeCaptureSettings, enumera las simbologías a habilitar, adquiere una instancia de Camera, asígnala como la fuente de cuadros, transiciona la cámara a un estado activo y habilita la captura de códigos de barras. Esta inicialización existe porque Scandit procesa fotogramas de vídeo en directo. Para el procesamiento de archivos del lado del servidor, la secuencia no proporciona ningún beneficio e introduce una complejidad de estado que no tiene equivalente en el entorno de destino: no hay cámara en un contenedor Docker ni fuente de fotogramas en una función de Azure.

Precios no públicos: Scandit no publica sus precios. SparkScan, MatrixScan, escaneo de identificación, superposiciones de realidad aumentada y analizador son productos con precios individuales que requieren una consulta de ventas independiente para cada uno. Una propuesta de presupuesto, una comparación de proveedores o un análisis de costo-beneficio no pueden completarse sin ingresar a un ciclo de ventas. IronBarcode publica sus precios de forma transparente : 749 dólares, 1499 dólares o 2999 dólares como compra única con validez perpetua, por lo que el precio aparece en la página antes de escribir una sola línea de código.

Declaración obligatoria sobre la simbología: Scandit requiere la activación explícita de cada formato de código de barras antes de que comience una sesión de escaneo. En el escaneo de cámara en tiempo real, esto supone una optimización del rendimiento: restringir las simbologías reduce la sobrecarga de procesamiento por fotograma. En el procesamiento de documentos basado en archivos, donde los documentos entrantes pueden contener cualquier formato de código de barras de cualquier proveedor o socio, la declaración obligatoria del formato se convierte en una limitación. Enumerar todas las posibles simbologías elimina la ventaja en cuanto al rendimiento; Escribir lógica para adivinar el formato sobre la biblioteca añade una carga de trabajo de ingeniería.

Sin soporte para PDF: No hay un equivalente directo a BarcodeReader.Read("invoice.pdf") en la API de Scandit. La extracción de códigos de barras de un documento PDF requiere convertir cada página a una imagen rasterizada mediante una biblioteca independiente y, posteriormente, procesar esas imágenes renderizadas mediante un sistema de simulación de cámara. Este enfoque introduce dependencias adicionales, licencias adicionales y un considerable esfuerzo de ingeniería para una tarea que es habitual en los flujos de trabajo de procesamiento de documentos.

El problema fundamental

Scandit requiere que la cámara esté en funcionamiento antes de que pueda comenzar cualquier trabajo con códigos de barras. IronBarcode solo requiere una ruta de archivo:

// Scandit SDK: mandatory camera pipeline before first barcode read
var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");
var settings = BarcodeCaptureSettings.Create();
settings.EnableSymbologies(new HashSet<Symbology>
{
    Symbology.Ean13Upca,
    Symbology.Ean8,
    Symbology.Code128,
    Symbology.QrCode
});
var barcodeCapture = BarcodeCapture.Create(dataCaptureContext, settings);
var camera = Camera.GetDefaultCamera();
await dataCaptureContext.SetFrameSourceAsync(camera);
await camera.SwitchToDesiredStateAsync(FrameSourceState.On);
barcodeCapture.IsEnabled = true;
// Results arrive later via BarcodeScanned event callback
// Scandit SDK: mandatory camera pipeline before first barcode read
var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");
var settings = BarcodeCaptureSettings.Create();
settings.EnableSymbologies(new HashSet<Symbology>
{
    Symbology.Ean13Upca,
    Symbology.Ean8,
    Symbology.Code128,
    Symbology.QrCode
});
var barcodeCapture = BarcodeCapture.Create(dataCaptureContext, settings);
var camera = Camera.GetDefaultCamera();
await dataCaptureContext.SetFrameSourceAsync(camera);
await camera.SwitchToDesiredStateAsync(FrameSourceState.On);
barcodeCapture.IsEnabled = true;
// Results arrive later via BarcodeScanned event callback
Imports Scandit.DataCapture.Core
Imports Scandit.DataCapture.Barcode
Imports System.Collections.Generic

' Scandit SDK: mandatory camera pipeline before first barcode read
Dim dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE")
Dim settings = BarcodeCaptureSettings.Create()
settings.EnableSymbologies(New HashSet(Of Symbology) From {
    Symbology.Ean13Upca,
    Symbology.Ean8,
    Symbology.Code128,
    Symbology.QrCode
})
Dim barcodeCapture = BarcodeCapture.Create(dataCaptureContext, settings)
Dim camera = Camera.GetDefaultCamera()
Await dataCaptureContext.SetFrameSourceAsync(camera)
Await camera.SwitchToDesiredStateAsync(FrameSourceState.On)
barcodeCapture.IsEnabled = True
' Results arrive later via BarcodeScanned event callback
$vbLabelText   $csharpLabel
// IronBarcode: direct file reading
// NuGet: dotnet add package IronBarcode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
    Console.WriteLine($"{result.Value} ({result.Format})");
// IronBarcode: direct file reading
// NuGet: dotnet add package IronBarcode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
    Console.WriteLine($"{result.Value} ({result.Format})");
Imports IronBarCode

' IronBarcode: direct file reading
' NuGet: dotnet add package IronBarcode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
    Console.WriteLine($"{result.Value} ({result.Format})")
Next
$vbLabelText   $csharpLabel

Todo el bloque de procesamiento de la cámara —creación de contexto, configuración, habilitación de simbología, adquisición de la cámara, asignación de fuente de fotogramas, transición de estado— se reemplaza por la asignación de una clave de licencia y una única llamada a un método.

Comparación de características entre IronBarcode y Scandit SDK

Característica SDK de Scandit IronBarcode
Despliegue principal Escaneo con cámara móvil Procesamiento de archivos en servidores, en la nube y en equipos de escritorio
Se requiere cámara No
Lectura de archivos de imagen No diseñado para Tipo de entrada principal
Extracción de códigos de barras PDF No soportado Compatibilidad nativa con varias páginas
Entrada de flujo/matriz de bytes No soportado
Detección automática de formato No (debe especificarse) Sí (comportamiento predeterminado)
Resultados impulsados ​​por eventos Sí (devolución de llamada de BarcodeScanned) No (retorno síncrono)
ASP.NET Core / lado del servidor No diseñado para Totalmente compatible
Azure Functions / sin servidor No es práctico Totalmente compatible
Docker / Linux No soportado Totalmente compatible
Generación de BarCodes No soportado Incluido en el paquete
Detección de múltiples códigos de barras MatrixScan (producto aparte) Incluido en el paquete
Modelo de precios Contacte con el departamento de ventas (por producto) Niveles perpetuos publicados
Tarifas por escaneo/por dispositivo No

Inicio rápido

Paso 1: Sustituir el paquete NuGet

Eliminar paquetes de Scandit:

dotnet remove package Scandit.BarcodePicker
dotnet remove package Scandit.DataCapture.Core
dotnet remove package Scandit.DataCapture.Barcode
dotnet remove package Scandit.BarcodePicker
dotnet remove package Scandit.DataCapture.Core
dotnet remove package Scandit.DataCapture.Barcode
SHELL

Instalar IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

Paso 2: Actualizar los espacios de nombres

Reemplace las importaciones del espacio de nombres de Scandit con el espacio de nombres de IronBarcode:

// Before (Scandit SDK)
using Scandit.DataCapture.Core;
using Scandit.DataCapture.Barcode;
using Scandit.DataCapture.Barcode.Data;

// After (IronBarcode)
using IronBarCode;
// Before (Scandit SDK)
using Scandit.DataCapture.Core;
using Scandit.DataCapture.Barcode;
using Scandit.DataCapture.Barcode.Data;

// After (IronBarcode)
using IronBarCode;
' Before (Scandit SDK)
Imports Scandit.DataCapture.Core
Imports Scandit.DataCapture.Barcode
Imports Scandit.DataCapture.Barcode.Data

' After (IronBarcode)
Imports IronBarCode
$vbLabelText   $csharpLabel

Paso 3: Inicializar licencia

Agrega la inicialización de la licencia al inicio de la aplicación, reemplazando la llamada a DataCaptureContext.ForLicenseKey:

// Before (Scandit SDK)
var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");

// After (IronBarcode)
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Before (Scandit SDK)
var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");

// After (IronBarcode)
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Before (Scandit SDK)
Dim dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE")

' After (IronBarcode)
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Ejemplos de migración de código

Lectura de códigos de barras desde un archivo de imagen

El procesamiento de un archivo de imagen estática es un escenario compatible con IronBarcode y un flujo de trabajo no compatible con Scandit. El SDK de Scandit procesa fotogramas de cámara en tiempo real; Para leer un archivo es necesario adaptar el proceso de captura para que trate un mapa de bits como una fuente de fotogramas, lo cual no tiene una implementación nativa.

Enfoque del SDK de Scandit:

// SDK de Scandit has no direct file-read API.
// Reading a static image requires constructing a bitmap frame source
// and routing it through the capture pipeline — an unsupported workaround.
// The standard Scandit integration assumes a running camera at all times.
// SDK de Scandit has no direct file-read API.
// Reading a static image requires constructing a bitmap frame source
// and routing it through the capture pipeline — an unsupported workaround.
// The standard Scandit integration assumes a running camera at all times.
' SDK de Scandit has no direct file-read API.
' Reading a static image requires constructing a bitmap frame source
' and routing it through the capture pipeline — an unsupported workaround.
' The standard Scandit integration assumes a running camera at all times.
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

var results = BarcodeReader.Read("product-label.png");
foreach (var result in results)
{
    Console.WriteLine($"Value: {result.Value}");
    Console.WriteLine($"Format: {result.Format}");
    Console.WriteLine($"Confidence: {result.Confidence}%");
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

var results = BarcodeReader.Read("product-label.png");
foreach (var result in results)
{
    Console.WriteLine($"Value: {result.Value}");
    Console.WriteLine($"Format: {result.Format}");
    Console.WriteLine($"Confidence: {result.Confidence}%");
}
Imports IronBarCode

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

Dim results = BarcodeReader.Read("product-label.png")
For Each result In results
    Console.WriteLine($"Value: {result.Value}")
    Console.WriteLine($"Format: {result.Format}")
    Console.WriteLine($"Confidence: {result.Confidence}%")
Next
$vbLabelText   $csharpLabel

La lectura de códigos de barras a partir de imágenes con IronBarcode no requiere configuración de canalización. La colección de resultados está disponible inmediatamente después de que el método finaliza, sin necesidad de suscripción a eventos.

Extracción de códigos de barras de un documento PDF

La extracción de códigos de barras de PDF es un terreno completamente nuevo al migrar desde Scandit, que no tiene soporte para PDF. IronBarcode lee directamente los documentos PDF y devuelve resultados indexados por número de página.

Enfoque del SDK de Scandit:

// Scandit SDK: no PDF support.
// Implementing PDF barcode extraction with Scandit requires:
// 1. A separate PDF rendering library to convert pages to raster images
// 2. Routing each rendered image through the camera simulation pipeline
// 3. Correlating results back to page numbers manually
// This is not a supported workflow and requires significant custom engineering.
// Scandit SDK: no PDF support.
// Implementing PDF barcode extraction with Scandit requires:
// 1. A separate PDF rendering library to convert pages to raster images
// 2. Routing each rendered image through the camera simulation pipeline
// 3. Correlating results back to page numbers manually
// This is not a supported workflow and requires significant custom engineering.
' Scandit SDK: no PDF support.
' Implementing PDF barcode extraction with Scandit requires:
' 1. A separate PDF rendering library to convert pages to raster images
' 2. Routing each rendered image through the camera simulation pipeline
' 3. Correlating results back to page numbers manually
' This is not a supported workflow and requires significant custom engineering.
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

var results = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in results)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})");
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

var results = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in results)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})");
}
Imports IronBarCode

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

Dim results = BarcodeReader.Read("shipping-manifest.pdf")
For Each result In results
    Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})")
Next
$vbLabelText   $csharpLabel

Para obtener una guía completa sobre la lectura de códigos de barras en documentos PDF , incluyendo la selección de rangos de páginas y el manejo de múltiples códigos de barras, la documentación de IronBarcode abarca toda la gama de escenarios de procesamiento de PDF. No se requiere ninguna dependencia de biblioteca PDF adicional.

Conversión de funciones de devolución de llamada de eventos a valores de retorno directos

Scandit entrega los resultados de código de barras a través del evento BarcodeScanned porque la exploración de cámaras en vivo es inherentemente asincrónica: los resultados llegan cuando la cámara detecta un código de barras en el cuadro actual. IronBarcode devuelve los resultados como una colección tipificada porque la lectura basada en archivos tiene un límite de finalización conocido. Este es uno de los cambios estructurales más significativos en la migración.

Enfoque del SDK de Scandit:

// Scandit SDK: event-driven result delivery
barcodeCapture.BarcodeScanned += (sender, args) =>
{
    foreach (var barcode in args.Session.NewlyRecognizedBarcodes)
    {
        string value = barcode.Data;
        string symbology = barcode.Symbology.ToString();

        // Processing logic embedded inside event handler
        LogBarcodeResult(value, symbology);
        UpdateInventory(value);
    }
};

// Scan continues indefinitely until camera session is terminated
// Scandit SDK: event-driven result delivery
barcodeCapture.BarcodeScanned += (sender, args) =>
{
    foreach (var barcode in args.Session.NewlyRecognizedBarcodes)
    {
        string value = barcode.Data;
        string symbology = barcode.Symbology.ToString();

        // Processing logic embedded inside event handler
        LogBarcodeResult(value, symbology);
        UpdateInventory(value);
    }
};

// Scan continues indefinitely until camera session is terminated
Imports System

' Scandit SDK: event-driven result delivery
AddHandler barcodeCapture.BarcodeScanned, Sub(sender, args)
    For Each barcode In args.Session.NewlyRecognizedBarcodes
        Dim value As String = barcode.Data
        Dim symbology As String = barcode.Symbology.ToString()

        ' Processing logic embedded inside event handler
        LogBarcodeResult(value, symbology)
        UpdateInventory(value)
    Next
End Sub

' Scan continues indefinitely until camera session is terminated
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

var results = BarcodeReader.Read("document.png");
foreach (var result in results)
{
    // Same processing logic, now in standard control flow
    LogBarcodeResult(result.Value, result.Format.ToString());
    UpdateInventory(result.Value);
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

var results = BarcodeReader.Read("document.png");
foreach (var result in results)
{
    // Same processing logic, now in standard control flow
    LogBarcodeResult(result.Value, result.Format.ToString());
    UpdateInventory(result.Value);
}
Imports IronBarCode

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

Dim results = BarcodeReader.Read("document.png")
For Each result In results
    ' Same processing logic, now in standard control flow
    LogBarcodeResult(result.Value, result.Format.ToString())
    UpdateInventory(result.Value)
Next
$vbLabelText   $csharpLabel

Toda la lógica de procesamiento que estaba integrada en las funciones de devolución de llamada del controlador de eventos se traslada al código secuencial estándar. El manejo de errores, el registro de eventos y las operaciones posteriores pueden estructurarse utilizando el flujo de control ordinario en lugar de patrones de manejadores de eventos.

Punto final de ASP.NET Core para la carga de archivos

Un punto final de servidor sin estado que lee códigos de barras desde un archivo cargado representa el caso de uso principal del lado del servidor para IronBarcode. Este patrón no es compatible con la arquitectura de procesamiento de imágenes de la cámara de Scandit.

Enfoque del SDK de Scandit:

// Scandit SDK: not applicable to ASP.NET Core file upload scenarios.
// The DataCaptureContext requires a camera hardware session.
// There is no mechanism to process an IFormFile through the Scandit pipeline
// without substantial custom camera-simulation infrastructure.
// Scandit SDK: not applicable to ASP.NET Core file upload scenarios.
// The DataCaptureContext requires a camera hardware session.
// There is no mechanism to process an IFormFile through the Scandit pipeline
// without substantial custom camera-simulation infrastructure.
' Scandit SDK: not applicable to ASP.NET Core file upload scenarios.
' The DataCaptureContext requires a camera hardware session.
' There is no mechanism to process an IFormFile through the Scandit pipeline
' without substantial custom camera-simulation infrastructure.
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

// NuGet: dotnet add package IronBarcode
using IronBarCode;

[ApiController]
[Route("api/[controller]")]
public class BarcodeController : ControllerBase
{
    [HttpPost("scan")]
    public IActionResult ScanUploadedDocument(IFormFile file)
    {
        if (file == null || file.Length == 0)
            return BadRequest("No file provided");

        using var stream = file.OpenReadStream();
        var results = BarcodeReader.Read(stream);

        if (!results.Any())
            return NotFound("No barcodes detected");

        return Ok(results.Select(r => new
        {
            r.Value,
            Format = r.Format.ToString(),
            r.PageNumber
        }));
    }
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

[ApiController]
[Route("api/[controller]")]
public class BarcodeController : ControllerBase
{
    [HttpPost("scan")]
    public IActionResult ScanUploadedDocument(IFormFile file)
    {
        if (file == null || file.Length == 0)
            return BadRequest("No file provided");

        using var stream = file.OpenReadStream();
        var results = BarcodeReader.Read(stream);

        if (!results.Any())
            return NotFound("No barcodes detected");

        return Ok(results.Select(r => new
        {
            r.Value,
            Format = r.Format.ToString(),
            r.PageNumber
        }));
    }
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc

<ApiController>
<Route("api/[controller]")>
Public Class BarcodeController
    Inherits ControllerBase

    <HttpPost("scan")>
    Public Function ScanUploadedDocument(file As IFormFile) As IActionResult
        If file Is Nothing OrElse file.Length = 0 Then
            Return BadRequest("No file provided")
        End If

        Using stream = file.OpenReadStream()
            Dim results = BarcodeReader.Read(stream)

            If Not results.Any() Then
                Return NotFound("No barcodes detected")
            End If

            Return Ok(results.Select(Function(r) New With {
                .Value = r.Value,
                .Format = r.Format.ToString(),
                .PageNumber = r.PageNumber
            }))
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

El método BarcodeReader.Read acepta un Stream directamente de IFormFile.OpenReadStream(), sin necesidad de crear un archivo temporal. Los resultados se devuelven de forma síncrona dentro del ciclo de solicitud-respuesta, sin gestión asíncrona de la cámara.

Procesamiento simultáneo por lotes de múltiples documentos

Las colas de documentos de gran volumen requieren un procesamiento paralelo a través de múltiples hilos. Debido a que la API de IronBarcode no mantiene estado, es inherentemente segura para hilos y se compone directamente con Parallel.ForEach y patrones de tareas asincrónicos.

Enfoque del SDK de Scandit:

// Scandit SDK: no supported batch file processing pattern.
// The FrameSourceState model assumes a continuous camera session,
// not a queue of discrete documents. Batch processing would require
// one camera simulation pipeline per document or serialized processing
// through a shared pipeline — neither is a supported workflow.
// Scandit SDK: no supported batch file processing pattern.
// The FrameSourceState model assumes a continuous camera session,
// not a queue of discrete documents. Batch processing would require
// one camera simulation pipeline per document or serialized processing
// through a shared pipeline — neither is a supported workflow.
' Scandit SDK: no supported batch file processing pattern.
' The FrameSourceState model assumes a continuous camera session,
' not a queue of discrete documents. Batch processing would require
' one camera simulation pipeline per document or serialized processing
' through a shared pipeline — neither is a supported workflow.
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

// NuGet: dotnet add package IronBarcode
using IronBarCode;
using System.Collections.Concurrent;

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

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var files = Directory.GetFiles("./documents/", "*.pdf");
var allResults = new ConcurrentBag<(string File, BarcodeResult Result)>();

Parallel.ForEach(files, file =>
{
    var results = BarcodeReader.Read(file, options);
    foreach (var result in results)
        allResults.Add((file, result));
});

foreach (var (file, result) in allResults)
    Console.WriteLine($"{Path.GetFileName(file)}: {result.Value} ({result.Format})");
// NuGet: dotnet add package IronBarcode
using IronBarCode;
using System.Collections.Concurrent;

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

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var files = Directory.GetFiles("./documents/", "*.pdf");
var allResults = new ConcurrentBag<(string File, BarcodeResult Result)>();

Parallel.ForEach(files, file =>
{
    var results = BarcodeReader.Read(file, options);
    foreach (var result in results)
        allResults.Add((file, result));
});

foreach (var (file, result) in allResults)
    Console.WriteLine($"{Path.GetFileName(file)}: {result.Value} ({result.Format})");
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.IO
Imports System.Threading.Tasks

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

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True,
    .MaxParallelThreads = 4
}

Dim files = Directory.GetFiles("./documents/", "*.pdf")
Dim allResults As New ConcurrentBag(Of (File As String, Result As BarcodeResult))()

Parallel.ForEach(files, Sub(file)
    Dim results = BarcodeReader.Read(file, options)
    For Each result In results
        allResults.Add((file, result))
    Next
End Sub)

For Each item In allResults
    Console.WriteLine($"{Path.GetFileName(item.File)}: {item.Result.Value} ({item.Result.Format})")
Next
$vbLabelText   $csharpLabel

Para patrones avanzados que abarcan la lectura de códigos de barras asíncrona y multihilo , incluyendo el ajuste del rendimiento y la configuración del número de hilos, la documentación de IronBarcode proporciona una guía detallada.

Referencia de mapeo de la API del SDK de Scandit a IronBarcode

SDK de Scandit IronBarcode Notas
DataCaptureContext.ForLicenseKey("key") IronBarCode.License.LicenseKey = "key" Una tarea; sin objeto contextual
BarcodeCaptureSettings.Create() new BarcodeReaderOptions() Opcional; no es necesario para la lectura básica
settings.EnableSymbologies(Symbology.Code128, ...) (not needed) IronBarcode detecta automáticamente todos los formatos.
Camera.GetDefaultCamera() (not applicable) Sin concepto de cámara
dataCaptureContext.SetFrameSourceAsync(camera) (not applicable) Sin fuente de fotogramas
camera.SwitchToDesiredStateAsync(FrameSourceState.On) (not applicable) Máquina de estados sin cámara
barcodeCapture.IsEnabled = true BarcodeReader.Read(path) Una sola llamada inicia la lectura
BarcodeScanned += controlador de eventos foreach estándar sobre valor de retorno No se necesita ningún sistema de eventos
args.Session.NewlyRecognizedBarcodes Valor de retorno de BarcodeReader.Read() Cobro directo
barcode.Data result.Value Mismo contenido semántico
barcode.Symbology result.Format Enumeración de formato equivalente
using Scandit.DataCapture.Core using IronBarCode Espacio de nombres único
using Scandit.DataCapture.Barcode using IronBarCode Incluido en el mismo espacio de nombres
Producto SparkScan BarcodeReader.Read(path) No se requiere ningún producto adicional.
Producto MatrixScan BarcodeReaderOptions { ExpectMultipleBarcodes = true } Incluido en el paquete básico

Problemas comunes de migración y soluciones

Problema 1: El código del pipeline de la cámara no tiene una traducción directa.

Scandit SDK: El bloque de configuración de DataCaptureContext, BarcodeCaptureSettings, Camera y BarcodeCapture abarca de 7 a 10 líneas de código de inicialización con transiciones de estado asincrónicas.

Solución: Este bloque se elimina por completo. No tiene equivalente en IronBarcode porque la API basada en archivos de IronBarcode no requiere inicialización de sesión. Reemplace todo el bloque con:

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

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

Problema 2: Lógica del controlador de eventos BarcodeScanned

Scandit SDK: La lógica de procesamiento está incrustada dentro de las lambdas o métodos de controladores de eventos BarcodeScanned +=. Este patrón no existe en IronBarcode.

Solución: Mueve el cuerpo del controlador al código estándar después de la llamada a BarcodeReader.Read:

// Before: event handler
barcodeCapture.BarcodeScanned += (s, args) =>
{
    foreach (var b in args.Session.NewlyRecognizedBarcodes)
        Console.WriteLine(b.Data);
};

// After: direct iteration
foreach (var result in BarcodeReader.Read("document.png"))
    Console.WriteLine(result.Value);
// Before: event handler
barcodeCapture.BarcodeScanned += (s, args) =>
{
    foreach (var b in args.Session.NewlyRecognizedBarcodes)
        Console.WriteLine(b.Data);
};

// After: direct iteration
foreach (var result in BarcodeReader.Read("document.png"))
    Console.WriteLine(result.Value);
Imports System

' Before: event handler
AddHandler barcodeCapture.BarcodeScanned, Sub(s, args)
    For Each b In args.Session.NewlyRecognizedBarcodes
        Console.WriteLine(b.Data)
    Next
End Sub

' After: direct iteration
For Each result In BarcodeReader.Read("document.png")
    Console.WriteLine(result.Value)
Next
$vbLabelText   $csharpLabel

Problema 3: Llamadas a EnableSymbologies dispersas por todo el código.

Scandit SDK: En múltiples lugares del código se puede llamar settings.EnableSymbologies(...) con diferentes conjuntos de simbologías para distintos contextos de escaneo.

Solución: Elimina todas las llamadas a EnableSymbologies. IronBarcode detecta automáticamente todos los formatos compatibles por defecto. Si se necesita una restricción de formato para el rendimiento en escenarios específicos, usa BarcodeReaderOptions.ExpectBarcodeTypes:

var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("document.png", options);
var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("document.png", options);
Imports System

Dim options As New BarcodeReaderOptions With {
    .ExpectBarcodeTypes = BarcodeEncoding.Code128 Or BarcodeEncoding.QRCode
}
Dim results = BarcodeReader.Read("document.png", options)
$vbLabelText   $csharpLabel

Problema 4: No hay lectura de PDF en el código fuente existente.

SDK de Scandit: Si el código fuente existente convierte las páginas PDF en imágenes antes de introducirlas en el proceso de Scandit, esta infraestructura de renderizado personalizada ya no es necesaria.

Solución: Eliminar por completo el paso de conversión de PDF a imagen. Pasa la ruta del PDF directamente a IronBarcode:

// Before: render PDF pages to images, then pass each image to Scandit pipeline
// (multiple steps, external PDF library dependency)

// After: pass PDF directly to IronBarcode
var results = BarcodeReader.Read("document.pdf");
// Results include PageNumber property for each detected barcode
// Before: render PDF pages to images, then pass each image to Scandit pipeline
// (multiple steps, external PDF library dependency)

// After: pass PDF directly to IronBarcode
var results = BarcodeReader.Read("document.pdf");
// Results include PageNumber property for each detected barcode
' Before: render PDF pages to images, then pass each image to Scandit pipeline
' (multiple steps, external PDF library dependency)

' After: pass PDF directly to IronBarcode
Dim results = BarcodeReader.Read("document.pdf")
' Results include PageNumber property for each detected barcode
$vbLabelText   $csharpLabel

Problema 5: Patrones de inicialización asíncrona de la cámara

Scandit SDK: La inicialización de la cámara utiliza await para SetFrameSourceAsync y SwitchToDesiredStateAsync. Si el código que realiza la llamada está estructurado en torno a estas operaciones asíncronas, eliminarlas simplifica la cadena asíncrona.

Solución: Eliminar por completo la inicialización asíncrona de la cámara. BarcodeReader.Read es sincrónica. Si se necesita ejecución asincrónica para la capacidad de respuesta en un contexto de UI o servidor, envuélvelo en Task.Run:

// Async wrapper for non-blocking execution
var results = await Task.Run(() => BarcodeReader.Read("document.png"));
// Async wrapper for non-blocking execution
var results = await Task.Run(() => BarcodeReader.Read("document.png"));
Imports System.Threading.Tasks

' Async wrapper for non-blocking execution
Dim results = Await Task.Run(Function() BarcodeReader.Read("document.png"))
$vbLabelText   $csharpLabel

Lista de verificación para la migración del SDK de Scandit

Tareas previas a la migración

Audite todos los puntos de integración de Scandit en el código fuente:

grep -r "DataCaptureContext\|BarcodeCaptureSettings\|BarcodeCapture" --include="*.cs" .
grep -r "EnableSymbologies\|BarcodeScanned\|NewlyRecognizedBarcodes" --include="*.cs" .
grep -r "using Scandit" --include="*.cs" .
grep -r "barcode\.Data\|barcode\.Symbology\|FrameSourceState" --include="*.cs" .
grep -r "DataCaptureContext\|BarcodeCaptureSettings\|BarcodeCapture" --include="*.cs" .
grep -r "EnableSymbologies\|BarcodeScanned\|NewlyRecognizedBarcodes" --include="*.cs" .
grep -r "using Scandit" --include="*.cs" .
grep -r "barcode\.Data\|barcode\.Symbology\|FrameSourceState" --include="*.cs" .
SHELL

Documente todos los contextos de escaneo: identifique qué rutas de código manejan el escaneo de cámara en tiempo real (manteniéndose en Scandit) frente al procesamiento de archivos o documentos (migrando a IronBarcode). Tenga en cuenta todos los lugares donde las páginas PDF se convierten en imágenes antes del procesamiento de Scandit, ya que este paso de renderizado se eliminará.

Tareas de actualización de código

  1. Elimina los paquetes NuGet de Scandit (Scandit.BarcodePicker, Scandit.DataCapture.Core, Scandit.DataCapture.Barcode)
  2. Instala el paquete NuGet IronBarcode
  3. Reemplaza las importaciones de using Scandit.DataCapture.* con using IronBarCode
  4. Elimina por completo el bloque de inicialización DataCaptureContext
  5. Elimina todas las llamadas a Camera.GetDefaultCamera() y SetFrameSourceAsync
  6. Elimina todas las llamadas a EnableSymbologies
  7. Reemplaza barcodeCapture.IsEnabled = true con BarcodeReader.Read(filePath)
  8. Convierte los controladores de eventos BarcodeScanned += a foreach sobre los resultados de BarcodeReader.Read()
  9. Reemplaza barcode.Data con result.Value
  10. Reemplaza barcode.Symbology con result.Format
  11. Eliminar las canalizaciones de renderizado de PDF a imagen donde IronBarcode ahora lee los PDF directamente.
  12. Agrega IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY" al inicio de la aplicación

Pruebas posteriores a la migración

Verifique lo siguiente después de completar las actualizaciones del código:

  • Confirmar que los valores de código de barras devueltos por IronBarcode coincidan con los valores devueltos previamente por Scandit para los mismos documentos de entrada.
  • Verifica que todos los formatos de código de barras soportados en el conjunto de documentos sean detectados sin la configuración ExpectBarcodeTypes
  • Prueba que la extracción de PDFs devuelva valores PageNumber correctos para documentos de varias páginas
  • Confirmar que los puntos finales de ASP.NET Core devuelven resultados dentro de tiempos de respuesta aceptables bajo la carga prevista.
  • Verificar que las implementaciones de Docker o contenedores completen correctamente la lectura de códigos de barras sin hardware de cámara.
  • Prueba el procesamiento por lotes concurrente con Parallel.ForEach produce resultados correctos sin condiciones de carrera
  • Confirme que la aplicación se inicia y se inicializa correctamente con la clave de licencia de IronBarcode en lugar del contexto de Scandit.

Principales ventajas de migrar a IronBarcode

Eliminación del sobrecarga de la canalización de la cámara: Eliminar la secuencia de inicialización DataCaptureContext elimina la gestión de cámara con estado, las transiciones de estado asincrónicas y las API de cámara específicas de la plataforma del código del servidor. El código resultante es más sencillo, más corto y no presenta limitaciones de plataforma que impidan su implementación en Linux, en contenedores Docker o en entornos de computación sin servidor.

Procesamiento directo de PDF: La extracción nativa de códigos de barras de PDF elimina la dependencia de una biblioteca de renderizado de PDF independiente, la complejidad técnica del proceso de conversión de página a imagen y el coste adicional de licencia de dicha dependencia. Los documentos PDF de varias páginas se procesan en una sola llamada a un método, y los resultados, indexados por página, están disponibles de inmediato.

API síncrona sin estado: El modelo de valor de retorno directo reemplaza los patrones de devolución de llamada controlados por eventos con código secuencial estándar. El manejo de errores, el registro y el procesamiento posterior se integran de forma natural con la arquitectura de la aplicación existente sin necesidad de gestión de suscripciones a eventos ni coordinación de máquinas de estados asíncronas.

Precios transparentes publicados: Los niveles de licencia perpetua, listados públicamente a 749 $, 1499 $ y 2999 $, permiten que las propuestas de presupuesto, las comparaciones entre proveedores y los procesos de adquisición se lleven a cabo sin un ciclo de ventas. El coste de la licencia se puede determinar antes de escribir una sola línea de código de integración.

Compatibilidad total con la nube y los contenedores: la API sin estado e independiente del hardware de IronBarcode se ejecuta sin modificaciones en Azure Functions, AWS Lambda, contenedores Docker en Linux y cualquier otro entorno informático donde esté disponible el entorno de ejecución .NET . Para su implementación en estos entornos, no se requiere simulación de cámara, soluciones alternativas para dependencias de hardware ni configuración específica de la plataforma.

Detección automática de formato: La eliminación de las declaraciones EnableSymbologies significa que los documentos entrantes con formatos de código de barras inesperados se manejan correctamente sin cambios en el código. Cuando cambia el conjunto de formatos presentes en los documentos entrantes (nuevos proveedores, nuevos formatos de etiquetas, nuevos tipos de documentos), IronBarcode gestiona automáticamente los nuevos formatos.

Por favor notaScandit es una marca registrada de su respectivo propietario. Este sitio no está afiliado, respaldado ni patrocinado por Scandit. Todos los nombres de producto, logotipos y marcas son propiedad de sus respectivos dueños. Las comparaciones son solo para fines informativos y reflejan información públicamente disponible en el momento de la redacción.

Preguntas Frecuentes

¿Por qué debería migrar de Scandit SDK 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 Scandit 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 Scandit SDK 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 Scandit SDK 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 Scandit SDK?

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 Scandit?

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 Scandit SDK a IronBarcode?

Cambios de nombre comunes: BarcodeValue se convierte en Value, BarcodeType se convierte en Format. Los resultados de IronBarcode también añaden Confidence y PageNumber. Una búsqueda y sustitución en toda la solución gestiona los cambios de nombre en el código de procesamiento de resultados existente.

¿Cómo configuro las licencias de IronBarcode en un proceso CI/CD?

Almacene IRONBARCODE_LICENSE_KEY como un secreto de canalización y asigne IronBarCode.License.LicenseKey en el código de inicio de la aplicación. Un secreto cubre todos los entornos, incluidos los de desarrollo, prueba, montaje y producción.

¿Admite IronBarcode la generación de códigos QR con estilos personalizados?

Sí. QRCodeWriter.CreateQrCode() admite colores personalizados mediante ChangeBarCodeColor(), incrustación de logotipos mediante AddBrandLogo(), niveles de corrección de errores configurables y múltiples formatos de salida, incluidos PNG, JPG, PDF y stream.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame