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

Como ler códigos de barras no ZXing para desenvolvedores C#

Accusoft BarcodeXpressvs IronBarcode: Licenciamento, Produção e Trocas de API

Ao avaliar uma biblioteca de códigos de barras por meio de sua versão de teste, você espera verificar se ela realmente funciona com suas imagens antes de efetuar a compra. OAccusoft BarcodeXpressnão oferece essa opção. No modo de avaliação, os valores de código de barras decodificados são carimbados com a string " UNLICENSED accusoft.com " e os códigos de barras 2D gerados carregam o mesmo carimbo. Você pode verificar se a biblioteca encontra um código de barras, mas não pode verificar se ela lê o código corretamente. Essa é uma situação de "comprometa-se antes de verificar", e representa um ponto de atrito significativo antes mesmo de você analisar os preços.

Entendendo o Accusoft BarcodeXpress

A Accusoft desenvolve software de digitalização de documentos para ambientes Enterprise há décadas. O BarcodeXpress faz parte de uma família de produtos mais ampla que inclui o PrizmDoc, o ImageGear e o Accusoft Imaging. As equipes que já utilizam esses produtos encontram uma interface de API familiar e podem contar com um relacionamento existente com a conta Accusoft. Para uso isolado de códigos de barras, esse contexto oferece menos valor.

O SDK principal está disponível como um pacote NuGet for .NET Core. A API é baseada em instância — você cria um objeto BarcodeXpress, configura a propriedade Licensing, então usa os objetos filho reader e writer para operações reais. O sistema de licenciamento de chave dupla diferencia o BarcodeXpress da maioria das alternativas.

Principais características arquitetônicas do BarcodeXpress:

  • API baseada em instância: Cada operação requer uma instância BarcodeXpress; Métodos estáticos de conveniência não fazem parte do projeto.
  • Licenciamento em duas camadas: O licenciamento do SDK (SetSolutionName + SetSolutionKey) e o licenciamento OEM/runtime (SetOEMLicenseKey) são sistemas separados que requerem compras separadas
  • Carimbo de modo de avaliação: No modo de avaliação, os valores decodificados são carimbados com " UNLICENSED accusoft.com " (e os códigos de barras 2D gerados são carimbados com a mesma string), tornando impossível o teste de precisão pré-compra
  • Especificação de formato manual: O leitor requer configuração explícita de BarcodeTypes para enumerar quais simbologias procurar; Formatos não especificados não são detectados.
  • Limite padrão de 40 PPM: A Edição Padrão limita o processamento a 40 páginas por minuto, um limite que a maioria das equipes encontra após a implementação, e não antes.
  • Sem suporte nativo para PDF: os arquivos PDF precisam ser pré-renderizados em imagens usando uma biblioteca separada antes que o leitor possa processá-los.
  • Mínimo de cinco licenças de tempo de execução: Mesmo uma implementação em um único servidor exige a compra de pelo menos cinco licenças de tempo de execução.

O Sistema de Duas Chaves Explicado

A BarcodeXpress divide o licenciamento em duas camadas conceitualmente distintas:

// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;

// Constructor takes the path to the runtime files (e.g. ".").
var barcodeXpress = new BarcodeXpress(".");

// Step 1: SDK license (for development).
// SetSolutionName and SetSolutionKey are methods, not properties.
// SetSolutionKey takes four 32-bit integers (not a parsed long).
barcodeXpress.Licensing.SetSolutionName("YourCompanyName");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);

// Step 2: OEM/runtime license (for production — minimum 5 purchased).
try
{
    barcodeXpress.Licensing.SetOEMLicenseKey("YourOEMLicenseString");
}
catch (Exception ex)
{
    // Without a valid OEM license, the SDK runs in stamped evaluation mode.
    Console.WriteLine($"OEM license activation failed: {ex.Message}");
}
// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;

// Constructor takes the path to the runtime files (e.g. ".").
var barcodeXpress = new BarcodeXpress(".");

// Step 1: SDK license (for development).
// SetSolutionName and SetSolutionKey are methods, not properties.
// SetSolutionKey takes four 32-bit integers (not a parsed long).
barcodeXpress.Licensing.SetSolutionName("YourCompanyName");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);

// Step 2: OEM/runtime license (for production — minimum 5 purchased).
try
{
    barcodeXpress.Licensing.SetOEMLicenseKey("YourOEMLicenseString");
}
catch (Exception ex)
{
    // Without a valid OEM license, the SDK runs in stamped evaluation mode.
    Console.WriteLine($"OEM license activation failed: {ex.Message}");
}
Imports Accusoft.BarcodeXpressSdk

