Ir para o conteúdo do rodapé
VíDEOS

Como ler códigos de barras de imagens GIF e TIFF de várias páginas em C#

Migrando do SDK Scanbot para IronBarcode

Este guia foi escrito para equipes de desenvolvimento .NET que estão migrando o processamento de códigos de barras do SDK Scanbot para o IronBarcode em cenários de servidor, desktop ou baseados em arquivos expandidos. Não se trata de uma substituição direta: o SDK Scanbot é um componente de digitalização por câmera para dispositivos móveis, enquanto o IronBarcode é uma biblioteca para processamento de arquivos e documentos. A migração é uma mudança de escopo motivada por requisitos que o modelo baseado apenas em câmeras não consegue atender. As equipes que substituem uma interface de usuário de digitalização por câmera móvel em tempo real sem adicionar outros requisitos devem avaliar se a migração é apropriada antes de prosseguir.

Para equipes que começaram a usar o Scanbot para um aplicativo móvel MAUI e agora precisam de processamento de código de barras em ASP.NET Core, uma versão para desktop ou um pipeline de documentos, a migração mecânica é simples. A principal mudança é substituir ScanbotSDKMain.Barcode.StartScannerAsync(configuration) por BarcodeReader.Read(source), onde source é um caminho de arquivo, um fluxo, um array de bytes ou um PDF.

Por que migrar do SDK da Scanbot?

Requisitos de processamento do lado do servidor: o SDK Scanbot não compila em ASP.NET Core, aplicativos de console, Azure Functions ou qualquer projeto que não seja MAUI. Quando o aplicativo móvel requer um servidor complementar que também processe códigos de barras — extraindo-os de PDFs carregados ou validando valores de códigos de barras em documentos recebidos — o Scanbot não consegue ultrapassar essa barreira. IronBarcode funciona em todos esses contextos com a mesma API BarcodeReader.Read().

Suporte para Desktop MAUI: O pacote do Scanbot tem como alvo net10.0-android e net10.0-ios. Um projeto MAUI que adiciona net10.0-windows ou net10.0-maccatalyst ao seu TargetFrameworks falhará em compilar os alvos de desktop porque o pacote Scanbot não fornece assemblies para essas plataformas. O IronBarcode oferece suporte ao MAUI para Windows e macOS, além de iOS e Android, o que significa que o mesmo pacote funciona em um projeto MAUI multiplataforma sem exclusões específicas de plataforma ou referências condicionais.

Fluxos de trabalho de documentos PDF: Não há BarcodeScanner.Read(filePath) no Scanbot. Quando um fluxo de trabalho evolui para incluir a leitura de códigos de barras de documentos enviados, arquivos de imagens digitalizadas ou faturas em PDF, a arquitetura do Scanbot não consegue acomodá-lo. O IronBarcode lê PDFs e imagens diretamente, e cada resultado contém o número da página em que o código de barras foi encontrado.

Previsibilidade do modelo de preços: A Scanbot utiliza uma taxa fixa anual. Para algumas organizações, a renovação anual é o gatilho para avaliar alternativas — particularmente quando o escopo do projeto cresceu para incluir objetivos do servidor ou desktop que estão fora da cobertura do Scanbot. O IronBarcode é uma compra única e perpétua, eliminando a obrigação de renovação anual.

O problema fundamental

O SDK Scanbot requer uma transmissão de vídeo ao vivo da câmera. Quando os requisitos se expandem para além dos dispositivos móveis, não existe um caminho equivalente que supere a dependência 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

O IronBarcode aceita os mesmos tipos de origem — arquivo, fluxo, matriz de bytes ou PDF — em qualquer contexto de projeto:

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

IronBarcode vs Scanbot SDK: Comparação de Recursos

Recurso SDK Scanbot IronBarcode
Entrada a partir do caminho do arquivo Não Sim
Entrada do fluxo Não Sim
Entrada de um array de bytes Não Sim
Extração de código de barras PDF Não Sim
Visor da câmera ao vivo Sim Não (use o MediaPicker)
Geração de código de barras Não Sim
iOS PRINCIPAL Sim Sim
Android MAUI Sim Sim
Windows MAUI Não Sim
macOS MAUI Não Sim
ASP.NET Core Não Sim
Console / Servidor Não Sim
Azure / Lambda / Docker Não Sim
.NET Framework 4.6.2+ Não Sim
Correção de erros de aprendizado de máquina Não Sim
Recuperação de código de barras danificado Não Sim
Detecção automática de formato Sim Sim
Formatos 1D 20+ 30+
formatos 2D QR, DataMatrix, PDF417, Aztec QR, DataMatrix, PDF417, Aztec, MaxiCode
Modelo de licença Taxa fixa anual Uma vez perpétuo
Preços publicados Entre em contato com vendas Sim ($999–$5,999)

