Ir para o conteúdo do rodapé
VíDEOS

Como definir uma região de recorte de código de barras em C#

Migrando deNetBarcodepara IronBarcode

Este guia abrange todo o processo de migração doNetBarcodepara o IronBarcode , incluindo etapas de remoção de pacotes, atualizações de namespace, exemplos de tradução de API e uma lista de verificação para localizar cada ponto de chamada antes do início da migração. O guia aborda o cenário comum em que um projeto começa comNetBarcodepara geração de códigos de barras 1D e depois requer formatos 2D, capacidade de leitura ou esclarecimento da obrigação de licença do SixLabors.ImageSharp — todos fora do escopo do NetBarcode.

Por que migrar do NetBarcode?

Limite de Formatos: O enum Type doNetBarcodedefine exatamente 11 formatos de código de barras, todos lineares. Não há nenhuma entrada para QR Code, DataMatrix, PDF417 ou Aztec. Quando um projeto adiciona um requisito de código QR — para links de entrega sem contato, links diretos para dispositivos móveis ou uma exigência de DataMatrix para a indústria farmacêutica — oNetBarcodenão consegue atendê-lo. A única solução dentro do projeto da biblioteca é parar de usá-la para esse formato e introduzir um pacote separado. Cada requisito de formato adicional que cai fora do enum de 11 entradas adiciona outra biblioteca à árvore de dependência.

Sem API de leitura: ONetBarcodegera imagens de código de barras e não fornece nenhum método para decodificá-las. Um projeto que precisa escanear etiquetas de devolução de remessas, extrair valores de código de barras de faturas de fornecedores ou validar se um código de barras impresso corresponde aos seus dados de origem deve adicionar uma biblioteca de leitura separada. O uso do ZXing .NET é a opção mais comum, introduzindo uma terceira superfície de API em uma base de código que já contém oNetBarcodee, normalmente, uma biblioteca específica para QR Code.

Licença Comercial ImageSharp:NetBarcodedepende do SixLabors.ImageSharp, que usa uma licença comercial dividida. A versão gratuita aplica-se a projetos de código aberto e empresas com faturamento anual abaixo de um determinado limite; acima desse limite é necessária uma licença comercial. Essa condição está embutida na cadeia de dependência transitiva e não é exposta pelo NuGet durante a instalação. Uma empresa de varejo ou logística que processa códigos de barras em grande escala — exatamente o caso de uso que aNetBarcodevisa — pode estar operando acima do limite sem ter avaliado a obrigação.

Acúmulo de múltiplas bibliotecas: Projetos que utilizam o QRCoder quando códigos QR são necessários e, em seguida, o ZXing .NET quando a leitura se torna necessária, acumulam três dependências distintas relacionadas a códigos de barras. Cada um possui seu próprio cronograma de lançamento, sua própria expectativa de versão do ImageSharp e sua própria API para manutenção. A consolidação em uma única biblioteca que abrange geração, leitura, impressão 1D e 2D elimina o problema de gerenciamento de versões entre bibliotecas.

O problema fundamental

Um projeto que começa apenas comNetBarcodee depois cresce a ponto de exigir formatos 2D acaba com esse tipo de importação dividida:

//NetBarcodefor 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
//NetBarcodefor 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
Imports NetBarcode
Imports QRCoder
Imports System.IO

'NetBarcode for 1D — one library, one API
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")

' QRCoder added separately for QR — second library, second API
Dim qrGenerator As New QRCodeGenerator()
Dim qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim png = New PngByteQRCode(qrData).GetGraphic(20)
File.WriteAllBytes("qr.png", png)
$vbLabelText   $csharpLabel

Após a migração para o IronBarcode, as mesmas duas saídas são obtidas a partir de uma única importação:

using IronBarCode;

BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
    .SaveAsPng("label.png")

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsPng("qr.png")
$vbLabelText   $csharpLabel

IronBarcode vs NetBarcode: Comparação de Recursos

Recurso NetBarcode IronBarcode
Geração de código de barras 1D Sim Sim
Geração de código de barras 2D (QR, DataMatrix, PDF417, Aztec) Não Sim
Leitura de código de barras a partir de imagens Não Sim
Leitura de código de barras em documentos PDF Não Sim
contagem de formato 1D 11 30+
contagem de formato 2D 0 8+
Simbologias totais 11 50+
GS1-128, GS1 DataBar Não Sim
Formatos postais Não Sim
Saída SVG Não Sim
Processamento em lote Manual Embutido
Dependência do ImageSharp Sim (licença dividida) Não
Suporte comercial Comunidade Professional
Modelo de licença MIT (+ condições ImageSharp) Comercial

