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

Accusoft BarcodeXpress vs IronBarcode: Comparação de bibliotecas de código de barras em C#

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. O Accusoft BarcodeXpress não oferece essa opção. No modo de avaliação, os valores do código de barras decodificado ficam parcialmente ocultos — "1234567890" é retornado como "1234...XXX". Você pode verificar se a biblioteca encontra um código de barras, mas não pode verificar se ela lê o código de barras 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 para .NET Core. A API é baseada em instâncias — você cria um objeto BarcodeXpress, configura a propriedade Licensing e, em seguida, usa os objetos filhos reader e writer para as 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âncias: 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 (SolutionName + SolutionKey) e o licenciamento do runtime (UnlockRuntime) são sistemas separados que exigem compras separadas.
  • Ocultação do modo de avaliação: No modo de avaliação, os valores decodificados são deliberadamente degradados — "1234567890" retorna como "1234...XXX" — impossibilitando testes de precisão antes da compra.
  • Especificação de formato manual: O leitor requer configuração explícita 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;

var barcodeXpress = new BarcodeXpress();
// Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"));
// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;

var barcodeXpress = new BarcodeXpress();
// Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"));
Imports Accusoft.BarcodeXpressSdk

Dim barcodeXpress As New BarcodeXpress()
' Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName"
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")
' Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"))
$vbLabelText   $csharpLabel

O par SolutionName e SolutionKey ativa o próprio SDK. A chamada UnlockRuntime, que recebe sua própria chave e sua própria chave de solução como argumentos separados, ativa os recursos 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 completos e sem obstruções.

Na revisão de código, esse padrão gera uma pergunta previsível: "Por que estamos chamando UnlockRuntime com duas chaves diferentes?" A resposta — que a Accusoft trata o licenciamento do 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.

A propriedade IsRuntimeUnlocked permite verificar se a camada de tempo de execução está ativa:

if (!barcodeXpress.Licensing.IsRuntimeUnlocked)
{
    // In this state, barcode values are partially obscured
    // "1234567890" returns as "1234...XXX"
    Console.WriteLine("Warning: runtime license not active");
}
if (!barcodeXpress.Licensing.IsRuntimeUnlocked)
{
    // In this state, barcode values are partially obscured
    // "1234567890" returns as "1234...XXX"
    Console.WriteLine("Warning: runtime license not active");
}
If Not barcodeXpress.Licensing.IsRuntimeUnlocked Then
    ' In this state, barcode values are partially obscured
    ' "1234567890" returns as "1234...XXX"
    Console.WriteLine("Warning: runtime license not active")
End If
$vbLabelText   $csharpLabel

Essa verificação é a medida de segurança que as equipes adicionam quando percebem que a saída do modo de avaliação retorna silenciosamente dados parciais em vez de lançar uma exceção ou falhar claramente.

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 — nenhum gerenciamento de instâncias é necessário.
  • 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: oIronBarcodedetecta automaticamente a simbologia em todos os formatos suportados; Não é necessária nenhuma 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 do código de barras parcialmente ocultos ("1234...XXX") 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 — @@--CÓDIGO-63198--@@
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 ocultos como "1234...XXX" 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 a configuração BarcodeTypes Sim, com a opção ExpectMultipleBarcodes
Propriedades do resultado @@--CÓDIGO-63201--@@, @@--CÓDIGO-63202--@@ 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 @@--CÓDIGO-63210--@@ integrado
Formatos de saída Salvar arquivo PNG, JPG, PDF, dados binários, fluxo
Plataforma e Implantação
.NET Framework SDK legado separado .NET Framework4.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 eIronBarcodeé 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.SolutionName = "AcmeCorp";
        _barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");

        // Layer 2: Runtime license — separate purchase, minimum 5
        _barcodeXpress.Licensing.UnlockRuntime(
            "RuntimeKey-XXXXXX",
            Convert.ToInt64("98765432109876"));

        // Guard against partial-value mode
        if (!_barcodeXpress.Licensing.IsRuntimeUnlocked)
        {
            throw new InvalidOperationException(
                "Runtime license not active — barcode values will be obscured");
        }
    }
}
using Accusoft.BarcodeXpressSdk;

public class BarcodeService
{
    private readonly BarcodeXpress _barcodeXpress;

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

        // Layer 1: SDK license
        _barcodeXpress.Licensing.SolutionName = "AcmeCorp";
        _barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");

        // Layer 2: Runtime license — separate purchase, minimum 5
        _barcodeXpress.Licensing.UnlockRuntime(
            "RuntimeKey-XXXXXX",
            Convert.ToInt64("98765432109876"));