Guia rápido: Migração do SDK Scanbot para o IronBarcode

Passo 1: Substitua o pacote NuGet

Remova o pacote Scanbot:

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

Se o projeto usar referências de pacotes condicionais no arquivo .csproj, remova essas entradas também:


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

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

Instale o IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

O IronBarcode está disponível no NuGet e é compatível com .NET 6, 7, 8, 9 e .NET Framework 4.6.2+. Para um projeto MAUI de múltiplos alvos, um único dotnet add package funciona em todos os alvos — não são necessárias referências de pacotes condicionais a plataforma.

Etapa 2: Atualizar Namespaces

Substitua os namespaces do Scanbot pelo namespace do IronBarcode:

// Remove
using ScanbotSDK.MAUI;

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

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

Etapa 3: Inicializar a licença

Remova o bloco de inicialização do Scanbot e substitua-o pela chave de licença do IronBarcode. Adicione a inicialização da licença na inicialização do aplicativo em MauiProgram.cs, App.xaml.cs ou Program.cs, dependendo do tipo de projeto:

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

Exemplos de migração de código

Captura de fotos MAUI

A chamada de leitura do Scanbot abre uma interface de usuário da câmera em tela cheia e retorna quando o usuário lê um código de barras ou cancela a operação. O IronBarcode não oferece uma interface de câmera; a substituição usa o MediaPicker do MAUI para invocar a câmera do sistema, capturar uma foto e passar os bytes da imagem para BarcodeReader.Read().

Abordagem do SDK 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

Abordagem do 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

A mudança na experiência do usuário consiste em visualizar a tela da câmera do sistema em vez do visor integrado do Scanbot com uma sobreposição da região de digitalização. Para aplicações comerciais — inventário, logística, fluxos de trabalho de documentos — a câmera do sistema é adequada. O tutorial do leitor de código de barras .NET MAUI aborda o padrão de integração completo para dispositivos iOS e Android, incluindo o gerenciamento de permissões.

Opções de digitalização e configuração

Os BarcodeScannerScreenConfiguration do Scanbot controlam quais formatos o scanner aceita e como a interface da câmera se parece. Os BarcodeReaderOptions do IronBarcode controlam como a imagem é analisada — velocidade de processamento, detecção de múltiplos códigos de barras e parâmetros semelhantes. Os conceitos de configuração correspondem a diferentes preocupações porque as operações subjacentes são diferentes.

Abordagem do SDK 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

Abordagem do 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

Não é necessário especificar o formato — o IronBarcode detecta automaticamente todos os formatos suportados. Os parâmetros BarcodeReaderOptions que correspondem mais diretamente à configuração do Scanbot são Speed (controla a profundidade do processamento versus desempenho) e ExpectMultipleBarcodes (continua escaneando após a primeira correspondência).

Processamento de PDF no servidor

Este cenário não possui equivalente ao Scanbot. Com o IronBarcode, o mesmo pacote instalado para o aplicativo móvel MAUI pode extrair códigos de barras de PDFs em um endpoint ASP.NET Core do lado do servidor, oferecendo às equipes uma única dependência de código de barras que funciona em ambos os contextos de implantação.

Abordagem do SDK Scanbot:

// SDK 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 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 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

Abordagem do 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 lida com PDFs de várias páginas nativamente — cada resultado possui uma propriedade PageNumber indicando em qual página o código de barras foi encontrado. O guia de extração de código de barras em PDF abrange toda a gama de opções de leitura de PDF, incluindo a seleção de intervalo de páginas e a otimização de desempenho para grandes lotes de documentos.

Processamento em segundo plano do ASP.NET Core

Para fluxos de trabalho em lote, como o Azure Functions ou o Worker Services, que processam documentos PDF arquivados, o IronBarcode fornece a mesma API usada no aplicativo MAUI e no controlador ASP.NET Core .

Abordagem do SDK Scanbot:

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

