Como Criar uma Aplicação Desktop de Código de Barras (Scanner/Gerador) com .NET MAUI

This article was translated from English: Does it need improvement?
Translated
View the article in English

Para uma solução de software abrangente, não se trata apenas de acessibilidade móvel. A capacidade de implantar nativamente em sistemas operacionais de desktop, como Windows e macOS, é igualmente crítica. Essa abordagem multiplataforma permite que as empresas aproveitem todo o poder das estações de trabalho para tarefas de alto volume, como rastreamento de ativos e administração.

Sem o devido suporte para desktop, os fluxos de trabalho são interrompidos ou, pior ainda, forçados a dispositivos menos capazes. Isso é particularmente importante na gestão de inventário, onde o pessoal do escritório precisa gerar lotes de códigos ou verificar scans rapidamente sem sair de suas mesas.

IronBarcode oferece as ferramentas necessárias para implementar esses recursos, garantindo que sua aplicação .NET MAUI funcione de forma confiável em qualquer computador.

Neste artigo, explicaremos como integrar o IronBarcode para construir tanto um Scanner de Código de Barras para Desktop quanto um Gerador de Código de Barras para Desktop.



Aplicação Desktop .NET MAUI

Integrar IronBarcode em um aplicativo .NET MAUI é direto, pois a biblioteca funciona nativamente com a plataforma desktop sem adaptações. Neste exemplo, criaremos separadamente um scanner de código de barras e um gerador de código de barras usando o IronBarcode.

Vamos começar com o scanner de código de barras primeiro.

Interface XAML do Scanner de Código de Barras

Para a interface do .NET MAUI, uma interface simples é implementada para permitir que os usuários enviem imagens de códigos de barras por meio de um botão de envio. O arquivo MainPage.xaml dentro do projeto deve ser substituído pelo conteúdo mostrado abaixo.

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MauiApp1.MainPage"
             BackgroundColor="{DynamicResource PageBackgroundColor}">

    <ScrollView>
        <VerticalStackLayout Spacing="25" Padding="30" VerticalOptions="Center">

            <Label Text="Desktop Barcode Scanner"
                   FontSize="32"
                   HorizontalOptions="Center" />

            <Image x:Name="ScannerImage"
                   HeightRequest="300"
                   WidthRequest="400"
                   BackgroundColor="#F0F0F0"
                   Aspect="AspectFit"
                   HorizontalOptions="Center" />

            <Button Text="Select Image to Scan"
                    Clicked="OnScanButtonClicked"
                    HorizontalOptions="Center" 
                    WidthRequest="200"/>

            <Label x:Name="ResultLabel"
                   Text="Result will appear here..."
                   FontSize="20"
                   HorizontalOptions="Center"
                   HorizontalTextAlignment="Center" />

        </VerticalStackLayout>
    </ScrollView>

</ContentPage>
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MauiApp1.MainPage"
             BackgroundColor="{DynamicResource PageBackgroundColor}">

    <ScrollView>
        <VerticalStackLayout Spacing="25" Padding="30" VerticalOptions="Center">

            <Label Text="Desktop Barcode Scanner"
                   FontSize="32"
                   HorizontalOptions="Center" />

            <Image x:Name="ScannerImage"
                   HeightRequest="300"
                   WidthRequest="400"
                   BackgroundColor="#F0F0F0"
                   Aspect="AspectFit"
                   HorizontalOptions="Center" />

            <Button Text="Select Image to Scan"
                    Clicked="OnScanButtonClicked"
                    HorizontalOptions="Center" 
                    WidthRequest="200"/>

            <Label x:Name="ResultLabel"
                   Text="Result will appear here..."
                   FontSize="20"
                   HorizontalOptions="Center"
                   HorizontalTextAlignment="Center" />

        </VerticalStackLayout>
    </ScrollView>

</ContentPage>
XML

Lógica CS do Scanner de Código de Barras para Desktop

Em seguida, a lógica para quando o usuário clica no botão é implementada. Um manipulador de eventos OnScanButtonClicked está anexado ao botão de digitalização na interface do usuário.

PickPhotoAsync é usado primeiro para permitir que os usuários escolham o código de barras para upload, seguido por OpenReadAsync para acessar o fluxo do arquivo. Os dados da imagem são imediatamente copiados em um MemoryStream usando CopyToAsync. Isso permite que os dados sejam usados simultaneamente para exibir a imagem na tela e para que o método Read escaneie o código de barras.

