Saltar al pie de página
VIDEOS

Cómo Leer Códigos de Barras de Imágenes Gif y Tiff de Múltiples Páginas en C#

Migrating from SDK de Scanbot to IronBarcode

Esta guía está escrita para equipos de desarrollo .NET que migran el procesamiento de códigos de barras del SDK de Scanbot a IronBarcode para escenarios basados ​​en archivos, ya sean del lado del servidor, de escritorio o ampliados. No se trata de una sustitución directa: SDK de Scanbot es un componente de escaneo para cámaras móviles, e IronBarcode es una biblioteca de procesamiento de archivos y documentos. La migración supone un cambio de alcance motivado por requisitos que el modelo basado únicamente en cámaras no puede satisfacer. Los equipos que reemplacen una interfaz de usuario de escaneo de cámara móvil en tiempo real sin agregar otros requisitos deben evaluar si la migración es apropiada antes de proceder.

Para los equipos que comenzaron con Scanbot para una aplicación móvil MAUI y ahora necesitan el procesamiento de códigos de barras en ASP.NET Core, una compilación de escritorio o un flujo de trabajo de documentos, la migración mecánica es sencilla. El cambio principal es reemplazar ScanbotSDKMain.Barcode.StartScannerAsync(configuration) con BarcodeReader.Read(source), donde source es una ruta de archivo, un flujo, un arreglo de bytes o un PDF.

¿Por qué migrar desde Scanbot SDK?

Requisitos de procesamiento del lado del servidor: SDK de Scanbot no se compila en ASP.NET Core, aplicaciones de consola, Azure Functions ni en ningún proyecto que no sea MAUI. Cuando la aplicación móvil requiere un servidor que también procese códigos de barras (extrayéndolos de archivos PDF cargados o validando los valores de los códigos de barras en los documentos entrantes), Scanbot no puede cruzar ese límite. IronBarcode funciona en todos esos contextos con la misma API BarcodeReader.Read().

Soporte de MAUI para escritorio: El paquete de Scanbot está dirigido a net10.0-android y net10.0-ios. Un proyecto MAUI que añade net10.0-windows o net10.0-maccatalyst a su TargetFrameworks fallará al construir los objetivos de escritorio porque el paquete de Scanbot no proporciona ensamblados para esas plataformas. IronBarcode es compatible con Windows y macOS MAUI, además de iOS y Android, lo que significa que el mismo paquete funciona en un proyecto MAUI multiplataforma sin exclusiones específicas de la plataforma ni referencias condicionales.

Flujos de trabajo de documentos PDF: No hay BarcodeScanner.Read(filePath) en Scanbot. Cuando un flujo de trabajo evoluciona para incluir la lectura de códigos de barras procedentes de documentos subidos, archivos de imágenes escaneadas o facturas en formato PDF, la arquitectura de Scanbot no puede adaptarse a ello. IronBarcode lee directamente archivos PDF e imágenes, y cada resultado incluye el número de página en la que se encontró el código de barras.

Previsibilidad del modelo de precios: Scanbot utiliza una tarifa plana anual. Para algunas organizaciones, la renovación anual es el desencadenante para evaluar alternativas, especialmente cuando el alcance del proyecto ha crecido para incluir objetivos del lado del servidor o de escritorio que están fuera de la cobertura de Scanbot. IronBarcode es una compra única y perpetua, que elimina la obligación de renovación anual.

El problema fundamental

El SDK de Scanbot requiere una transmisión de video en directo. Cuando los requisitos se extienden más allá de los dispositivos móviles, no existe una ruta equivalente a través de la dependencia existente:

// Scanbot SDK: camera-only — no file or server equivalent exists
var configuration = new BarcodeScannerScreenConfiguration
{
    BarcodeFormats = new[] { BarcodeFormat.Code128, BarcodeFormat.QrCode }
};

// This call requires iOS or Android hardware and a MAUI camera UI
// It cannot be redirected to a file path, stream, or server context
var result = await ScanbotSDKMain.Barcode.StartScannerAsync(configuration);
// Scanbot SDK: camera-only — no file or server equivalent exists
var configuration = new BarcodeScannerScreenConfiguration
{
    BarcodeFormats = new[] { BarcodeFormat.Code128, BarcodeFormat.QrCode }
};

// This call requires iOS or Android hardware and a MAUI camera UI
// It cannot be redirected to a file path, stream, or server context
var result = await ScanbotSDKMain.Barcode.StartScannerAsync(configuration);
Imports System.Threading.Tasks