Abordagem do 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

Referência de mapeamento da API do SDK Scanbot para o IronBarcode

SDK 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() ou 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 Não há equivalente — o enquadramento da imagem é feito pelo MediaPicker.
BarcodeScannerScreenConfiguration.FlashEnabled Não há equivalente — use as opções do MediaPicker.
Entrada necessária da câmera Caminho do arquivo, fluxo, matriz de bytes ou PDF
Somente para iOS e Android MAUI Todas as plataformas .NET e tipos de projeto

Problemas e soluções comuns em migrações

Problema 1: Não existe equivalente ao visor eletrônico

SDK Scanbot: Oferece um visor de câmera em tempo real integrado à experiência de digitalização, com sobreposição da região de digitalização, feedback tátil e detecção contínua de código de barras na transmissão de vídeo ao vivo.

Solução: Use o MediaPicker.CapturePhotoAsync() do MAUI para abrir a câmera do sistema e capturar uma imagem fixa para processamento:

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 aplicações comerciais, a câmera do sistema é adequada. Para aplicativos voltados ao consumidor, nos quais a sobreposição em tempo real é fundamental para a experiência do usuário, avalie se essa mudança na experiência do usuário é aceitável antes de se comprometer com a migração.

Problema 2: Diferenças nas permissões da câmera

SDK Scanbot: O pacote Scanbot lidava com as solicitações de permissão da câmera como parte do fluxo da interface do usuário, portanto, as permissões da câmera eram gerenciadas implicitamente pela inicialização do SDK e pela inicialização do scanner.

Solução: Com MediaPicker, o MAUI lida com as permissões através do mecanismo padrão. Verifique se AndroidManifest.xml inclui a declaração de permissão para a câmera e se Info.plist inclui a chave NSCameraUsageDescription. Essas entradas geralmente estão presentes em modelos de projeto MAUI pré-configurados. Se o aplicativo estava usando apenas o Scanbot para acessar a câmera, confirme se essas entradas do manifesto estão presentes antes de testar:


<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: Erros de compilação do Windows resolvidos

Scanbot SDK: O pacote ScanbotBarcodeSDK.MAUI tem como alvo apenas net10.0-android e net10.0-ios, causando falhas na compilação quando net10.0-windows está presente em TargetFrameworks.

Solução: Remover a referência ao pacote Scanbot resolve a falha na compilação do Windows. O IronBarcode é resolvido corretamente em todos os destinos MAUI sem nenhuma configuração condicional à 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: Alteração do Namespace do Enum Format

Scanbot SDK: Usa valores de enum BarcodeFormat tais como BarcodeFormat.Code128 do namespace ScanbotBarcodeSDK.MAUI.

Solução: IronBarcode usa o enum BarcodeEncoding no namespace IronBarCode. Atualize todas as referências de formato e qualquer código que armazene, compare ou alterne entre valores de enumeração 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

Observe que IronBarcode detecta automaticamente todos os formatos suportados por padrão — a filtragem explícita de formato através de BarcodeReaderOptions só é necessária para otimização de desempenho quando o formato esperado é conhecido de antemão.

Lista de verificação para migração do SDK do Scanbot

Tarefas pré-migração

Realize uma auditoria no código-fonte para identificar todo o uso do SDK 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 os locais de chamada de varredura e indique se estão em código compartilhado, código específico da plataforma ou manipuladores de eventos da interface do usuário.
  • Identificar se alguma página ou fluxo depende do visor em tempo real do Scanbot como principal meio de interação com o usuário.
  • Confirme que entradas de permissão de câmera existem em AndroidManifest.xml e Info.plist
  • Revise o .csproj para quaisquer referências condicionais de pacotes associadas ao Scanbot

