Barcode4.NET vs IronBarcode: Comparação de bibliotecas de código de barras em C#
BarcodeScanning.Native.Maui vs IronBarcode: Controle de Câmera vs SDK Completo de Código de Barras
BarcodeScanning.Native.Maui é um plugin de câmera com escopo para aplicativos MAUI. Se seu aplicativo processa arquivos carregados ou lê códigos de barras de PDFs, ele não é projetado para esse caso de uso. O pacote se descreve como uma "biblioteca de leitura de códigos de barras para .NET MAUI" e, na prática, é um controle CameraView que dispara um evento quando um código de barras entra em um quadro de câmera ao vivo. Esse é o conjunto completo de funcionalidades. Esta comparação examina a diferença arquitetônica entre uma biblioteca de controle de câmera e um SDK completo de código de barras, ajudando as equipes a entender onde cada ferramenta se encaixa.
Entendendo a leitura de código de barras.MAUI
BarcodeScanning.Native.Maui encapsula as APIs nativas de detecção de códigos de barras da câmera no iOS/macOS (framework Vision da Apple), Android (Google ML Kit) e Windows (ZXingCpp, adicionado na versão 3.0.1) em um controle CameraView MAUI. Um desenvolvedor insere o controle em uma página XAML, configura um manipulador de eventos e a biblioteca dispara esse evento sempre que um código de barras é detectado na transmissão ao vivo da câmera. Todo o modelo de interação é do tipo "câmera entra, evento sai" — não há outro caminho.
A biblioteca é de código aberto e gratuita sob a licença MIT. Seu objetivo de design é estreito e explícito: fornecer detecção de código de barras por câmera ao vivo para aplicativos MAUI com a menor superfície de API possível. Ele alcança esse objetivo através da delegação para motores nativos por plataforma, em vez de implementar seu próprio motor de decodificação.
Principais características arquitetônicas do BarcodeScanning.Native.Maui:
- Entrada somente por câmera: A biblioteca aceita apenas quadros de câmera ao vivo. Não há
ReadFromFile(), não háReadFromBytes(), não háReadFromStream(), e nenhum métodoReadFromPdf()em qualquer lugar na API pública. - Destinos apenas MAUI: A biblioteca suporta os destinos MAUI — iOS, Android, Windows (desde 3.0.1, via ZXingCpp) e macOS Catalyst. Não pode ser usada fora de projetos MAUI (sem ASP.NET, console, WPF ou WinForms).
- Three Different Engines: Apple Vision on iOS/macOS, Google ML Kit on Android, and ZXingCpp on Windows. A cobertura de simbologia e o comportamento de decodificação variam entre os três motores.
- Sem capacidade de geração: BarcodeScanning.Native.Maui lê códigos de barras a partir de frames da câmera. Não consegue gerar códigos de barras em nenhum formato.
- Quirk UPC-A do iOS: O framework Vision da Apple pode retornar 13 dígitos para códigos de barras UPC-A (adicionando um zero à esquerda para corresponder à codificação EAN-13). A biblioteca passa esse valor bruto, e os aplicativos normalizam conforme necessário.
- Confiabilidade do PDF417 no iOS/Android: O rastreador de problemas do GitHub da biblioteca descreve a digitalização do PDF417 como "muito problemática - a maioria das digitalizações nunca ocorre" nos caminhos de código do Vision/ML Kit, que são relevantes para etiquetas de envio, carteiras de motorista e cartões de embarque.
- Superfície Pública Mínima: A API pública consiste em
CameraView,OnDetectionFinished,OnDetectionFinishedEventArg, eBarcodeResultcomDisplayValueeBarcodeFormat. Isso representa a totalidade daquilo com que o código da aplicação interage. - Licença MIT, sem custo: A biblioteca é de uso gratuito, sem taxas de licenciamento.
Padrão de varredura da câmera ao vivo
O padrão completo da API BarcodeScanning.Native.Maui consiste em um controle XAML combinado com um manipulador de eventos C#:
<scanner:CameraView x:Name="CameraView"
OnDetectionFinished="OnBarcodeDetected"
CameraEnabled="True"
BarcodeFormats="All" />
<scanner:CameraView x:Name="CameraView"
OnDetectionFinished="OnBarcodeDetected"
CameraEnabled="True"
BarcodeFormats="All" />
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode != null)
ResultLabel.Text = barcode.DisplayValue;
}
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode != null)
ResultLabel.Text = barcode.DisplayValue;
}
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArg)
Dim barcode = e.BarcodeResults.FirstOrDefault()
If barcode IsNot Nothing Then
ResultLabel.Text = barcode.DisplayValue
End If
End Sub
Este controle oferece aos usuários um visor em tempo real incorporado à página MAUI. A detecção de código de barras é contínua enquanto o feed da câmera está ativo. A UX é bem adaptada para aplicativos de consumo onde "apontar e digitalizar" é a interação principal. A restrição é que esta é a única interação que a biblioteca suporta - requisitos que vão além da detecção ao vivo da câmera em um contexto MAUI ficam fora de seu escopo.
Entendendo o IronBarcode
IronBarcode é uma biblioteca comercial para .NET dedicada à leitura e geração de códigos de barras que opera com entradas de dados em vez de fluxos de vídeo da câmera. Ele lê códigos de barras de arquivos de imagem, matrizes de bytes, fluxos de dados e documentos PDF. Não MAUI, ele se integra com a câmera do sistema através de MediaPicker — a mesma API padrão do MAUI que aplicações usam para seleção de foto — capturando uma foto e depois processando a imagem resultante como uma entrada estática.
IronBarcode implementa seu próprio motor de decodificação de código de barras gerenciado em vez de delegar para APIs nativas específicas da plataforma. Isso significa que a mesma chamada BarcodeReader.Read() se comporta de forma consistente em todos os alvos .NET suportados — Windows, Linux, macOS, ASP.NET e processos de servidor em segundo plano — bem como nos alvos móveis MAUI quando uma imagem é capturada e passada para o leitor. A biblioteca também fornece uma API completa de geração de códigos de barras através de BarcodeWriter e QRCodeWriter.
Principais características do IronBarcode:
- API Baseada em Arquivo Estático:
BarcodeReader.Read()aceita um caminho de arquivo, array de bytes, stream ou PDF — qualquer fonte de dados estática. - Ampla Cobertura de Plataforma: Windows, Linux e macOS (incluindo ARM) são suportados, juntamente com o .NET Framework 4.6.2+, .NET Core 3.1+ e .NET 5/6/7/8. O mesmo caminho de código gerenciado é executado em todos os alvos suportados, sem ramificações específicas da plataforma.
- Geração de Códigos de Barras:
BarcodeWriter.CreateBarcode()eQRCodeWriter.CreateQrCode()geram Code128, QR, DataMatrix e outros formatos como arquivos de imagem ou arrays de bytes. - Suporte a PDF: Os códigos de barras incorporados em documentos PDF são lidos diretamente, sem uma etapa intermediária de extração de imagem.
- Decodificação Consistente de UPC-A: Retorna o valor padrão de 12 dígitos do UPC-A por meio de seu motor gerenciado.
- Licenciamento comercial: Lite US$ 749, Plus US$ 1.499, Professional $ 2.999, Ilimitado US$ 5.999 — licenças perpétuas com um ano de suporte.
- Implantação no lado do servidor: Funciona em ASP.NET, Azure Functions, contêineres Docker e AWS Lambda, sem dependência de plataforma ou de uma câmera física.
Comparação de recursos
A tabela a seguir destaca as diferenças fundamentais entre BarcodeScanning.Native.Maui e IronBarcode:
| Recurso | BarcodeScanning.MAUI | IronBarcode |
|---|---|---|
| Objetivo principal | detecção de código de barras em tempo real por câmera | Leitura e geração de códigos de barras a partir de qualquer fonte de dados. |
| Fontes de entrada | Somente quadros da câmera ao vivo | Arquivos, matrizes de bytes, fluxos, PDFs |
| Suporte da plataforma | MAUI only — iOS, Android, Windows (via ZXingCpp), macOS Catalyst | Windows, Linux, macOS, ASP.NET, console, WPF, além de MAUI via imagens capturadas |
| Motor de Reconhecimento | Três motores (Apple Vision / Google ML Kit / ZXingCpp) | Motor único gerenciado em todos os alvos |
| Geração de código de barras | Não | Sim — BarcodeWriter + QRCodeWriter |
| Modelo de Licença | MIT (gratuito, código aberto) | Comercial — Lite: US$ 749 a Ilimitado: US$ 5.999 |
| Lado do servidor / ASP.NET | Não | Sim |
Comparação Detalhada de Recursos
| Recurso | BarcodeScanning.MAUI | IronBarcode |
|---|---|---|
| Leitura | ||
| Leitura de quadros da câmera ao vivo | Sim — Controle CameraView | Não (use o MediaPicker para capturar e depois ler) |
| visor da câmera no aplicativo | Sim — contínuo em tempo real | Não — utiliza a interface de utilizador da câmara do sistema através do MediaPicker. |
| Ler a partir de um arquivo de imagem | Não | Sim — BarcodeReader.Read(path) |
| Ler de um array de bytes | Não | Sim — BarcodeReader.Read(bytes) |
| Leia a partir do fluxo | Não | Sim — BarcodeReader.Read(stream) |
| Leia a partir do PDF | Não | Sim — BarcodeReader.Read(pdf) |
| Detecção de múltiplos códigos de barras | Sim (múltiplos por quadro via e.BarcodeResults) |
Sim (opção ExpectMultipleBarcodes) |
| Controle de velocidade de leitura | None | ReadingSpeed.Faster / Balanced / Detailed / ExtremeDetail |
| UPC-A no iOS | Pode retornar 13 dígitos; applications normalize | Retorna o padrão de 12 dígitos do UPC-A |
| Confiabilidade do PDF417 | Problemas documentados nos motores iOS/Android | Apoiado |
| Geração | ||
| Geração de código de barras | Não | Sim — BarcodeWriter.CreateBarcode() |
| Geração de código QR | Não | Sim — QRCodeWriter.CreateQrCode() |
| Saída em formato PNG / matriz de bytes | Não | Sim |
| Plataforma | ||
| iOS PRINCIPAL | Sim (Apple Vision) | Sim (via imagem capturada) |
| Android MAUI | Sim (Google ML Kit) | Sim (via imagem capturada) |
| Windows MAUI | Sim (ZXingCpp, desde 3.0.1) | Sim |
| macOS MAUI | Sim (Mac Catalyst, Apple Vision) | Sim |
| ASP.NET / lado do servidor | Não | Sim |
| Docker / Azure / AWS Lambda | Não | Sim |
| Suporte ao .NET Framework | Não (apenas MAUI) | Sim — .NET Framework 4.6.2 ou superior |
| Licenciamento | ||
| Tipo de licença | MIT (código aberto) | Perpétua comercial |
| Custo | Livre | Lite $749, Plus $1.499, Professional $2.999, Unlimited $5.999 |
| Modo de avaliação | N / D | Teste grátis disponível |
Arquitetura: Controle da câmera vs. API de processamento de arquivos
A diferença mais fundamental entre essas duas bibliotecas é o modelo de entrada. O BarcodeScanning.Native.Maui foi projetado em torno de um fluxo contínuo de vídeo da câmera; O IronBarcode foi projetado para entradas de dados discretos. Essas não são implementações concorrentes da mesma ideia — são escolhas arquitetônicas diferentes para casos de uso distintos.
Abordagem de leitura de código de barras MAUI
BarcodeScanning.Native.Maui encapsula o pipeline nativo de detecção de câmera em cada plataforma. Não Android, ML Kit processa quadros; no iOS e macOS, o framework Vision da Apple processa frames; no Windows, ZXingCpp processa quadros. A biblioteca apresenta isso como um controle CameraView MAUI com um evento OnDetectionFinished. O código do aplicativo nunca manipula bytes de imagem diretamente — ele manipula apenas os valores de código de barras detectados que emergem do evento.
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode != null)
ResultLabel.Text = barcode.DisplayValue;
}
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode != null)
ResultLabel.Text = barcode.DisplayValue;
}
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArg)
Dim barcode = e.BarcodeResults.FirstOrDefault()
If barcode IsNot Nothing Then
ResultLabel.Text = barcode.DisplayValue
End If
End Sub
A consequência desse projeto é que não há outro ponto de entrada. A câmera não é opcional — é a única entrada que a biblioteca reconhece. Um servidor, um arquivo, um PDF ou qualquer host não MAUI não tem caminho na biblioteca.
Abordagem do IronBarcode
IronBarcode recebe dados de imagem através de seu método estático BarcodeReader.Read(). O solicitante fornece os dados — de qualquer fonte — e a biblioteca os decodifica. Não MAUI, os dados vêm de MediaPicker; Em um servidor, ele vem do envio de um formulário; Em um aplicativo de desktop, ele vem de uma caixa de diálogo de arquivo.
//IronBarcode in MAUI: capture a photo, then read barcodes from it
// NuGet: dotnet add package IronBarcode
using IronBarCode;
private async void ScanBarcodeButton_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 result in results)
ResultLabel.Text = result.Value;
}
//IronBarcode in MAUI: capture a photo, then read barcodes from it
// NuGet: dotnet add package IronBarcode
using IronBarCode;
private async void ScanBarcodeButton_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 result in results)
ResultLabel.Text = result.Value;
}
Imports IronBarCode
Imports System.IO
Imports Microsoft.Maui.Media
Private Async Sub ScanBarcodeButton_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 result In results
ResultLabel.Text = result.Value
Next
End Using
End Using
End Sub
Este código roda de forma idêntica nos alvos MAUI que podem capturar uma imagem. Para uso do lado do servidor, o mesmo método BarcodeReader.Read() aceita um array de bytes de um arquivo enviado ou um caminho de PDF. A documentação do IronBarcode abrange todos os tipos de entrada suportados.
Cobertura de Plataforma e Motores de Reconhecimento
A cobertura da plataforma é importante para equipes que desenvolvem aplicativos MAUI que também podem precisar compartilhar lógica de código de barras com projetos não MAUI.
Abordagem de leitura de código de barras MAUI
BarcodeScanning.Native.Maui suporta todos os quatro alvos MAUI (iOS, Android, Windows desde 3.0.1 e macOS Catalyst), mas cada alvo usa um motor de reconhecimento diferente: Apple Vision no iOS e macOS, Google ML Kit no Android e ZXingCpp no Windows. A cobertura de simbologia e o comportamento de decodificação diferem entre os três motores, então um código de barras que decodifica de forma confiável em uma plataforma pode se comportar de forma diferente em outra. Fora do MAUI - ASP.NET, console, WPF, WinForms, Blazor Server, Azure Functions - a biblioteca não tem implementação. Equipes que precisam de lógica de código de barras tanto em um aplicativo MAUI quanto em um serviço de back-end devem usar uma biblioteca diferente para o código não MAUI.
Abordagem do IronBarcode
A chamada BarcodeReader.Read() do IronBarcode usa o mesmo motor gerenciado em todos os alvos suportados, para que o comportamento seja consistente em Windows, Linux, macOS, ASP.NET e qualquer alvo MAUI que possa capturar uma imagem e passá-la ao leitor. Não há blocos #if WINDOWS, não há carregamento condicional de dependências, e não são necessárias implementações de stub. Para entradas de arquivos e PDFs, o padrão também é consistente:
using IronBarCode;
// Read barcodes from a file the user selected
var file = await FilePicker.PickAsync();
if (file != null)
{
var results = BarcodeReader.Read(file.FullPath);
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
}
// Read barcodes directly from a PDF — no image extraction step needed
var pdfResults = BarcodeReader.Read("shipment-manifest.pdf");
using IronBarCode;
// Read barcodes from a file the user selected
var file = await FilePicker.PickAsync();
if (file != null)
{
var results = BarcodeReader.Read(file.FullPath);
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
}
// Read barcodes directly from a PDF — no image extraction step needed
var pdfResults = BarcodeReader.Read("shipment-manifest.pdf");
Imports IronBarCode
' Read barcodes from a file the user selected
Dim file = Await FilePicker.PickAsync()
If file IsNot Nothing Then
Dim results = BarcodeReader.Read(file.FullPath)
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
End If
' Read barcodes directly from a PDF — no image extraction step needed
Dim pdfResults = BarcodeReader.Read("shipment-manifest.pdf")
O guia de integração IronBarcode MAUI fornece instruções completas de configuração para todos os dispositivos MAUI. O IronBarcode também oferece suporte à implantação no lado do servidor em ambientes ASP.NET, Docker, Azure Functions e AWS Lambda, onde o caminho BarcodeScanning.Native.Maui não está presente.
Precisão de leitura de código de barras: UPC-A e PDF417
Dois comportamentos específicos de formato no BarcodeScanning.Native.Maui merecem destaque para aplicativos de produção.
Abordagem de leitura de código de barras MAUI
No iOS, a detecção subjacente do BarcodeScanning.Native.Maui (Apple Vision) pode retornar 13 dígitos para códigos de barras UPC-A. O código UPC-A tem um formato de 12 dígitos; O zero à esquerda adicional corresponde à codificação EAN-13. A biblioteca passa esse valor bruto, e os aplicativos normalizam conforme necessário. Aplicativos que armazenam valores UPC-A em um banco de dados sem normalização podem acumular registros com um zero à esquerda.
O trabalho alternativo documentado verifica o formato e ajusta o valor:
// Normalize iOS UPC-A — strip the leading zero when present
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode == null) return;
var value = barcode.DisplayValue;
if (barcode.BarcodeFormat == BarcodeFormats.Upca && value.Length == 13)
value = value.Substring(1);
ProcessBarcode(value);
}
// Normalize iOS UPC-A — strip the leading zero when present
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
var barcode = e.BarcodeResults.FirstOrDefault();
if (barcode == null) return;
var value = barcode.DisplayValue;
if (barcode.BarcodeFormat == BarcodeFormats.Upca && value.Length == 13)
value = value.Substring(1);
ProcessBarcode(value);
}
' Normalize iOS UPC-A — strip the leading zero when present
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArg)
Dim barcode = e.BarcodeResults.FirstOrDefault()
If barcode Is Nothing Then Return
Dim value = barcode.DisplayValue
If barcode.BarcodeFormat = BarcodeFormats.Upca AndAlso value.Length = 13 Then
value = value.Substring(1)
End If
ProcessBarcode(value)
End Sub
A verificação de formato é necessária para que os valores EAN-13 começando com 0 não sejam cortados por engano. O PDF417 é documentado separadamente nos problemas do GitHub como "muito problemático - a maioria das digitalizações nunca ocorre" nos motores iOS/Android, o que é relevante para etiquetas de envio, carteiras de motorista e cartões de embarque.
Abordagem do IronBarcode
IronBarcode retorna o valor padrão de 12 dígitos do UPC-A por meio de seu motor gerenciado. O PDF417 é um formato suportado. A parte de geração também está disponível através da API do IronBarcode:
using IronBarCode;
// Generate a QR code
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
// Generate a Code128 barcode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
using IronBarCode;
// Generate a QR code
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
// Generate a Code128 barcode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
Imports IronBarCode
' Generate a QR code
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.SaveAsPng("qr.png")
' Generate a Code128 barcode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("barcode.png")
Para aplicações onde a precisão dos dados do código de barras afeta diretamente buscas de inventário, transações de ponto de venda ou integrações da cadeia de suprimentos, o tratamento de formato consistente da IronBarcode reduz a necessidade de normalização específica da plataforma. A documentação de leitura de código de barras IronBarcode aborda detalhadamente o comportamento específico de cada formato.
Referência de Mapeamento de API
| BarcodeScanning.Native.Maui | IronBarcode |
|---|---|
CameraView controle XAML |
Sem controle de câmera — use MediaPicker.CapturePhotoAsync() para capturar |
OnDetectionFinished evento |
BarcodeReader.Read(imageBytes) |
e.BarcodeResults |
Valor de retorno de BarcodeReader.Read() (IEnumerable) |
e.BarcodeResults.FirstOrDefault() |
results.FirstOrDefault() |
barcode.DisplayValue |
result.Value |
barcode.BarcodeFormat |
result.Format |
BarcodeFormats="All" |
Detecção automática — nenhuma configuração necessária para vários formatos. |
CameraEnabled="True" |
MediaPicker.CapturePhotoAsync() chamada |
| Apenas para MAUI (iOS, Android, Windows, macOS) | MAUI (via captured image) + ASP.NET, console, WPF, desktop, server |
| apenas enquadramentos da câmera | Arquivos, matrizes de bytes, fluxos, PDFs |
| Sem API para arquivos/PDF | BarcodeReader.Read(path) — aceita arquivos de imagem e PDFs |
| Três motores pelos alvos do MAUI | Motor único gerenciado em todos os alvos |
| Nenhuma API de geração | BarcodeWriter.CreateBarcode() + QRCodeWriter.CreateQrCode() |
Quando as equipes consideram migrar do BarcodeScanning.MAUI para o IronBarcode
A Consistência do Motor em Plataformas Cruzadas se Torna uma Necessidade
Aplicações MAUI que visam iOS, Android, Windows e macOS adotam três motores de reconhecimento diferentes ao usar BarcodeScanning.Native.Maui: Apple Vision (iOS/macOS), Google ML Kit (Android) e ZXingCpp (Windows). Cada motor tem sua própria cobertura de simbologia e comportamento de decodificação, então o mesmo código de barras pode ser decodificado de forma diferente entre as plataformas — e os aplicativos frequentemente adicionam camadas de normalização para encobrir as diferenças. Quando esse custo de manutenção cresce, ou quando QA relatam regressões em plataformas cruzadas ligadas às diferenças de motor, as equipes às vezes migram a camada de código de barras para um único motor gerenciado que se comporta da mesma maneira em todos os alvos.
Requisitos para upload de arquivos ou processamento de PDF adicionados.
Os aplicativos móveis geralmente começam com a digitalização da câmera ao vivo como único método de entrada e, posteriormente, expandem-se para aceitar imagens ou documentos carregados. Quando um usuário precisa digitalizar um código de barras de uma foto em sua galeria, de uma imagem recebida por e-mail ou de um PDF contendo manifestos de remessa ou cartões de embarque, o BarcodeScanning.Native.Maui não tem um caminho de código para essas entradas. Equipes que enfrentam essa fronteira de requisitos se deparam com uma escolha: adicionar uma segunda biblioteca de código de barras ao lado do BarcodeScanning.Native.Maui para entradas de arquivo e PDF, ou migrar para uma única biblioteca que lida com todos os tipos de entrada. Gerenciar dois pacotes de código de barras com APIs e tipos de resultados diferentes adiciona complexidade a longo prazo que uma solução de pacote único evita.
Processamento de código de barras no servidor introduzido
Aplicativos que leem códigos de barras em dispositivos móveis geralmente desenvolvem um componente do lado do servidor — um endpoint de API ASP.NET que valida códigos de barras, uma tarefa em segundo plano que processa PDFs ou uma função na nuvem que extrai números de rastreamento de documentos carregados. BarcodeScanning.Native.Maui é uma biblioteca de controle de UI do MAUI; ela não tem uma implementação no lado do servidor. Uma equipe que precisa da mesma lógica de leitura de código de barras tanto em dispositivos móveis quanto em servidores deve usar uma biblioteca diferente para o lado do servidor. Quando surge a necessidade de implementar a lógica no servidor, as equipes frequentemente avaliam se consolidar tudo em uma única biblioteca que abranja ambas as versões é preferível a manter duas implementações separadas.
Normalização de Dados UPC-A se Torna uma Preocupação
O comportamento do código UPC-A de 13 dígitos do iOS nem sempre é detectado durante o desenvolvimento. Códigos de barras UPC-A digitalizados em desenvolvimento podem parecer funcionar corretamente, mas o zero à esquerda do framework Vision da Apple pode aparecer no banco de dados quando a normalização está ausente. Equipes que descobrem valores UPC-A de 13 dígitos em registros de inventário, sistemas de ponto de venda ou integrações de cadeia de suprimentos podem precisar tanto de uma correção de código quanto de uma etapa de correção de dados. Adicionar a normalização documentada lida com novas digitalizações; migrar para uma biblioteca com saída consistente de UPC-A às vezes é preferido como uma solução de longo prazo.
Obrigatório o uso do PDF417 (digitalização de documentos)
O PDF417 é o formato de código de barras usado em etiquetas de envio, carteiras de motorista e cartões de embarque na América do Norte. Esses são alvos de escaneamento comuns para aplicações de logística, verificação de identidade e viagens. O rastreador de problemas do GitHub do BarcodeScanning.Native.Maui documenta o PDF417 como "muito problemático - a maioria das digitalizações nunca ocorre" nos motores iOS/Android. Para aplicações onde a confiabilidade do PDF417 é um requisito funcional, as equipes frequentemente avaliam bibliotecas alternativas.
Considerações Comuns de Migração
Evento da câmera para MediaPicker e leitura estática
A principal mudança estrutural na migração é substituir o padrão de evento contínuo da câmera por uma captura MediaPicker seguida de BarcodeReader.Read(). O manipulador de evento OnDetectionFinished, o controle XAML CameraView, e a declaração de namespace XML scanner: são todos removidos. Em seu lugar, um botão aciona MediaPicker.CapturePhotoAsync(), e os bytes da foto resultante são passados para BarcodeReader.Read(). Isso altera a experiência do usuário, passando de um visor contínuo ao vivo para uma tela de câmera do sistema — adequada para a maioria das aplicações empresariais.
Alterações na organização de threads
BarcodeScanning.Native.Maui dispara OnDetectionFinished em um thread de segundo plano, então todos os manipuladores existentes que atualizam elementos da interface do usuário encapsulam suas atualizações em MainThread.BeginInvokeOnMainThread(). Com o padrão MediaPicker + async usado pelo IronBarcode, a continuação após await retorna no contexto de chamada, que é tipicamente o thread principal. Na maioria dos casos, os encapsulamentos MainThread.BeginInvokeOnMainThread() podem ser removidos, simplificando o código do manipulador de eventos.
Remoção de Normalização UPC-A
Qualquer código que lidava com o comportamento de 13 dígitos UPC-A do iOS do BarcodeScanning.Native.Maui terá código que verifica BarcodeFormats.Upca e chama Substring(1) para remover o zero inicial. Esse código deve ser removido após a migração - o IronBarcode retorna o valor padrão de 12 dígitos, e deixar a normalização em vigor removeria incorretamente o primeiro dígito de leituras válidas de UPC-A.
Permissões MAUI
BarcodeScanning.Native.Maui adiciona permissões de câmera automaticamente aos manifestos de Android e iOS como parte da configuração do pacote. Com o IronBarcode usando MediaPicker, as permissões de câmera padrão do MAUI em AndroidManifest.xml e Info.plist são necessárias — as mesmas permissões que qualquer app MAUI precisa para MediaPicker.CapturePhotoAsync(). Essas permissões geralmente já estão presentes em projetos MAUI que utilizam a câmera para qualquer finalidade.
Funcionalidades adicionais do IronBarcode
Além das funcionalidades abordadas nesta comparação, o IronBarcode oferece recursos que o BarcodeScanning.Native.Maui não oferece em nenhum nível:
- Geração de código de barras : Gere códigos de barras nos formatos Code128, QR, DataMatrix, PDF417 e outros, como PNG, SVG ou matriz de bytes — utilizáveis na interface do usuário do MAUI, em respostas de API ou em etiquetas impressas.
- Geração de código QR : Crie códigos QR estilizados com incorporação de logotipo, personalização de cores e controle do nível de correção de erros.
- Leitura de Múltiplos Códigos de Barras: A opção
ExpectMultipleBarcodeslê todos os códigos de barras presentes em uma única imagem em uma única passagem. - Extração de código de barras em PDF : Leia códigos de barras incorporados em documentos PDF diretamente — sem necessidade de conversão intermediária de imagem.
- Implantação no servidor : Implante a mesma lógica de leitura e geração de código de barras em ASP.NET, Azure Functions, Docker e AWS Lambda sem qualquer dependência de câmera.
- Configuração de Velocidade de Leitura: As configurações
ReadingSpeed.Faster,Balanced,Detailed, eExtremeDetailpermitem ajustar para taxa de transferência versus precisão, dependendo da qualidade da imagem. - Reutilização de Servidores e Desktops: A mesma biblioteca funciona em projetos ASP.NET, console, WPF, e WinForms, então a lógica de código de barras pode ser compartilhada entre um cliente MAUI e um serviço de back-end sem um segundo pacote.
Compatibilidade com .NET e Preparação para o Futuro
IronBarcode suporta .NET 6, .NET 7, e .NET 8, bem como .NET Framework 4.6.2 e versões posteriores. Isso significa que ele funciona em alvos .NET modernos, bem como em ambientes de servidor legados que ainda não migraram. BarcodeScanning.Native.Maui é uma biblioteca exclusiva para MAUI sem suporte ao .NET Framework e sem caminho de implantação no lado do servidor. Para equipes cujo código-fonte abrange tanto o MAUI quanto aplicativos de servidor .NET Framework ou .NET Core existentes, o IronBarcode fornece uma API consistente em todos os ambientes, sem exigir um pacote de código de barras separado para cada contexto de execução.
Conclusão
BarcodeScanning.Native.Maui e IronBarcode abordam problemas diferentes. BarcodeScanning.Native.Maui é uma biblioteca de controle de câmera que fornece um visualizador em tempo real com detecção automática de códigos de barras nos alvos MAUI, delegando o reconhecimento a três motores de plataforma diferentes.IronBarcode é uma biblioteca de leitura e geração de códigos de barras que processa dados de imagem estáticos de qualquer origem através de um motor gerenciado único em alvos .NET. A diferença arquitetônica — fluxo contínuo de câmera versus entrada de dados discreta — determina qual biblioteca é apropriada para um determinado conjunto de requisitos.
BarcodeScanning.Native.Maui é a escolha certa quando o aplicativo é um aplicativo MAUI onde a pré-visualização de câmera no aplicativo ao vivo com detecção contínua de frames é o padrão UX necessário, e quando os requisitos não se expandem para incluir uploads de arquivos, processamento de PDF ou trabalho de código de barras no lado do servidor. Dentro desse escopo, é gratuito, mínimo e funcional.
IronBarcode é a escolha certa quando a entrada de códigos de barras vem de arquivos, PDFs ou matrizes de bytes além ou em vez de uma câmera ao vivo, quando o processamento de código de barras no lado do servidor é parte da arquitetura, ou quando a geração de códigos de barras é necessária junto à leitura. Também é adequado quando o comportamento de decodificação consistente entre plataformas ou a confiabilidade do PDF417 são requisitos de produção. O custo da licença comercial é a contrapartida para essas funcionalidades.
Para equipes cujos requisitos atualmente se encaixam no escopo do BarcodeScanning.Native.Maui, a biblioteca é uma escolha razoável e econômica. Para equipes cujos requisitos cresceram ou estão previstos para crescer além da digitalização de câmera ao vivo, a API consistente da IronBarcode entre tipos de entrada, plataformas e alvos de implantação é uma alternativa prática.
Perguntas frequentes
O que é BarcodeScanning.MAUI?
BarcodeScanning.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 BarcodeScanning.MAUI e IronBarcode?
O IronBarcode utiliza uma API estática e sem estado, que não requer gerenciamento de instâncias, enquanto o BarcodeScanning.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 BarcodeScanning.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 BarcodeScanning.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 BarcodeScanning.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 BarcodeScanning.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 BarcodeScanning.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 BarcodeScanning.MAUI para o IronBarcode?
A migração do BarcodeScanning.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()`.