' Scanbot SDK: camera-only — no file or server equivalent exists
Dim configuration As New BarcodeScannerScreenConfiguration With {
    .BarcodeFormats = {BarcodeFormat.Code128, BarcodeFormat.QrCode}
}

' This call requires iOS or Android hardware and a MAUI camera UI
' It cannot be redirected to a file path, stream, or server context
Dim result = Await ScanbotSDKMain.Barcode.StartScannerAsync(configuration)
$vbLabelText   $csharpLabel

IronBarcode acepta los mismos tipos de origen (archivo, flujo de datos, matriz de bytes o PDF) en cualquier contexto de proyecto:

// IronBarcode: the same call works in MAUI, ASP.NET Core, console, WPF, Azure Functions
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

// From a file — works on any platform
var results = BarcodeReader.Read("invoice.pdf");
foreach (var result in results)
    Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.BarcodeType})");
// IronBarcode: the same call works in MAUI, ASP.NET Core, console, WPF, Azure Functions
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

// From a file — works on any platform
var results = BarcodeReader.Read("invoice.pdf");
foreach (var result in results)
    Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.BarcodeType})");
Imports IronBarCode

' IronBarcode: the same call works in MAUI, ASP.NET Core, console, WPF, Azure Functions
License.LicenseKey = "YOUR-LICENSE-KEY"

' From a file — works on any platform
Dim results = BarcodeReader.Read("invoice.pdf")
For Each result In results
    Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.BarcodeType})")
Next
$vbLabelText   $csharpLabel

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

Característica SDK de Scanbot IronBarcode
Entrada desde la ruta del archivo No
Entrada desde el flujo No
Entrada desde una matriz de bytes No
Extracción de códigos de barras PDF No
Visor de la cámara en directo No (usar MediaPicker)
Generación de BarCodes No
iOS MAUI
Android MAUI
Windows MAUI No
macOS MAUI No
ASP.NET Core No
Consola/Servidor No
Azure / Lambda / Docker No
.NET Framework 4.6.2+ No
Corrección de errores de aprendizaje automático No
Recuperación de códigos de barras dañados No
Detección de formato automático
Formatos 1D Más de 20 años 30+
formatos 2D QR, DataMatrix, PDF417, Aztec QR, DataMatrix, PDF417, Aztec, MaxiCode
Modelo de licencia Tarifa plana anual Perpetuo de una sola vez
Precios publicados Contacto de ventas Sí ($999–$5,999)

Inicio rápido: Migración del SDK de Scanbot a IronBarcode

Paso 1: Sustituir el paquete NuGet

Elimine el paquete Scanbot:

dotnet remove package ScanbotBarcodeSDK.MAUI
dotnet remove package ScanbotBarcodeSDK.MAUI
SHELL

Si el proyecto utiliza referencias de paquete condicionales en el archivo .csproj, elimine también esas entradas:


<PackageReference Include="ScanbotBarcodeSDK.MAUI" Version="8.0.0" />

<PackageReference Include="ScanbotBarcodeSDK.MAUI" Version="8.0.0" />
XML

Instalar IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

IronBarcode está disponible en NuGet y es compatible con .NET 6, 7, 8, 9 y .NET Framework 4.6.2+. Para un proyecto multi-objetivo de MAUI, un solo dotnet add package funciona en todos los objetivos: no se necesitan referencias de paquetes condicionales a la plataforma.

Paso 2: Actualizar los espacios de nombres

Reemplace los espacios de nombres de Scanbot con el espacio de nombres de IronBarcode :

// Remove
using ScanbotSDK.MAUI;

// Add
using IronBarCode;
// Remove
using ScanbotSDK.MAUI;

// Add
using IronBarCode;
Imports IronBarCode
$vbLabelText   $csharpLabel

Paso 3: Inicializar licencia

Elimine el bloque de inicialización de Scanbot y sustitúyalo por la clave de licencia de IronBarcode . Agregue la inicialización de la licencia al inicio de la aplicación en MauiProgram.cs, App.xaml.cs o Program.cs dependiendo del tipo de proyecto:

// Remove this
ScanbotSDKMain.Initialize(new SdkConfiguration
{
    LicenseKey = "YOUR-SCANBOT-LICENSE-KEY",
    LoggingEnabled = false
});

// Add this — one line, placed once at startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Remove this
ScanbotSDKMain.Initialize(new SdkConfiguration
{
    LicenseKey = "YOUR-SCANBOT-LICENSE-KEY",
    LoggingEnabled = false
});

// Add this — one line, placed once at startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Remove this
ScanbotSDKMain.Initialize(New SdkConfiguration With {
    .LicenseKey = "YOUR-SCANBOT-LICENSE-KEY",
    .LoggingEnabled = False
})