        // Guard against partial-value mode
        if (!_barcodeXpress.Licensing.IsRuntimeUnlocked)
        {
            throw new InvalidOperationException(
                "Runtime license not active — barcode values will be obscured");
        }
    }
}
Imports Accusoft.BarcodeXpressSdk

Public Class BarcodeService
    Private ReadOnly _barcodeXpress As BarcodeXpress

    Public Sub New()
        _barcodeXpress = New BarcodeXpress()

        ' Layer 1: SDK license
        _barcodeXpress.Licensing.SolutionName = "AcmeCorp"
        _barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")

        ' Layer 2: Runtime license — separate purchase, minimum 5
        _barcodeXpress.Licensing.UnlockRuntime("RuntimeKey-XXXXXX", Convert.ToInt64("98765432109876"))

        ' Guard against partial-value mode
        If Not _barcodeXpress.Licensing.IsRuntimeUnlocked Then
            Throw New InvalidOperationException("Runtime license not active — barcode values will be obscured")
        End If
    End Sub
End Class
$vbLabelText   $csharpLabel

Este é um construtor de 15 linhas que existe exclusivamente para gerenciar dois sistemas de chave de licença separados antes que qualquer operação com código de barras possa ocorrer. A proteção IsRuntimeUnlocked não é opcional — sem ela, o serviço retornará silenciosamente valores degradados em qualquer ambiente onde a chave de tempo de execução esteja ausente ou mal configurada.

Abordagem do IronBarcode

using IronBarCode;

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

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

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

Essa é a configuração completa de licenciamento. Sem desbloqueio de tempo de execução separado, sem nome de solução, sem chamada de dois argumentos UnlockRuntime. 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 oIronBarcodedetecta tudo automaticamente a partir de uma única chamada de método.

Abordagem BarcodeXpress

A leitura com BarcodeXpress envolve a configuração do leitor através de SetPropertyValue, que recebe uma constante e um valor, e então a chamada de Analyze() para recuperar os resultados:

using Accusoft.BarcodeXpressSdk;

public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
    var barcodeXpress = new BarcodeXpress();
    barcodeXpress.Licensing.SolutionName = "AcmeCorp";
    barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
    barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"));

    barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath);
    barcodeXpress.reader.BarcodeTypes =
        BarcodeType.LinearBarcode |
        BarcodeType.DataMatrixBarcode |
        BarcodeType.QRCodeBarcode;

    var results = barcodeXpress.reader.Analyze();
    return results.Select(r => r.BarcodeValue);
}
using Accusoft.BarcodeXpressSdk;

public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
    var barcodeXpress = new BarcodeXpress();
    barcodeXpress.Licensing.SolutionName = "AcmeCorp";
    barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
    barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"));

    barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath);
    barcodeXpress.reader.BarcodeTypes =
        BarcodeType.LinearBarcode |
        BarcodeType.DataMatrixBarcode |
        BarcodeType.QRCodeBarcode;

    var results = barcodeXpress.reader.Analyze();
    return results.Select(r => r.BarcodeValue);
}
Imports Accusoft.BarcodeXpressSdk

Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
    Dim barcodeXpress = New BarcodeXpress()
    barcodeXpress.Licensing.SolutionName = "AcmeCorp"
    barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")
    barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"))

    barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath)
    barcodeXpress.reader.BarcodeTypes = BarcodeType.LinearBarcode Or BarcodeType.DataMatrixBarcode Or BarcodeType.QRCodeBarcode

    Dim results = barcodeXpress.reader.Analyze()
    Return results.Select(Function(r) r.BarcodeValue)
End Function
$vbLabelText   $csharpLabel

A constante cycBxeSetFilename é a forma que a API utiliza para especificar o arquivo a ser processado. Esse padrão — passar um identificador constante mais um valor para um método genérico SetPropertyValue — lembra APIs antigas baseadas em COM. Se um documento contiver um formato não listado em BarcodeTypes, ele não será encontrado. Isso se torna um custo adicional de manutenção quando as fontes de documentos mudam.

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

