Ir para o conteúdo do rodapé
COMPARAR COM OUTROS COMPONENTES

Spire.Barcode vs IronBarcode: Comparação de bibliotecas de código de barras em C#

ZXing.Net.MAUI vs IronBarcode: Comparação de Código de Barras C# MAUI 2026

ZXing.Net.Maui.Controls v0.7.4. Estável no NuGet, mas ainda pré-1.0. Escaneamento MAUI do Windows não suportado (apenas geração). Autofoco do iPhone 15 Pro relatado como afetado (problema #260). Vazamento de recurso da câmera sem Dispose() (problema #164). Esta é a biblioteca que a maioria dos desenvolvedores .NET MAUI consulta primeiro — e aquela que mais frequentemente revela problemas de produção antes do lançamento de um projeto.

Entendendo o ZXing .NET.MAUI

ZXing .NET.MAUI é uma adaptação para .NET MAUI, mantida pela comunidade, da biblioteca de código de barras ZXing .NET , desenvolvida e publicada por Jon Dick (GitHub: Redth) sob a licença MIT. Ele fornece um controle de câmera XAML, CameraBarcodeReaderView, que incorpora um visor de digitalização de código de barras em tempo real em páginas MAUI. Os desenvolvedores conectam um evento BarcodesDetected para receber resultados de digitalização à medida que a câmera captura quadros. A biblioteca herda todo o mecanismo de formato de código de barras do ZXing.Net, incluindo seu enum BarcodeFormats e o modelo de configuração BarcodeReaderOptions.

O pacote ZXing.Net.Maui.Controls é registrado em MauiProgram.cs via builder.UseBarcodeReader() e é projetado em torno do pipeline de câmera móvel para iOS e Android. A biblioteca não é apoiada por uma organização comercial, não possui SLA (Acordo de Nível de Serviço) e não oferece nenhum nível de suporte pago. Sua versão v0.7.4 é um lançamento estável no NuGet, mas permanece pré-1.0 sob versionamento semântico.

Principais características arquitetônicas do ZXing .NET.MAUI:

  • Status Pré-1.0: O pacote NuGet está na versão v0.7.4 — estável, mas ainda pré-1.0. Alterações na API de versão menor ainda são possíveis antes da 1.0, o ciclo de correção de bugs depende do mantenedor da comunidade e não há contrato de suporte comercial.
  • Escaneamento iOS e Android: A biblioteca é construída em torno de APIs de câmera de plataforma para iOS e Android. O MAUI do Windows suporta apenas geração — o escaneamento de câmera não está implementado. O Mac Catalyst está incluído na lista de frameworks de destino, mas o escaneamento não é oficialmente documentado.
  • Visor Contínuo da Câmera: CameraBarcodeReaderView é um controle de câmera ao vivo que funciona continuamente enquanto a página está visível. Ocupa espaço na tela e requer gerenciamento do ciclo de vida da página.
  • Sem Implementação de Dispose(): O controle não implementa IDisposable. Os recursos da câmera não são liberados formalmente na navegação da página, exigindo uma solução alternativa manual IsDetecting = false em OnDisappearing() (problema do GitHub #164).
  • Problema de Auto-Foco do iPhone 15 Pro: O problema do GitHub #260 documenta que os dispositivos iPhone 15 Pro e Pro Max (identificadores de hardware iPhone16,1 e iPhone16,2) falham em alcançar um foco confiável para a detecção de código de barras. Nenhuma correção programática está atualmente disponível.
  • Problema de Compatibilidade da Câmera Android: O problema do GitHub #275 rastreia falhas de compilação devido a conflitos de compatibilidade com a Camera AndroidX 1.5.0, com uma solução de fixar pacotes da câmera para 1.4.x ou aumentar o projeto minSdkVersion.
  • Herdando a Especificação de Formato ZXing.Net: Cada sessão de digitalização requer declaração explícita de quais valores BarcodeFormats devem ser digitalizados. Os formatos não listados em BarcodeReaderOptions.Formats são silenciosamente ignorados, mesmo quando visíveis no quadro da câmera.
  • Arquitetura exclusiva para câmera: A biblioteca não possui API de entrada de arquivos, API de leitura de fluxos de dados nem capacidade de extração de códigos de barras de PDFs. Toda a digitalização deve ser feita através do visor da câmera em tempo real.

A arquitetura CameraBarcodeReaderView

O controle CameraBarcodeReaderView é o componente central do ZXing.Net.MAUI. Ele é declarado em XAML e configurado através de uma ligação BarcodeReaderOptions. Cada página que o utiliza deve implementar OnAppearing e substituir OnDisappearing para gerenciar o estado IsDetecting:


<ContentPage xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;assembly=ZXing.Net.MAUI.Controls">
    <zxing:CameraBarcodeReaderView
        x:Name="CameraView"
        Options="{Binding ReaderOptions}"
        BarcodesDetected="OnBarcodesDetected" />
</ContentPage>

<ContentPage xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;assembly=ZXing.Net.MAUI.Controls">
    <zxing:CameraBarcodeReaderView
        x:Name="CameraView"
        Options="{Binding ReaderOptions}"
        BarcodesDetected="OnBarcodesDetected" />
</ContentPage>
XML
// Toggling IsDetecting in lifecycle overrides is the documented pattern
protected override void OnDisappearing()
{
    base.OnDisappearing();
    if (CameraView != null)
        CameraView.IsDetecting = false;  // Não IDisposable on the control
}

protected override void OnAppearing()
{
    base.OnAppearing();
    if (CameraView != null)
        CameraView.IsDetecting = true;
}
// Toggling IsDetecting in lifecycle overrides is the documented pattern
protected override void OnDisappearing()
{
    base.OnDisappearing();
    if (CameraView != null)
        CameraView.IsDetecting = false;  // Não IDisposable on the control
}

protected override void OnAppearing()
{
    base.OnAppearing();
    if (CameraView != null)
        CameraView.IsDetecting = true;
}
' Toggling IsDetecting in lifecycle overrides is the documented pattern
Protected Overrides Sub OnDisappearing()
    MyBase.OnDisappearing()
    If CameraView IsNot Nothing Then
        CameraView.IsDetecting = False ' Não IDisposable on the control
    End If
End Sub

Protected Overrides Sub OnAppearing()
    MyBase.OnAppearing()
    If CameraView IsNot Nothing Then
        CameraView.IsDetecting = True
    End If
End Sub
$vbLabelText   $csharpLabel

Cada página de varredura em um aplicativo ZXing .NET.MAUI contém esse código padrão de ciclo de vida. A ausência de IDisposable significa que o estado da câmera deve ser gerido manualmente através do flag IsDetecting em vez do padrão Dispose.

Entendendo o IronBarcode

IronBarcode é uma biblioteca de código de barras .NET com suporte comercial, desenvolvida pela Iron Software. Ele fornece tanto a leitura quanto a geração de códigos de barras através de uma API estática, BarcodeReader.Read(), que aceita bytes de imagem, caminhos de arquivo, fluxos e documentos PDF. Em um contexto MAUI, o IronBarcode emparelha-se com o MediaPicker embutido do MAUI para capturar imagens através da câmera do sistema, processando a imagem resultante após a captura em vez de processar um fluxo contínuo da câmera.

A biblioteca é compatível com todas as plataformas MAUI — iOS, Android, Windows e macOS — através do mesmo pacote e dos mesmos caminhos de código. Nenhum registro de serviço específico para a plataforma é necessário em MauiProgram.cs, nenhum controle de visualização de câmera é incorporado em XAML, e nenhum gerenciamento de ciclo de vida é necessário porque o IronBarcode não mantém o estado de câmera em execução.

Principais características do IronBarcode:

  • Versão comercial estável: Publicada como um pacote NuGet pronto para produção, com suporte comercial, SLA e um cronograma de lançamentos regular.
  • Todas as plataformas MAUI: Suporta alvos MAUI para iOS, Android, Windows e macOS a partir de um único pacote e um único padrão de código.
  • API Sem Estado: BarcodeReader.Read() é uma chamada de método estático. Não há processos em segundo plano executados entre as varreduras, nenhum gancho de ciclo de vida é necessário e nenhum recurso da câmera se acumula durante a navegação entre páginas.
  • Detecção automática de todos os formatos: Detecta automaticamente mais de 50 formatos de código de barras sem a necessidade de uma lista de especificações. Nenhuma configuração é necessária para ler um formato desconhecido.
  • Leitura de arquivos e PDFs: Lê códigos de barras de caminhos de arquivos, matrizes de bytes, fluxos e documentos PDF nativamente, abrangendo cenários que as bibliotecas de câmeras ao vivo não conseguem abordar.
  • Recuperação de códigos de barras danificados com tecnologia de aprendizado de máquina: Aplica modelos de aprendizado de máquina para recuperar códigos de barras de imagens danificadas, parcialmente obscurecidas ou de baixa qualidade, além do que os algoritmos de limiar conseguem alcançar.
  • Geração de código de barras: Gera todos os principais formatos de código de barras 1D e 2D como imagens com tamanho, cor e margem configuráveis.
  • Implantação cruzada: O mesmo pacote é executado em ASP.NET Core, WPF, WinForms, aplicativos de console, Azure Functions e contêineres Docker, juntamente com o MAUI.

Comparação de recursos

A tabela a seguir destaca as principais diferenças entre ZXing .NET.MAUI e IronBarcode:

Recurso ZXing.Net.MAUI IronBarcode
Status da versão Estável mas pré-1.0 (v0.7.4). Lançamento comercial estável
Suporte da plataforma iOS, digitalização Android (apenas geração Windows) iOS, Android, Windows, macOS, servidor
Especificação de formato necessária Sim Não (detecção automática)
Gerenciamento de recursos da câmera Manual (IsDetecting) Não aplicável — sem estado
Extração de código de barras em PDF Não disponível Sim
Licença MIT (gratuito, comunitário) Comercial
Suporte Comercial None Sim

Comparação Detalhada de Recursos

Recurso ZXing.Net.MAUI IronBarcode
Plataforma
iOS PRINCIPAL Sim (problema de foco do iPhone 15 Pro #260) Sim
Android MAUI Sim (problema de construção da Camera 1.5.0 #275) Sim
Windows MAUI Apenas geração — digitalização não implementada Sim
macOS MAUI Mac Catalyst direcionado; digitalização não oficialmente documentada Sim
ASP.NET Core / Servidor Não Sim
WPF / WinForms Não Sim
Azure Functions / Docker Não Sim
.NET Framework 4.6.2+ Não Sim
Leitura
Detecção automática de formato Não — é necessário especificar os formatos. Sim (mais de 50 formatos)
Entrada do caminho do arquivo Somente via ZXing .NET Core Sim
Entrada de fluxo Somente via ZXing .NET Core Sim
Extração de código de barras PDF Não Sim
Recuperação de código de barras danificado Tente com mais afinco, apenas Sim (com tecnologia de aprendizado de máquina)
Integração de câmeras
Controle do visor ao vivo Sim Não (interface do usuário do sistema MediaPicker)
Gestão do ciclo de vida necessária Sim (Está detectando) Não
Implementação de Dispose() Não Não aplicável
Foco automático do iPhone 15 Pro Afetado (problema do GitHub #260) Não aplicável
Geração
Geração de código de barras Sim (via ZXing .NET) Sim
Manutenção
Status da versão Estável mas pré-1.0 (v0.7.4). Pronto para produção
Suporte comercial None Sim
garantia de estabilidade da API Pré-1.0 — mudanças na versão menor possíveis Sim
Licença MIT (grátis) Comercial

Suporte da plataforma

A cobertura de plataforma é uma diferença estrutural entre ZXing .NET.MAUI e IronBarcode, pois as duas bibliotecas são construídas com base em pressupostos fundamentalmente diferentes sobre onde os aplicativos .NET MAUI são executados.

Abordagem ZXing .NET.MAUI

ZXing.Net.MAUI é projetado em torno das APIs de câmera de plataforma para iOS e Android.Windows MAUIsuporta apenas geração de código de barras — digitalização com câmera não está implementada e não está em um roteiro público. Isso reflete a escolha arquitetônica de construir a biblioteca em torno de um controle de visor de câmera ao vivo cujas implementações de plataforma foram escritas apenas para sistemas operacionais móveis.

Um projeto MAUI que mira net8.0-windows10.0.19041.0 não terá funcionalidade de digitalização de código de barras do ZXing.Net.MAUI. Mac Catalyst está presente na lista de frameworks de destino, mas a digitalização nesse destino não está oficialmente documentada. Equipes que iniciam um projeto com alvos somente móveis e posteriormente adicionam um requisito para Windows ou macOS descobrirão que ZXing.Net.MAUI não pode cobrir digitalização nesses alvos. O próprio suporte ao iOS traz um aviso: o problema do GitHub #260 documenta que os dispositivos iPhone 15 Pro e Pro Max são afetados por um problema de foco automático que impede a detecção confiável.

Abordagem do IronBarcode

O IronBarcode é compatível com todas as estruturas de destino do MAUI — iOS, Android, Windows e macOS — a partir do mesmo pacote e do mesmo padrão de código. A abordagem MediaPicker + BarcodeReader.Read() mapeia-se naturalmente para cada plataforma: em dispositivos móveis, MediaPicker.CapturePhotoAsync() aciona a câmera do dispositivo; Não Windows, ele é mapeado para o seletor de arquivos, o que é um comportamento apropriado para um ambiente de desktop. Não é necessário código específico da plataforma, compilação condicional ou registro de serviço da plataforma.

O padrão de código de barras MAUI para desktop, tanto para Windows quanto para macOS, é abrangido pelo mesmo pacote que lida com a leitura em dispositivos móveis. A mesma chamada BarcodeReader.Read() que roda em um dispositivo Android também funciona em um endpoint ASP.NET Core, uma aplicação desktop WinForms ou uma Função Azure — o alvo de implantação não afeta a API.

Integração e ciclo de vida da câmera

As duas bibliotecas adotam posições arquitetônicas opostas sobre como o acesso à câmera funciona em um aplicativo MAUI.

Abordagem ZXing .NET.MAUI

CameraBarcodeReaderView é um controle de câmera persistente incorporado na página XAML. Ele começa a processar os quadros da câmera quando IsDetecting é ajustado para true e para quando é ajustado para false. A ausência de uma implementação Dispose() significa que os recursos da câmera não são liberados através do padrão IDisposable quando o usuário navega para longe. A mitigação documentada é ajustar IsDetecting = false em OnDisappearing() e restaurá-la em OnAppearing():

// ZXing.Net.MAUI: toggle IsDetecting in page lifecycle overrides
protected override void OnDisappearing()
{
    base.OnDisappearing();
    CameraView.IsDetecting = false;
}

protected override void OnAppearing()
{
    base.OnAppearing();
    CameraView.IsDetecting = true;
}
// ZXing.Net.MAUI: toggle IsDetecting in page lifecycle overrides
protected override void OnDisappearing()
{
    base.OnDisappearing();
    CameraView.IsDetecting = false;
}

protected override void OnAppearing()
{
    base.OnAppearing();
    CameraView.IsDetecting = true;
}
' ZXing.Net.MAUI: toggle IsDetecting in page lifecycle overrides
Protected Overrides Sub OnDisappearing()
    MyBase.OnDisappearing()
    CameraView.IsDetecting = False
End Sub

Protected Overrides Sub OnAppearing()
    MyBase.OnAppearing()
    CameraView.IsDetecting = True
End Sub
$vbLabelText   $csharpLabel

Esse padrão deve ser repetido em todas as páginas que contêm um scanner. Aplicações que navegam frequentemente para e de páginas de digitalização podem acumular recursos de câmera que não foram totalmente liberados, o que é acompanhado pelo problema do GitHub #164 ao lado de relatórios de crescimento de memória e inicialização intermitente da câmera no retorno. O problema de auto-foco do iPhone 15 Pro (problema do GitHub #260) é uma preocupação separada dentro da camada de integração da câmera: o visor da câmera exibe o código de barras claramente, mas o sistema de auto-foco não trava com nitidez suficiente para a detecção nos hardwares iPhone16,1 e iPhone16,2. A solução alternativa documentada é instruir o usuário a ajustar manualmente a distância entre o dispositivo e o código de barras.

Abordagem do IronBarcode

O IronBarcode não incorpora um controle de câmera no layout XAML. Em vez disso, a chamada MediaPicker.CapturePhotoAsync() abre a interface da câmera do sistema quando o usuário toca em um botão. A câmera do sistema controla o foco, a exposição e o autofoco de forma independente. Quando o usuário confirma a captura, a imagem resultante é passada para BarcodeReader.Read() como uma matriz de bytes:

// 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());
    foreach (var barcode in results)
        Console.WriteLine($"{barcode.Format}: {barcode.Value}");
}

// Não OnAppearing or OnDisappearing needed — no camera state to manage
// 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());
    foreach (var barcode in results)
        Console.WriteLine($"{barcode.Format}: {barcode.Value}");
}

// Não OnAppearing or OnDisappearing needed — no camera state to manage
Imports IronBarCode
Imports System.IO
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())
            For Each barcode In results
                Console.WriteLine($"{barcode.Format}: {barcode.Value}")
            Next
        End Using
    End Using
End Sub

' Não OnAppearing or OnDisappearing needed — no camera state to manage
$vbLabelText   $csharpLabel

O tutorial do leitor de código de barras .NET MAUI aborda a configuração completa do projeto para esse padrão, incluindo a configuração de permissões para iOS e Android. Como não há uma visualização de câmera persistente, não há recursos para liberar, nenhum estado para alternar e nenhum código repetitivo de ciclo de vida para manter entre as páginas.

Especificação de formato

A forma como uma biblioteca lida com a detecção do formato de código de barras tem consequências diretas para a confiabilidade da leitura em aplicações reais.

Abordagem ZXing .NET.MAUI

O ZXing .NET.MAUI herda os requisitos de especificação de formato do ZXing .NET . Antes que a digitalização comece, o desenvolvedor deve preencher BarcodeReaderOptions.Formats com uma máscara de bits dos valores de enum BarcodeFormats que devem ser detectados. Os formatos não incluídos nesta lista não serão detectados — silenciosamente, sem erro ou aviso:

// ZXing.Net.MAUI: formats must be declared explicitly
// Formats not listed here are not detected
ReaderOptions = new BarcodeReaderOptions
{
    Formats = BarcodeFormats.QRCode |
              BarcodeFormats.Code128 |
              BarcodeFormats.Ean13 |
              BarcodeFormats.UpcA,
    TryHarder = true,
    AutoRotate = true
};
// ZXing.Net.MAUI: formats must be declared explicitly
// Formats not listed here are not detected
ReaderOptions = new BarcodeReaderOptions
{
    Formats = BarcodeFormats.QRCode |
              BarcodeFormats.Code128 |
              BarcodeFormats.Ean13 |
              BarcodeFormats.UpcA,
    TryHarder = true,
    AutoRotate = true
};
' ZXing.Net.MAUI: formats must be declared explicitly
' Formats not listed here are not detected
ReaderOptions = New BarcodeReaderOptions With {
    .Formats = BarcodeFormats.QRCode Or
               BarcodeFormats.Code128 Or
               BarcodeFormats.Ean13 Or
               BarcodeFormats.UpcA,
    .TryHarder = True,
    .AutoRotate = True
}
$vbLabelText   $csharpLabel

Se um usuário apontar a câmera para um GS1 DataBar, um código Azteca, um MaxiCode ou qualquer formato que não foi declarado nas opções, a digitalização não retorna resultado sem gerar um erro. A câmera renderiza o código de barras e nenhum resultado é retornado para a aplicação. Em um ambiente controlado — um armazém onde cada item possui uma etiqueta com o código 128 — isso é administrável. Em implantações onde os formatos de código de barras são determinados por fornecedores externos, clientes ou sistemas de terceiros, a ausência de um caminho de fallback se torna um problema recorrente de suporte.

Abordagem do IronBarcode

O IronBarcode realiza a detecção automática de formatos em todos os formatos suportados, sem qualquer configuração prévia. BarcodeReader.Read() analisa a imagem e retorna resultados para cada código de barras que identifica, independentemente do formato. Nenhuma lista BarcodeReaderOptions é necessária:

// IronBarcode: no format specification needed
// All 50+ formats detected automatically
var results = BarcodeReader.Read(imageBytes);
foreach (var barcode in results)
    Console.WriteLine($"{barcode.Format}: {barcode.Value}");
// IronBarcode: no format specification needed
// All 50+ formats detected automatically
var results = BarcodeReader.Read(imageBytes);
foreach (var barcode in results)
    Console.WriteLine($"{barcode.Format}: {barcode.Value}");
Imports IronBarcode

' IronBarcode: no format specification needed
' All 50+ formats detected automatically
Dim results = BarcodeReader.Read(imageBytes)
For Each barcode In results
    Console.WriteLine($"{barcode.Format}: {barcode.Value}")
Next
$vbLabelText   $csharpLabel

Caso seja necessário otimizar o desempenho em um cenário controlado onde apenas um formato é esperado, as dicas de formato podem ser fornecidas opcionalmente — mas nunca são obrigatórias para a detecção correta. Um código de barras em um formato não previsto pelo desenvolvedor ainda será detectado e retornado.

Processamento de arquivos e PDFs

Além da leitura de códigos de barras em tempo real por câmeras, muitos fluxos de trabalho de produção envolvem a leitura de documentos armazenados — faturas de envio, ingressos digitais, imagens carregadas e anexos em PDF.

Abordagem ZXing .NET.MAUI

ZXing .NET.MAUI é uma biblioteca de controle de câmeras. Não possui uma API para leitura de códigos de barras a partir de caminhos de arquivos, arrays de bytes passados ​​diretamente do armazenamento ou documentos PDF. O controle CameraBarcodeReaderView requer uma transmissão de câmera ao vivo; Não existe um método estático que aceite um caminho de arquivo e retorne resultados de código de barras. Equipes que precisam ler códigos de barras de PDFs carregados, sistemas de gerenciamento de documentos ou filas de processamento de imagens em lote não podem usar o ZXing .NET.MAUI para esses cenários e devem introduzir uma biblioteca separada.

Abordagem do IronBarcode

O IronBarcode lê códigos de barras de qualquer fonte através do mesmo método BarcodeReader.Read(). Ele aceita caminhos de arquivos, matrizes de bytes, fluxos e documentos PDF. A análise de PDFs é nativa — o IronBarcode processa páginas PDF diretamente, sem uma etapa intermediária de rasterização:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Read barcodes from a PDF file
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}");

// Read from a user-selected file using MAUI FilePicker
var file = await FilePicker.PickAsync();
if (file != null)
{
    var fileResults = BarcodeReader.Read(file.FullPath);
    foreach (var result in fileResults)
        ResultLabel.Text += $"\n{result.Format}: {result.Value}";
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Read barcodes from a PDF file
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}");

// Read from a user-selected file using MAUI FilePicker
var file = await FilePicker.PickAsync();
if (file != null)
{
    var fileResults = BarcodeReader.Read(file.FullPath);
    foreach (var result in fileResults)
        ResultLabel.Text += $"\n{result.Format}: {result.Value}";
}
Imports IronBarCode
Imports Microsoft.Maui.Storage

' Read barcodes from a PDF file
Dim results = BarcodeReader.Read("invoice.pdf")
For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}")
Next