Finalmente, o valor do código de barras é exibido na interface se um código de barras válido for detectado, ou uma mensagem em vermelho é exibida informando que nenhum código de barras foi encontrado na imagem.

Observe Substitua a chave de licença pela sua própria antes de testar a aplicação.

using IronBarCode;

namespace MauiApp1
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            // Your license key is set here
            IronBarCode.License.LicenseKey = "YOUR_KEY"
        }

        private async void OnScanButtonClicked(object sender, EventArgs e)
        {
            try
            {
                var fileResult = await MediaPicker.Default.PickPhotoAsync();

                if (fileResult != null)
                {
                    // 1. Copy the file content into a byte array or MemoryStream immediately
                    // This ensures we have the data in memory before the file closes
                    byte[] imageBytes;
                    using (var stream = await fileResult.OpenReadAsync())
                    using (var memoryStream = new MemoryStream())
                    {
                        await stream.CopyToAsync(memoryStream);
                        imageBytes = memoryStream.ToArray();
                    }

                    // 2. Set the Image Source for the UI
                    // We give the UI a FRESH stream from the bytes we just saved
                    ScannerImage.Source = ImageSource.FromStream(() => new MemoryStream(imageBytes));

                    // 3. Process the Barcode
                    // We give IronBarcode its OWN fresh stream from the same bytes
                    using (var processingStream = new MemoryStream(imageBytes))
                    {
                        // 4. Read the barcode with Read
                        var results = BarcodeReader.Read(processingStream);

                        // 5. Display barcode results
                        if (results != null && results.Count > 0)
                        {

                            // Successfully found barcode value
                            ResultLabel.Text = $"Success: {results[0].Value}";
                            ResultLabel.TextColor = Colors.Green;
                        }
                        else
                        {
                            // Image uploaded has no barcode or barcode value is not found
                            ResultLabel.Text = "No barcode detected.";
                            ResultLabel.TextColor = Colors.Red;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // Display any exception thrown in runtime
                ResultLabel.Text = $"Error: {ex.Message}";
                ResultLabel.TextColor = Colors.Red;
            }
        }
    }
}
using IronBarCode;

namespace MauiApp1
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            // Your license key is set here
            IronBarCode.License.LicenseKey = "YOUR_KEY"
        }

        private async void OnScanButtonClicked(object sender, EventArgs e)
        {
            try
            {
                var fileResult = await MediaPicker.Default.PickPhotoAsync();

                if (fileResult != null)
                {
                    // 1. Copy the file content into a byte array or MemoryStream immediately
                    // This ensures we have the data in memory before the file closes
                    byte[] imageBytes;
                    using (var stream = await fileResult.OpenReadAsync())
                    using (var memoryStream = new MemoryStream())
                    {
                        await stream.CopyToAsync(memoryStream);
                        imageBytes = memoryStream.ToArray();
                    }

                    // 2. Set the Image Source for the UI
                    // We give the UI a FRESH stream from the bytes we just saved
                    ScannerImage.Source = ImageSource.FromStream(() => new MemoryStream(imageBytes));

                    // 3. Process the Barcode
                    // We give IronBarcode its OWN fresh stream from the same bytes
                    using (var processingStream = new MemoryStream(imageBytes))
                    {
                        // 4. Read the barcode with Read
                        var results = BarcodeReader.Read(processingStream);

                        // 5. Display barcode results
                        if (results != null && results.Count > 0)
                        {

                            // Successfully found barcode value
                            ResultLabel.Text = $"Success: {results[0].Value}";
                            ResultLabel.TextColor = Colors.Green;
                        }
                        else
                        {
                            // Image uploaded has no barcode or barcode value is not found
                            ResultLabel.Text = "No barcode detected.";
                            ResultLabel.TextColor = Colors.Red;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // Display any exception thrown in runtime
                ResultLabel.Text = $"Error: {ex.Message}";
                ResultLabel.TextColor = Colors.Red;
            }
        }
    }
}
$vbLabelText   $csharpLabel

Saída com Valor de Código de Barras encontrado

Saída de códigos de barras encontrados

Como você pode ver, a aplicação exibe o resultado do código de barras e a imagem do código de barras enviado.

Saída sem Valor de Código de Barras encontrado

Saída sem códigos de barras encontrados

Como você pode ver, quando um usuário envia uma imagem que não contém um código de barras, ela exibe uma mensagem em vermelho afirmando "Nenhum código de barras encontrado."

Gerador de Código de Barras para Desktop

A próxima parte se baseia no mesmo conceito, integrando o IronBarcode ao MAUI para criar um gerador de códigos de barras.

Interface XAML do Gerador de Código de Barras

Para a interface do gerador, um formulário simples é implementado para permitir a entrada de texto e a seleção do tipo de código de barras por meio de um menu suspenso. Um botão é incluído para acionar o processo de geração e salvamento, junto com uma visualização de imagem para exibir o resultado. O arquivo MainPage.xaml deve ser substituído pelo conteúdo mostrado abaixo.

Por favor, consulte aqui para a lista completa de códigos de barras 1D e aqui para códigos de barras 2D.

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MauiApp1.MainPage"
             BackgroundColor="{DynamicResource PageBackgroundColor}">

    <ScrollView>
        <VerticalStackLayout Spacing="20" Padding="30" VerticalOptions="Center">

            <Label Text="Barcode Generator"
                   FontSize="32"
                   HorizontalOptions="Center" />

            <Entry x:Name="BarcodeEntry"
                   Placeholder="Enter value (e.g. 12345 or https://ironsoftware.com)"
                   WidthRequest="300" />

            <Picker x:Name="BarcodeTypePicker"
                    Title="Select Barcode Type"
                    WidthRequest="300">
                <Picker.ItemsSource>
                    <x:Array Type="{x:Type x:String}">
                        <x:String>QRCode</x:String>
                        <x:String>Code128</x:String>
                        <x:String>EAN13</x:String>
                        <x:String>Code39</x:String>
                        <x:String>PDF417</x:String>
                    </x:Array>
                </Picker.ItemsSource>
            </Picker>

            <Button Text="Generate &amp; Save"
                    Clicked="OnGenerateButtonClicked"
                    HorizontalOptions="Center"
                    WidthRequest="200" />

            <Image x:Name="GeneratedImage"
                   HeightRequest="200"
                   WidthRequest="300"
                   BackgroundColor="#F0F0F0"
                   Aspect="AspectFit" />

            <Label x:Name="StatusLabel"
                   FontSize="16"
                   HorizontalOptions="Center"
                   HorizontalTextAlignment="Center" />

        </VerticalStackLayout>
    </ScrollView>

</ContentPage>
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MauiApp1.MainPage"
             BackgroundColor="{DynamicResource PageBackgroundColor}">

    <ScrollView>
        <VerticalStackLayout Spacing="20" Padding="30" VerticalOptions="Center">

            <Label Text="Barcode Generator"
                   FontSize="32"
                   HorizontalOptions="Center" />

            <Entry x:Name="BarcodeEntry"
                   Placeholder="Enter value (e.g. 12345 or https://ironsoftware.com)"
                   WidthRequest="300" />

            <Picker x:Name="BarcodeTypePicker"
                    Title="Select Barcode Type"
                    WidthRequest="300">
                <Picker.ItemsSource>
                    <x:Array Type="{x:Type x:String}">
                        <x:String>QRCode</x:String>
                        <x:String>Code128</x:String>
                        <x:String>EAN13</x:String>
                        <x:String>Code39</x:String>
                        <x:String>PDF417</x:String>
                    </x:Array>
                </Picker.ItemsSource>
            </Picker>

            <Button Text="Generate &amp; Save"
                    Clicked="OnGenerateButtonClicked"
                    HorizontalOptions="Center"
                    WidthRequest="200" />

            <Image x:Name="GeneratedImage"
                   HeightRequest="200"
                   WidthRequest="300"
                   BackgroundColor="#F0F0F0"
                   Aspect="AspectFit" />

            <Label x:Name="StatusLabel"
                   FontSize="16"
                   HorizontalOptions="Center"
                   HorizontalTextAlignment="Center" />

        </VerticalStackLayout>
    </ScrollView>

</ContentPage>
XML

Lógica CS do Gerador de Código de Barras para Desktop

Em seguida, a lógica para o evento de clique do botão é implementada. Um manipulador de eventos OnGenerateButtonClicked está anexado ao botão de geração na interface do usuário.

A entrada do usuário é validada para garantir que o texto esteja presente e um tipo seja selecionado, após o qual a seleção é mapeada para o BarcodeEncoding correto. BarcodeWriter.CreateBarcode é usado para gerar a imagem, redimensioná-la e convertê-la em dados binários JPEG. A imagem é então exibida na tela usando um MemoryStream.

Finalmente, o arquivo de código de barras gerado é salvo diretamente na área de trabalho do usuário usando File.WriteAllBytes, e o rótulo de status é atualizado para confirmar o local de salvamento.

Observe Substitua a chave de licença pela sua própria antes de testar a aplicação.

using IronBarCode;
using System.IO; // Required for saving files

namespace MauiApp1
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            IronBarCode.License.LicenseKey = "YOUR-KEY";

            // Set default selection
            BarcodeTypePicker.SelectedIndex = 0;
        }

        private void OnGenerateButtonClicked(object sender, EventArgs e)
        {
            try
            {
                // 1. Get and Validate Input
                string text = BarcodeEntry.Text;

                if (string.IsNullOrWhiteSpace(text))
                {
                    StatusLabel.Text = "Error: Please enter text.";
                    StatusLabel.TextColor = Colors.Red;
                    return;
                }

                if (BarcodeTypePicker.SelectedIndex == -1)
                {
                    StatusLabel.Text = "Error: Please select a type.";
                    StatusLabel.TextColor = Colors.Red;
                    return;
                }

                // 2. Determine Encoding Type
                string selectedType = BarcodeTypePicker.SelectedItem.ToString();
                BarcodeEncoding encoding = BarcodeEncoding.QRCode;

                switch (selectedType)
                {
                    case "QRCode": encoding = BarcodeEncoding.QRCode; break;
                    case "Code128": encoding = BarcodeEncoding.Code128; break;
                    case "EAN13": encoding = BarcodeEncoding.EAN13; break;
                    case "Code39": encoding = BarcodeEncoding.Code39; break;
                    case "PDF417": encoding = BarcodeEncoding.PDF417; break;
                }

                // 3. Generate Barcode
                var barcode = BarcodeWriter.CreateBarcode(text, encoding);
                barcode.ResizeTo(400, 200); // Optional resizing

                // 4. Convert to Bytes (JPEG)
                var bytes = barcode.ToJpegBinaryData();

                // 5. Update UI
                GeneratedImage.Source = ImageSource.FromStream(() => new MemoryStream(bytes));

                // 6. Save to Desktop automatically
                string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                string fileName = $"barcode_{DateTime.Now:yyyyMMdd_HHmmss}.jpg";
                string fullPath = Path.Combine(desktopPath, fileName);

                File.WriteAllBytes(fullPath, bytes);

                // 7. Show Success Message
                StatusLabel.Text = $"Saved to Desktop:\n{fileName}";
                StatusLabel.TextColor = Colors.Green;
            }
            catch (Exception ex)
            {
                StatusLabel.Text = $"Error: {ex.Message}";
                StatusLabel.TextColor = Colors.Red;
            }
        }
    }
}
using IronBarCode;
using System.IO; // Required for saving files