' BarcodeXpress: two separate license keys required

' Constructor takes the path to the runtime files (e.g. ".").
Dim barcodeXpress As New BarcodeXpress(".")

' Step 1: SDK license (for development).
' SetSolutionName and SetSolutionKey are methods, not properties.
' SetSolutionKey takes four 32-bit integers (not a parsed long).
barcodeXpress.Licensing.SetSolutionName("YourCompanyName")
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)

' Step 2: OEM/runtime license (for production — minimum 5 purchased).
Try
    barcodeXpress.Licensing.SetOEMLicenseKey("YourOEMLicenseString")
Catch ex As Exception
    ' Without a valid OEM license, the SDK runs in stamped evaluation mode.
    Console.WriteLine($"OEM license activation failed: {ex.Message}")
End Try
$vbLabelText   $csharpLabel

O par SetSolutionKey ativa o próprio SDK. A chamada SetOEMLicenseKey ativa as capacidades de implantação em produção. Ambos devem estar presentes e válidos para que uma implantação em produção retorne valores de código de barras sem o carimbo " UNLICENSED accusoft.com ".

Na revisão de código, esse padrão gera uma pergunta previsível: 'Por que temos duas ativações de licença separadas?' A resposta — que a Accusoft trata o licenciamento SDK e o licenciamento de implantação como produtos separados com faturamento separado — nem sempre é óbvia na própria API. As equipes que fazem manutenção desse código seis meses após a configuração inicial geralmente precisam consultar a documentação para entender qual tecla corresponde a qual função.

Sem uma licença OEM válida, SetOEMLicenseKey é lançado e o SDK volta para o modo de avaliação. As equipes normalmente envolvem a ativação em try/catch para que a falha seja registrada em alto volume, em vez de produzir silenciosamente valores de códigos de barras carimbados na produção:

try
{
    barcodeXpress.Licensing.SetOEMLicenseKey(oemKey);
}
catch (Exception ex)
{
    // In evaluation mode, barcode values are stamped with
    // " UNLICENSED accusoft.com " in the output.
    throw new InvalidOperationException(
        "OEM license activation failed — barcode values will be stamped", ex);
}
try
{
    barcodeXpress.Licensing.SetOEMLicenseKey(oemKey);
}
catch (Exception ex)
{
    // In evaluation mode, barcode values are stamped with
    // " UNLICENSED accusoft.com " in the output.
    throw new InvalidOperationException(
        "OEM license activation failed — barcode values will be stamped", ex);
}
Try
    barcodeXpress.Licensing.SetOEMLicenseKey(oemKey)
Catch ex As Exception
    ' In evaluation mode, barcode values are stamped with
    ' " UNLICENSED accusoft.com " in the output.
    Throw New InvalidOperationException("OEM license activation failed — barcode values will be stamped", ex)
End Try
$vbLabelText   $csharpLabel

Esse guarda é o padrão que as equipes adicionam quando percebem que a saída em modo de avaliação carimba os resultados silenciosamente em vez de lançar uma exceção durante a decodificação.

Entendendo o IronBarcode

IronBarcode é uma biblioteca independente de código de barras para .NET , sem dependências externas além do seu pacote NuGet . Ele lida tanto com a geração quanto com a leitura por meio de métodos de fábrica estáticos, o que significa que não há ciclo de vida de instância para gerenciar nem chamadas de construtor espalhadas pelo código do aplicativo.

O modelo de licenciamento de chave única significa que o que você testa no modo de avaliação é o que funciona em produção — a única diferença é uma marca d'água nas imagens de código de barras geradas durante o período de avaliação. Os valores decodificados são sempre completos, o que significa que você pode comparar a precisão de leitura com seus documentos reais antes de decidir se deve comprar.

Principais características do IronBarcode:

  • Design de API estática: BarcodeReader.Read() e BarcodeWriter.CreateBarcode() são métodos estáticos sem estado — não é necessário gerenciamento de instâncias
  • Chave de licença única: Uma única chave cobre tanto a implantação em ambiente de desenvolvimento quanto em produção; Não existe uma camada de licença de tempo de execução separada.
  • Valores de teste completos: O modo de teste retorna os valores decodificados completos; A marca d'água aplica-se apenas às imagens de saída geradas, não aos resultados lidos.
  • Detecção automática de formato: o IronBarcode detecta automaticamente a simbologia em todos os formatos suportados; não é necessária a enumeração BarcodeTypes
  • Suporte nativo a PDF: BarcodeReader.Read("document.pdf") processa arquivos PDF diretamente sem uma etapa de renderização separada
  • Sem limite de taxa de transferência: A velocidade de processamento é limitada apenas pela capacidade do hardware e da rede, e não por um limite imposto por software.
  • Seguro para threads por design: Métodos estáticos sem estado podem ser chamados simultaneamente por qualquer número de threads sem isolamento de instância.