OIronBarcodedetecta 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âncias 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;

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

    foreach (var path in imagePaths)
    {
        _barcodeXpress.reader.SetPropertyValue(
            BarcodeXpress.cycBxeSetFilename, path);
        _barcodeXpress.reader.BarcodeTypes =
            BarcodeType.LinearBarcode | BarcodeType.QRCodeBarcode;

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

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

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

    foreach (var path in imagePaths)
    {
        _barcodeXpress.reader.SetPropertyValue(
            BarcodeXpress.cycBxeSetFilename, path);
        _barcodeXpress.reader.BarcodeTypes =
            BarcodeType.LinearBarcode | BarcodeType.QRCodeBarcode;

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

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

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
        _barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, path)
        _barcodeXpress.reader.BarcodeTypes = BarcodeType.LinearBarcode Or BarcodeType.QRCodeBarcode

        Dim barcodes = _barcodeXpress.reader.Analyze()
        If barcodes.Length > 0 Then
            results(path) = barcodes(0).BarcodeValue
        End If
    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 doIronBarcodenão têm estado, Parallel.ForEach sobre eles é seguro, sem necessidade de isolamento de instância. AIronBarcodenão impõe limite de produção em nenhum nível de preço. Para otimizar o desempenho de leitura, a classe BarcodeReaderOptions fornece as 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 fluxos de trabalho de alto rendimento onde os códigos de barras estão limpos, ou ReadingSpeed.Detailed para imagens danificadas ou de baixo contraste.

Referência de Mapeamento de API

Accusoft BarcodeXpress IronBarcode
@@--CÓDIGO-63225--@@ Métodos estáticos — nenhuma instância é necessária
@@--CÓDIGO-63226--@@ @@--CÓDIGO-63227--@@
@@--CÓDIGO-63228--@@ (removed — not needed)
@@--CÓDIGO-63229--@@ (removed — no runtime license concept)
@@--CÓDIGO-63230--@@ (removed — license is always either valid or not)
@@--CÓDIGO-63231--@@ @@--CÓDIGO-63232--@@
reader.BarcodeTypes = BarcodeType.LinearBarcode \| ... (removed — auto-detection handles all formats)
@@--CÓDIGO-63233--@@ (part of BarcodeReader.Read)
@@--CÓDIGO-63235--@@ @@--CÓDIGO-63236--@@
@@--CÓDIGO-63237--@@ @@--CÓDIGO-63238--@@
@@--CÓDIGO-63239--@@ @@--CÓDIGO-63240--@@
@@--CÓDIGO-63241--@@ (first argument to CreateBarcode)
@@--CÓDIGO-63243--@@ @@--CÓDIGO-63244--@@
Limite padrão de 40 PPM Sem limite de taxa de transferência em nenhum nível.
Avaliação: valores ocultos como "1234...XXX" Teste: valores completos, marca d'água apenas nas imagens de saída.

Quando as equipes consideram migrar do Accusoft BarcodeXpress para 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

O BarcodeXpress requer que uma instância BarcodeXpress seja criada e licenciada antes de qualquer operação. Os métodos estáticos doIronBarcodenão precisam de instância. As equipes em processo de migração geralmente possuem uma classe BarcodeService cujo construtor é basicamente código padrão de licenciamento — após a migração, esse construtor pode ser removido completamente ou reduzido a uma única atribuição de chave de licença.

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

Cada operação de leitura do BarcodeXpress requer a atribuição de um sinalizador BarcodeTypes para enumerar quais simbologias devem ser pesquisadas. Por padrão, oIronBarcodedetecta 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, o BarcodeReaderOptions oferece suporte à filtragem de formato como uma opção explícita, em vez de um padrão obrigatório.

Alterações no nome da propriedade de resultado

Duas alterações de renomeação de propriedades afetam todo o código de processamento de resultados: @@--CÓDIGO-63235--@@ torna-se result.Value, e @@--CÓDIGO-63237--@@ torna-se result.Format. Uma função de busca e substituição em toda a solução resolve ambos os problemas. Os resultados doIronBarcodetambé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 tratamento de resultados existente.

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. OIronBarcodeusa uma variável de ambiente. A migração envolve a remoção da instrução COPY do arquivo de configuração e a adição de 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, oIronBarcodeoferece recursos que não fazem parte da oferta do BarcodeXpress:

  • Código QR com logotipo : QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") incorpora uma imagem da marca em um código QR nativamente, com nível de correção de erros configurável para manter a confiabilidade da leitura.
  • 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

OIronBarcodeé 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 para .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 doIronBarcodeabrange todos os ambientes de execução suportados. Atualizações regulares garantem a compatibilidade com o .NET 10, previsto para o final de 2026, e com as futuras versões do .NET à medida que forem lançadas.

Conclusão

BarcodeXpress eIronBarcoderepresentam 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. OIronBarcodetrata 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 é adequado para ambientes onde as fontes de documentos são bem controladas e os requisitos de formato são estáveis, tornando a especificação manual BarcodeTypes uma configuração única aceitável em vez de manutenção contínua.

OIronBarcodeé 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 doIronBarcodeé 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 oIronBarcodea opção mais direta.

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 de ferro

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