namespace MauiApp1
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            IronBarCode.License.LicenseKey = "YOUR-KEY";

            // Set default selection
            BarcodeTypePicker.SelectedIndex = 0;
        }

        private void OnGenerateButtonClicked(object sender, EventArgs e)
        {
            try
            {
                // 1. Get and Validate Input
                string text = BarcodeEntry.Text;

                if (string.IsNullOrWhiteSpace(text))
                {
                    StatusLabel.Text = "Error: Please enter text.";
                    StatusLabel.TextColor = Colors.Red;
                    return;
                }

                if (BarcodeTypePicker.SelectedIndex == -1)
                {
                    StatusLabel.Text = "Error: Please select a type.";
                    StatusLabel.TextColor = Colors.Red;
                    return;
                }

                // 2. Determine Encoding Type
                string selectedType = BarcodeTypePicker.SelectedItem.ToString();
                BarcodeEncoding encoding = BarcodeEncoding.QRCode;

                switch (selectedType)
                {
                    case "QRCode": encoding = BarcodeEncoding.QRCode; break;
                    case "Code128": encoding = BarcodeEncoding.Code128; break;
                    case "EAN13": encoding = BarcodeEncoding.EAN13; break;
                    case "Code39": encoding = BarcodeEncoding.Code39; break;
                    case "PDF417": encoding = BarcodeEncoding.PDF417; break;
                }

                // 3. Generate Barcode
                var barcode = BarcodeWriter.CreateBarcode(text, encoding);
                barcode.ResizeTo(400, 200); // Optional resizing

                // 4. Convert to Bytes (JPEG)
                var bytes = barcode.ToJpegBinaryData();

                // 5. Update UI
                GeneratedImage.Source = ImageSource.FromStream(() => new MemoryStream(bytes));

                // 6. Save to Desktop automatically
                string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                string fileName = $"barcode_{DateTime.Now:yyyyMMdd_HHmmss}.jpg";
                string fullPath = Path.Combine(desktopPath, fileName);

                File.WriteAllBytes(fullPath, bytes);

                // 7. Show Success Message
                StatusLabel.Text = $"Saved to Desktop:\n{fileName}";
                StatusLabel.TextColor = Colors.Green;
            }
            catch (Exception ex)
            {
                StatusLabel.Text = $"Error: {ex.Message}";
                StatusLabel.TextColor = Colors.Red;
            }
        }
    }
}
$vbLabelText   $csharpLabel