Tarefas de atualização de código

  1. Remova o pacote NuGet ScanbotSDK.MAUI
  2. Remova quaisquer entradas condicionais <PackageReference> para Scanbot do .csproj
  3. Instale o pacote NuGet IronBarcode
  4. Substitua using ScanbotSDK.MAUI; por using IronBarCode; em todos os arquivos
  5. Substitua ScanbotSDK.Initialize(...) por IronBarCode.License.LicenseKey = "key" na inicialização da aplicação
  6. Substitua ScanbotSDKMain.Barcode.StartScannerAsync(configuration) por MediaPicker.CapturePhotoAsync() seguido por cópia de fluxo e BarcodeReader.Read(bytes) em fluxos de trabalho de câmera MAUI
  7. Substitua ScanbotSDKMain.Barcode.StartScannerAsync(configuration) por BarcodeReader.Read(filePath) ou BarcodeReader.Read(stream) em contextos de processamento do lado do servidor e de arquivos
  8. Substitua verificações result.Status == OperationResult.Ok por results.Any() ou results.FirstOrDefault() != null
  9. Substitua referências de coleção result.Barcodes pelo valor de retorno de BarcodeReader.Read()
  10. Substitua o acesso à propriedade barcode.Text por result.Value
  11. Substitua os valores de enum BarcodeFormat.* pelos equivalentes BarcodeEncoding.*
  12. Substitua new BarcodeScannerScreenConfiguration() por new BarcodeReaderOptions() onde opções de processamento são necessárias

Testes pós-migração

  • Verifique se a compilação foi bem-sucedida em todas as plataformas de destino do MAUI, incluindo Windows e macOS, se presentes.
  • Teste o fluxo de MediaPicker.CapturePhotoAsync() em um dispositivo iOS físico e um dispositivo Android físico
  • Confirme se os valores dos códigos de barras decodificados pelo IronBarcode correspondem aos valores decodificados anteriormente pelo Scanbot para os mesmos códigos de barras físicos.
  • Teste a extração de PDFs com várias páginas se o projeto incluir fluxos de trabalho de processamento de documentos.
  • Verifique se a detecção de formato cobre todos os tipos de códigos de barras previamente configurados em BarcodeScannerScreenConfiguration.BarcodeFormats
  • Confirme se os endpoints do lado do servidor ou as tarefas em segundo plano produzem resultados corretos nas mesmas amostras de documentos.
  • Verificar se as solicitações de permissão da câmera aparecem corretamente na primeira inicialização no iOS e no Android.

Principais benefícios da migração para o IronBarcode

Pacote unificado para todos os destinos de implantação: o IronBarcode é instalado uma única vez e executado em MAUI mobile, MAUI desktop, ASP.NET Core, Azure Functions, aplicativos de console e aplicativos de desktop Windows. As equipes não precisam mais de dependências de código de barras separadas para diferentes partes do mesmo sistema.

Processamento de PDFs e documentos: O IronBarcode lê códigos de barras de arquivos PDF nativamente, e cada resultado contém o número da página em que foi encontrado. Fluxos de trabalho de documentos que anteriormente eram impossíveis dentro do modelo Scanbot tornam-se operações diretas com BarcodeReader.Read("document.pdf").

Suporte a MAUI para desktops Windows e macOS: Projetos MAUI com múltiplas plataformas, incluindo Windows ou macOS, são compilados sem erros após a remoção do Scanbot. O IronBarcode fornece a mesma API de leitura de código de barras em todos os quatro dispositivos MAUI, eliminando o gerenciamento de dependências condicionais à plataforma que o Scanbot exigia.

Licença perpétua: O modelo de compra única elimina as obrigações de renovação anual. Uma vez licenciado, o IronBarcode pode ser usado indefinidamente no plano adquirido, sem taxas recorrentes. Equipes cujos projetos ultrapassaram a área de cobertura móvel do Scanbot constataram que o modelo de contrato perpétuo se alinha melhor ao planejamento de custos a longo prazo.

Geração de código de barras: O IronBarcode pode gerar códigos de barras em todos os formatos suportados, como arquivos de imagem, fluxos de dados ou conteúdo incorporado. Projetos que precisam tanto de leitura quanto de geração de dados não necessitam mais de uma segunda biblioteca além do Scanbot.

Leitura assistida por aprendizado de máquina: o IronBarcode aplica correção de erros baseada em aprendizado de máquina e recuperação de códigos de barras danificados para imagens complexas do mundo real — baixo contraste, danos parciais, baixa qualidade de impressão — que os algoritmos de detecção padrão não conseguem decodificar. Essa funcionalidade é particularmente relevante para fluxos de trabalho de processamento de documentos onde a qualidade da imagem é variável.

ObserveScanbot SDK é uma marca registrada de seu respectivo proprietário. Este site não é afiliado, endossado ou patrocinado por Scanbot SDK. Todos os nomes de produtos, logotipos e marcas são propriedade de seus respectivos proprietários. As comparações são apenas para fins informativos e refletem informações disponíveis publicamente no momento da redação.