Comparação de recursos

Recurso Accusoft BarcodeXpress IronBarcode
Modelo de licença Licença do SDK + licença de tempo de execução separada Chave perpétua única
Comportamento do modo de avaliação Valores de código de barras carimbados com 'UNLICENSED accusoft.com' Valores completos retornados, marca d'água apenas na saída gerada.
Limite de capacidade (Padrão) 40 páginas por minuto Sem limite de capacidade
Suporte a PDF Requer biblioteca PDF externa para extração de imagens. Nativo — BarcodeReader.Read("doc.pdf")
Estilo da API Configuração detalhada baseada em instâncias Métodos de fábrica estáticos, API fluente
Segurança da rosca É necessário ter uma instância por thread. Métodos estáticos sem estado — naturalmente seguros para threads.
Ponto de entrada de preços SDK a partir de US$ 1.960 + tempo de execução a partir de US$ 2.500 (mínimo de 5 unidades) Licença perpétua de US$ 749 (Lite, 1 desenvolvedor)

Comparação Detalhada de Recursos

Recurso Accusoft BarcodeXpress IronBarcode
Licenciamento
Modelo de licença Chave do SDK + chave de tempo de execução Chave perpétua única
Licenças mínimas de tempo de execução 5 (mesmo para 1 servidor) Não existe o conceito de licença de tempo de execução.
Modo de avaliação Valores carimbados com 'UNLICENSED accusoft.com' Valores completos, marca d'água apenas nas imagens de saída.
Licença perpétua Não é padrão — entre em contato com o departamento de vendas. Sim, todos os níveis.
Renovação anual Necessário para suporte Opcional
Leitura
Detecção automática de formato Manual — é necessário especificar os tipos de código de barras Automático em todos os formatos suportados.
Leitura de PDF Requer biblioteca PDF externa. Nativo
Vários códigos de barras por imagem Sim, com configuração BarcodeTypes Sim, com opção ExpectMultipleBarcodes
Propriedades do resultado BarcodeValue, BarcodeType Value, Format, Confidence, PageNumber
Limite de capacidade 40 PPM (Edição Padrão) Sem limite em nenhum nível.
Geração
Geração de código 128 Sim, via writer.BarcodeType Sim, via BarcodeWriter.CreateBarcode()
Geração de código QR Sim Sim, via QRCodeWriter.CreateQrCode()
Código QR com logotipo Sobreposição manual de imagens necessária AddBrandLogo("logo.png") embutido
Formatos de saída Salvar arquivo PNG, JPG, PDF, dados binários, fluxo
Plataforma e Implantação
.NET Framework SDK legado separado .NET Framework 4.6.2+
.NET Core / .NET 5+ Sim (SDK do .NET Core ) .NET Core 3.1+, .NET 5/6/7/8/9
Linux/Docker Sim Sim — Windows x64/x86, Linux x64, macOS x64/ARM
Configuração de licença do Docker Arquivo de licença ou servidor de licenças Variável de ambiente
Integração CI/CD São necessárias chaves tanto do SDK quanto do runtime. Um segredo
Processamento em Lote
Segurança da rosca É necessário ter uma instância por thread. Sem estado — Paralelo.Para cada cofre
Lote paralelo Requer gerenciamento de instâncias por thread. Suporte para Paralelo Direto.Para cada suporte

Arquitetura de Licenças

A diferença na complexidade de licenciamento entre BarcodeXpress e IronBarcode é mais visível ao escrever o código de inicialização que será executado em produção.

Abordagem BarcodeXpress

using Accusoft.BarcodeXpressSdk;

public class BarcodeService
{
    private readonly BarcodeXpress _barcodeXpress;

    public BarcodeService()
    {
        _barcodeXpress = new BarcodeXpress(".");

        // Layer 1: SDK license
        _barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
        _barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);

        // Layer 2: OEM/runtime license — separate purchase, minimum 5
        try
        {
            _barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException(
                "OEM license activation failed — barcode values will be stamped", ex);
        }
    }
}
using Accusoft.BarcodeXpressSdk;