' Add this — one line, placed once at startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Ejemplos de migración de código

Captura de fotos de MAUI

La función de escaneo de Scanbot abre una interfaz de cámara a pantalla completa y regresa cuando el usuario escanea un código de barras o cancela la operación. IronBarcode no proporciona una interfaz de usuario para la cámara; el reemplazo utiliza MediaPicker de MAUI para invocar la cámara del sistema, capturar una foto y pasar los bytes de la imagen a BarcodeReader.Read().

Enfoque del SDK de Scanbot:

using ScanbotSDK.MAUI;

private async void ScanButton_Clicked(object sender, EventArgs e)
{
    var configuration = new BarcodeScannerScreenConfiguration
    {
        BarcodeFormats = new[]
        {
            BarcodeFormat.Code128,
            BarcodeFormat.QrCode,
            BarcodeFormat.Ean13
        },
        FinderAspectRatio = new AspectRatio(1, 1),
        TopBarBackgroundColor = Colors.DarkBlue
    };

    var result = await ScanbotSDKMain.Barcode.StartScannerAsync(configuration);

    if (result.Status == OperationResult.Ok)
    {
        foreach (var barcode in result.Barcodes)
            ResultLabel.Text = $"{barcode.Format}: {barcode.Text}";
    }
}
using ScanbotSDK.MAUI;

private async void ScanButton_Clicked(object sender, EventArgs e)
{
    var configuration = new BarcodeScannerScreenConfiguration
    {
        BarcodeFormats = new[]
        {
            BarcodeFormat.Code128,
            BarcodeFormat.QrCode,
            BarcodeFormat.Ean13
        },
        FinderAspectRatio = new AspectRatio(1, 1),
        TopBarBackgroundColor = Colors.DarkBlue
    };

    var result = await ScanbotSDKMain.Barcode.StartScannerAsync(configuration);

    if (result.Status == OperationResult.Ok)
    {
        foreach (var barcode in result.Barcodes)
            ResultLabel.Text = $"{barcode.Format}: {barcode.Text}";
    }
}
Imports ScanbotSDK.MAUI

Private Async Sub ScanButton_Clicked(sender As Object, e As EventArgs)
    Dim configuration = New BarcodeScannerScreenConfiguration With {
        .BarcodeFormats = New BarcodeFormat() {
            BarcodeFormat.Code128,
            BarcodeFormat.QrCode,
            BarcodeFormat.Ean13
        },
        .FinderAspectRatio = New AspectRatio(1, 1),
        .TopBarBackgroundColor = Colors.DarkBlue
    }

    Dim result = Await ScanbotSDKMain.Barcode.StartScannerAsync(configuration)

    If result.Status = OperationResult.Ok Then
        For Each barcode In result.Barcodes
            ResultLabel.Text = $"{barcode.Format}: {barcode.Text}"
        Next
    End If
End Sub
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

// NuGet: dotnet add package IronBarcode
using IronBarCode;