' Read from a user-selected file using MAUI FilePicker
Dim file = Await FilePicker.PickAsync()
If file IsNot Nothing Then
    Dim fileResults = BarcodeReader.Read(file.FullPath)
    For Each result In fileResults
        ResultLabel.Text &= $"\n{result.Format}: {result.Value}"
    Next
End If
$vbLabelText   $csharpLabel

O fluxo de trabalho completo de leitura de códigos de barras em PDF, incluindo documentos com várias páginas e formatos de código de barras mistos em diferentes páginas, está documentado no guia de leitura de códigos de barras em PDF . Isso abrange faturas de envio, bilhetes digitais, fluxos de trabalho de gerenciamento de documentos e cenários de processamento em lote que a arquitetura baseada apenas em câmera do ZXing .NET.MAUI não consegue atender.

Referência de Mapeamento de API

ZXing.Net.MAUI IronBarcode Notas
builder.UseBarcodeReader() Não é necessário Remover de MauiProgram.cs
xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;..." Não é necessário Remover declaração de namespace XAML
<zxing:CameraBarcodeReaderView> Substituir por <Button> + MediaPicker Mudança arquitetônica
Options="{Binding ReaderOptions}" Não é necessário Não é necessário nenhum objeto de opções.
BarcodesDetected="OnBarcodesDetected" Valor de retorno BarcodeReader.Read() Evento → método de retorno
new BarcodeReaderOptions { Formats = BarcodeFormats.X \| ... } Não é necessário A detecção automática substitui isso.
BarcodeDetectionEventArgs e IEnumerable<BarcodeResult> Modelo de entrega de resultados diferente
e.Results Valor de retorno de BarcodeReader.Read()
barcode.Value result.Value Mesmo nome de propriedade
barcode.Format result.Format Mesmo nome de propriedade
BarcodeFormats.QRCode BarcodeEncoding.QRCode Renomear Enum
BarcodeFormats.Code128 BarcodeEncoding.Code128 Renomear Enum
BarcodeFormats.Ean13 BarcodeEncoding.EAN13 Renomear Enum
CameraView.IsDetecting = false (OnDesaparecendo) Não é necessário — remova o método. IronBarcode não possui estado.
CameraView.IsDetecting = true (OnAparecendo) Não é necessário — remova o método. IronBarcode não possui estado.
Sem API de entrada de arquivos BarcodeReader.Read("path/to/file.png") Nova capacidade
Sem API para PDF BarcodeReader.Read("document.pdf") Nova capacidade