public class BarcodeService
{
    private readonly BarcodeXpress _barcodeXpress;

    public BarcodeService()
    {
        _barcodeXpress = new BarcodeXpress(".");

        // Layer 1: SDK license
        _barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
        _barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);

        // Layer 2: OEM/runtime license — separate purchase, minimum 5
        try
        {
            _barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException(
                "OEM license activation failed — barcode values will be stamped", ex);
        }
    }
}
Imports Accusoft.BarcodeXpressSdk

Public Class BarcodeService
    Private ReadOnly _barcodeXpress As BarcodeXpress

    Public Sub New()
        _barcodeXpress = New BarcodeXpress(".")

        ' Layer 1: SDK license
        _barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
        _barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)

        ' Layer 2: OEM/runtime license — separate purchase, minimum 5
        Try
            _barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString")
        Catch ex As Exception
            Throw New InvalidOperationException("OEM license activation failed — barcode values will be stamped", ex)
        End Try
    End Sub
End Class
$vbLabelText   $csharpLabel

Este construtor existe inteiramente para gerenciar duas ativações de licença separadas antes que qualquer operação de código de barras possa ocorrer. O try/catch ao redor de SetOEMLicenseKey não é opcional — sem ele, o serviço retornará silenciosamente valores carimbados em qualquer ambiente onde a chave OEM esteja faltando ou mal configurada.

Abordagem do IronBarcode

using IronBarCode;

// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
using IronBarCode;

// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

' In Program.vb or startup configuration
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Esse é todo o conjunto de licenciamento. Nenhum desbloqueio de tempo de execução separado, nenhum nome de solução, nenhuma chamada UnlockRuntime com dois argumentos. No Docker, isso se torna uma variável de ambiente lida na inicialização. Em um pipeline de CI/CD, é um segredo. Em um orquestrador de contêineres, trata-se de uma variável de ambiente injetada no pod.

Leitura de códigos de barras

A leitura de códigos de barras revela a diferença entre as filosofias de configuração das duas bibliotecas: o BarcodeXpress exige a enumeração explícita de formatos e uma API de configuração baseada em propriedades, enquanto o IronBarcode detecta tudo automaticamente a partir de uma única chamada de método.

Abordagem BarcodeXpress

A leitura com BarcodeXpress requer carregar a imagem em um System.Drawing.Bitmap, atribuindo o conjunto de simbologia a reader.BarcodeTypes como um System.Array de valores BarcodeType, e chamando Analyze(bitmap) para recuperar os resultados. O SDK não lê PDFs diretamente — os formatos de entrada documentados são TIFF, JPEG, PNG e BMP:

using Accusoft.BarcodeXpressSdk;
using System.Drawing;

public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
    var barcodeXpress = new BarcodeXpress(".");
    barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
    barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
    barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");

    using var bitmap = new Bitmap(imagePath);

    // BarcodeTypes is a System.Array of BarcodeType values (not a [Flags]
    // enum). Pass Enum.GetValues to scan for everything, or assign a
    // narrower array to restrict the search space.
    barcodeXpress.reader.BarcodeTypes = new[]
    {
        BarcodeType.Code128Barcode,
        BarcodeType.DataMatrixBarcode,
        BarcodeType.QRCodeBarcode
    };

    Result[] results = barcodeXpress.reader.Analyze(bitmap);
    return results.Select(r => r.BarcodeValue);
}
using Accusoft.BarcodeXpressSdk;
using System.Drawing;

public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
    var barcodeXpress = new BarcodeXpress(".");
    barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
    barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
    barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");

    using var bitmap = new Bitmap(imagePath);

    // BarcodeTypes is a System.Array of BarcodeType values (not a [Flags]
    // enum). Pass Enum.GetValues to scan for everything, or assign a
    // narrower array to restrict the search space.
    barcodeXpress.reader.BarcodeTypes = new[]
    {
        BarcodeType.Code128Barcode,
        BarcodeType.DataMatrixBarcode,
        BarcodeType.QRCodeBarcode
    };

    Result[] results = barcodeXpress.reader.Analyze(bitmap);
    return results.Select(r => r.BarcodeValue);
}
Imports Accusoft.BarcodeXpressSdk
Imports System.Drawing

Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
    Dim barcodeXpress = New BarcodeXpress(".")
    barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
    barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
    barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString")

    Using bitmap As New Bitmap(imagePath)
        ' BarcodeTypes is a System.Array of BarcodeType values (not a [Flags]
        ' enum). Pass Enum.GetValues to scan for everything, or assign a
        ' narrower array to restrict the search space.
        barcodeXpress.Reader.BarcodeTypes = New BarcodeType() {
            BarcodeType.Code128Barcode,
            BarcodeType.DataMatrixBarcode,
            BarcodeType.QRCodeBarcode
        }

        Dim results As Result() = barcodeXpress.Reader.Analyze(bitmap)
        Return results.Select(Function(r) r.BarcodeValue)
    End Using
End Function
$vbLabelText   $csharpLabel

Analyze recebe um Bitmap e retorna um Result[]. Se um documento contém um formato não presente no array BarcodeTypes, ele não será encontrado. Isso se torna um custo adicional de manutenção quando as fontes de documentos mudam. Os PDFs exigem pré-renderização para imagens com uma biblioteca separada antes de serem alimentados em Analyze.

Abordagem do IronBarcode

using IronBarCode;

public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
    var results = BarcodeReader.Read(imagePath);
    return results.Select(r => r.Value);
}
using IronBarCode;

public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
    var results = BarcodeReader.Read(imagePath);
    return results.Select(r => r.Value);
}
Imports IronBarCode

Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
    Dim results = BarcodeReader.Read(imagePath)
    Return results.Select(Function(r) r.Value)
End Function
$vbLabelText   $csharpLabel

O IronBarcode detecta automaticamente o formato em todas as simbologias suportadas. Se a imagem contiver um código 128, um código QR e um DataMatrix, os três serão retornados na coleção de resultados sem qualquer alteração de configuração. Para maior controle sobre o comportamento de leitura, a classe BarcodeReaderOptions expõe configurações de velocidade, número de threads e múltiplos códigos de barras.

A leitura nativa de PDFs também está disponível pelo mesmo método:

using IronBarCode;

// Nativo PDF support — no separate library needed
var results = BarcodeReader.Read("invoice-batch.pdf");

foreach (var result in results)
{
    Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}");
}
using IronBarCode;

// Nativo PDF support — no separate library needed
var results = BarcodeReader.Read("invoice-batch.pdf");

foreach (var result in results)
{
    Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}");
}
Imports IronBarCode

' Nativo PDF support — no separate library needed
Dim results = BarcodeReader.Read("invoice-batch.pdf")

For Each result In results
    Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}")
Next
$vbLabelText   $csharpLabel

O BarcodeXpress não lê PDFs nativamente. Primeiro, você precisa renderizar cada página como uma imagem, usando uma biblioteca separada, e depois passar essas imagens para o leitor BarcodeXpress. Isso adiciona uma dependência, uma etapa de conversão e outro custo de licenciamento, dependendo da biblioteca de PDF escolhida.

Processamento em lote e segurança de roscas

O processamento de códigos de barras em grande volume expõe a diferença arquitetônica entre o modelo de instância com estado do BarcodeXpress e a API estática sem estado do IronBarcode.

Abordagem BarcodeXpress

BarcodeXpress é baseado em instância e seu objeto reader é stateful. O processamento paralelo requer uma instância por thread, com a inicialização completa da licença de duas camadas repetida em cada contexto de thread:

using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;
using System.Drawing;

public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
    var results = new Dictionary<string, string>();

    foreach (var path in imagePaths)
    {
        using var bitmap = new Bitmap(path);

        _barcodeXpress.reader.BarcodeTypes = new[]
        {
            BarcodeType.Code128Barcode,
            BarcodeType.QRCodeBarcode
        };

        var barcodes = _barcodeXpress.reader.Analyze(bitmap);
        if (barcodes.Length > 0)
            results[path] = barcodes[0].BarcodeValue;
    }

    return results;
}
using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;
using System.Drawing;

public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
    var results = new Dictionary<string, string>();

    foreach (var path in imagePaths)
    {
        using var bitmap = new Bitmap(path);

        _barcodeXpress.reader.BarcodeTypes = new[]
        {
            BarcodeType.Code128Barcode,
            BarcodeType.QRCodeBarcode
        };

        var barcodes = _barcodeXpress.reader.Analyze(bitmap);
        if (barcodes.Length > 0)
            results[path] = barcodes[0].BarcodeValue;
    }

    return results;
}
Imports Accusoft.BarcodeXpressSdk
Imports System.Collections.Generic
Imports System.Drawing

Public Function ProcessBatch(imagePaths As IEnumerable(Of String)) As Dictionary(Of String, String)
    Dim results As New Dictionary(Of String, String)()

    For Each path In imagePaths
        Using bitmap As New Bitmap(path)
            _barcodeXpress.reader.BarcodeTypes = New BarcodeType() {
                BarcodeType.Code128Barcode,
                BarcodeType.QRCodeBarcode
            }

            Dim barcodes = _barcodeXpress.reader.Analyze(bitmap)
            If barcodes.Length > 0 Then
                results(path) = barcodes(0).BarcodeValue
            End If
        End Using
    Next

    Return results
End Function
$vbLabelText   $csharpLabel

A Edição Padrão também impõe um limite máximo de 40 páginas por minuto. Um lote de 100.000 documentos a 40 PPM leva aproximadamente 41 horas para ser concluído. A Edição Professional remove esse limite, mas a um custo mais elevado por desenvolvedor — além das licenças de tempo de execução já adquiridas.

Abordagem do IronBarcode

using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;

//IronBarcode— parallel batch with thread-safe static API
var files = Directory.GetFiles("/incoming/scans", "*.png");
var allResults = new ConcurrentBag<string>();

Parallel.ForEach(files, file =>
{
    var r = BarcodeReader.Read(file);
    foreach (var barcode in r)
        allResults.Add($"{file}: {barcode.Value}");
});
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;

//IronBarcode— parallel batch with thread-safe static API
var files = Directory.GetFiles("/incoming/scans", "*.png");
var allResults = new ConcurrentBag<string>();

Parallel.ForEach(files, file =>
{
    var r = BarcodeReader.Read(file);
    foreach (var barcode in r)
        allResults.Add($"{file}: {barcode.Value}");
});
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks

'IronBarcode— parallel batch with thread-safe static API
Dim files = Directory.GetFiles("/incoming/scans", "*.png")
Dim allResults = New ConcurrentBag(Of String)()

Parallel.ForEach(files, Sub(file)
    Dim r = BarcodeReader.Read(file)
    For Each barcode In r
        allResults.Add($"{file}: {barcode.Value}")
    Next
End Sub)
$vbLabelText   $csharpLabel

Como os métodos estáticos de IronBarcode não têm estado, Parallel.ForEach sobre eles é seguro sem exigir isolamento de instância. A IronBarcode não impõe limite de produção em nenhum nível de preço. Para ajustar o desempenho de leitura, a classe BarcodeReaderOptions fornece configurações ReadingSpeed e MaxParallelThreads:

using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read("warehouse-scan.png", options);
using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read("warehouse-scan.png", options);
Imports IronBarCode

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

Dim results = BarcodeReader.Read("warehouse-scan.png", options)
$vbLabelText   $csharpLabel

ReadingSpeed.Balanced é o padrão. Use ReadingSpeed.Faster para pipelines de alta vazão onde os códigos de barra estão limpos, ou ReadingSpeed.Detailed para imagens danificadas ou de baixo contraste.

Referência de Mapeamento de API

Accusoft BarcodeXpress IronBarcode
new BarcodeXpress(".") Métodos estáticos — nenhuma instância é necessária
Licensing.SetSolutionName("...") IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Licensing.SetSolutionKey(int, int, int, int) (removed — not needed)
Licensing.SetOEMLicenseKey(string) (removed — no separate runtime license concept)
try/catch em torno da ativação OEM (removed — license is always either valid or not)
reader.Analyze(bitmap) (carrega System.Drawing.Bitmap primeiro) BarcodeReader.Read(path)
reader.BarcodeTypes = new[] { BarcodeType.Code128Barcode, ... } (removed — auto-detection handles all formats)
result.BarcodeValue result.Value
result.BarcodeType result.Format
writer.BarcodeType = BarcodeType.Code128 BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
writer.BarcodeValue = "data" (first argument to CreateBarcode)
writer.SaveToFile(path) .SaveAsPng(path)
Limite padrão de 40 PPM Sem limite de taxa de transferência em nenhum nível.
Avaliação: valores carimbados com 'UNLICENSED accusoft.com' Teste: valores completos, marca d'água apenas nas imagens de saída.

Quando as equipes consideram migrar doAccusoft BarcodeXpresspara o IronBarcode

Superando a barreira dos 40 PPM

O limite da Edição Padrão de 40 páginas por minuto parece generoso até que uma equipe comercial decida executar um processamento em lote no final do dia em um ano inteiro de faturas arquivadas. Um lote de 100.000 documentos, nesse ritmo, leva aproximadamente 41 horas para ser concluído. A migração para a Edição Professional remove o limite, mas com um custo mais elevado por licença de desenvolvedor — além das licenças de tempo de execução já adquiridas. As equipes que descobrem o limite de produção após a assinatura de um pedido de compra frequentemente constatam que o custo total para removê-lo excede substancialmente as estimativas iniciais.

Complexidade do licenciamento do pipeline CI/CD

Uma configuração típica de CI/CD executa builds em contêineres efêmeros. Com o BarcodeXpress, cada ambiente de compilação precisa ter disponíveis tanto o par de chaves do SDK quanto as chaves de desbloqueio em tempo de execução, gerenciadas como segredos separados. Se a chave de tempo de execução estiver ausente ou mal configurada, a compilação pode ser bem-sucedida, mas os testes de integração retornarão valores ocultos — um modo de falha silencioso que é fácil de passar despercebido em um pipeline de testes se as asserções de teste não forem escritas cuidadosamente em relação ao conteúdo real do código de barras.

Requisitos de implantação em ambiente isolado e seguro

Alguns ambientes — como sistemas de saúde que processam registros de pacientes, fluxos de trabalho de documentos governamentais e processamento administrativo de instituições financeiras — não podem ter a validação de licenças para fazer chamadas de rede de saída. O sistema de licenciamento de tempo de execução do BarcodeXpress envolve a infraestrutura de licenciamento da Accusoft, o que pode representar um problema de conformidade em ambientes com restrições rigorosas de saída de rede. As equipes que operam nesses ambientes geralmente optam por bibliotecas cuja validação de licença é inteiramente local.

Implantação de contêineres e Docker

Normalmente, o BarcodeXpress no Docker exige que o contêiner monte um arquivo de licença em um caminho conhecido ou que configure um servidor de licenças e direcione o contêiner para ele. Ambas as abordagens aumentam a complexidade de implementação — os arquivos de licença precisam ser distribuídos e mantidos sincronizados, e um servidor de licenças é uma peça adicional de infraestrutura que precisa ser mantida. Equipes que migram para arquiteturas de microsserviços ou padrões de implantação sem servidor descobrem que a abordagem de arquivo de configuração não se traduz facilmente em imagens de contêiner imutáveis.

Requisitos de precisão da avaliação

Equipes que precisam validar a precisão de leitura em seus próprios documentos antes de efetuar uma compra consideram o modo de avaliação do BarcodeXpress fundamentalmente limitante. Os testes com base em digitalizações de documentos reais — verificando se a biblioteca lida bem com códigos de barras de baixo contraste, imagens distorcidas ou páginas com vários códigos de barras — exigem valores decodificados completos. A saída parcialmente oculta revela apenas que a biblioteca encontrou um código de barras, não se o leu corretamente.

Considerações Comuns de Migração

Gerenciamento de instâncias para chamadas estáticas

BarcodeXpress exige que uma instância BarcodeXpress seja criada e licenciada antes de qualquer operação. Os métodos estáticos do IronBarcode não precisam de instância. As equipes que migram tipicamente têm uma classe BarcodeService cujo construtor é em grande parte um boilerplate de licenciamento — após a migração, esse construtor pode ser removido inteiramente ou reduzido a uma única atribuição de chave de licença.

Remoção da enumeração de tipos de código de barras

Toda operação de leitura do BarcodeXpress requer a atribuição da Array BarcodeTypes para enumerar quais simbologias procurar. Por padrão, o IronBarcode detecta automaticamente todos os formatos suportados. Durante a migração, todas as atribuições reader.BarcodeTypes = ... podem ser excluídas sem substituição. Se houver um motivo de desempenho para restringir o espaço de pesquisa, BarcodeReaderOptions suporta filtragem de formato como opt-in explícito em vez de um padrão obrigatório.

Alterações no nome da propriedade de resultado

Duas renomeações de propriedades afetam todo o código de processamento de resultados: result.BarcodeValue se torna result.Value, e result.BarcodeType se torna result.Format. Uma função de busca e substituição em toda a solução resolve ambos os problemas. Os resultados do IronBarcode também expõem result.Confidence e result.PageNumber, que não têm equivalente no BarcodeXpress e podem ser usados para filtragem adicional sem alterações no código de manipulação de resultados existentes.

Configuração de licença do Docker