Guia rápido: Migração doNetBarcodepara o IronBarcode

Passo 1: Substitua o pacote NuGet

Remova oNetBarcodee sua dependência transitiva do ImageSharp:

dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
SHELL

Note que SixLabors.ImageSharp pode reaparecer na lista de pacotes restaurados se outros pacotes no projeto também o referenciam de forma transitiva. Após a remoção, execute dotnet list package --include-transitive para confirmar se o ImageSharp permanece e se a condição de licença comercial ainda se aplica ao projeto.

Passo 2: Adicionar IronBarcode

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

O nome do pacote NuGet é IronBarcode; o namespace usado no código é IronBarCode (observe o C maiúsculo).

Etapa 3: Atualizar Namespaces e Inicializar Licença

Substitua as diretivas using antigas em todos os arquivos que continham chamadas ao NetBarcode:

// Remover these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;

// Add this:
using IronBarCode;
// Remover these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;

// Add this:
using IronBarCode;
Imports IronBarCode
$vbLabelText   $csharpLabel

Adicione a inicialização da licença uma vez na inicialização da aplicação — em Program.cs, Startup.cs, ou no ponto de entrada do projeto:

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Uma chave de avaliação gratuita está disponível para consulta; A compra de uma licença remove a marca d'água de avaliação das imagens de código de barras geradas.

Exemplos de migração de código

Geração Code128

O padrão de uso mais comum doNetBarcodese traduz diretamente para o IronBarcode com uma mudança de construtor para método estático e uma renomeação do método.

Abordagem NetBarcode:

using NetBarcode;

var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");
using NetBarcode;

var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");
Imports NetBarcode

Dim barcode As New Barcode("12345678901234", Type.Code128)
barcode.SaveImageFile("shipping-label.png")
$vbLabelText   $csharpLabel

Abordagem do IronBarcode:

using IronBarCode;

BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128) _
    .SaveAsPng("shipping-label.png")
$vbLabelText   $csharpLabel

O construtor new Barcode(data, Type.X) se torna BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X). O método SaveImageFile() se torna SaveAsPng(), SaveAsJpeg(), ou SaveAsWindowsBitmap() dependendo do formato de saída requerido. Todas as opções disponíveis para geração de códigos de barras 1D estão documentadas nos guias práticos do IronBarcode.

EAN-13

Os tipos de código de barras de produtos de varejo são mapeados diretamente entre bibliotecas com uma renomeação de constante e uma renomeação de método.

Abordagem NetBarcode:

using NetBarcode;

var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product-ean.png");
using NetBarcode;

var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product-ean.png");
Imports NetBarcode

Dim ean13 As New Barcode("5901234123457", Type.EAN13)
ean13.SaveImageFile("product-ean.png")
$vbLabelText   $csharpLabel

Abordagem do IronBarcode:

using IronBarCode;

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product-ean.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product-ean.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
    .SaveAsPng("product-ean.png")
$vbLabelText   $csharpLabel

Os nomes das constantes de codificação correspondem aos nomes dos membros do enum Type doNetBarcodeonde equivalentes diretos existem. Note que UPC-A (Type.UPCA), UPC-E (Type.UPCE), ITF (Type.ITF), e MSI (Type.MSI) não fazem parte do enum Type doNetBarcode— se esses formatos forem necessários, o IronBarcode os suporta nativamente via BarcodeEncoding.UPCA, BarcodeEncoding.UPCE, BarcodeEncoding.ITF, e BarcodeEncoding.MSI.

GetImage() para ToPngBinaryData()

O método GetImage() doNetBarcoderetorna SixLabors.ImageSharp.Image<Rgba32>, que requer importações explícitas do ImageSharp no código chamador e vincula a lógica subsequente à API do ImageSharp. O IronBarcode expõe métodos de saída binária e de fluxo diretamente no objeto GeneratedBarcode, eliminando completamente a dependência do ImageSharp no código chamador.

Abordagem NetBarcode:

using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();

using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();

using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
Imports NetBarcode
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats
Imports System.IO

Dim barcode As New Barcode("12345", Type.Code128)
Dim image As Image(Of Rgba32) = barcode.GetImage()

