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

Qual biblioteca de código de barras C# você deve usar para desenvolvimento .NET?

Todo desenvolvedor que usou Aspose.BarCode escreveu alguma versão desta linha: new BarCodeReader(path, DecodeType.Code128). Funciona bem quando você sabe qual é o formato da imagem. Quando você não o faz — quando um documento vem de um sistema externo, um fornecedor que mudou o formato de suas etiquetas ou um upload de usuário — você ou adivinha uma lista de tipos de decodificação ou recorre a DecodeType.AllSupportedTypes, que é tipicamente mais lento de acordo com a própria orientação da Aspose. A exigência de especificação de formato não é um obstáculo intransponível, mas representa um atrito diário que se acumula em cada operação de leitura em sua base de código.

A história do PDF é a história do orçamento. Se você precisa processar códigos de barras a partir de documentos PDF, o Aspose.BarCode não consegue fazer isso sozinho. Você precisa do Aspose.PDF for .NET para renderizar as páginas para imagens primeiro. Aspose.PDF é um produto de assinatura separado além do que você já está pagando pelo Aspose.BarCode. Duas assinaturas para um fluxo de trabalho que a maioria dos desenvolvedores considera como uma única tarefa.

O IronBarcode detecta automaticamente o formato do código de barras, lê PDFs nativamente em um único pacote e oferece uma licença perpétua a partir de US$ 749. Esta comparação examina ambas as bibliotecas em detalhes para que você possa fazer uma escolha bem fundamentada.

Entendendo o Aspose.BarCode

A Aspose vem desenvolvendo bibliotecas de processamento de documentos para .NET, Java e outras plataformas há anos. O Aspose.BarCode é um dos muitos produtos da família, juntamente com o Aspose.Words, Aspose.Cells, Aspose.PDF, Aspose.Slides e cerca de uma dúzia de outros. Para equipes que já pagam pelo Aspose.Total — o pacote que inclui todos os produtos Aspose — o Aspose.BarCode é oferecido sem custo adicional. Para equipes que precisam apenas de uma biblioteca de código de barras, o modelo de assinatura é mais difícil de justificar.

Aspose.BarCode suporta mais de 80 simbologias de código de barras, uma das listas de formato mais completas em qualquer biblioteca comercial de códigos de barras .NET. Essa abrangência é o maior diferencial da biblioteca. A superfície da API é correspondentemente grande, e a verbosidade da API aumenta com os recursos. Gerar um código de barras Code 128 básico requer instanciar um BarcodeGenerator, definir XDimension, BarHeight e outros parâmetros, e então chamar Save com um argumento de formato explícito. A leitura requer especificar quais tipos de decodificação pesquisar e então iterar os resultados retornados por ReadBarCodes(). Ambas as operações funcionam corretamente — são apenas mais verbosas do que o necessário.

Principais características arquitetônicas do Aspose.BarCode:

  • Modelo de Leitura Por Formato: Toda operação de leitura requer especificar DecodeType explicitamente. O fallback DecodeType.AllSupportedTypes é tipicamente mais lento do que uma lista direcionada, pois o decodificador percorre cada simbologia conhecida sequencialmente.
  • API Baseada em Instância: Tanto BarCodeReader quanto BarcodeGenerator são objetos instanciados que implementam IDisposable. Eles devem ser envoltos em blocos using para liberar recursos nativos.
  • Sem suporte nativo a PDF: o Aspose.BarCode não consegue abrir ou renderizar documentos PDF diretamente. Ler códigos de barras de PDFs requer Aspose.PDF, um produto de assinatura separado.
  • Hierarquia Profunda de Parâmetros: A personalização é feita através de cadeias de propriedades generator.Parameters.Barcode.* — uma hierarquia de objetos em múltiplos níveis que requer memorização.
  • Licenciamento por Assinatura: De acordo com o preço publicado da Aspose, os níveis por desenvolvedor e site são assinaturas anuais; uma opção autônoma perpétua não está listada.
  • Ativação de Licença Baseada em Arquivo: As implantações de produção requerem um arquivo .lic acessível em um caminho conhecido, o que adiciona um passo de implantação para os ambientesDockere Kubernetes.

O Modelo de Leitura Centrada no Formato

A API de leitura do Aspose.BarCode é construída partindo do pressuposto de que o chamador conhece o formato do código de barras:

using Aspose.BarCode.BarCodeRecognition;

var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
foreach (var result in reader.ReadBarCodes())
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
using Aspose.BarCode.BarCodeRecognition;

var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
foreach (var result in reader.ReadBarCodes())
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
Imports Aspose.BarCode.BarCodeRecognition

Dim reader As New BarCodeReader("barcode.png", DecodeType.Code128)
For Each result In reader.ReadBarCodes()
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
Next
$vbLabelText   $csharpLabel

Quando você conhece o formato, esse padrão funciona bem. O problema é justamente esse "conhecimento do formato". Um sistema de compras que processa faturas de fornecedores não pode garantir que todos os fornecedores usem o mesmo tipo de código de barras. Um sistema de gerenciamento de documentos que aceita uploads de usuários não pode prever qual formato um scanner utilizou. Nesses casos, DecodeType.AllSupportedTypes é o fallback, e é tipicamente mais lento do que uma lista direcionada de tipos de decodificação.

O decodificador também deve ser descartado:

using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
$vbLabelText   $csharpLabel

Não usar using é um vazamento de recursos. O BarcodeGenerator também implementa IDisposable, embora as consequências de não descartá-lo sejam menos severas. Em ambos os casos, você está gerenciando o ciclo de vida dos objetos, algo que uma API de fábrica estática faria automaticamente.

Entendendo o IronBarcode

IronBarcode utiliza métodos de fábrica estáticos tanto para leitura quanto para escrita. Não há instâncias para construir, configurar ou descartar. Por padrão, a API de leitura é independente do formato, e a mesma chamada funciona independentemente de o arquivo de origem ser PNG, JPEG, TIFF ou PDF.

IronBarcode é desenvolvido e mantido pela Iron Software, uma empresa focada em ferramentas para desenvolvedores .NET. A biblioteca foi projetada com base no princípio de que a leitura de códigos de barras não deve exigir conhecimento prévio do formato do código de barras — o mecanismo de detecção da biblioteca determina o formato a partir do conteúdo da imagem. Para a geração, uma cadeia de métodos fluentes substitui a hierarquia de parâmetros multinível comum em outras bibliotecas.

Principais características do IronBarcode:

  • Detecção Automática de Formato: BarcodeReader.Read() identifica a simbologia do código de barras a partir do conteúdo da imagem sem exigir que o chamador especifique um equivalente DecodeType.
  • API estática sem estado: Todas as operações de leitura e gravação são métodos estáticos. Sem instâncias descartáveis ​​para gerenciar, e a API é naturalmente thread-safe para uso concorrente.
  • Suporte Nativo a PDF: BarcodeReader.Read("doc.pdf") lê diretamente de arquivos PDF sem necessidade de pacote adicional ou etapa de renderização. Os resultados incluem result.PageNumber.
  • API de Geração Fluente: BarcodeWriter.CreateBarcode() retorna um objeto encadeável. A personalização utiliza encadeamento de métodos em vez de uma hierarquia de propriedades.
  • Modelo de Licença Perpétua: Todos os planos oferecem uma compra única, sem necessidade de renovação anual.
  • Ativação de Licença Baseada em Texto: A chave de licença é configurada via IronBarCode.License.LicenseKey, compatível com variáveis de ambiente e gerenciadores de segredos CI/CD.

Comparação de recursos

Recurso Aspose.BarCode IronBarcode
Detecção de formato Manual — deve especificar DecodeType ou usar AllSupportedTypes lento Automático em todos os formatos suportados.
Contagem de simbologia 80+ 50+
Suporte a PDF Sem suporte nativo — requer licença Aspose.PDF separada. Nativo — BarcodeReader.Read("doc.pdf") embutido no pacote
Modelo de preços Apenas por assinatura — níveis anuais a partir de $999/ano Licença perpétua a partir de US$ 749 (pagamento único)
Licença perpétua Não disponível Sim, todos os níveis.
Estilo da API Configuração detalhada baseada em instâncias Métodos de fábrica estáticos, API fluente
Requisito de descarte Sim — BarCodeReader e BarcodeGenerator Não — métodos estáticos sem estado
Segurança da rosca Instâncias separadas são necessárias por thread. API estática — veja a documentação do IronBarcode para orientação de threading

Comparação Detalhada de Recursos

Recurso Aspose.BarCode IronBarcode
Geração
Estilo API new BarcodeGenerator(EncodeTypes.X, "data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.X)
Modelo de personalização Hierarquia de propriedades generator.Parameters.Barcode.* Cadeia de métodos fluentes (.ResizeTo(), .ChangeBarCodeColor())
Código QR com logotipo Sobreposição manual de GDI+ após a geração .AddBrandLogo("logo.png") embutido
Saída para bytes generator.GenerateBarCodeImage() .ToPngBinaryData()
Códigos de barras coloridos generator.Parameters.Barcode.BarColor .ChangeBarCodeColor(Color.X)
Leitura
Especificação de formato Obrigatório (DecodeType) Não é necessário — automático
Recurso alternativo para formato desconhecido DecodeType.AllSupportedTypes (lento) Mesma chamada — sem necessidade de modo alternativo.
Ajuste de desempenho Conjunto de parâmetros QualitySettings Enum ReadingSpeed — três níveis
Leitor descartável Sim — using var reader = new BarCodeReader(...) Não — chamada estática, nenhum objeto para descartar.
Acesso aos resultados Iterar reader.ReadBarCodes() Valor de retorno de BarcodeReader.Read()
Propriedade de valor do código de barras result.CodeText result.Value
Propriedade de nome de formato result.CodeTypeName result.Format.ToString()
Suporte a PDF
Leitura nativa de PDFs Não Sim
Necessário para PDF Aspose.PDF (assinatura separada) Sem pacote adicional
Número da página nos resultados N / D result.PageNumber
Licenciamento
Modelo de licença Somente por assinatura, com renovação anual. Perpétuo, compra única
Desenvolvedor único US$ 999/ano $749 (pagamento único)
10 desenvolvedores US$ 4.995/ano (Licença para o local) US$ 2.999, pagamento único (Professional)
Implantações ilimitadas (10 devs) $13.986/ano (OEM de Site) US$ 5.999, pagamento único (ilimitado)
Suporte para PDF incluído Não — assinatura separada do Aspose.PDF Sim
Plataforma e Implantação
Ativação de licença Caminho do arquivo .lic String key — variável de ambiente
Implantação em Docker Deve copiar o arquivo .lic para a imagem ou montá-lo Variável de ambiente — nenhum arquivo necessário
.NET Framework Sim Sim (4.6.2+)
.NET Core / .NET 5+ Sim Sim (.NET Core 3.1+, .NET 5/6/7/8)
Windows Sim Sim (x64/x86)
Linux Sim Sim (x64)
macOS Sim Sim (x64/ARM)
Docker Sim Sim
Azure / AWS Lambda Sim Sim

API de geração

A API de geração é onde a diferença de verbosidade entre as duas bibliotecas se torna mais visível no código do dia a dia.

Abordagem Aspose.BarCode

Aspose.BarCode usa uma classe BarcodeGenerator com uma hierarquia Parameters para configuração. Uma chamada de geração mínima requer três etapas: instanciação, chamada de salvamento e especificação de formato. O uso real tipicamente requer navegar em generator.Parameters.Barcode.*:

using Aspose.BarCode.Generation;
using System.Drawing;

var generator = new BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345");

// Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2;
generator.Parameters.Barcode.BarHeight.Pixels = 100;
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial";
generator.Parameters.Barcode.Padding.Left.Pixels = 10;
generator.Parameters.Barcode.Padding.Right.Pixels = 10;
generator.Parameters.BackColor = Color.White;
generator.Parameters.Resolution = 300;

generator.Save("barcode.png", BarCodeImageFormat.Png);
using Aspose.BarCode.Generation;
using System.Drawing;

var generator = new BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345");

// Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2;
generator.Parameters.Barcode.BarHeight.Pixels = 100;
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial";
generator.Parameters.Barcode.Padding.Left.Pixels = 10;
generator.Parameters.Barcode.Padding.Right.Pixels = 10;
generator.Parameters.BackColor = Color.White;
generator.Parameters.Resolution = 300;

generator.Save("barcode.png", BarCodeImageFormat.Png);
Imports Aspose.BarCode.Generation
Imports System.Drawing

Dim generator As New BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345")

' Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2
generator.Parameters.Barcode.BarHeight.Pixels = 100
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial"
generator.Parameters.Barcode.Padding.Left.Pixels = 10
generator.Parameters.Barcode.Padding.Right.Pixels = 10
generator.Parameters.BackColor = Color.White
generator.Parameters.Resolution = 300

generator.Save("barcode.png", BarCodeImageFormat.Png)
$vbLabelText   $csharpLabel

Toda personalização navega em generator.Parameters.Barcode.*, que é uma hierarquia de objetos em múltiplos níveis. Não é complexo depois de memorizado, mas requer memorização.

Abordagem do IronBarcode

IronBarcode substitui a hierarquia de parâmetros por uma cadeia de métodos fluente. As configurações padrão produzem resultados corretos para a maioria dos casos de uso, e a personalização é expressa diretamente no código:

using IronBarCode;

// Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");

// Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");

// Get as bytes instead of saving to disk
byte[] pngData = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ToPngBinaryData();
using IronBarCode;

// Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");

// Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");

// Get as bytes instead of saving to disk
byte[] pngData = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ToPngBinaryData();
Imports IronBarCode

' Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .SaveAsPng("barcode.png")

' Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ResizeTo(400, 100) _
    .SaveAsPng("barcode.png")

' Get as bytes instead of saving to disk
Dim pngData As Byte() = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

Para códigos QR, a API de geração de QR Codes da IronBarcode inclui suporte para logotipos de marcas sem a necessidade de composição manual de imagens:

using IronBarCode;
using IronSoftware.Drawing;

// With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");

// With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded-high-ecc.png");

// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
    .ChangeBarCodeColor(Color.DarkBlue)
    .SaveAsPng("qr-colored.png");
using IronBarCode;
using IronSoftware.Drawing;

// With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");

// With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded-high-ecc.png");

// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
    .ChangeBarCodeColor(Color.DarkBlue)
    .SaveAsPng("qr-colored.png");
Imports IronBarCode
Imports IronSoftware.Drawing

' With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded.png")

' With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode( _
    "https://example.com", _
    500, _
    QRCodeWriter.QrErrorCorrectionLevel.Highest) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded-high-ecc.png")

' Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300) _
    .ChangeBarCodeColor(Color.DarkBlue) _
    .SaveAsPng("qr-colored.png")
$vbLabelText   $csharpLabel

Aspose.BarCode não fornece um assistente de logotipo de marca em uma única chamada para QR codes; a abordagem documentada é gerar a imagem do código de barras e então compor o logotipo sobre ela (por exemplo, com System.Drawing.Graphics). O AddBrandLogo do IronBarcode lida com o composto em uma única chamada e define automaticamente a correção de erro apropriadamente.

Leitura de código de barras em PDF

Para muitas equipes, essa é a comparação mais importante. Ler códigos de barras em documentos PDF é um fluxo de trabalho comum: faturas recebidas, etiquetas de envio salvas em PDF, arquivos de documentos digitalizados.

Abordagem Aspose.BarCode

O Aspose.BarCode não possui suporte nativo para PDF. Para ler um código de barras de um PDF com o Aspose, você precisa do Aspose.PDF para carregar o PDF e renderizar as páginas em imagens, e do Aspose.BarCode para ler essas imagens renderizadas. Ambos são produtos por assinatura. Ambos precisam de ativação de licença. Você está pagando duas assinaturas anuais por algo que a maioria dos desenvolvedores considera como uma única capacidade.

// Requires both Aspose.PDF (separate license) and Aspose.BarCode
using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.BarCode.BarCodeRecognition;
using System.IO;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var barcodeValues = new List<string>();

    // Step 1: Load and render the PDF using Aspose.PDF
    var pdfDocument = new Aspose.Pdf.Document(pdfPath);
    var resolution = new Resolution(300);
    var device = new PngDevice(resolution);

    for (int pageNum = 1; pageNum <= pdfDocument.Pages.Count; pageNum++)
    {
        using var pageStream = new MemoryStream();
        device.Process(pdfDocument.Pages[pageNum], pageStream);
        pageStream.Seek(0, SeekOrigin.Begin);

        // Step 2: Scan the rendered image for barcodes using Aspose.BarCode
        using var reader = new BarCodeReader(pageStream, DecodeType.AllSupportedTypes);
        foreach (var result in reader.ReadBarCodes())
        {
            barcodeValues.Add(result.CodeText);
        }
    }

    return barcodeValues;
}
// Requires both Aspose.PDF (separate license) and Aspose.BarCode
using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.BarCode.BarCodeRecognition;
using System.IO;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var barcodeValues = new List<string>();

    // Step 1: Load and render the PDF using Aspose.PDF
    var pdfDocument = new Aspose.Pdf.Document(pdfPath);
    var resolution = new Resolution(300);
    var device = new PngDevice(resolution);

    for (int pageNum = 1; pageNum <= pdfDocument.Pages.Count; pageNum++)
    {
        using var pageStream = new MemoryStream();
        device.Process(pdfDocument.Pages[pageNum], pageStream);
        pageStream.Seek(0, SeekOrigin.Begin);

        // Step 2: Scan the rendered image for barcodes using Aspose.BarCode
        using var reader = new BarCodeReader(pageStream, DecodeType.AllSupportedTypes);
        foreach (var result in reader.ReadBarCodes())
        {
            barcodeValues.Add(result.CodeText);
        }
    }

    return barcodeValues;
}
Imports Aspose.Pdf
Imports Aspose.Pdf.Devices
Imports Aspose.BarCode.BarCodeRecognition
Imports System.IO

Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
    Dim barcodeValues As New List(Of String)()

    ' Step 1: Load and render the PDF using Aspose.PDF
    Dim pdfDocument As New Aspose.Pdf.Document(pdfPath)
    Dim resolution As New Resolution(300)
    Dim device As New PngDevice(resolution)

    For pageNum As Integer = 1 To pdfDocument.Pages.Count
        Using pageStream As New MemoryStream()
            device.Process(pdfDocument.Pages(pageNum), pageStream)
            pageStream.Seek(0, SeekOrigin.Begin)

            ' Step 2: Scan the rendered image for barcodes using Aspose.BarCode
            Using reader As New BarCodeReader(pageStream, DecodeType.AllSupportedTypes)
                For Each result In reader.ReadBarCodes()
                    barcodeValues.Add(result.CodeText)
                Next
            End Using
        End Using
    Next

    Return barcodeValues
End Function
$vbLabelText   $csharpLabel

São duas configurações de licença, duas declarações de uso de dois namespaces, um pipeline de renderização, gerenciamento de fluxo de memória e um loop aninhado. Ele também usa DecodeType.AllSupportedTypes porque no ponto de extração da imagem você tipicamente não sabe qual formato o código de barras utiliza.

Abordagem do IronBarcode

O IronBarcode lida internamente com a análise de PDFs, a renderização de páginas e a detecção de códigos de barras. Você chama Read com um caminho que termina em .pdf, e ele retorna resultados de códigos de barras que incluem result.PageNumber para que você saiba de qual página cada um veio. Sem segundo pacote, sem segunda licença, sem código de renderização.

using IronBarCode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var results = BarcodeReader.Read(pdfPath);
    return results.Select(r => r.Value).ToList();
}
using IronBarCode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var results = BarcodeReader.Read(pdfPath);
    return results.Select(r => r.Value).ToList();
}
Imports IronBarCode

Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
    Dim results = BarcodeReader.Read(pdfPath)
    Return results.Select(Function(r) r.Value).ToList()
End Function
$vbLabelText   $csharpLabel
// With page number context
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
// With page number context
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
Imports System

' With page number context
Dim results = BarcodeReader.Read("invoice-batch.pdf")
For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}")
Next
$vbLabelText   $csharpLabel

A documentação de leitura de PDFs do IronBarcode abrange o processamento em lote de várias páginas e as opções de filtragem por intervalo de páginas.

Leitura de formatos de código de barras desconhecidos

Quando você não sabe qual formato de código de barras uma imagem contém, as duas bibliotecas lidam com a situação de maneira diferente.

Abordagem Aspose.BarCode

DecodeType.AllSupportedTypes é a solução da Aspose para cenários de formato desconhecido. A própria documentação da Aspose reconhece que esse método é mais lento do que especificar uma lista de alvos, porque o decodificador percorre sequencialmente todas as simbologias conhecidas. Para processamento de alto volume — um armazém escaneando milhares de etiquetas por minuto — essa diferença de desempenho não é trivial.

using Aspose.BarCode.BarCodeRecognition;

using var reader = new BarCodeReader("unknown-format.png");
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
}
using Aspose.BarCode.BarCodeRecognition;

using var reader = new BarCodeReader("unknown-format.png");
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
}
Imports Aspose.BarCode.BarCodeRecognition

Using reader As New BarCodeReader("unknown-format.png")
    reader.SetBarCodeReadType(DecodeType.AllSupportedTypes)
    For Each result In reader.ReadBarCodes()
        Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
    Next
End Using
$vbLabelText   $csharpLabel

Abordagem do IronBarcode

Não existe um "modo lento" e um "modo rápido" com base no conhecimento do formato. A detecção do IronBarcode utiliza o mesmo algoritmo, independentemente de a imagem conter um código Code 128 ou um DataMatrix. Se você quiser ajustar o equilíbrio entre desempenho e precisão, a opção ReadingSpeed faz isso sem exigir conhecimento de formato:

using IronBarCode;

// The same call regardless of format — always auto-detects
var results = BarcodeReader.Read("unknown-format.png");
foreach (var result in results)
{
    Console.WriteLine($"{result.Format}: {result.Value}");
}
using IronBarCode;

// The same call regardless of format — always auto-detects
var results = BarcodeReader.Read("unknown-format.png");
foreach (var result in results)
{
    Console.WriteLine($"{result.Format}: {result.Value}");
}
Imports IronBarCode

' The same call regardless of format — always auto-detects
Dim results = BarcodeReader.Read("unknown-format.png")
For Each result In results
    Console.WriteLine($"{result.Format}: {result.Value}")
Next
$vbLabelText   $csharpLabel
using IronBarCode;

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

var results = BarcodeReader.Read("document.png", options);
using IronBarCode;

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

var results = BarcodeReader.Read("document.png", options);
Imports IronBarCode

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

Dim results = BarcodeReader.Read("document.png", options)
$vbLabelText   $csharpLabel

ReadingSpeed.Faster prioriza o rendimento. ReadingSpeed.Detailed prioriza a precisão em imagens danificadas ou de baixo contraste. Nenhuma delas exige que você conheça o formato com antecedência. Consulte as opções de leitura do IronBarcode para obter o conjunto completo de parâmetros de ajuste.

Referência de Mapeamento de API

Aspose.BarCode IronBarcode
new BarcodeGenerator(EncodeTypes.Code128, "data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
generator.Save("file.png", BarCodeImageFormat.Png) .SaveAsPng("file.png")
new BarCodeReader(path, DecodeType.Code128) BarcodeReader.Read(path)
DecodeType.AllSupportedTypes (lenta, varredura exaustiva) Automático — sempre rápido, a mesma chamada para todos os formatos.
reader.ReadBarCodes() (part of BarcodeReader.Read — returns results directly)
Iterar reader.ReadBarCodes() Valor de retorno de BarcodeReader.Read
result.CodeText result.Value
result.CodeTypeName result.Format.ToString()
result.Confidence result.Confidence
Aspose.BarCode + Aspose.PDF for PDF reading BarcodeReader.Read("doc.pdf") — um pacote
license.SetLicense("Aspose.BarCode.lic") IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
new Aspose.BarCode.Metered() + .SetMeteredKey() (not needed — single key covers all environments)
generator.GenerateBarCodeImage() .ToPngBinaryData() ou .SaveAsPng()
QREncodeMode.Auto + QRErrorLevel.LevelH + sobreposição de logotipo manual QRCodeWriter.CreateQrCode().AddBrandLogo()

Quando as equipes consideram migrar do Aspose.BarCode para o IronBarcode

Diversos cenários costumam levar as equipes de desenvolvimento a avaliar o IronBarcode como uma alternativa ao Aspose.BarCode.

Chegou a hora de renovar a assinatura.

A renovação da assinatura anual é o período em que as equipes mais frequentemente revisam as decisões relativas à biblioteca. Se Aspose.BarCode for o único produto Aspose na pilha, pagar $999/ano por desenvolvedor (ou $4.995/ano no nível de site) para funcionalidade de códigos de barras incita uma comparação. A conversa geralmente é assim: "Vamos pagar isso todo ano, para sempre." Qual o custo inicial do IronBarcode? Não plano Professional (US$ 2.999 para 10 desenvolvedores), o IronBarcode se paga no primeiro ano com a licença Site.

Para equipes usando o Aspose.Total — onde o Aspose.BarCode é agrupado com muitos outros produtos Aspose — os cálculos são diferentes. O custo marginal do Aspose.BarCode nesse pacote se aproxima de zero. Essas equipes têm menos motivos para mudar.

Suporte a PDF torna-se um requisito

Muitos projetos começam com a leitura de códigos de barras em imagens e, posteriormente, adicionam suporte a PDFs quando um dos envolvidos percebe que os documentos recebidos são PDFs em vez de arquivos de imagem. Nesse ponto, a equipe do Aspose.BarCode se depara com uma decisão: adicionar o Aspose.PDF (outra assinatura), encontrar um renderizador de PDF de terceiros ou reavaliar a biblioteca de código de barras.

Adicionar o Aspose.PDF resolve o requisito imediato, mas significa uma segunda assinatura anual. Encontrar um renderizador de terceiros adiciona uma dependência e um esforço de integração. Reavaliar a biblioteca de códigos de barras — e descobrir que o IronBarcode lê PDFs nativamente por uma taxa única — é frequentemente o resultado.

Cenários de formato desconhecido em produção

Aplicativos voltados para o cliente que aceitam uploads de documentos não podem controlar qual formato de código de barras um documento carregado utiliza. Se a aplicação foi construída assumindo entradas Code 128 e um cliente fizer o upload de uma etiqueta DataMatrix, um DecodeType.Code128 codificado irá silenciosamente não retornar resultados. Mudar para DecodeType.AllSupportedTypes corrige a precisão, mas introduz um custo de desempenho.

As equipes que encontraram esse problema — adicionando mais e mais valores DecodeType à sua configuração de leitor conforme novos formatos aparecem na produção — frequentemente acabam mantendo uma lista que precisa ser atualizada toda vez que uma nova fonte de formato é adicionada. A detecção automática do IronBarcode torna essa lista desnecessária.

Implantações em nuvem e conteinerizadas

O licenciamento baseado em arquivo do Aspose.BarCode adiciona uma etapa de implantação: o arquivo de licença deve estar acessível em tempo de execução a partir de um caminho que o aplicativo possa ler. Em um fluxo de trabalho GitOps, o arquivo de licença acaba no controle de versão (um risco de segurança) ou precisa ser injetado por meio de um volume secreto montado. A abordagem baseada em chaves do IronBarcode se integra perfeitamente aos segredos do Kubernetes e às variáveis ​​secretas de CI/CD, sem a necessidade de gerenciar arquivos na imagem do contêiner.

Considerações Comuns de Migração

As equipes que fazem a transição do Aspose.BarCode para o IronBarcode encontram um pequeno conjunto de ajustes técnicos previsíveis.

Mapeamento de nomes de propriedades

O erro de compilação mais comum após a troca de pacotes é a renomeação de result.CodeText para result.Value. Uma busca em todo o código-fonte resolve isso rapidamente:

grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
SHELL

result.CodeText se torna result.Value. result.CodeTypeName se torna result.Format.ToString(). A propriedade result.Format é um valor enum BarcodeEncoding, que também permite comparações tipadas, onde necessário.

Remoção do tipo de decodificação

Toda referência DecodeType.* na base de código pode ser removida:

grep -r "DecodeType\." --include="*.cs" .
grep -r "DecodeType\." --include="*.cs" .
SHELL

Se um DecodeType específico foi listado para melhorar o desempenho em um formato conhecido, ReadingSpeed.Faster em BarcodeReaderOptions fornece um benefício semelhante sem requisitos de conhecimento de formato.

Alteração de inicialização da licença

Aspose.BarCode usa um arquivo .lic carregado via license.SetLicense().IronBarcode usa uma chave de string:

IronBarCode.License.LicenseKey =
    Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
    ?? throw new InvalidOperationException("IronBarcode license key not configured");
IronBarCode.License.LicenseKey =
    Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
    ?? throw new InvalidOperationException("IronBarcode license key not configured");
Imports IronBarCode
Imports System

License.LicenseKey = If(Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE"), Throw New InvalidOperationException("IronBarcode license key not configured"))
$vbLabelText   $csharpLabel

Remova o arquivo .lic do repositório e dos artefatos de construção. Não Docker, remova a linha COPY Aspose.BarCode.lic e substitua por uma entrada ENV IRONBARCODE_LICENSE.

Mapeamento de EncodeTypes para BarcodeEncoding

EncodeTypes.QR mapeia para BarcodeEncoding.QRCode — a diferença de nome é onde as equipes frequentemente encontram o primeiro erro de compilação após migrar o código de geração. A maioria dos outros mapeamentos são equivalentes diretos com nomenclatura consistente.

Funcionalidades adicionais do IronBarcode

Além dos principais pontos de comparação, o IronBarcode oferece funcionalidades que podem ser relevantes dependendo do contexto da aplicação:

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

IronBarcode suporta.NET Framework4.6.2+, .NET Core 3.1+, e .NET 5, 6, 7, e 8. A biblioteca recebe atualizações regulares alinhadas com a cadência de lançamentos do .NET da Microsoft. Aspose.BarCode suporta uma faixa de versão .NET comparável, portanto, nenhuma biblioteca apresenta uma vantagem de compatibilidade em versões atuais. A diferença significativa para a preparação futura reside no licenciamento: uma licença perpétua do IronBarcode adquirida hoje cobre as versões futuras do .NET sem custos adicionais, enquanto as assinaturas do Aspose.BarCode exigem renovação contínua para acessar as versões atualizadas.

Conclusão

Aspose.BarCode e IronBarcode representam duas filosofias diferentes no design de bibliotecas de código de barras. O Aspose.BarCode é construído sobre uma API explícita, baseada em instâncias, onde o chamador especifica o formato, gerencia o ciclo de vida dos objetos e configura cada operação por meio de uma hierarquia de propriedades. O IronBarcode é construído sobre uma API estática e independente de formato, onde a biblioteca lida internamente com a detecção, o ciclo de vida do objeto e a renderização de PDF. Nenhuma das duas abordagens está inerentemente correta — a escolha certa depende das necessidades da aplicação.

O Aspose.BarCode é a opção mais robusta para equipes que já operam dentro do ecossistema Aspose. Quando o Aspose.Total já está licenciado, o Aspose.BarCode não adiciona custo marginal, e sua lista de mais de 80 simbologias é uma das mais amplas disponíveis em qualquer biblioteca de códigos de barras .NET comercial. Para aplicações que exigem formatos incomuns — MaxiCode, DotCode ou simbologias postais específicas que não constam na lista de mais de 50 formatos do IronBarcode— o Aspose.BarCode pode ser a única opção viável. Sua maturidade e variedade de formatos são pontos fortes genuínos.

Para equipes que avaliam o Aspose.BarCode como uma compra independente, o cálculo de valor é mais difícil de ser feito. A exigência de especificação de formato adiciona atrito a cada operação de leitura. A ausência de suporte nativo para PDF dobra o custo da assinatura para uma funcionalidade que o IronBarcode inclui em seu pacote básico. E o modelo de assinatura significa que o custo se acumula anualmente — US$ 4.995 por ano para uma equipe de 10 desenvolvedores chegam a US$ 24.975 em cinco anos, em comparação com US$ 2.999 como uma compra única do IronBarcode Professional . A detecção automática, a leitura nativa de PDFs e a licença perpétua do IronBarcode resolvem todas essas três preocupações em um único pacote.

A decisão final depende da adequação ao ecossistema e dos requisitos de simbologia. Equipes profundamente integradas aos produtos Aspose, ou equipes que precisam de formatos fora da lista de formatos suportados pelo IronBarcode, devem usar o Aspose.BarCode. Equipes que desejam uma licença perpétua independente, leitura nativa de PDFs e uma API que não exige conhecimento de formato a cada leitura acharão o IronBarcode a opção mais prática.

Perguntas frequentes

O que é o Aspose.BarCode for .NET?

Aspose.BarCode for .NET é uma biblioteca .NET para gerar e ler códigos de barras em aplicações C#. É uma das várias 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 o Aspose.BarCode for .NET e o IronBarcode?

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

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 Aspose.BarCode for .NET 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 Aspose.BarCode for .NET para o IronBarcode?

A migração do Aspose.BarCode for .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