Saída com Código de Barras Gerado

Sucesso ao Gerar Código de Barras

Como você pode ver, o aplicativo exibe o código de barras gerado e o salva na área de trabalho do usuário.

Falha na Saída

Falha ao Gerar Código de Barras

Certos tipos de código de barras têm restrições e requisitos de formato para o valor de entrada. Quando o código de barras falha ao gerar, o aplicativo exibe a exceção IronBarcode, conforme mostrado acima. Consulte os respectivos 1D e 2D formatos detalhados para formatação para cada tipo de código de barras.

Para testar os exemplos acima (Scanner de Código de Barras de Desktop e o Gerador de Código de Barras de Desktop), por favor baixe este projeto de exemplo.

Perguntas frequentes

O que é .NET MAUI?

.NET MAUI é um framework multiplataforma para a criação de aplicativos nativos para dispositivos móveis e desktops usando C# e XAML. Ele permite que desenvolvedores criem aplicativos para Android, iOS, macOS e Windows utilizando uma única base de código.

Como o IronBarcode pode ser usado em uma aplicação .NET MAUI?

O IronBarcode pode ser integrado a um aplicativo .NET MAUI para habilitar a geração e leitura de códigos de barras. Ele oferece uma maneira simples de criar e ler códigos de barras em diversas plataformas de desktop.