Using stream As New MemoryStream()
    image.SaveAsPng(stream)
    Dim bytes As Byte() = stream.ToArray()
End Using
$vbLabelText   $csharpLabel

Abordagem do IronBarcode:

using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);

// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();

// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);

// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();

// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
Imports IronBarCode

Dim barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)

' Retrieve bytes directly — no ImageSharp type in calling code
Dim bytes As Byte() = barcode.ToPngBinaryData()

' Or write to a stream directly
Using stream As New MemoryStream()
    barcode.SaveAsPng(stream)
End Using
$vbLabelText   $csharpLabel

O código que executou manipulações adicionais do ImageSharp no resultado Image<Rgba32> — redimensionamento, composição, conversão de formato — precisará ter essas operações avaliadas individualmente, pois o IronBarcode não expõe um objeto do ImageSharp.

SubstituindoNetBarcodee QRCoder em conjunto

Projetos que utilizam oNetBarcodeem conjunto com o QRCoder podem substituir ambos simultaneamente. A geração 2D do IronBarcode usa o mesmo método BarcodeWriter.CreateBarcode de sua geração 1D; apenas a constante BarcodeEncoding difere. Consulte o guia de geração de código de barras 2D para opções de codificação e configuração.

AbordagemNetBarcodee QRCoder:

using NetBarcode;
using QRCoder;

// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));
using NetBarcode;
using QRCoder;

// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));
Imports NetBarcode
Imports QRCoder

' 1D with NetBarcode
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")

' QR with QRCoder
Dim qrGenerator As New QRCodeGenerator()
Dim qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim qrCode As New PngByteQRCode(qrData)
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20))
$vbLabelText   $csharpLabel

Abordagem do IronBarcode:

using IronBarCode;

// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-label.png");
using IronBarCode;

// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-label.png");
Imports IronBarCode

' 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
    .SaveAsPng("label.png")

' QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsPng("qr.png")

' Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix) _
    .SaveAsPng("pharma-label.png")
$vbLabelText   $csharpLabel

Adicionando capacidade de leitura

Se o projeto também utilizasse o ZXing .NET para leitura, essa dependência poderia ser removida juntamente com o NetBarcode. O BarcodeReader do IronBarcode lida com imagens e documentos PDF com detecção automática de formato.

Abordagem ZXing .NET :

using ZXing;
using ZXing.Common;
using ZXing.Rendering;

var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };

// Bitmap loading and format-specific handling required before decode call
using ZXing;
using ZXing.Common;
using ZXing.Rendering;

var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };

// Bitmap loading and format-specific handling required before decode call
Imports ZXing
Imports ZXing.Common
Imports ZXing.Rendering

Dim reader = New BarcodeReaderGeneric()
reader.Options = New DecodingOptions With {.TryHarder = True}

' Bitmap loading and format-specific handling required before decode call
$vbLabelText   $csharpLabel

Abordagem do IronBarcode:

using IronBarCode;

// Read from an image file — automatic format detection
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
    Console.WriteLine($"{r.Format}: {r.Value}");
}

// Read from a PDF document — no separate PDF library needed
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var r in pdfResults)
{
    Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}");
}
using IronBarCode;

// Read from an image file — automatic format detection
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
    Console.WriteLine($"{r.Format}: {r.Value}");
}

// Read from a PDF document — no separate PDF library needed
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var r in pdfResults)
{
    Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}");
}
Imports IronBarCode

' Read from an image file — automatic format detection
Dim imageResults = BarcodeReader.Read("shipping-label.png")
For Each r In imageResults
    Console.WriteLine($"{r.Format}: {r.Value}")
Next

' Read from a PDF document — no separate PDF library needed
Dim pdfResults = BarcodeReader.Read("supplier-invoice.pdf")
For Each r In pdfResults
    Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}")
Next
$vbLabelText   $csharpLabel

A documentação completa sobre as opções de leitura está disponível no guia de leitura de códigos de barras a partir de imagens , abrangendo ajustes de velocidade, detecção de múltiplos códigos de barras e configurações de correção de imagem.

Referência de mapeamento da APINetBarcodepara IronBarcode

NetBarcode IronBarcode Notas
new Barcode(data, Type.Code128) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) Construtor → método estático
new Barcode(data, Type.EAN13) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN13) Mapeamento direto
new Barcode(data, Type.Code39) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code39) Mapeamento direto
new Barcode(data, Type.EAN8) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN8) Mapeamento direto
new Barcode(data, Type.Codabar) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Codabar) Mapeamento direto
new Barcode(data, Type.Code93) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code93) Mapeamento direto
barcode.SaveImageFile("x.png") .SaveAsPng("x.png") Método renomear
barcode.SaveImageFile("x.jpg") .SaveAsJpeg("x.jpg") Método renomear
barcode.GetImage()Image<Rgba32> .ToPngBinaryData() ou .SaveAsPng() Nenhum tipo ImageSharp exposto
Sem Type.QRCode BarcodeEncoding.QRCode Nova capacidade
Sem Type.DataMatrix BarcodeEncoding.DataMatrix Nova capacidade
Sem Type.PDF417 BarcodeEncoding.PDF417 Nova capacidade
Sem Type.Aztec BarcodeEncoding.Aztec Nova capacidade
Sem API de leitura BarcodeReader.Read(path) Nova capacidade
using NetBarcode; using IronBarCode; Substituição de namespace
using SixLabors.ImageSharp; Remover Não é mais necessário
using SixLabors.ImageSharp.PixelFormats; Remover Não é mais necessário
using SixLabors.Fonts; Remover Não é mais necessário

A lista completa de constantes de codificação encontra-se na referência de formatos de código de barras suportados .

Problemas e soluções comuns em migrações

Problema 1: Dependência transitiva do ImageSharp permanece após a remoção do pacote

Problema: Após executar dotnet remove package NetBarcode, dotnet restore mostra que SixLabors.ImageSharp ainda está presente na árvore de dependências porque outro pacote no projeto também o referencia.

Solução: Execute dotnet list package --include-transitive para identificar qual pacote ainda está trazendo o ImageSharp. Se for apenas o NetBarcode, remover a referência explícita do pacote e restaurar deve limpá-lo. Se outro pacote for responsável, a dependência ImageSharp desse pacote e sua condição de licença comercial permanecem em escopo independentemente da remoção do NetBarcode.

dotnet list package --include-transitive | grep -i imagesharp
dotnet list package --include-transitive | grep -i imagesharp
SHELL

Edição 2: Imagem O erro "Type cannot be resolved after removal" não pode ser resolvido após a remoção.

Problema: Após remover o pacote SixLabors.ImageSharp, qualquer variável declarada como Image<Rgba32> ou parâmetro tipado como SixLabors.ImageSharp.Image<Rgba32> produz um erro de compilação porque o tipo não está mais disponível.

Solução: Substitua cada uso pelo método de saída IronBarcode apropriado. Se a variável foi usada para obter bytes, substitua por .ToPngBinaryData(). Se foi escrita para um fluxo, substitua por .SaveAsPng(stream). Se foi salva em um arquivo, substitua por .SaveAsPng(path).

// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);

// After — no external image type required
barcode.SaveAsPng(stream);
// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);

// After — no external image type required
barcode.SaveAsPng(stream);
' Before — requires SixLabors.ImageSharp reference
Dim img As Image(Of Rgba32) = barcode.GetImage()
img.SaveAsPng(stream)

' After — no external image type required
barcode.SaveAsPng(stream)
$vbLabelText   $csharpLabel

Problema 3: v1.8 Contexto de Alteração Incompatível

Problema: Bases de código escritas contra oNetBarcodeantes da v1.8 podem ter chamadas de GetImage() que armazenavam o resultado sem digitação explícita, confiando no tipo de retorno interno da pré-v1.8. Essas chamadas podem já estar interrompidas após uma atualização do NetBarcode, independentemente da migração para o IronBarcode.

Solução: Use a migração do IronBarcode como uma oportunidade para resolver qualquer quebra pré-existente da v1.8 ao mesmo tempo. Todos os sites de chamadas de GetImage() devem ser localizados com uma busca em todo o projeto e substituídos pelo método de saída apropriado do IronBarcode durante a passagem de migração. Os comandos grep na lista de verificação de migração abaixo identificam esses locais.

Lista de verificação para migração do NetBarcode

Pré-migração

Antes de fazer qualquer alteração, faça uma auditoria em todo o uso do NetBarcode:

grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
SHELL
  • Identifique todos os arquivos que precisam de uma alteração na diretiva using.
  • Note todos os sites de chamadas de GetImage() e como o objeto Image<Rgba32> retornado é usado a jusante
  • Verifique se o QRCoder ou o ZXing .NET estão presentes e podem ser removidos na mesma passagem.
  • Execute dotnet list package --include-transitive para documentar o estado atual de dependência do ImageSharp antes da remoção
  • Obtenha uma chave de licença do IronBarcode(uma chave de avaliação gratuita está disponível sem necessidade de compra)

Atualização de código

  1. Execute dotnet remove package NetBarcode
  2. Execute dotnet remove package SixLabors.ImageSharp se não for usado por outros pacotes
  3. Execute dotnet add package IronBarcode
  4. Adicione IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; na inicialização da aplicação
  5. Substitua using NetBarcode; por using IronBarCode; em cada arquivo afetado
  6. Remova using SixLabors.ImageSharp;, using SixLabors.ImageSharp.PixelFormats;, e using SixLabors.Fonts; de todos os arquivos
  7. Traduza cada chamada de new Barcode(data, Type.X) para BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X) usando a tabela de mapeamento de API
  8. Substitua SaveImageFile() por SaveAsPng() ou o método específico de formato apropriado
  9. Substitua chamadas de GetImage() por ToPngBinaryData(), SaveAsPng(), ou SaveAsPng(stream) conforme apropriado
  10. Se estiver removendo QRCoder: substitua as cadeias QRCodeGenerator + PngByteQRCode por BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
  11. Se estiver removendo ZXing.Net: substitua a configuração do leitor por BarcodeReader.Read(path)

Testes pós-migração

  • Compile o projeto e confirme que não há erros de compilação.
  • Executar testes unitários existentes na saída de código de barras gerada.
  • Verificar visualmente as imagens dos códigos de barras para garantir simbologia correta e conteúdo legível.
  • Verifique se o código QR de saída foi adicionado durante a migração.
  • Testar a funcionalidade de leitura caso a leitura de código de barras tenha sido adicionada.
  • Execute dotnet list package --include-transitive para confirmar que o ImageSharp não está mais presente se foi removido
  • Verifique se a inicialização da chave de licença é executada antes da primeira operação com o código de barras.

Principais benefícios da migração para o IronBarcode

Cobertura de Formatos Unificada: Após a migração, códigos QR, DataMatrix, PDF417, Aztec, e todos os outros formatos 2D estão disponíveis através da mesma chamada de API usada para Code128 e EAN-13. Não é necessário uma segunda biblioteca quando os requisitos de formato se expandem, e a constante BarcodeEncoding é a única coisa que muda entre os tipos de formato.

Leitura Embutida: BarcodeReader.Read() lida com arquivos de imagem e documentos PDF com detecção automática de formato. Projetos que antes exigiam o uso do ZXing .NET para leitura podem agora eliminar essa dependência e consolidar tudo em uma única biblioteca de código de barras, reduzindo a complexidade da API que os desenvolvedores do projeto precisam aprender.

Sem obrigação de usar ImageSharp:IronBarcode não possui dependência do SixLabors.ImageSharp. Após a migração, a condição de licença comercial dividida incorporada nas dependências transitivas doNetBarcodenão se aplica mais ao projeto. As revisões de conformidade de licença tornam-se mais simples porque as obrigações da biblioteca de código de barras são declaradas diretamente e não dependem do limite de receita de uma biblioteca de processamento de imagem de terceiros.

API pública estável: O IronBarcode não expõe tipos de terceiros em sua API pública. O tipo de retorno GeneratedBarcode de BarcodeWriter.CreateBarcode é o próprio tipo do IronBarcode, o que significa que as futuras atualizações de renderização interna do IronBarcode não produzirão alterações disruptivas no código chamador da mesma forma que a mudança de tipo GetImage() da v1.8 doNetBarcodefez.

Uma única dependência para manter: substituir NetBarcode, QRCoder e ZXing .NET por IronBarcode reduz três ciclos de atualização, três conjuntos de notas de versão e três potenciais conflitos de versão para apenas um. À medida que as versões do .NET avançam e as atualizações de dependências se tornam necessárias, o trabalho de manutenção passa a ser realizado com uma única biblioteca em vez de três.

ObserveNetBarcode, QRCoder e ZXing.NET são marcas registradas de seus respectivos proprietários. Este site não é afiliado, endossado ou patrocinado por NetBarcode, QRCoder ou ZXing.NET. Todos os nomes de produtos, logotipos e marcas são propriedade de seus respectivos proprietários. As comparações são apenas para fins informativos e refletem informações disponíveis publicamente no momento da redação.