private async void ScanButton_Clicked(object sender, EventArgs e)
{
    var photo = await MediaPicker.CapturePhotoAsync();
    if (photo == null) return;

    using var stream = await photo.OpenReadAsync();
    using var ms = new MemoryStream();
    await stream.CopyToAsync(ms);

    var results = BarcodeReader.Read(ms.ToArray());
    var first = results.FirstOrDefault();
    ResultLabel.Text = first != null
        ? $"{first.BarcodeType}: {first.Value}"
        : "No barcode found";
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

private async void ScanButton_Clicked(object sender, EventArgs e)
{
    var photo = await MediaPicker.CapturePhotoAsync();
    if (photo == null) return;

    using var stream = await photo.OpenReadAsync();
    using var ms = new MemoryStream();
    await stream.CopyToAsync(ms);

    var results = BarcodeReader.Read(ms.ToArray());
    var first = results.FirstOrDefault();
    ResultLabel.Text = first != null
        ? $"{first.BarcodeType}: {first.Value}"
        : "No barcode found";
}
Imports IronBarCode
Imports System.IO
Imports System.Linq
Imports System.Threading.Tasks

Private Async Sub ScanButton_Clicked(sender As Object, e As EventArgs)
    Dim photo = Await MediaPicker.CapturePhotoAsync()
    If photo Is Nothing Then Return

    Using stream = Await photo.OpenReadAsync()
        Using ms As New MemoryStream()
            Await stream.CopyToAsync(ms)

            Dim results = BarcodeReader.Read(ms.ToArray())
            Dim first = results.FirstOrDefault()
            ResultLabel.Text = If(first IsNot Nothing, $"{first.BarcodeType}: {first.Value}", "No barcode found")
        End Using
    End Using
End Sub
$vbLabelText   $csharpLabel

El cambio en la experiencia de usuario consiste en que el usuario ve la pantalla de la cámara del sistema en lugar del visor integrado de Scanbot con una superposición de la región de escaneo. Para aplicaciones empresariales (inventario, logística, flujos de trabajo de documentos), la cámara del sistema es adecuada. El tutorial del escáner de códigos de barras .NET MAUI cubre el patrón de integración completo para dispositivos iOS y Android, incluyendo la gestión de permisos.

Opciones y configuración de escaneo

El BarcodeScannerScreenConfiguration de Scanbot controla cuáles formatos acepta el escáner y cómo se ve la interfaz de la cámara. El BarcodeReaderOptions de IronBarcode controla cómo se analiza la imagen: velocidad de procesamiento, detección de múltiples códigos de barras y parámetros similares. Los conceptos de configuración se corresponden con diferentes aspectos porque las operaciones subyacentes son diferentes.

Enfoque del SDK de Scanbot:

var configuration = new BarcodeScannerScreenConfiguration
{
    BarcodeFormats = new[] { BarcodeFormat.Code128, BarcodeFormat.QrCode },
    FinderAspectRatio = new AspectRatio(1, 1),
    FlashEnabled = false,
    OrientationLockMode = OrientationLockMode.Portrait
};

var result = await ScanbotSDKMain.Barcode.StartScannerAsync(configuration);

if (result.Status == OperationResult.Ok)
{
    foreach (var barcode in result.Barcodes)
        Console.WriteLine($"{barcode.Format}: {barcode.Text}");
}
var configuration = new BarcodeScannerScreenConfiguration
{
    BarcodeFormats = new[] { BarcodeFormat.Code128, BarcodeFormat.QrCode },
    FinderAspectRatio = new AspectRatio(1, 1),
    FlashEnabled = false,
    OrientationLockMode = OrientationLockMode.Portrait
};

var result = await ScanbotSDKMain.Barcode.StartScannerAsync(configuration);

if (result.Status == OperationResult.Ok)
{
    foreach (var barcode in result.Barcodes)
        Console.WriteLine($"{barcode.Format}: {barcode.Text}");
}
Imports System
Imports System.Threading.Tasks

Dim configuration As New BarcodeScannerScreenConfiguration With {
    .BarcodeFormats = {BarcodeFormat.Code128, BarcodeFormat.QrCode},
    .FinderAspectRatio = New AspectRatio(1, 1),
    .FlashEnabled = False,
    .OrientationLockMode = OrientationLockMode.Portrait
}

Dim result = Await ScanbotSDKMain.Barcode.StartScannerAsync(configuration)

If result.Status = OperationResult.Ok Then
    For Each barcode In result.Barcodes
        Console.WriteLine($"{barcode.Format}: {barcode.Text}")
    Next
End If
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

using IronBarCode;

// Format detection is automatic — BarcodeReaderOptions controls processing behavior
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = false
};

// Combined with the MediaPicker capture pattern
var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;

using var photoStream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await photoStream.CopyToAsync(ms);

var results = BarcodeReader.Read(ms.ToArray(), options);
foreach (var result in results)
    Console.WriteLine($"{result.BarcodeType}: {result.Value}");
using IronBarCode;

// Format detection is automatic — BarcodeReaderOptions controls processing behavior
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = false
};

// Combined with the MediaPicker capture pattern
var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;

using var photoStream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await photoStream.CopyToAsync(ms);

var results = BarcodeReader.Read(ms.ToArray(), options);
foreach (var result in results)
    Console.WriteLine($"{result.BarcodeType}: {result.Value}");
Imports IronBarCode
Imports System.IO

' Format detection is automatic — BarcodeReaderOptions controls processing behavior
Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = False
}

' Combined with the MediaPicker capture pattern
Dim photo = Await MediaPicker.CapturePhotoAsync()
If photo Is Nothing Then Return

Using photoStream = Await photo.OpenReadAsync()
    Using ms As New MemoryStream()
        Await photoStream.CopyToAsync(ms)

        Dim results = BarcodeReader.Read(ms.ToArray(), options)
        For Each result In results
            Console.WriteLine($"{result.BarcodeType}: {result.Value}")
        Next
    End Using
End Using
$vbLabelText   $csharpLabel

No es necesario especificar el formato: IronBarcode detecta automáticamente todos los formatos compatibles. Los parámetros de BarcodeReaderOptions que corresponden más directamente a la configuración de Scanbot son Speed (controla exhaustividad del procesamiento frente al rendimiento) y ExpectMultipleBarcodes (continúa escaneando después de la primera coincidencia).