Quando as equipes consideram migrar do ZXing .NET.MAUI para o IronBarcode.

Diversos cenários concretos motivam a decisão de avaliar o IronBarcode como substituto do ZXing .NET.MAUI. Essas são condições de nível de projeto e de nível de produto, não preferências de implementação.

Requisitos do MAUI do Windows

O fator mais comum que leva a uma reavaliação é a adição de um alvo MAUI para Windows a um projeto que começou como exclusivo para iOS e Android. As equipes da MAUI frequentemente começam com versões focadas em dispositivos móveis e expandem para versões desktop à medida que os requisitos evoluem. Quando essa expansão ocorrer, o ZXing .NET.MAUI não oferece uma solução — a plataforma Windows não está implementada e não consta em um roteiro público. A equipe terá que aceitar que a leitura de código de barras não estará disponível no Windows ou substituir a biblioteca. Como a substituição envolve uma mudança estrutural no padrão de digitalização, as equipes normalmente fazem a alteração para todas as plataformas ao mesmo tempo.

Compatibilidade com hardware da geração atual

O problema de foco automático do iPhone 15 Pro (problema do GitHub #260) é uma consideração real para qualquer equipe que esteja lançando um scanner de código de barras de produção para usuários de iOS. O iPhone 15 Pro e Pro Max são comuns no segmento de consumidores que espera uma experiência de aplicação polida, e uma solução alternativa que pede aos usuários para ajustar sua distância de um código de barras é uma regressão notável de UX em comparação com o hardware do iPhone mais antigo. Equipes que encontram esse problema no QA, ou recebem relatórios de suporte de usuários do iPhone 15 Pro, enfrentam uma escolha entre permanecer em uma biblioteca onde nenhuma correção está atualmente disponível ou migrar para uma abordagem que não seja afetada pelo modelo de foco da visualização da câmera.

Processamento de Arquivos e Documentos

Os requisitos de leitura de código de barras raramente se limitam à captura de imagens ao vivo por câmera. Aplicações que começam como leitores de inventário frequentemente se expandem para incluir a leitura de códigos de barras de PDFs carregados, o processamento de faturas de envio ou o gerenciamento de ingressos digitais anexados a e-mails. O ZXing .NET.MAUI não possui uma API para nenhum desses cenários. Quando um requisito de produto que envolve a leitura de um código de barras de um arquivo ou documento entra na lista de pendências, as equipes que usam ZXing .NET.MAUI precisam introduzir uma biblioteca separada para lidar com isso. Se a equipe já utiliza o IronBarcode para algum desses cenários baseados em arquivos, consolidar a digitalização da câmera MAUI na mesma biblioteca torna-se o próximo passo natural.

Requisitos de estabilidade de produção

A designação pré-1.0 na v0.7.4 — embora o próprio pacote seja um lançamento estável do NuGet — tem implicações para equipes sujeitas a análise de composição de software, auditorias de dependência ou processos de aprovação interna. Alguns ambientes corporativos exigem que dependências de produção tenham um lançamento estável 1.0+ ou um contrato de suporte comercial, ou ambos. ZXing.Net.MAUI é mantido pela comunidade e pré-1.0, o que se encaixa em ferramentas internas e protótipos, mas adiciona etapas de revisão em aplicações voltadas para o cliente onde o scanner de código de barras é o fluxo de trabalho principal. A ausência de um nível de suporte pago significa que qualquer bug crítico depende da disponibilidade do mantenedor da comunidade.

Considerações Comuns de Migração

A mudança estrutural do ZXing .NET.MAUI para o IronBarcode envolve três substituições técnicas específicas que afetam todos os arquivos do código-fonte que participam da leitura de código de barras.

Padrão CameraBarcodeReaderView para MediaPicker

O controle XAML CameraBarcodeReaderView e sua declaração de namespace xmlns:zxing são removidos completamente. Em cada arquivo XAML que continha uma visualização do scanner, a substituição é um controle Button que invoca MediaPicker.CapturePhotoAsync() em seu manipulador Clicked. O modelo orientado a eventos — onde os resultados chegam através de BarcodesDetected — é substituído pela leitura do valor de retorno de BarcodeReader.Read() diretamente no manipulador assíncrono.

Detecção de remoção do ciclo de vida

Cada substituição de OnAppearing e OnDisappearing que existe apenas para alternar CameraView.IsDetecting pode ser deletada. Se essas substituições contiverem outra lógica de ciclo de vida da página, as linhas IsDetecting são removidas e a lógica restante é preservada. Não existe um equivalente do IronBarcode para IsDetecting porque não há estado de câmera persistente para gerenciar entre navegações de página.

Remoção do registro UseBarcodeReader()

O ZXing.Net.MAUI requer uma chamada única builder.UseBarcodeReader() em MauiProgram.cs para registrar seus serviços de câmera da plataforma. O IronBarcode não requer qualquer registro MauiProgram.cs. A linha UseBarcodeReader() é removida, e a importação do namespace using ZXing.Net.Maui; que a suporta é removida junto com a desinstalação do pacote.

Funcionalidades adicionais do IronBarcode

Além dos cenários abordados nesta comparação, o IronBarcode oferece funcionalidades de código de barras que vão muito além do que um controle MAUI baseado em câmera pode oferecer:

  • Digitalização de Código de Barras no iOS: Suporte completo ao iOS PRINCIPAL usando o mesmo padrão MediaPicker + BarcodeReader.Read() — sem gerenciamento de câmera específico para a plataforma, sem listas de formatos e sem boilerplate de ciclo de vida.
  • Leitura de código de barras no Android : Leitura de código de barras noAndroid MAUIatravés da mesma API unificada, sem os problemas de dependência do Camera 1.5.0 presentes no ZXing .NET.MAUI.
  • Geração de código de barras: Gera códigos QR, Code128, EAN-13, PDF417, Data Matrix e todos os principais formatos como imagens com tamanho, cor, zona de silêncio e nível de correção de erros configuráveis.
  • Processamento em lote: Lê todos os códigos de barras de todas as páginas de um PDF com várias páginas ou de um diretório de imagens em uma única chamada, retornando os metadados do número da página com cada resultado.
  • Implantação no Lado do Servidor: O mesmo pacote NuGet e a mesma chamada BarcodeReader.Read() rodam em endpoints do ASP.NET Core, Funções Azure e contêineres Docker — um único pacote cobre tanto o cliente móvel quanto o backend do servidor.
  • Recuperação de códigos de barras danificados: Modelos de aprendizado de máquina recuperam códigos de barras de etiquetas fisicamente danificadas, impressões de baixo contraste e imagens capturadas em ângulos subótimos que os decodificadores padrão baseados em limiar não conseguem processar.
  • Geração de código de barras estilizado: Gera códigos de barras com cores personalizadas, logotipos incorporados, cantos arredondados e texto de anotação — além da saída monocromática simples disponível através do ZXing .NET.

Compatibilidade com .NET e Preparação para o Futuro

A IronBarcode mantém um desenvolvimento ativo com atualizações regulares voltadas para as versões atuais do .NET . A biblioteca suporta .NET 8, .NET 9 e acompanha os lançamentos subsequentes do .NET. Ela também suporta .NET Framework 4.6.2 e posterior para ambientes de aplicativos legados. ZXing.Net.MAUI, como um pacote pré-1.0 mantido pela comunidade, não tem compromissos formais em relações aos cronogramas de suporte às versões do .NET. Para projetos MAUI — que estão atrelados ao ciclo de lançamentos do .NET — a disponibilidade de uma biblioteca com manutenção ativa e suporte comercial, que acompanhe cada versão do .NET , é relevante para o planejamento a longo prazo.

Conclusão

ZXing .NET.MAUI e IronBarcode representam respostas diferentes para o mesmo problema — leitura de códigos de barras em um aplicativo .NET MAUI — mas partem de premissas arquitetônicas diferentes. O ZXing .NET.MAUI incorpora um visor de câmera ao vivo diretamente na página XAML, funcionando como um controle de câmera persistente que dispara eventos à medida que os quadros são analisados.IronBarcode trata a câmera como um dispositivo de captura acessado pelo sistema MediaPicker, processando uma imagem estática após a captura em vez de um fluxo contínuo. Essa diferença de abordagem determina praticamente todo o resto: cobertura da plataforma, complexidade do ciclo de vida, tratamento de formatos e escopo de implantação.

ZXing.Net.MAUI é genuinamente apropriado para perfis de projetos específicos: aplicações iOS e Android, protótipos e ferramentas internas, equipes que conhecem seus formatos de código de barras com antecedência, projetos sem requisito de digitalização paraWindows MAUIe situações onde a licença MIT de custo zero é o fator decisivo. Para um scanner de inventário de armazém em um conjunto fixo de dispositivos Android que leem etiquetas Code128, o ZXing .NET.MAUI funcionará corretamente. O status pré-1.0, o problema do iPhone 15 Pro e o código de boilerplate de ciclo de vida são concessões reais que valem a pena aceitar no contexto certo.

O IronBarcode é apropriado quando o escopo do projeto é mais amplo: alvos MAUI para Windows ou macOS, formatos de código de barras desconhecidos ou variáveis ​​de sistemas externos, requisitos que incluem a leitura de códigos de barras de PDFs ou arquivos carregados, necessidades de estabilidade de nível de produção ou processamento de código de barras no servidor, além da leitura em dispositivos móveis. A licença comercial é um investimento que cobre suporte, manutenção e atualizações de compatibilidade entre as versões do .NET . A API sem estado elimina uma categoria de bugs — vazamentos de recursos da câmera, erros de estado do ciclo de vida — que o ZXing .NET.MAUI exige que os desenvolvedores evitem manualmente.

A avaliação honesta é que nenhuma das duas bibliotecas está universalmente correta. ZXing .NET.MAUI conquista sua posição como a primeira biblioteca que a maioria dos desenvolvedores MAUI experimenta por ser gratuita, familiar e de rápida integração. Os problemas que acarreta são reais, mas só importam em determinadas condições de projeto. Quando essas condições estão presentes — um requisito do Windows, hardware de iPhone de última geração, digitalização baseada em arquivos ou padrões de estabilidade de produção — o IronBarcode atende a todas elas. A escolha depende de se as restrições específicas do projeto o colocam dentro ou fora dos cenários em que as limitações conhecidas do ZXing .NET.MAUI se tornam impeditivas.

Perguntas frequentes

O que é ZXing.Net.MAUI?

ZXing.Net.MAUI é uma biblioteca .NET para geração e leitura de códigos de barras em aplicações C#. É uma das diversas alternativas que os desenvolvedores avaliam ao selecionar uma solução de código de barras para projetos .NET.

Quais são as principais diferenças entre ZXing.Net.MAUI e IronBarcode?

O IronBarcode utiliza uma API estática e sem estado, que não requer gerenciamento de instâncias, enquanto o ZXing.Net.MAUI normalmente exige a criação e configuração de uma instância antes do uso. O IronBarcode também oferece suporte nativo a PDF, detecção automática de formato e licenciamento com chave única em todos os ambientes.

O IronBarcode é mais fácil de licenciar do que o ZXing.Net.MAUI?

O IronBarcode utiliza uma única chave de licença que abrange tanto o ambiente de desenvolvimento quanto o de produção. Isso simplifica os pipelines de CI/CD e as configurações do Docker em comparação com sistemas de licenciamento que separam as chaves do SDK das chaves de tempo de execução.

O IronBarcode é compatível com todos os formatos de código de barras suportados pelo ZXing.Net.MAUI?

O IronBarcode suporta mais de 30 simbologias de código de barras, incluindo QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 e muitas outras. A detecção automática de formato significa que não é necessária a enumeração explícita de formatos.

O IronBarcode suporta leitura nativa de códigos de barras em PDF?

Sim. O IronBarcode lê códigos de barras diretamente de arquivos PDF usando BarcodeReader.Read("document.pdf") sem a necessidade de uma biblioteca de renderização de PDF separada. Os resultados por página incluem número da página, formato do código de barras, valor e nível de confiança.

Como o IronBarcode lida com o processamento em lote em comparação com o ZXing.Net.MAUI?

Os métodos estáticos do IronBarcode são sem estado e naturalmente seguros para threads, permitindo o uso direto de Parallel.ForEach sem gerenciamento de instâncias por thread. Não há limite de throughput em nenhum plano de preços.

Quais versões do .NET o IronBarcode suporta?

O IronBarcode é compatível com o .NET Framework 4.6.2+, .NET Core 3.1 e .NET 5, 6, 7, 8 e 9 em um único pacote NuGet. As plataformas suportadas incluem Windows x64/x86, Linux x64 e macOS x64/ARM.

Como faço para instalar o IronBarcode em um projeto .NET?

Instale o IronBarcode via NuGet: execute 'Install-Package IronBarCode' no Console do Gerenciador de Pacotes ou 'dotnet add package IronBarCode' na CLI. Não são necessários instaladores de SDK ou arquivos de tempo de execução adicionais.

Posso avaliar o IronBarcode antes de comprar, ao contrário do ZXing.Net.MAUI?

Sim. O modo de avaliação do IronBarcode retorna os valores completos dos códigos de barras decodificados — apenas as imagens de saída geradas recebem uma marca d'água. Você pode testar a precisão de leitura em seus próprios documentos antes de efetuar a compra.

Qual é a diferença de preço entre ZXing.Net.MAUI e IronBarcode?

O IronBarcode tem um preço inicial de US$ 749 para uma licença perpétua de desenvolvedor único, que abrange desenvolvimento e produção. Detalhes sobre preços e opções de volume estão disponíveis na página de licenciamento do IronBarcode. Não há necessidade de uma licença de tempo de execução separada.

É simples migrar do ZXing.Net.MAUI para o IronBarcode?

A migração do ZXing.Net.MAUI para o IronBarcode envolve principalmente a substituição de chamadas de API baseadas em instâncias por métodos estáticos do IronBarcode, a remoção de código repetitivo de licenciamento e a atualização dos nomes das propriedades de resultado. A maioria das migrações consiste em reduzir o código em vez de adicioná-lo.

O IronBarcode gera códigos QR com logotipos?

Sim. O método `QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")` incorpora uma imagem da marca em um código QR nativamente, com correção de erros configurável. Códigos QR coloridos também são suportados através do método `ChangeBarCodeColor()`.

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