Perguntas frequentes

Por que devo migrar do NetBarcode para o IronBarcode?

Entre os motivos comuns estão a simplificação do licenciamento (removendo a complexidade do SDK e da chave de tempo de execução), a eliminação dos limites de taxa de transferência, a obtenção de suporte nativo para PDF, a melhoria da implantação em Docker/CI/CD e a redução do código repetitivo da API em produção.

Como faço para substituir as chamadas da API NetBarcode pelas do IronBarcode?

Substitua o código padrão de criação de instâncias e licenciamento por `IronBarCode.License.LicenseKey = "key"`. Substitua as chamadas de leitura por `BarcodeReader.Read(path)` e as chamadas de gravação por `BarcodeWriter.CreateBarcode(data, encoding)`. Os métodos estáticos não exigem gerenciamento de instâncias.

Quanta alteração de código ocorre ao migrar do NetBarcode para o IronBarcode?

A maioria das migrações resulta em menos linhas de código. O código repetitivo de licenciamento, os construtores de instância e a configuração explícita de formato são removidos. As operações principais de leitura/gravação são mapeadas para equivalentes mais curtos em IronBarcode, com objetos de resultado mais limpos.

Preciso manter o NetBarcode e o IronBarcode instalados durante a migração?

Não. A maioria das migrações são substituições diretas, e não operações paralelas. Migre uma classe de serviço por vez, substitua a referência do NuGet e atualize os padrões de instanciação e chamada de API antes de passar para a próxima classe.

Qual é o nome do pacote NuGet para IronBarcode?

O pacote é 'IronBarCode' (com B e C maiúsculos). Instale-o com 'Install-Package IronBarCode' ou 'dotnet add package IronBarCode'. A diretiva using no código é 'using IronBarCode;'.

Como o IronBarcode simplifica a implantação do Docker em comparação com o NetBarcode?

IronBarcode é um pacote NuGet sem arquivos SDK externos ou configuração de licença montada. No Docker, defina a variável de ambiente IRONBARCODE_LICENSE_KEY e o pacote cuidará da validação da licença na inicialização.

O IronBarcode detecta automaticamente todos os formatos de código de barras após a migração do NetBarcode?

Sim. O IronBarcode detecta automaticamente a simbologia em todos os formatos suportados. A enumeração explícita de BarcodeTypes não é necessária. Se o formato já for conhecido e o desempenho for importante, o BarcodeReaderOptions permite restringir o espaço de busca como uma otimização.

O IronBarcode consegue ler códigos de barras de PDFs sem uma biblioteca separada?

Sim. O método `BarcodeReader.Read("document.pdf")` processa arquivos PDF nativamente. Os resultados incluem o número da página, o formato, o valor e a confiança de cada código de barras encontrado. Não é necessária nenhuma etapa externa de renderização de PDF.

Como o IronBarcode lida com o processamento paralelo de códigos de barras?

Os métodos estáticos do IronBarcode são sem estado e thread-safe. Use Parallel.ForEach diretamente em listas de arquivos sem gerenciamento de instâncias por thread. BarcodeReaderOptions.MaxParallelThreads controla o orçamento interno de threads.

Quais propriedades de resultado são alteradas ao migrar do NetBarcode para o IronBarcode?

Renomeações comuns: BarcodeValue torna-se Value, BarcodeType torna-se Format. Os resultados do IronBarcode também incluem Confidence e PageNumber. Uma função de busca e substituição em toda a solução lida com as renomeações no código de processamento de resultados existente.

Como configuro o licenciamento do IronBarcode em um pipeline de CI/CD?

Armazene IRONBARCODE_LICENSE_KEY como um segredo de pipeline e atribua IronBarCode.License.LicenseKey no código de inicialização do aplicativo. Um único segredo abrange todos os ambientes, incluindo desenvolvimento, teste, homologação e produção.

O IronBarcode suporta a geração de códigos QR com estilos personalizados?

Sim. O método QRCodeWriter.CreateQrCode() suporta cores personalizadas através do método ChangeBarCodeColor(), incorporação de logotipo através do método AddBrandLogo(), níveis configuráveis de correção de erros e múltiplos formatos de saída, incluindo PNG, JPG, PDF e fluxo de dados.

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