Procesamiento de PDF del lado del servidor

Este escenario no tiene equivalente en Scanbot. Con IronBarcode, el mismo paquete instalado para la aplicación móvil MAUI puede extraer códigos de barras de archivos PDF en un punto final ASP.NET Core del lado del servidor, lo que proporciona a los equipos una única dependencia de códigos de barras que funciona en ambos contextos de implementación.

Enfoque del SDK de Scanbot:

// SDK de Scanbot cannot be used here — the package does not compile
// in ASP.NET Core, Azure Functions, console apps, or any non-MAUI project.
// There is no server-side Scanbot equivalent for this endpoint.
// SDK de Scanbot cannot be used here — the package does not compile
// in ASP.NET Core, Azure Functions, console apps, or any non-MAUI project.
// There is no server-side Scanbot equivalent for this endpoint.
' SDK de Scanbot cannot be used here — the package does not compile
' in ASP.NET Core, Azure Functions, console apps, or any non-MAUI project.
' There is no server-side Scanbot equivalent for this endpoint.
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

// NuGet: dotnet add package IronBarcode
// Works in ASP.NET Core, console apps, Azure Functions, Docker — the same package as MAUI
using IronBarCode;

[HttpPost("extract-barcodes")]
public async Task<IActionResult> ExtractBarcodes(IFormFile file)
{
    using var ms = new MemoryStream();
    await file.CopyToAsync(ms);

    // Reads all barcodes from all pages of the uploaded PDF
    var results = BarcodeReader.Read(ms.ToArray());
    var values = results.Select(r => new
    {
        r.Value,
        Format = r.Format.ToString(),
        r.PageNumber
    });

    return Ok(values);
}
// NuGet: dotnet add package IronBarcode
// Works in ASP.NET Core, console apps, Azure Functions, Docker — the same package as MAUI
using IronBarCode;

[HttpPost("extract-barcodes")]
public async Task<IActionResult> ExtractBarcodes(IFormFile file)
{
    using var ms = new MemoryStream();
    await file.CopyToAsync(ms);

    // Reads all barcodes from all pages of the uploaded PDF
    var results = BarcodeReader.Read(ms.ToArray());
    var values = results.Select(r => new
    {
        r.Value,
        Format = r.Format.ToString(),
        r.PageNumber
    });

    return Ok(values);
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc
Imports System.IO
Imports System.Threading.Tasks

<HttpPost("extract-barcodes")>
Public Async Function ExtractBarcodes(file As IFormFile) As Task(Of IActionResult)
    Using ms As New MemoryStream()
        Await file.CopyToAsync(ms)

        ' Reads all barcodes from all pages of the uploaded PDF
        Dim results = BarcodeReader.Read(ms.ToArray())
        Dim values = results.Select(Function(r) New With {
            .Value = r.Value,
            .Format = r.Format.ToString(),
            .PageNumber = r.PageNumber
        })

        Return Ok(values)
    End Using
End Function
$vbLabelText   $csharpLabel

IronBarcode maneja PDFs de múltiples páginas de forma nativa: cada resultado lleva una propiedad PageNumber indicando en cuál página se encontró el código de barras. La guía de extracción de códigos de barras de PDF abarca todas las opciones de lectura de PDF, incluida la selección de rangos de páginas y la optimización del rendimiento para grandes lotes de documentos.

Procesamiento en segundo plano de ASP.NET Core

Para flujos de trabajo por lotes, como Azure Functions o Worker Services que procesan documentos PDF archivados, IronBarcode proporciona la misma API que se utiliza en la aplicación MAUI y en el controlador ASP.NET Core .

Enfoque del SDK de Scanbot:

// SDK de Scanbot does not support this deployment context.
// The package will not compile in Azure Functions or Worker Services.
// SDK de Scanbot does not support this deployment context.
// The package will not compile in Azure Functions or Worker Services.
' SDK de Scanbot does not support this deployment context.
' The package will not compile in Azure Functions or Worker Services.
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Azure Function or Worker Service batch processing
public void ProcessInvoiceBatch(IEnumerable<string> filePaths)
{
    foreach (var filePath in filePaths)
    {
        var results = BarcodeReader.Read(filePath);
        foreach (var result in results)
            Console.WriteLine($"File: {filePath} | Page {result.PageNumber}: {result.Value} ({result.BarcodeType})");
    }
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Azure Function or Worker Service batch processing
public void ProcessInvoiceBatch(IEnumerable<string> filePaths)
{
    foreach (var filePath in filePaths)
    {
        var results = BarcodeReader.Read(filePath);
        foreach (var result in results)
            Console.WriteLine($"File: {filePath} | Page {result.PageNumber}: {result.Value} ({result.BarcodeType})");
    }
}
Imports IronBarCode

Public Sub ProcessInvoiceBatch(filePaths As IEnumerable(Of String))
    For Each filePath In filePaths
        Dim results = BarcodeReader.Read(filePath)
        For Each result In results
            Console.WriteLine($"File: {filePath} | Page {result.PageNumber}: {result.Value} ({result.BarcodeType})")
        Next
    Next
End Sub
$vbLabelText   $csharpLabel

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

SDK de Scanbot IronBarcode
ScanbotSDKMain.Initialize(new SdkConfiguration { LicenseKey = "..." }) IronBarCode.License.LicenseKey = "key"
new BarcodeScannerScreenConfiguration() new BarcodeReaderOptions()
ScanbotSDKMain.Barcode.StartScannerAsync(configuration) BarcodeReader.Read(path / stream / bytes)
result.Status == OperationResult.Ok results.Any() o results.FirstOrDefault() != null
result.Barcodes Valor de retorno de BarcodeReader.Read()
barcode.Format result.BarcodeType (IronBarCode.BarcodeEncoding)
barcode.Text result.Value
BarcodeFormat.Code128 BarcodeEncoding.Code128
BarcodeFormat.QrCode BarcodeEncoding.QRCode
BarcodeFormat.Ean13 BarcodeEncoding.EAN13
BarcodeScannerScreenConfiguration.FinderAspectRatio No existe un equivalente: el encuadre de la imagen lo gestiona MediaPicker.
BarcodeScannerScreenConfiguration.FlashEnabled No existe un equivalente; utilice las opciones de MediaPicker.
Entrada requerida por la cámara Ruta de archivo, flujo, matriz de bytes o PDF
Solo para iOS y Android MAUI Todas las plataformas y tipos de proyectos .NET

Problemas comunes de migración y soluciones

Problema 1: No hay equivalente al visor en directo

SDK de Scanbot: Proporciona un visor de cámara en tiempo real integrado en la experiencia de escaneo, con una superposición de la región de escaneo, retroalimentación háptica y detección continua de códigos de barras en la transmisión de video en vivo.

Solución: Use MediaPicker.CapturePhotoAsync() de MAUI para abrir la cámara del sistema y capturar una imagen fija para su procesamiento:

var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;

using var stream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);

var results = BarcodeReader.Read(ms.ToArray());
var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;

using var stream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);

var results = BarcodeReader.Read(ms.ToArray());
Imports System.IO

Dim photo = Await MediaPicker.CapturePhotoAsync()
If photo Is Nothing Then Return

Using stream = Await photo.OpenReadAsync()
    Using ms As New MemoryStream()
        Await stream.CopyToAsync(ms)

        Dim results = BarcodeReader.Read(ms.ToArray())
    End Using
End Using
$vbLabelText   $csharpLabel

Para aplicaciones empresariales, la cámara del sistema es adecuada. En el caso de las aplicaciones para consumidores donde la superposición en tiempo real es fundamental para la experiencia del usuario, evalúe si este cambio en la experiencia de usuario es aceptable antes de comprometerse con la migración.

Problema 2: Diferencias en los permisos de la cámara

SDK de Scanbot: El paquete Scanbot gestionaba las solicitudes de permisos de la cámara como parte de su flujo de interfaz de usuario, por lo que los permisos de la cámara se gestionaban implícitamente mediante la inicialización del SDK y el lanzamiento del escáner.

Solución: Con MediaPicker, MAUI maneja permisos a través del mecanismo estándar. Verifique que AndroidManifest.xml incluya la declaración de permiso para la cámara y que Info.plist incluya la clave NSCameraUsageDescription. Estas entradas suelen estar presentes en las plantillas de proyectos MAUI con andamiaje. Si la aplicación utilizaba anteriormente solo Scanbot para acceder a la cámara, confirme que estas entradas del manifiesto estén presentes antes de realizar la prueba:


<uses-permission android:name="android.permission.CAMERA" />

<key>NSCameraUsageDescription</key>
<string>This app uses the camera to scan barcodes.</string>

<uses-permission android:name="android.permission.CAMERA" />

<key>NSCameraUsageDescription</key>
<string>This app uses the camera to scan barcodes.</string>
XML

Problema 3: Se corrigieron los errores de compilación de Windows.

Scanbot SDK: El paquete ScanbotBarcodeSDK.MAUI está dirigido solo a net10.0-android y net10.0-ios, causando fallas de construcción cuando net10.0-windows está presente en TargetFrameworks.