Perguntas frequentes

Por que devo migrar do SDK da Scanbot para o IronBarcode?

Entre os motivos comuns estão a simplificação do licenciamento (removendo a complexidade do SDK e da chave de tempo de execução), a eliminação dos limites de taxa de transferência, a obtenção de suporte nativo para PDF, a melhoria da implantação em Docker/CI/CD e a redução do código repetitivo da API em produção.

Como faço para substituir as chamadas da API do Scanbot pelo IronBarcode?

Substitua o código padrão de criação de instâncias e licenciamento por `IronBarCode.License.LicenseKey = "key"`. Substitua as chamadas de leitura por `BarcodeReader.Read(path)` e as chamadas de gravação por `BarcodeWriter.CreateBarcode(data, encoding)`. Os métodos estáticos não exigem gerenciamento de instâncias.

Quanta alteração de código ocorre ao migrar do SDK da Scanbot para o IronBarcode?

A maioria das migrações resulta em menos linhas de código. O código repetitivo de licenciamento, os construtores de instância e a configuração explícita de formato são removidos. As operações principais de leitura/gravação são mapeadas para equivalentes mais curtos em IronBarcode, com objetos de resultado mais limpos.

Preciso manter o Scanbot SDK e o IronBarcode instalados durante a migração?

Não. A maioria das migrações são substituições diretas, e não operações paralelas. Migre uma classe de serviço por vez, substitua a referência do NuGet e atualize os padrões de instanciação e chamada de API antes de passar para a próxima classe.

Qual é o nome do pacote NuGet para IronBarcode?

O pacote é 'IronBarCode' (com B e C maiúsculos). Instale-o com 'Install-Package IronBarCode' ou 'dotnet add package IronBarCode'. A diretiva using no código é 'using IronBarCode;'.

Como o IronBarcode simplifica a implantação do Docker em comparação com o SDK da Scanbot?

IronBarcode é um pacote NuGet sem arquivos SDK externos ou configuração de licença montada. No Docker, defina a variável de ambiente IRONBARCODE_LICENSE_KEY e o pacote cuidará da validação da licença na inicialização.

O IronBarcode detecta automaticamente todos os formatos de código de barras após a migração do Scanbot?

Sim. O IronBarcode detecta automaticamente a simbologia em todos os formatos suportados. A enumeração explícita de BarcodeTypes não é necessária. Se o formato já for conhecido e o desempenho for importante, o BarcodeReaderOptions permite restringir o espaço de busca como uma otimização.

O IronBarcode consegue ler códigos de barras de PDFs sem uma biblioteca separada?

Sim. O método `BarcodeReader.Read("document.pdf")` processa arquivos PDF nativamente. Os resultados incluem o número da página, o formato, o valor e a confiança de cada código de barras encontrado. Não é necessária nenhuma etapa externa de renderização de PDF.

Como o IronBarcode lida com o processamento paralelo de códigos de barras?

Os métodos estáticos do IronBarcode são sem estado e thread-safe. Use Parallel.ForEach diretamente em listas de arquivos sem gerenciamento de instâncias por thread. BarcodeReaderOptions.MaxParallelThreads controla o orçamento interno de threads.

Quais propriedades de resultado são alteradas ao migrar do SDK Scanbot para o IronBarcode?

Renomeações comuns: BarcodeValue torna-se Value, BarcodeType torna-se Format. Os resultados do IronBarcode também incluem Confidence e PageNumber. Uma função de busca e substituição em toda a solução lida com as renomeações no código de processamento de resultados existente.

Como configuro o licenciamento do IronBarcode em um pipeline de CI/CD?

Armazene IRONBARCODE_LICENSE_KEY como um segredo de pipeline e atribua IronBarCode.License.LicenseKey no código de inicialização do aplicativo. Um único segredo abrange todos os ambientes, incluindo desenvolvimento, teste, homologação e produção.

O IronBarcode suporta a geração de códigos QR com estilos personalizados?

Sim. O método QRCodeWriter.CreateQrCode() suporta cores personalizadas através do método ChangeBarCodeColor(), incorporação de logotipo através do método AddBrandLogo(), níveis configuráveis de correção de erros e múltiplos formatos de saída, incluindo PNG, JPG, PDF e fluxo de dados.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de Suporte Iron

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim