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

Comparação entre as bibliotecas de código de barras Syncfusion Barcode e IronBarcode em C#

ZXing.Net vs IronBarcode: Escolhendo uma Biblioteca de Código de Barras .NET em 2026

O BarcodeReader do ZXing.Net não é thread-safe. Cada caminho de leitura simultânea na sua aplicação - cada ForEach em paralelo, cada ação de controlador assíncrona que trata de pedidos simultâneos - requer a sua própria instância de leitor. Isso significa configuração de formato repetida por instância, carregamento e descarte de Bitmap por chamada, e alocação de leitor em cada requisição. O método estático do IronBarcode lida com o mesmo trabalho sem alocação por requisição. A segurança de threads é apenas um item da lista: a ausência de suporte nativo a PDF, a fragmentação do pacote de vinculação entre Windows e Linux e a necessidade de especificar cada formato de código de barras que você pretende ler são características que fazem com que projetos .NET para ZX acumulem soluções alternativas ao longo do tempo.

Entendendo o ZXing .NET

ZXing .NET é uma versão de código aberto da biblioteca Java ZXing ("Faixa de Pedestres") do Google, lançada sob a licençaApache 2.0e mantida por Michael Jahn no GitHub. É a biblioteca de código de barras de código aberto mais baixada para .NET, com um longo histórico que remonta a mais de uma década. A biblioteca abrange tanto a leitura quanto a gravação em uma ampla variedade de formatos de código de barras, e sua licença gratuita a torna acessível a projetos de todos os tamanhos, incluindo produtos de código aberto que exigem dependências compatíveis com o Apache.

A arquitetura do ZXing.Net reflete suas origens como uma adaptação do Java. A classe BarcodeReader é um objeto com estado: chamar Decode grava o estado interno, o que torna as instâncias inseguras para compartilhamento entre threads. O uso correto e concorrente exige ou um novo leitor por thread ou um pool de ThreadLocal<BarcodeReader> - ambos colocam a responsabilidade da segurança em thread sobre o chamador. O carregamento de imagens também não está incluído no pacote principal; Em vez disso, o ZXing .NET fornece pacotes de vinculação específicos da plataforma, cada um expondo uma superfície de API diferente.

As principais características arquitetônicas incluem:

  • Licença Apache 2.0: Gratuita para uso comercial e de código aberto, sem custos e sem necessidade de contato com a equipe de vendas.
  • Leitor de Código de Barras com Estado: A instância BarcodeReader não é thread-safe; Uma nova instância deve ser criada por thread ou por operação paralela.
  • Especificação de Formato Manual: Os chamadores devem definir reader.Options.PossibleFormats antes de cada decodificação; Os formatos não listados são ignorados silenciosamente, sem erro ou aviso.
  • Sem suporte nativo para PDF: a biblioteca lê apenas imagens; A entrada de PDFs requer uma biblioteca de renderização de PDF separada, como o PdfiumViewer, para converter as páginas em bitmaps antes da decodificação.
  • Fragmentação da vinculação da plataforma: o pacote principal não oferece carregamento de imagens; pacotes de ligação separados (ZXing.Net.Bindings.Windows.Compatibility utilizando System.Drawing,ZXing.Net.Bindings.ImageSharp / .V2 / .V3utilizando SixLabors.ImageSharp, além de ZXing.Net.Bindings.SkiaSharp e ZXing.Net.Bindings.Magick) expõem APIs diferentes para alvos de implementação diferentes.
  • Comunidade ativa: Problemas, solicitações de pull e discussões são realizadas ativamente no GitHub, oferecendo suporte da comunidade sem custo algum.
  • Ampla cobertura de formatos: Suporta QR Code, Code 128, Code 39, EAN-13, EAN-8, UPC-A, Data Matrix, PDF 417, Aztec e outras simbologias amplamente utilizadas.

A arquitetura do leitor com estado

O BarcodeReader do ZXing.Net requer uma nova instância para cada thread ou operação paralela. O padrão a seguir mostra a configuração mínima correta para processamento simultâneo:

// ZXing.Net: a new reader instance is created per iteration
Parallel.ForEach(imagePaths, path =>
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    };

    using var bitmap = new Bitmap(path);
    var result = reader.Decode(bitmap);

    if (result != null)
        results[path] = result.Text;
});
// ZXing.Net: a new reader instance is created per iteration
Parallel.ForEach(imagePaths, path =>
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    };

    using var bitmap = new Bitmap(path);
    var result = reader.Decode(bitmap);

    if (result != null)
        results[path] = result.Text;
});
Imports System.Collections.Concurrent
Imports System.Drawing
Imports ZXing

Parallel.ForEach(imagePaths, Sub(path)
    Dim reader = New BarcodeReader()
    reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    }

    Using bitmap As New Bitmap(path)
        Dim result = reader.Decode(bitmap)

        If result IsNot Nothing Then
            results(path) = result.Text
        End If
    End Using
End Sub)
$vbLabelText   $csharpLabel

O padrão ThreadLocal<BarcodeReader> reduz a alocação por chamada ao reutilizar uma instância por thread, mas adiciona complexidade ao descarte. De qualquer forma, a segurança de threads é responsabilidade do chamador no ZXing.Net.

Entendendo o IronBarcode

IronBarcode é uma biblioteca comercial de código de barras .NET desenvolvida pela Iron Software. Ele fornece leitura e geração de códigos de barras através de uma API estática sem estado: BarcodeReader.Read e BarcodeWriter.CreateBarcode são os principais pontos de entrada, e nenhum requer criação ou configuração de instância antes do uso. A biblioteca é distribuída como um único pacote NuGet que funciona de forma idêntica no Windows, Linux,macOSe dentro de contêineres Docker, sem a necessidade de pacotes de vinculação específicos para cada plataforma.

O mecanismo de leitura do IronBarcode realiza a detecção automática de formatos em mais de 50 simbologias de código de barras. Quem liga não especifica quais formatos procurar; O mecanismo avalia cada imagem em relação a todos os formatos suportados e retorna todos os códigos de barras encontrados. Para aplicações que precisam equilibrar velocidade de escaneamento com exaustividade, um enum ReadingSpeed (Faster, Balanced, Detailed, ExtremeDetail) oferece controle sem exigir enumeração de formato. A biblioteca também inclui suporte nativo a PDF, lendo códigos de barras diretamente de documentos PDF em todas as páginas, sem a necessidade de uma biblioteca de renderização de PDF separada.

As características principais incluem:

  • Licença Comercial: Requer uma chave de licença paga; O modo de teste está disponível para avaliação.
  • API Estática sem Estado: BarcodeReader.Read e BarcodeWriter.CreateBarcode são métodos estáticos thread-safe; Não é necessário gerenciar nenhuma instância.
  • Detecção automática de formato: Todos os mais de 50 formatos de código de barras suportados são detectados sem a necessidade de uma lista de formatos; os usuários ajustam a velocidade em vez do escopo do formato.
  • Suporte Nativo a PDF: BarcodeReader.Read aceita caminhos de arquivo PDF diretamente, processando todas as páginas sem uma biblioteca externa de PDF.
  • Pacote único multiplataforma: Um único pacote NuGet funciona no Windows, Linux,macOSe Docker com a mesma interface de API.
  • API de Geração Fluente: BarcodeWriter.CreateBarcode retorna um objeto GeneratedBarcode com métodos de saída embutidos, incluindo SaveAsPng, SaveAsPdf, ToPngBinaryData, e ToStream.
  • Suporte comercial: As licenças pagas incluem acesso à equipe de suporte da Iron Software, com compromissos de nível de serviço.

Comparação de recursos

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

Recurso ZXing.Net IronBarcode
Licença Apache 2.0 (gratuito) Comercial
Segurança da rosca Não é thread-safe — requer uma nova instância por thread. API estática thread-safe
Detecção de formato Manual — lista de PossibleFormats necessários Automático — mais de 50 formatos
Leitura de PDF Não — requer o PdfiumViewer ou similar. Nativo — chamada de método único
Suporte da plataforma Pacotes de vinculação separados por plataforma Pacote único, todas as plataformas
Geração de código de barras Retorna Bitmap, requer salvamento manual API fluente com saída integrada
Preços Livre A partir de $749 (Lite) / $1,499 (Plus)

Comparação Detalhada de Recursos

Recurso ZXing.Net IronBarcode
Leitura
Leitura segura para threads Não — são necessárias instâncias por thread. Sim — API estática sem estado
Detecção automática de formato Não — PossibleFormats necessário Sim — todos os formatos são detectados automaticamente.
Vários códigos de barras por imagem Sim — DecodeMultiple Sim — comportamento padrão
Leitura de código de barras em PDF Não — é necessária uma biblioteca externa. Sim — nativo
Recuperação de código de barras danificado flag de TryHarder Correção de imagem com tecnologia de aprendizado de máquina
Ajuste de velocidade/precisão Redução de lista de formatação enum de ReadingSpeed
Geração
Código 128 / Código 39 Sim Sim
Código QR Sim Sim
Código QR com logotipo Não Sim
Personalização de cores do código QR Não Sim
Saída para PNG/JPEG/PDF Manual via System.Drawing Métodos de saída integrados
Cadeia de geração fluente Não Sim
Plataforma e Implantação
Windows (System.Drawing) Sim — ZXing.Net.Bindings.Windows.Compatibility Sim
Linux / Docker Sim —ZXing.Net.Bindings.ImageSharp / .V2 / .V3(API diferente) Sim — mesma API
macOS Sim — ZXing.Net.Bindings.ImageSharp / .V2 / .V3 Sim
Dependências extras do Docker Pode exigir libgdiplus None
Pacote NuGet único Não — núcleo + vinculação + ImageSharp opcional Sim
Licenciamento e suporte
Tipo de licença Apache 2.0 Comercial
Custo Livre A partir de $749
Apoio comunitário Problemas no GitHub , comunidade ativa Sim
Suporte a SLA comercial Não Sim
Compatível com código aberto Sim Não

Segurança de threads e processamento concorrente

A segurança de threads é a diferença operacional mais importante entre as duas bibliotecas e afeta mais projetos do que os avisos da documentação podem sugerir.

Abordagem ZXing .NET

O BarcodeReader do ZXing.Net é um objeto com estado. Quando Decode é chamado, o estado interno é gravado. Se duas threads compartilharem a mesma instância, ocorrerá uma corrida entre elas durante a escrita. Os resultados não são determinísticos: você pode obter um resultado de uma imagem diferente, um valor nulo onde existe um código de barras ou uma exceção. A abordagem correta é criar um leitor por thread — o que significa que cada caminho paralelo ou assíncrono aloca um leitor, o configura, o utiliza uma vez e o descarta:

// ZXing.Net: one reader instance per parallel operation
Parallel.ForEach(imagePaths, path =>
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    };

    using var bitmap = new Bitmap(path);
    var result = reader.Decode(bitmap);

    if (result != null)
        results[path] = result.Text;
});
// ZXing.Net: one reader instance per parallel operation
Parallel.ForEach(imagePaths, path =>
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    };

    using var bitmap = new Bitmap(path);
    var result = reader.Decode(bitmap);

    if (result != null)
        results[path] = result.Text;
});
Imports System.Collections.Concurrent
Imports System.Drawing
Imports ZXing

Parallel.ForEach(imagePaths, Sub(path)
    Dim reader As New BarcodeReader()
    reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    }

    Using bitmap As New Bitmap(path)
        Dim result = reader.Decode(bitmap)

        If result IsNot Nothing Then
            results(path) = result.Text
        End If
    End Using
End Sub)
$vbLabelText   $csharpLabel

O padrão ThreadLocal<BarcodeReader> reduz a alocação por chamada ao reutilizar um leitor por thread, mas adiciona complexidade ao descarte e ainda requer configuração de formato em cada instância.

Abordagem do IronBarcode

O BarcodeReader.Read do IronBarcode é um método estático sem estado. Não há instância para compartilhar, nenhuma instância para isolar e nenhum estado de configuração para proteger. A mesma chamada é executada com segurança a partir de qualquer número de threads simultâneas:

// IronBarcode: static method — no instance management
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

Parallel.ForEach(imagePaths, path =>
{
    var result = BarcodeReader.Read(path, options).FirstOrDefault();
    if (result != null)
        results[path] = result.Value;
});
// IronBarcode: static method — no instance management
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

Parallel.ForEach(imagePaths, path =>
{
    var result = BarcodeReader.Read(path, options).FirstOrDefault();
    if (result != null)
        results[path] = result.Value;
});
Imports IronBarcode

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True,
    .MaxParallelThreads = 4
}

Parallel.ForEach(imagePaths, Sub(path)
    Dim result = BarcodeReader.Read(path, options).FirstOrDefault()
    If result IsNot Nothing Then
        results(path) = result.Value
    End If
End Sub)
$vbLabelText   $csharpLabel

A documentação do IronBarcodesobre leitura assíncrona e multithread de códigos de barras explica o modelo interno de agrupamento de threads. A propriedade MaxParallelThreads controla o grau de paralelismo sem exigir coordenação externa.

Detecção de formato

A política de detecção de formato é a segunda diferença operacional significativa entre as duas bibliotecas.

Abordagem ZXing .NET

O ZXing.Net requer que reader.Options.PossibleFormats seja preenchido antes de cada decodificação. Se um formato de código de barras não estiver listado, ele não será detectado — sem erros, avisos ou resultados parciais:

// ZXing.Net: PossibleFormats list controls which symbologies are decoded
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
    BarcodeFormat.QR_CODE,
    BarcodeFormat.CODE_128,
    BarcodeFormat.CODE_39,
    BarcodeFormat.EAN_13,
    BarcodeFormat.EAN_8,
    BarcodeFormat.UPC_A,
    BarcodeFormat.DATA_MATRIX,
    BarcodeFormat.PDF_417
};
reader.Options.TryHarder = true;

using var bitmap = new Bitmap(imagePath);
var results = reader.DecodeMultiple(bitmap);
// ZXing.Net: PossibleFormats list controls which symbologies are decoded
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
    BarcodeFormat.QR_CODE,
    BarcodeFormat.CODE_128,
    BarcodeFormat.CODE_39,
    BarcodeFormat.EAN_13,
    BarcodeFormat.EAN_8,
    BarcodeFormat.UPC_A,
    BarcodeFormat.DATA_MATRIX,
    BarcodeFormat.PDF_417
};
reader.Options.TryHarder = true;

using var bitmap = new Bitmap(imagePath);
var results = reader.DecodeMultiple(bitmap);
Imports ZXing
Imports ZXing.Common

' ZXing.Net: PossibleFormats list controls which symbologies are decoded
Dim reader As New BarcodeReader()
reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
    BarcodeFormat.QR_CODE,
    BarcodeFormat.CODE_128,
    BarcodeFormat.CODE_39,
    BarcodeFormat.EAN_13,
    BarcodeFormat.EAN_8,
    BarcodeFormat.UPC_A,
    BarcodeFormat.DATA_MATRIX,
    BarcodeFormat.PDF_417
}
reader.Options.TryHarder = True

Using bitmap As New Bitmap(imagePath)
    Dim results = reader.DecodeMultiple(bitmap)
End Using
$vbLabelText   $csharpLabel

Se todos os formatos forem listados para evitar erros, o desempenho será prejudicado. Se apenas os formatos esperados forem listados, erros silenciosos se tornam um risco quando imagens chegam de fontes externas. Não existe nenhum mecanismo para o ZXing .NET informar que encontrou um código de barras em um formato não listado.

Abordagem do IronBarcode

O IronBarcode detecta automaticamente todos os mais de 50 formatos suportados. Não é necessário nem aceito nenhum formato de lista:

// IronBarcode: automatic detection across all supported formats
var results = BarcodeReader.Read(imagePath);
foreach (var barcode in results)
{
    Console.WriteLine($"{barcode.Value} ({barcode.Format})");
}
// IronBarcode: automatic detection across all supported formats
var results = BarcodeReader.Read(imagePath);
foreach (var barcode in results)
{
    Console.WriteLine($"{barcode.Value} ({barcode.Format})");
}
Imports IronBarcode

' IronBarcode: automatic detection across all supported formats
Dim results = BarcodeReader.Read(imagePath)
For Each barcode In results
    Console.WriteLine($"{barcode.Value} ({barcode.Format})")
Next
$vbLabelText   $csharpLabel

Para aplicações que ajustam velocidade de leitura contra exaustividade de detecção, o IronBarcode expõe um enum ReadingSpeedFaster, Balanced, Detailed, ExtremeDetail — sem exigir enumeração de formato. O ajuste de velocidade afeta a agressividade com que o mecanismo processa cada imagem, e não os formatos que ele considera.

Suporte para documentos PDF

A leitura de PDFs é uma limitação intransponível no ZXing .NET: a biblioteca não oferece nenhum tipo de suporte a PDFs.

Abordagem ZXing .NET

Quando um código de barras chega incorporado em um PDF, o ZXing .NET requer uma biblioteca externa de renderização de PDF. A solução alternativa mais comum utiliza o PdfiumViewer, que adiciona aproximadamente 20 MB de binários nativos e um loop de renderização de página que os chamadores devem implementar e manter:

// ZXing.Net: PDF input is handled by PdfiumViewer with a per-page render loop
using var pdfDocument = PdfDocument.Load(pdfPath);

var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
    BarcodeFormat.QR_CODE,
    BarcodeFormat.CODE_128,
    BarcodeFormat.PDF_417
};

for (int i = 0; i < pdfDocument.PageCount; i++)
{
    string tempPath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png");
    try
    {
        using var pageImage = pdfDocument.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi);
        pageImage.Save(tempPath, ImageFormat.Png);

        using var bitmap = new Bitmap(tempPath);
        var decoded = reader.DecodeMultiple(bitmap);
        if (decoded != null)
            results.AddRange(decoded.Select(d => d.Text));
    }
    finally
    {
        File.Delete(tempPath);
    }
}
// ZXing.Net: PDF input is handled by PdfiumViewer with a per-page render loop
using var pdfDocument = PdfDocument.Load(pdfPath);

var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
    BarcodeFormat.QR_CODE,
    BarcodeFormat.CODE_128,
    BarcodeFormat.PDF_417
};

for (int i = 0; i < pdfDocument.PageCount; i++)
{
    string tempPath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png");
    try
    {
        using var pageImage = pdfDocument.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi);
        pageImage.Save(tempPath, ImageFormat.Png);

        using var bitmap = new Bitmap(tempPath);
        var decoded = reader.DecodeMultiple(bitmap);
        if (decoded != null)
            results.AddRange(decoded.Select(d => d.Text));
    }
    finally
    {
        File.Delete(tempPath);
    }
}
Imports System.IO
Imports System.Drawing
Imports PdfiumViewer
Imports ZXing
Imports ZXing.Common

' ZXing.Net: PDF input is handled by PdfiumViewer with a per-page render loop
Using pdfDocument As PdfDocument = PdfDocument.Load(pdfPath)

    Dim reader As New BarcodeReader()
    reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.PDF_417
    }

    For i As Integer = 0 To pdfDocument.PageCount - 1
        Dim tempPath As String = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png")
        Try
            Using pageImage As Image = pdfDocument.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi)
                pageImage.Save(tempPath, Imaging.ImageFormat.Png)

                Using bitmap As New Bitmap(tempPath)
                    Dim decoded = reader.DecodeMultiple(bitmap)
                    If decoded IsNot Nothing Then
                        results.AddRange(decoded.Select(Function(d) d.Text))
                    End If
                End Using
            End Using
        Finally
            File.Delete(tempPath)
        End Try
    Next
End Using
$vbLabelText   $csharpLabel

Esse padrão apresenta modos de falha reais: a configuração incorreta do DPI causa falhas silenciosas, as permissões de arquivos temporários falham em ambientes restritos, as bibliotecas nativas do PdfiumViewer exigem gerenciamento de implantação separado e a instalação não funciona no Linux sem configuração adicional.

Abordagem do IronBarcode

O IronBarcodelê códigos de barras de PDFs nativamente — todas as páginas, todos os formatos, sem dependências externas. A mesma chamada BarcodeReader.Read aceita caminhos de PDF diretamente:

// IronBarcode: one call processes every page of the PDF
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}");
// IronBarcode: one call processes every page of the PDF
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}");
Imports IronBarcode

' IronBarcode: one call processes every page of the PDF
Dim results = BarcodeReader.Read("invoice.pdf")
For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}")
Next
$vbLabelText   $csharpLabel

Sem enumeração de páginas, sem configuração de DPI, sem arquivos temporários e sem biblioteca separada para implantar junto com o aplicativo.

Vinculações e Implantação da Plataforma

O processamento de imagens do ZXing.Net é distribuído por pacotes de vinculação específicos da plataforma, cada um com uma interface de API diferente.

Abordagem ZXing .NET

O pacote central ZXing.Net fornece lógica de decodificação, mas sem carregamento de imagem. Quem faz a chamada deve escolher uma vinculação com base no seu destino de implantação:

Ambiente Pacote Notas
Área de trabalho do Windows / WPF ZXing.Net.Bindings.Windows.Compatibility Usa System.Drawing — compatível com Windows; precisa de libgdiplus no Linux
Linux / Docker/multiplataforma ZXing.Net.Bindings.ImageSharp / .V2 / .V3 Diferentes superfícies de API; adiciona dependência SixLabors.ImageSharp (as versões V2/V3 acompanham as principais versões do ImageSharp)
macOS ZXing.Net.Bindings.ImageSharp / .V2 / .V3 Mesmo caminho que no Linux.

A consequência prática é que o código do Windows usando System.Drawing.Bitmap não compila ou roda no Linux. A conteinerização exige a troca de pacotes de vinculação e a reescrita do código de carregamento de imagens:

// Windows binding path — uses System.Drawing
using ZXing.Windows.Compatibility;
using System.Drawing;

var reader = new BarcodeReader();
using var bitmap = new Bitmap(imagePath);
var result = reader.Decode(bitmap);
// Windows binding path — uses System.Drawing
using ZXing.Windows.Compatibility;
using System.Drawing;

var reader = new BarcodeReader();
using var bitmap = new Bitmap(imagePath);
var result = reader.Decode(bitmap);
Imports ZXing.Windows.Compatibility
Imports System.Drawing

Dim reader As New BarcodeReader()
Using bitmap As New Bitmap(imagePath)
    Dim result = reader.Decode(bitmap)
End Using
$vbLabelText   $csharpLabel
// Cross-platform path — different package, different API
using ZXing.ImageSharp;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

var reader = new BarcodeReader<Rgba32>();
using var image = Image.Load<Rgba32>(imagePath);
var result = reader.Decode(image);
// Cross-platform path — different package, different API
using ZXing.ImageSharp;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

var reader = new BarcodeReader<Rgba32>();
using var image = Image.Load<Rgba32>(imagePath);
var result = reader.Decode(image);
Imports ZXing.ImageSharp
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats

Dim reader As New BarcodeReader(Of Rgba32)()
Using image As Image(Of Rgba32) = Image.Load(Of Rgba32)(imagePath)
    Dim result = reader.Decode(image)
End Using
$vbLabelText   $csharpLabel

Usar a ligação do Windows em um host Linux também requer libgdiplus na imagem Docker, adicionando aproximadamente 50 MB ao contêiner.

Abordagem do IronBarcode

A IronBarcode envia um único pacote para todas as plataformas. A mesma chamada BarcodeReader.Read(path) compila e roda de forma idêntica em Windows, Linux, macOS, e dentro de contêineres Docker. Não são necessários pacotes de vinculação, condicionais de plataforma ou dependências de sistema adicionais. Para equipes que utilizam contêineres para aplicações .NET , o guia de configuração do IronBarcode para Docker e Linux aborda detalhadamente o padrão de implantação de pacote único.

API de geração

Ambas as bibliotecas geram códigos de barras, mas as APIs refletem abordagens de design diferentes.

Abordagem ZXing .NET

A classe BarcodeWriter do ZXing.Net cria um objeto escritor, aceita opções de codificação, chama Write, e retorna um Bitmap que os chamadores devem salvar manualmente usando System.Drawing.Imaging:

// ZXing.Net: create writer, set options, call Write, save Bitmap
using ZXing;
using ZXing.Common;
using ZXing.Windows.Compatibility;
using System.Drawing.Imaging;

var writer = new BarcodeWriter
{
    Format = BarcodeFormat.CODE_128,
    Options = new EncodingOptions
    {
        Width = 300,
        Height = 100,
        Margin = 10
    }
};

using var bitmap = writer.Write("PRODUCT-001");
bitmap.Save("output.png", ImageFormat.Png);
// ZXing.Net: create writer, set options, call Write, save Bitmap
using ZXing;
using ZXing.Common;
using ZXing.Windows.Compatibility;
using System.Drawing.Imaging;

var writer = new BarcodeWriter
{
    Format = BarcodeFormat.CODE_128,
    Options = new EncodingOptions
    {
        Width = 300,
        Height = 100,
        Margin = 10
    }
};

using var bitmap = writer.Write("PRODUCT-001");
bitmap.Save("output.png", ImageFormat.Png);
Imports ZXing
Imports ZXing.Common
Imports ZXing.Windows.Compatibility
Imports System.Drawing.Imaging

Dim writer As New BarcodeWriter With {
    .Format = BarcodeFormat.CODE_128,
    .Options = New EncodingOptions With {
        .Width = 300,
        .Height = 100,
        .Margin = 10
    }
}

Using bitmap = writer.Write("PRODUCT-001")
    bitmap.Save("output.png", ImageFormat.Png)
End Using
$vbLabelText   $csharpLabel

Salvar em formatos diferentes de PNG ou JPEG, salvar em um PDF, ou produzir saída binária para uma resposta HTTP requerem toda infraestrutura adicional de System.Drawing que o chamador deve implementar.

Abordagem do IronBarcode

O BarcodeWriter.CreateBarcode do IronBarcode retorna um objeto GeneratedBarcode que fornece métodos de saída embutidos através de uma cadeia fluente:

// IronBarcode: create and save in one fluent chain
BarcodeWriter.CreateBarcode("PRODUCT-001", BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng("output.png");
// IronBarcode: create and save in one fluent chain
BarcodeWriter.CreateBarcode("PRODUCT-001", BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng("output.png");
Imports IronBarCode

' IronBarcode: create and save in one fluent chain
BarcodeWriter.CreateBarcode("PRODUCT-001", BarcodeEncoding.Code128) _
    .ResizeTo(300, 100) _
    .SaveAsPng("output.png")
$vbLabelText   $csharpLabel

O objeto GeneratedBarcode também expõe .ToPngBinaryData(), .ToJpegBinaryData(), .ToStream(), e .SaveAsPdf() — alvos de saída que o ZXing.Net requer que os chamadores implementem eles mesmos usando System.Drawing.

Referência de Mapeamento de API

ZXing.Net IronBarcode Notas
new BarcodeReader() Estático — nenhuma instância BarcodeReader.Read(...) é uma chamada estática
reader.Options.PossibleFormats = new List<BarcodeFormat> { ... } Não é necessário A detecção automática abrange todos os formatos.
reader.Options.TryHarder = true Speed = ReadingSpeed.Balanced Ajuste de precisão via BarcodeReaderOptions
reader.Decode(bitmap) BarcodeReader.Read(imagePath) Passe o caminho diretamente — não é necessário Bitmap
reader.DecodeMultiple(bitmap) BarcodeReader.Read(imagePath) Sempre retorna uma coleção
result.Text result.Value Propriedade renomeada
result.BarcodeFormat result.Format Propriedade renomeada
BarcodeFormat.QR_CODE BarcodeEncoding.QRCode Alteração na convenção de nomenclatura de enumerações
BarcodeFormat.CODE_128 BarcodeEncoding.Code128 Alteração na convenção de nomenclatura de enumerações
BarcodeFormat.EAN_13 BarcodeEncoding.EAN13 Alteração na convenção de nomenclatura de enumerações
new BarcodeWriter { Format = BarcodeFormat.CODE_128, Options = new EncodingOptions { ... } } BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) Método de fábrica estática
writer.Write(data) retorna Bitmap .SaveAsPng(path) / .ToPngBinaryData() Métodos de saída embutidos em GeneratedBarcode
Sem suporte para PDF — requer o PdfiumViewer. BarcodeReader.Read("doc.pdf") Suporte nativo a PDF
Não é seguro para threads API estática thread-safe Não é necessário gerenciamento de instâncias.

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

Diversos cenários levam as equipes de desenvolvimento a avaliar o IronBarcode como uma alternativa ao ZXing .NET.

Processamento simultâneo e de alto rendimento

Uma integração ZXing .NET que funciona corretamente em um aplicativo de console de thread única pode apresentar comportamento não determinístico quando o mesmo código é movido para um controlador ASP.NET Core que lida com solicitações simultâneas ou para um trabalho em segundo plano que processa lotes em paralelo. O padrão de instância por thread exigido pelo ZXing .NET significa que cada solicitação ou tarefa paralela aloca um objeto leitor completo com seu conjunto de decodificadores configurado, usa-o uma vez e o descarta. À medida que o volume de solicitações aumenta, essa pressão de alocação torna-se mensurável. As equipes que chegam a esse ponto — especialmente aquelas que executam fluxos de trabalho de digitalização de alto rendimento em logística, armazenagem ou processamento de documentos — geralmente procuram uma biblioteca cujo modelo de threading não imponha essa sobrecarga a cada chamador.

Digitalização de documentos em formatos mistos

Aplicações que aceitam documentos de terceiros frequentemente encontram formatos de código de barras que não foram previstos quando a lista de formatos foi configurada. Uma integração de envio criada para a Code 128 recebe remessas de parceiros usando códigos QR. Um sistema de registros médicos configurado para PDF 417 encontra simbologias Data Matrix de um novo fornecedor de equipamentos. Em ZXing .NET, cada um desses casos produz um valor nulo silencioso em vez de um erro de decodificação, o que significa que a falha pode não aparecer até que o processamento subsequente falhe. Equipes que já sofreram prejuízos com falhas silenciosas de formatação — especialmente em contextos onde um código de barras não identificado tem consequências para os negócios — começam a comparar o custo da manutenção da lista de formatos com o de uma biblioteca que detecta formatos automaticamente.

Extração de código de barras em PDF

Muitos documentos comerciais chegam em formato PDF: faturas, manifestos de envio, registros de pacientes, certificados de conformidade. O ZXing .NET não consegue ler estes arquivos diretamente. As equipes que precisam extrair códigos de barras de PDFs acabam construindo e mantendo um pipeline de renderização baseado no ZXing .NET — selecionando uma biblioteca PDF, gerenciando suas dependências nativas, implementando um loop de renderização de página, lidando com a configuração de DPI e escrevendo a lógica de limpeza para arquivos temporários. Esse código de infraestrutura não é lógica de código de barras; Ele existe unicamente para preencher a lacuna entre o que o ZXing .NET aceita (bitmaps) e o que os documentos comerciais realmente são (PDFs). As equipes que se veem responsáveis ​​pela manutenção dessa ponte — especialmente quando a própria biblioteca PDF tem suas próprias considerações de licenciamento, implantação e plataforma — geralmente preferem uma biblioteca única que lide com toda a superfície de entrada.

Reduzindo a complexidade de ligação

Projetos iniciados no Windows e posteriormente implantados no Linux ou Docker encontram diretamente a fragmentação do binding do ZXing.Net: o pacote de binding do Windows usa uma API diferente do binding multiplataforma do ImageSharp, e a troca entre eles exige a alteração tanto das referências do NuGet quanto do código de carregamento de imagens. Equipes que conteinerizam seus aplicativos .NET como prática comum, ou que executam a mesma base de código em máquinas de desenvolvimento (Windows ou macOS) e servidores de produção (Linux), descobrem que manter dois caminhos de código para carregamento de imagens adiciona atrito a cada alteração futura na camada de digitalização.

Considerações Comuns de Migração

As equipes que estão migrando do ZXing .NET para o IronBarcode devem se planejar para essas mudanças técnicas específicas.

Remoção da instanciação do leitor de código de barras

Cada chamada new BarcodeReader() na base de código é removida durante a migração. O padrão de instanciação — criação do leitor, configuração do formato, carregamento da imagem, chamada de decodificação — se resume em uma única chamada de método estático. Arquivos que importam os namespaces ZXing, ZXing.Common, ZXing.Windows.Compatibility, ZXing.ImageSharp, e SixLabors.ImageSharp têm essas importações removidas e substituídas por um único using IronBarCode;.

Remoção da configuração PossibleFormats

O bloco de atribuição reader.Options.PossibleFormats é excluído em cada ponto de chamada. O IronBarcode realiza detecção de formato automática e não aceita uma lista de restrição de formato. A flag TryHarder é substituída pela propriedade ReadingSpeed em BarcodeReaderOptions, que controla o esforço de detecção sem restringir o escopo do formato.

Limpeza do pacote de vinculação

A migração remove ZXing.Net, ZXing.Net.Bindings.Windows.Compatibility, qualquer variante de ZXing.Net.Bindings.ImageSharp (.V2 / .V3), e quaisquer pacotes de PdfiumViewer que foram adicionados para suportar leitura de PDF. Se libgdiplus foi adicionado a um Dockerfile para suportar System.Drawing através da ligação do Windows no Linux, essa linha também é removida. O IronBarcode não requer dependências específicas de plataforma na imagem Docker.

Funcionalidades adicionais do IronBarcode

Além das funcionalidades abordadas nas seções de comparação acima, o IronBarcode oferece:

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

IronBarcode tem como alvo .NET Standard 2.0 e acima, fornecendo compatibilidade com .NET Framework 4.6.2+, .NET Core 3.1, .NET 5, .NET 6, .NET 7, .NET 8, e .NET 9. A biblioteca recebe atualizações regulares alinhadas ao ciclo de lançamentos da Microsoft .NET, garantindo que a compatibilidade com o .NET 10 estará disponível no lançamento ou próximo a ele. O ZXing .NET também mantém ampla compatibilidade com o .NET por meio de seus pacotes NuGet , e ambas as bibliotecas são adequadas para projetos .NET modernos sob essa perspectiva.

Conclusão

ZXing .NET e IronBarcode representam filosofias diferentes no projeto de bibliotecas de código de barras. ZXing .NET é uma biblioteca com estado, baseada em instâncias, que delega a responsabilidade pelo gerenciamento de threads, especificação de formato e conversão para PDF inteiramente ao chamador.IronBarcode é uma biblioteca sem estado, com API estática, que internaliza threads, detecta formatos automaticamente e lida com entrada de PDF nativamente. A consequência prática dessa diferença é que o código .NET para ZX em contextos concorrentes ou de processamento de documentos tende a acumular infraestrutura — padrões de instância por thread, listas de formatos, pipelines de renderização de PDF e ramificações de vinculação específicas da plataforma — enquanto o código IronBarcode para os mesmos cenários não requer nenhuma dessa estrutura externa.

ZXing .NET é uma escolha realmente sólida para projetos com requisitos de custo zero. Sua licençaApache 2.0a torna compatível com projetos de código aberto e com produtos comerciais que preferem dependências livres. Em ambientes controlados — formatos de código de barras conhecidos, imagens nítidas, processamento de thread única ou levemente concorrente — seu desempenho é confiável. Sua ativa comunidade no GitHub fornece respostas rápidas aos problemas, e a abrangência de sua cobertura de formatos é comparável às alternativas comerciais. Para aplicações em que essas condições se verificam, a vantagem de custo do ZXing.Net é real e suas limitações técnicas são administráveis.

O IronBarcode aborda os cenários em que as limitações de design do ZXing.Net se transformam em custos operacionais: APIs web concorrentes onde a alocação de instâncias por requisição é mensurável, pipelines de documentos onde a entrada em PDF é a norma e não a exceção, digitalização de formatos mistos onde falhas silenciosas acarretam riscos para os negócios e implantações multiplataforma onde dois pacotes de vinculação significam dois caminhos de código. Nesses contextos, a licença comercial da biblioteca garante um modelo de execução simultânea que não impõe gerenciamento de instâncias, detecção de formato que não requer manutenção e suporte a PDF que não exige uma segunda biblioteca.

A decisão depende dos requisitos do projeto. Um protótipo de formato único, um scanner de código aberto ou uma ferramenta de baixo volume onde o custo é a principal restrição — nesses casos, o ZXing .NET é a escolha apropriada. Uma API web de produção que processa documentos de fontes externas em múltiplas threads — é aí que as premissas de design do IronBarcode se alinham com a realidade operacional. Para uma análise mais abrangente de como as bibliotecas se comparam em termos de taxas de detecção e cenários de digitalização do mundo real, a comparação entre os leitores de código de barras ZXing .NET e IronBarcode oferece análises adicionais.

Perguntas frequentes

O que é ZXing.Net?

ZXing.Net é 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 e IronBarcode?

O IronBarcode utiliza uma API estática e sem estado, que não requer gerenciamento de instâncias, enquanto o ZXing.Net normalmente exige a criação e configuração de instâncias 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?

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?

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?

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?

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 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 para o IronBarcode?

A migração do ZXing.Net 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 relacionado a 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