Solución: Eliminar la referencia al paquete Scanbot resuelve el error de compilación en Windows. IronBarcode se resuelve correctamente en todos los destinos MAUI sin necesidad de configuración condicional de la plataforma:

# Verify the build succeeds on all targets after removing Scanbot and adding IronBarcode
dotnet build -f net10.0-windows10.0.19041.0
dotnet build -f net10.0-ios
dotnet build -f net10.0-android
# Verify the build succeeds on all targets after removing Scanbot and adding IronBarcode
dotnet build -f net10.0-windows10.0.19041.0
dotnet build -f net10.0-ios
dotnet build -f net10.0-android
SHELL

Problema 4: Cambio de espacio de nombres de enumeración de formato

Scanbot SDK: Usa valores de enumeración BarcodeFormat como BarcodeFormat.Code128 del espacio de nombres ScanbotBarcodeSDK.MAUI.

Solución: IronBarcode utiliza la enumeración BarcodeEncoding en el espacio de nombres IronBarCode. Actualiza todas las referencias de formato y cualquier código que almacene, compare o cambie según los valores de enumeración de formato:

// Before (Scanbot)
BarcodeFormat.Code128
BarcodeFormat.QrCode
BarcodeFormat.Ean13

// After (IronBarcode)
BarcodeEncoding.Code128
BarcodeEncoding.QRCode
BarcodeEncoding.EAN13
// Before (Scanbot)
BarcodeFormat.Code128
BarcodeFormat.QrCode
BarcodeFormat.Ean13

// After (IronBarcode)
BarcodeEncoding.Code128
BarcodeEncoding.QRCode
BarcodeEncoding.EAN13
' Before (Scanbot)
BarcodeFormat.Code128
BarcodeFormat.QrCode
BarcodeFormat.Ean13

' After (IronBarcode)
BarcodeEncoding.Code128
BarcodeEncoding.QRCode
BarcodeEncoding.EAN13
$vbLabelText   $csharpLabel

Tenga en cuenta que IronBarcode detecta automáticamente todos los formatos compatibles por defecto: el filtrado explícito de formatos a través de BarcodeReaderOptions solo es necesario para optimización de rendimiento cuando se conoce el formato esperado de antemano.

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

Tareas previas a la migración

Audita el código fuente para identificar todos los usos del SDK de Scanbot:

grep -rn "ScanbotSDK.Initialize" --include="*.cs" .
grep -rn "BarcodeScannerScreenConfiguration" --include="*.cs" .
grep -rn "ScanbotSDKMain.Barcode.StartScannerAsync" --include="*.cs" .
grep -rn "result\.Barcodes" --include="*.cs" .
grep -rn "barcode\.Format" --include="*.cs" .
grep -rn "barcode\.Text" --include="*.cs" .
grep -rn "OperationResult\.Ok" --include="*.cs" .
grep -rn "using ScanbotBarcodeSDK" --include="*.cs" .
grep -rn "BarcodeFormat\." --include="*.cs" .
grep -rn "ScanbotSDK.Initialize" --include="*.cs" .
grep -rn "BarcodeScannerScreenConfiguration" --include="*.cs" .
grep -rn "ScanbotSDKMain.Barcode.StartScannerAsync" --include="*.cs" .
grep -rn "result\.Barcodes" --include="*.cs" .
grep -rn "barcode\.Format" --include="*.cs" .
grep -rn "barcode\.Text" --include="*.cs" .
grep -rn "OperationResult\.Ok" --include="*.cs" .
grep -rn "using ScanbotBarcodeSDK" --include="*.cs" .
grep -rn "BarcodeFormat\." --include="*.cs" .
SHELL
  • Documente todos los puntos de llamada de escaneo e indique si se encuentran en código compartido, código específico de la plataforma o controladores de eventos de la interfaz de usuario.
  • Identificar si alguna página o flujo depende del visor en tiempo real de Scanbot como interacción principal del usuario.
  • Confirme que existan entradas de permiso de cámara en AndroidManifest.xml y Info.plist
  • Revise .csproj para cualquier referencia de paquete condicional asociada a Scanbot

Tareas de actualización de código

  1. Elimine el paquete NuGet ScanbotSDK.MAUI
  2. Elimine cualquier entrada condicional <PackageReference> para Scanbot del .csproj
  3. Instale el paquete NuGet IronBarcode
  4. Reemplace using ScanbotSDK.MAUI; con using IronBarCode; en todos los archivos
  5. Reemplace ScanbotSDK.Initialize(...) con IronBarCode.License.LicenseKey = "key" al inicio de la aplicación
  6. Reemplace ScanbotSDKMain.Barcode.StartScannerAsync(configuration) con MediaPicker.CapturePhotoAsync() seguido de copia de flujo y BarcodeReader.Read(bytes) en flujos de cámara MAUI
  7. Reemplace ScanbotSDKMain.Barcode.StartScannerAsync(configuration) con BarcodeReader.Read(filePath) o BarcodeReader.Read(stream) en contextos de procesamiento de archivos y del lado del servidor
  8. Reemplace las verificaciones result.Status == OperationResult.Ok con results.Any() o results.FirstOrDefault() != null
  9. Reemplace las referencias de colección result.Barcodes con el valor de retorno de BarcodeReader.Read()
  10. Reemplace el acceso a la propiedad barcode.Text con result.Value
  11. Reemplace los valores de enumeración BarcodeFormat.* con los equivalentes BarcodeEncoding.*
  12. Reemplace new BarcodeScannerScreenConfiguration() con new BarcodeReaderOptions() donde se necesiten opciones de procesamiento

Pruebas posteriores a la migración

  • Verificar que la compilación se realice correctamente en todas las plataformas de destino de MAUI, incluidas Windows y macOS, si están presentes.
  • Pruebe el flujo MediaPicker.CapturePhotoAsync() en un dispositivo iOS físico y un dispositivo Android físico
  • Confirme que los valores de los códigos de barras decodificados por IronBarcode coinciden con los valores previamente decodificados por Scanbot para los mismos códigos de barras físicos.
  • Pruebe la extracción de archivos PDF de varias páginas si el proyecto incluye flujos de trabajo de procesamiento de documentos.
  • Verifique que la detección de formatos cubra todos los tipos de códigos de barras previamente configurados en BarcodeScannerScreenConfiguration.BarcodeFormats
  • Confirme que los puntos finales del servidor o los trabajos en segundo plano producen resultados correctos en las mismas muestras de documentos.
  • Verificar que las solicitudes de permiso de la cámara aparezcan correctamente la primera vez que se inicie en iOS y Android.

Principales ventajas de migrar a IronBarcode

Paquete unificado para todos los entornos de implementación: IronBarcode se instala una sola vez y se ejecuta en MAUI móvil, MAUI de escritorio, ASP.NET Core, Azure Functions, aplicaciones de consola y aplicaciones de escritorio de Windows. Los equipos ya no necesitan dependencias de códigos de barras separadas para diferentes partes del mismo sistema.

Procesamiento de PDF y documentos: IronBarcode lee códigos de barras de archivos PDF de forma nativa, y cada resultado incluye el número de página en la que se encontró. Los flujos de trabajo de documentos que antes eran imposibles dentro del modelo de Scanbot se convierten en operaciones simples con BarcodeReader.Read("document.pdf").

Compatibilidad con MAUI para Windows y macOS: Los proyectos MAUI multiplataforma que incluyen Windows o macOS se compilan sin errores después de eliminar Scanbot. IronBarcode proporciona la misma API de lectura de códigos de barras en los cuatro destinos de MAUI, eliminando la gestión de dependencias condicionada a la plataforma que requería Scanbot.

Propiedad de la licencia perpetua: El modelo de compra única elimina las obligaciones de renovación anual. Una vez obtenida la licencia, IronBarcode se puede utilizar de forma indefinida en el nivel adquirido sin cuotas recurrentes. Los equipos cuyo alcance de proyecto se extendió más allá de la cobertura móvil de Scanbot descubren que el modelo perpetuo se ajusta mejor a la planificación de costos a largo plazo.

Generación de códigos de barras: IronBarcode puede generar códigos de barras en todos los formatos compatibles, como archivos de imagen, flujos de datos o contenido incrustado. Los proyectos que requieren tanto lectura como generación ya no necesitan una segunda biblioteca además de Scanbot.

Lectura asistida por aprendizaje automático: IronBarcode aplica corrección de errores basada en aprendizaje automático y recuperación de códigos de barras dañados para imágenes difíciles del mundo real (bajo contraste, daños parciales, mala calidad de impresión) que los algoritmos de detección estándar no logran decodificar. Esta capacidad es especialmente relevante para los flujos de trabajo de procesamiento de documentos donde la calidad de la imagen es variable.

Por favor notaScanbot SDK es una marca registrada de su respectivo propietario. Este sitio no está afiliado, respaldado ni patrocinado por Scanbot SDK. 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 Scanbot 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 Scanbot 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 Scanbot 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 tener instalados Scanbot SDK 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 la implementación de Docker en comparación con Scanbot 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 Scanbot?

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