Que tipos de códigos de barras o IronBarcode pode gerar?

O IronBarcode suporta a geração de uma ampla variedade de formatos de código de barras, incluindo códigos QR, Code 128, Code 39, UPC, EAN e muitos outros, tornando-o versátil para qualquer necessidade de aplicação desktop.

É possível ler códigos de barras usando um aplicativo de desktop desenvolvido com o IronBarcode?

Sim, o IronBarcode pode ser usado para ler códigos de barras em aplicativos de desktop, permitindo que os usuários decodifiquem as informações do código de barras de forma rápida e eficiente por meio da interface do aplicativo.

Quais são as vantagens de usar o IronBarcode para aplicações de código de barras?

O IronBarcode oferece alta precisão, velocidade e facilidade de uso. Ele se integra perfeitamente ao .NET MAUI, fornecendo suporte abrangente para geração e leitura de códigos de barras em aplicativos de desktop.

O IronBarcode consegue lidar com grandes volumes de dados de código de barras?

Sim, o IronBarcode foi projetado para processar com eficiência grandes volumes de dados de código de barras, tornando-o adequado para aplicações que exigem o processamento de extensas tarefas com códigos de barras.

Preciso de uma biblioteca separada para leitura e geração de códigos de barras?

Não, o IronBarcode oferece funcionalidades de leitura e geração de códigos de barras em uma única biblioteca, simplificando o processo de desenvolvimento de aplicativos para desktop.

Quais são os requisitos de sistema para usar o IronBarcode com o .NET MAUI?

O IronBarcode requer um ambiente .NET compatível com .NET MAUI. Ele oferece suporte a Windows, macOS e outras plataformas onde aplicativos .NET MAUI podem ser executados.

Como a IronBarcode garante a precisão dos códigos de barras?

A IronBarcode utiliza algoritmos avançados para garantir alta precisão tanto na geração quanto na leitura de códigos de barras, reduzindo a probabilidade de erros na codificação ou decodificação dos dados.

O IronBarcode pode ser usado tanto para projetos comerciais quanto pessoais?

Sim, o IronBarcode pode ser usado tanto para projetos comerciais quanto pessoais, oferecendo opções flexíveis de licenciamento para atender a diferentes requisitos de projeto.

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
Pronto para começar?
Nuget Downloads 2,108,094 | Versão: 2026.3 acaba de ser lançado
Still Scrolling Icon

Ainda está rolando a tela?

Quer provas rápidas? PM > Install-Package BarCode
executar um exemplo Veja seu fio se transformar em um código de barras.