Aspose.BarCode for .NET vs IronBarcode: Comparação de bibliotecas de código de barras em C#
Todo desenvolvedor que já 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 isso não acontece — quando um documento vem de um sistema externo, de um fornecedor que alterou o formato da etiqueta ou de um upload do usuário — você precisa adivinhar uma lista de tipos de decodificação ou recorrer a DecodeType.AllSupportedTypes, o que é consideravelmente mais lento. 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 para .NET para renderizar as páginas em imagens primeiro. O Aspose.PDF é uma assinatura adicional: de US$ 999 a US$ 4.995 por ano, além do que você já paga pelo Aspose.BarCode. Duas assinaturas para um fluxo de trabalho que a maioria dos desenvolvedores considera como uma única tarefa.
OIronBarcodedetecta 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.
O Aspose.BarCode suporta mais de 60 simbologias de código de barras, sendo a lista de formatos mais completa de qualquer biblioteca comercial de código de barras para .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, em seguida, chamar Save com um argumento de formato explícito. A leitura requer especificar quais tipos de decodificação pesquisar, chamar ReadBarCodes() e, em seguida, iterar FoundBarCodes. 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 Format-First: Cada operação de leitura requer a especificação explícita de
DecodeType. A lista alternativaDecodeType.AllSupportedTypesé significativamente mais lenta do que uma lista direcionada, porque o decodificador percorre sequencialmente todas as simbologias conhecidas. - API baseada em instâncias: Tanto
BarCodeReaderquantoBarcodeGeneratorsão objetos instanciados que implementamIDisposable. A falta de encapsulamento em blocosusingresulta em vazamentos de recursos. - Sem suporte nativo a PDF: o Aspose.BarCode não consegue abrir ou renderizar documentos PDF diretamente. A leitura de códigos de barras em PDFs requer o Aspose.PDF, um produto de assinatura separado que custa entre US$ 999 e US$ 4.995 por ano.
- Hierarquia de Parâmetros Profunda: A personalização é tratada através de cadeias de propriedades
generator.Parameters.Barcode.*— uma hierarquia de objetos multinível que requer memorização. - Licenciamento somente por assinatura: Todos os planos são assinaturas anuais. Não há opção de assinatura perpétua disponível como produto independente.
- Ativação de licença baseada em arquivo: Implantações de produção exigem um arquivo
.licacessível em um caminho conhecido, o que adiciona uma etapa de implantação para 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:
// Aspose.BarCode: must specify format or use slow AllSupportedTypes
using Aspose.BarCode.BarCodeRecognition;
var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
reader.ReadBarCodes();
foreach (var result in reader.FoundBarCodes)
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
// Aspose.BarCode: must specify format or use slow AllSupportedTypes
using Aspose.BarCode.BarCodeRecognition;
var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
reader.ReadBarCodes();
foreach (var result in reader.FoundBarCodes)
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
Imports Aspose.BarCode.BarCodeRecognition
' Aspose.BarCode: must specify format or use slow AllSupportedTypes
Dim reader As New BarCodeReader("barcode.png", DecodeType.Code128)
reader.ReadBarCodes()
For Each result In reader.FoundBarCodes
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
Next
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 é a alternativa, e é significativamente mais lento do que uma lista de tipos de decodificação direcionada.
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);
Não usar using é um vazamento de recursos. O BarcodeGenerator também implementa o IDisposable, embora as consequências de não o descartar sejam menos graves. 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.
OIronBarcodeé desenvolvido e mantido pela Iron Software, uma empresa focada exclusivamente 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 equivalenteDecodeType. - 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 qualquer pacote adicional ou etapa de renderização. Os resultados incluemresult.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 string: A chave de licença é definida por meio de
IronBarCode.License.LicenseKey, compatível com variáveis de ambiente e gerenciadores de segredos de CI/CD.
Comparação de recursos
| Recurso | Aspose.BarCode | IronBarcode |
|---|---|---|
| Detecção de formato | Manual — deve especificar DecodeType ou usar a versão lenta AllSupportedTypes |
Automático em todos os formatos suportados. |
| Contagem de simbologia | 60+ | 50+ |
| Suporte a PDF | Sem suporte nativo — requer licença Aspose.PDF separada. | Nativo — BarcodeReader.Read("doc.pdf") integrado ao pacote |
| Modelo de preços | Somente por assinatura — US$ 999 a US$ 4.995 por 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. | Sem estado — naturalmente seguro para uso simultâneo. |
Comparação Detalhada de Recursos
| Recurso | Aspose.BarCode | IronBarcode |
|---|---|---|
| Geração | ||
| Estilo API | @@--CÓDIGO-63290--@@ | @@--CÓDIGO-63291--@@ |
| Modelo de personalização | generator.Parameters.Barcode.* hierarquia de propriedades |
Cadeia de métodos fluentes (.ResizeTo(), .ChangeBarCodeColor()) |
| Código QR com logotipo | Sobreposição manual de GDI+ após a geração | @@--CÓDIGO-63295--@@ integrado |
| Saída para bytes | @@--CÓDIGO-63296--@@ | @@--CÓDIGO-63297--@@ |
| Códigos de barras coloridos | @@--CÓDIGO-63298--@@ | @@--CÓDIGO-63299--@@ |
| Leitura | ||
| Especificação de formato | Obrigatório (DecodeType) |
Não é necessário — automático |
| Recurso alternativo para formato desconhecido | @@--CÓDIGO-63301--@@ (lento) | Mesma chamada — sem necessidade de modo alternativo. |
| Ajuste de desempenho | 12+ QualitySettings parâmetros |
ReadingSpeed enum — 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 | @@--CÓDIGO-63338--@@ após ligar para ReadBarCodes() |
Valor de retorno de BarcodeReader.Read() |
| Propriedade de valor do código de barras | @@--CÓDIGO-63308--@@ | @@--CÓDIGO-63309--@@ |
| Propriedade de nome de formato | @@--CÓDIGO-63310--@@ | @@--CÓDIGO-63311--@@ |
| Suporte a PDF | ||
| Leitura nativa de PDFs | Não | Sim |
| Necessário para PDF | Aspose.PDF (US$ 999 a US$ 4.995/ano adicional) | Sem pacote adicional |
| Número da página nos resultados | N / D | @@--CÓDIGO-63312--@@ |
| 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) |
| Desenvolvedores ilimitados | US$ 14.985/ano (OEM) | 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 | .lic caminho do arquivo |
String key — variável de ambiente |
| Implantação em Docker | É necessário 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/9) |
| 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 normalmente requer navegar até 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)
Cada personalização navega até generator.Parameters.Barcode.*, que é uma hierarquia de objetos multinível. 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()
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")
O Aspose.BarCode requer desenho manual em GDI+ para sobrepor um logotipo em um código QR — gerando a imagem do código de barras e, em seguida, usando System.Drawing.Graphics para compor o logotipo centralizado sobre ela. O recurso AddBrandLogo doIronBarcodelida com isso em uma única chamada e configura automaticamente a correção de erros de forma adequada.
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. Em conjunto, isso representa um custo de US$ 1.998 a US$ 9.990 por ano para o que a maioria dos desenvolvedores considera uma única funcionalidade.
// 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
Isso envolve duas configurações de licença, duas declarações using de dois namespaces, um pipeline de renderização, gerenciamento de fluxo de memória e um loop aninhado. Também utiliza DecodeType.AllSupportedTypes porque, no momento da extração da imagem, normalmente não se sabe qual formato o código de barras utiliza.
Abordagem do IronBarcode
OIronBarcodelida 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ódigo 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
// 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
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 maneiras muito diferentes.
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;
// AllSupportedTypes scans for every known format — significantly slower
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;
// AllSupportedTypes scans for every known format — significantly slower
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
' AllSupportedTypes scans for every known format — significantly slower
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
Abordagem do IronBarcode
Não existe um "modo lento" e um "modo rápido" com base no conhecimento do formato. A detecção doIronBarcodeutiliza o mesmo algoritmo, independentemente de a imagem conter um código Code 128 ou um DataMatrix. Se você deseja ajustar a relação entre desempenho e precisão, a opção ReadingSpeed faz isso sem exigir conhecimento do 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
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)
ReadingSpeed.Faster prioriza a taxa de transferência. ReadingSpeed.Detailed prioriza a precisão em imagens danificadas ou com 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 |
|---|---|
| @@--CÓDIGO-63329--@@ | @@--CÓDIGO-63330--@@ |
| @@--CÓDIGO-63331--@@ | @@--CÓDIGO-63332--@@ |
| @@--CÓDIGO-63333--@@ | @@--CÓDIGO-63334--@@ |
| @@--CÓDIGO-63335--@@ (varredura lenta e exaustiva) | Automático — sempre rápido, a mesma chamada para todos os formatos. |
| @@--CÓDIGO-63336--@@ | (part of BarcodeReader.Read — returns results directly) |
| @@--CÓDIGO-63338--@@ | Valor de retorno de BarcodeReader.Read |
| @@--CÓDIGO-63308--@@ | @@--CÓDIGO-63309--@@ |
| @@--CÓDIGO-63310--@@ | @@--CÓDIGO-63311--@@ |
| @@--CÓDIGO-63344--@@ | @@--CÓDIGO-63344--@@ |
| @@--CÓDIGO-63346--@@ | @@--CÓDIGO-63347--@@ — um pacote |
| @@--CÓDIGO-63348--@@ | @@--CÓDIGO-63349--@@ |
| @@--CÓDIGO-63350--@@ + @@--CÓDIGO-63351--@@ | (not needed — single key covers all environments) |
| @@--CÓDIGO-63296--@@ | @@--CÓDIGO-63353--@@ ou @@--CÓDIGO-63354--@@ |
QREncodeMode.Auto + QRErrorLevel.LevelH + sobreposição de logotipo manual |
@@--CÓDIGO-63357--@@ |
Quando as equipes consideram migrar do Aspose.BarCode para o IronBarcode
Diversos cenários costumam levar as equipes de desenvolvimento a avaliar oIronBarcodecomo 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 o Aspose.BarCode for o único produto Aspose na pilha, o preço de US$ 999 a US$ 4.995 por ano para a funcionalidade de código de barras exige uma comparação. A conversa geralmente é assim: "Vamos pagar isso todo ano, para sempre." Qual o custo inicial doIronBarcode? Não plano Professional (US$ 2.999 para 10 desenvolvedores), oIronBarcodese paga no primeiro ano com a licença Site.
Para equipes que utilizam o Aspose.Total — onde o Aspose.BarCode vem incluído em mais de 20 outros produtos — o cálculo é diferente. 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 a necessidade imediata, mas dobra o custo da assinatura. 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 oIronBarcodelê 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 o aplicativo foi desenvolvido considerando entradas do código 128 e um cliente carrega um rótulo DataMatrix, um valor fixo como DecodeType.Code128 simplesmente não retornará nenhum resultado. A alteração para DecodeType.AllSupportedTypes corrige o problema, mas introduz um custo de desempenho.
As equipes que se depararam com esse problema — adicionar cada vez mais valores DecodeType à configuração do leitor à medida que novos formatos surgem em produção — muitas vezes acabam mantendo uma lista que precisa ser atualizada sempre que uma nova fonte de formato é adicionada. A detecção automática doIronBarcodetorna 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 doIronBarcodese 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 oIronBarcodeencontram 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 @@--CÓDIGO-63308--@@ 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" .
result.CodeText torna-se result.Value. @@--CÓDIGO-63310--@@ torna-se result.Format.ToString(). A propriedade result.Format é um valor de enumeração BarcodeEncoding, que também permite comparações tipadas quando necessário.
Remoção do tipo de decodificação
Todas as referências a DecodeType.* no código-fonte podem ser removidas:
grep -r "DecodeType\." --include="*.cs" .
grep -r "DecodeType\." --include="*.cs" .
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 do formato.
Alteração de inicialização da licença
Aspose.BarCode usa um arquivo .lic carregado via license.SetLicense().IronBarcodeusa 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"))
Remova o arquivo .lic do repositório e dos artefatos de compilação. Não Docker, remova a linha COPY Aspose.BarCode.lic e substitua-a por uma entrada ENV IRONBARCODE_LICENSE.
Mapeamento de EncodeTypes para BarcodeEncoding
EncodeTypes.QR corresponde a BarcodeEncoding.QRCode — a diferença de nomenclatura é onde as equipes geralmente encontram o primeiro erro de compilação após migrar o código de geração. Todas as outras correspondências são equivalentes diretas com nomenclatura consistente.
Funcionalidades adicionais do IronBarcode
Além dos principais pontos de comparação, oIronBarcodeoferece funcionalidades que podem ser relevantes dependendo do contexto da aplicação:
- Detecção de múltiplos códigos de barras por imagem :
ExpectMultipleBarcodes = trueretorna todos os códigos de barras encontrados em uma única imagem, com as coordenadas de posição de cada um. - Inserção de códigos de barras em PDFs : Insira códigos de barras diretamente em páginas PDF existentes sem a necessidade de uma biblioteca PDF separada.
- Leitura de vários quadros TIFF : Lê códigos de barras de todos os quadros de um TIFF com várias páginas em uma única chamada.
- Códigos QR estilizados : Cor, logotipo e nível de correção de erros são definidos por meio do fluxo contínuo, sem processamento externo de imagens.
- Suporte para Azure Functions e AWS Lambda : Implantações sem servidor são suportadas em ambas as plataformas com a licença padrão.
- Codificação de dados binários : Codifique matrizes de bytes diretamente em códigos de barras Data Matrix ou PDF417 para casos de uso de carga útil binária.
Compatibilidade com .NET e Preparação para o Futuro
OIronBarcodeé compatível com o.NET Framework4.6.2+, .NET Core 3.1+ e .NET 5, 6, 7, 8 e 9. A biblioteca recebe atualizações regulares alinhadas ao ciclo de lançamentos do .NET da Microsoft, garantindo compatibilidade com o .NET 10, previsto para o final de 2026. O Aspose.BarCode também é compatível com a mesma faixa de versões do .NET , portanto, nenhuma das bibliotecas oferece vantagem de compatibilidade nas versões atuais. A diferença significativa para a preparação futura reside no licenciamento: uma licença perpétua doIronBarcodeadquirida 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 eIronBarcoderepresentam 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. OIronBarcodeé 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 nenhum custo adicional, e sua lista com mais de 60 simbologias é a mais abrangente disponível em qualquer biblioteca comercial de código de barras para .NET . 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 doIronBarcode— 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 oIronBarcodeinclui 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 doIronBarcodeProfessional . A detecção automática, a leitura nativa de PDFs e a licença perpétua doIronBarcoderesolvem 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 oIronBarcodea opção mais prática.
Perguntas frequentes
O que é o Aspose.BarCode para .NET?
Aspose.BarCode para .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 para .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 para .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 para .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 para .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 para .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 para .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 para .NET para o IronBarcode?
A migração do Aspose.BarCode para .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()`.