As implementações do BarcodeXpress em Docker normalmente usam um arquivo de configuração de licença montado. O IronBarcode usa uma variável de ambiente. A migração envolve remover a instrução COPY do arquivo de configuração e adicionar uma única atribuição de variável de ambiente. No Kubernetes, a chave de licença se torna uma referência secreta na especificação do pod, em vez de um volume montado.

Funcionalidades adicionais do IronBarcode

Além das funcionalidades principais abordadas nesta comparação, o IronBarcode oferece recursos que não fazem parte da oferta do BarcodeXpress:

  • QR Code com Logo: QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") embute uma imagem de marca em um código QR nativamente, com nível de correção de erro configurável para manter a confiabilidade da varredura
  • Inserção de códigos de barras em PDFs : Escreva códigos de barras diretamente em documentos PDF existentes sem a necessidade de uma biblioteca PDF separada. Exportação em lote : processe documentos PDF inteiros em uma única chamada e receba resultados por página com número da página, formato, valor e pontuação de confiança.

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

O IronBarcode é compatível com o.NET Framework4.6.2 e versões posteriores, .NET Core 3.1 e .NET 5, 6, 7, 8 e 9. As plataformas suportadas incluem Windows x64 e x86, Linux x64 e macOS x64 e ARM. O BarcodeXpress for .NET Core é um SDK separado da edição legada do.NET Framework— as equipes que atualizam a estrutura de destino de seus aplicativos precisam levar isso em consideração. O pacote único do IronBarcode abrange todos os ambientes de execução suportados. Atualizações regulares acompanham novos lançamentos do .NET conforme são publicados.

Conclusão

BarcodeXpress e IronBarcode representam duas filosofias de design diferentes para bibliotecas comerciais de código de barras .NET . A BarcodeXpress trata o acesso ao SDK e a implantação em produção como produtos licenciados separados, com faturamento, sistemas de chaves e requisitos mínimos de compra distintos. O IronBarcode trata a biblioteca como um único produto com uma única chave que abrange todos os ambientes, do desenvolvimento à produção.

O BarcodeXpress é uma escolha razoável para equipes já integradas ao ecossistema de produtos da Accusoft — organizações que usam o PrizmDoc ou o ImageGear acharão a API do BarcodeXpress familiar e o relacionamento com a conta Accusoft útil para suporte consolidado. Para essas equipes, o sistema de licenciamento com duas chaves é um padrão operacional já estabelecido, e não uma nova fonte de atrito. O SDK também se adequa a ambientes onde as fontes de documentos são bem controladas e os requisitos de formato são estáveis, tornando a especificação manual de BarcodeTypes uma configuração única aceitável em vez de manutenção contínua.

O IronBarcode é mais adequado para equipes que realizam implantações em contêineres, pipelines de CI/CD e ambientes de nuvem, onde a complexidade do gerenciamento de licenças afeta diretamente os custos operacionais. O modelo de detecção automática, a API estática e o suporte nativo a PDF reduzem a superfície de código de integração, e o modelo de licenciamento de chave única simplifica o gerenciamento de segredos em ambientes de desenvolvimento, teste e produção. Para equipes que precisam avaliar a precisão de leitura antes da compra, o resultado completo do teste — com marca d'água nas imagens geradas, e não nos resultados de leitura — permite uma avaliação comparativa genuína antes da compra.

A diferença de preços é significativa em todos os níveis. No nível de desenvolvedor individual, a diferença entre o SDK do BarcodeXpress com as licenças mínimas de tempo de execução e o plano Lite do IronBarcode é substancial. Para equipes em que essa diferença de custo é secundária em relação à integração com o ecossistema Accusoft, o BarcodeXpress continua sendo uma escolha coerente. Para equipes que avaliam bibliotecas de código de barras individualmente, a combinação das limitações do modo de avaliação, do licenciamento com duas chaves e dos limites de processamento torna o IronBarcode a opção mais direta.

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

Perguntas frequentes

O que é o Accusoft BarcodeXpress?

Accusoft BarcodeXpress é 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 Accusoft BarcodeXpress e IronBarcode?

O IronBarcode utiliza uma API estática e sem estado, que não requer gerenciamento de instâncias, enquanto o Accusoft BarcodeXpress 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 licenciamento do IronBarcode é mais fácil do que o do Accusoft BarcodeXpress?

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 Accusoft BarcodeXpress?

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 Accusoft BarcodeXpress?

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 Accusoft BarcodeXpress?

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

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

O IronBarcode gera códigos QR com logotipos?

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

Curtis Chau
Redator Técnico

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

Leia mais

Equipe de Suporte Iron

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