Como gerar formatos de dados de código de barras em C# | IronBarcode
Migrando de Neodynamic Barcode para IronBarcode
Este guia fornece um caminho completo de migração de Neodynamic.SDK.Barcode e Neodynamic.SDK.BarcodeReader para IronBarcode. Abrange a remoção de ambos os pacotes Neodynamic, a substituição da configuração de licença dupla por uma única chave, a tradução das chamadas de API de geração e leitura e o processo de obtenção da capacidade de leitura de código de barras 2D, que não era possível com o conjunto de produtos Neodynamic. Este guia foi escrito para desenvolvedores que já possuem código Neodynamic e precisam de uma abordagem sistemática, arquivo por arquivo, para concluir a migração.
Por que migrar do código de barras neodinâmico?
Lacuna de leitura 2D: O SDK Professional de código de barras neodinâmico gera códigos de barras QR Code, DataMatrix, PDF417 e Aztec. Nenhum desses formatos pode ser lido pelo SDK de leitor de código de barras complementar. Um projeto que gera códigos QR para etiquetas de produtos, contêineres de transporte ou rastreamento de documentos não consegue ler esses mesmos códigos através do leitor que adquiriu juntamente com o gerador. O IronBarcode lê e gera códigos QR, DataMatrix, PDF417, Aztec e todos os outros formatos 2D suportados, utilizando a mesma biblioteca e a mesma licença.
Sobrecarga de Produto Duplo: Todo projeto que utiliza ambos os SDKs da Neodynamic possui duas entradas PackageReference, duas diretivas using, dois blocos de licença e dois ciclos de atualização separados. A sobrecarga se repete em todas as máquinas de desenvolvedores, em todos os pipelines de CI e em todos os ambientes de produção. Consolidar dois pacotes com requisitos de manutenção distintos em uma única dependência com uma única licença é o resultado mecânico dessa migração.
O Problema da Terceira Biblioteca: As equipes que se depararam com a lacuna na leitura 2D e optaram por contorná-la em vez de migrar, normalmente adicionavam uma terceira biblioteca — sendo o ZXing .NET a escolha mais comum — especificamente para lidar com a leitura de códigos QR. Essa decisão troca uma limitação por uma complexidade diferente: três dependências relacionadas a códigos de barras, cada uma com suas próprias restrições de versão, suas próprias notas de lançamento e seu próprio potencial de conflito quando o runtime do .NET ou a estrutura dependente for atualizada.IronBarcode substitui todos os três.
Complexidade de Preços: O Professional de código de barras neodinâmico SDK é precificado por desenvolvedor (Básico a partir de aproximadamente $352, Ultimate a partir de aproximadamente $705 via ComponentSource). O SDK do Leitor de Código de Barras tem um custo separado. Um projeto que precisa tanto da geração quanto da leitura de 1D deve adquirir ambos, e o custo combinado escala com o tamanho da equipe além da taxa do Leitor. Um projeto que precisa de leitura 2D ainda não pode atender a esse requisito a qualquer preço dentro da família de produtos Neodynamic.IronBarcode Lite cobre geração e leitura — 1D e 2D — sob uma única licença. Os preços atuais estão na página de licenciamento do IronBarcode.
O problema fundamental
A principal questão em qualquer código-fonte que utilizasse os dois SDKs da Neodynamic para um fluxo de trabalho completo de código de barras era que a leitura de códigos QR nunca foi possível:
// Before: Leitor de código de barras neodinâmico does not support QR codes
using Neodynamic.SDK.BarcodeReader;
using System.Drawing;
public string ReadQrCode(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
var reader = new BarcodeReader();
var results = reader.Read(bitmap);
// Results are always null or empty for 2D barcodes
if (results == null || !results.Any())
{
throw new NotSupportedException(
"Neodynamic Barcode Reader does not support QR codes");
}
return results.First().Value;
}
// Before: Leitor de código de barras neodinâmico does not support QR codes
using Neodynamic.SDK.BarcodeReader;
using System.Drawing;
public string ReadQrCode(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
var reader = new BarcodeReader();
var results = reader.Read(bitmap);
// Results are always null or empty for 2D barcodes
if (results == null || !results.Any())
{
throw new NotSupportedException(
"Neodynamic Barcode Reader does not support QR codes");
}
return results.First().Value;
}
Imports Neodynamic.SDK.BarcodeReader
Imports System.Drawing
Public Function ReadQrCode(imagePath As String) As String
Using bitmap As New Bitmap(imagePath)
Dim reader As New BarcodeReader()
Dim results = reader.Read(bitmap)
' Results are always null or empty for 2D barcodes
If results Is Nothing OrElse Not results.Any() Then
Throw New NotSupportedException("Neodynamic Barcode Reader does not support QR codes")
End If
Return results.First().Value
End Using
End Function
Após a migração para o IronBarcode, a mesma operação se torna uma chamada de leitura padrão, sem tratamento específico de formato:
// After:IronBarcode reads QR codes with the same call used for all formats
using IronBarCode;
public string ReadQrCode(string imagePath)
{
var result = BarcodeReader.Read(imagePath).FirstOrDefault();
return result?.Value;
}
// After:IronBarcode reads QR codes with the same call used for all formats
using IronBarCode;
public string ReadQrCode(string imagePath)
{
var result = BarcodeReader.Read(imagePath).FirstOrDefault();
return result?.Value;
}
Imports IronBarCode
Public Function ReadQrCode(imagePath As String) As String
Dim result = BarcodeReader.Read(imagePath).FirstOrDefault()
Return If(result?.Value, Nothing)
End Function
Todo espaço reservado throw new NotSupportedException(...) em um código base que referencia a leitura de código de barras 2D é removido durante esta migração e substituído por uma chamada de leitura funcional.
IronBarcode vs Neodynamic Barcode: Comparação de Recursos
| Recurso | Professional de código de barras neodinâmico | Leitor de código de barras neodinâmico | IronBarcode |
|---|---|---|---|
| Geração de código 128, EAN-13 e UPC-A | Sim | N / D | Sim |
| Geração de código QR, DataMatrix e PDF417 | Sim | N / D | Sim |
| Leitura de código de barras 1D | N / D | Sim | Sim |
| Leitura de código QR | N / D | Não | Sim |
| Leitura de DataMatrix | N / D | Não | Sim |
| Leitura PDF417 | N / D | Não | Sim |
| Leitura nativa de código de barras em PDF | Não | Não | Sim |
| Detecção automática de formato | N / D | Não | Sim |
| Pacotes NuGet necessários | 1 | 1 | 1 (abrange ambos) |
| Chaves de licença necessárias | 1 | 1 (separado) | 1 (abrange tudo) |
| Dependência de desenho do sistema | Sim | Sim | Não |
| Suporte para Linux/Docker | Limitado | Limitado | Sim |
| Suporte para .NET 8 / .NET 9 | Sim | Limitado | Sim |
| Leitura em lote assíncrona | Não | Não | Sim |
Guia rápido: Migração de código de barras Neodynamic para IronBarcode
Passo 1: Remova ambos os pacotes neodinâmicos
Ambas as embalagens devem ser removidas. Eles não possuem dependências em comum que afetem a ordem de remoção:
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
Verifique se ambas as entradas foram removidas do arquivo .csproj antes de prosseguir.
Passo 2: Adicionar IronBarcode
dotnet add package IronBarcode
dotnet add package IronBarcode
Etapa 3: Substituir a configuração de licença dupla
Remova os dois blocos de licença Neodynamic e substitua-os por uma única atribuição de chave IronBarcode. Esta atribuição é feita uma vez na inicialização do aplicativo — em Program.cs, Startup.cs, ou na raiz de composição do aplicativo:
// Before: two license blocks, two products
using Neodynamic.SDK.Barcode;
using Neodynamic.SDK.BarcodeReader;
BarcodeProfessional.LicenseOwner = "Your Company";
BarcodeProfessional.LicenseKey = "GEN-LICENSE-KEY";
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseOwner = "Your Company";
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseKey = "READ-LICENSE-KEY";
// Before: two license blocks, two products
using Neodynamic.SDK.Barcode;
using Neodynamic.SDK.BarcodeReader;
BarcodeProfessional.LicenseOwner = "Your Company";
BarcodeProfessional.LicenseKey = "GEN-LICENSE-KEY";
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseOwner = "Your Company";
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseKey = "READ-LICENSE-KEY";
Imports Neodynamic.SDK.Barcode
Imports Neodynamic.SDK.BarcodeReader
BarcodeProfessional.LicenseOwner = "Your Company"
BarcodeProfessional.LicenseKey = "GEN-LICENSE-KEY"
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseOwner = "Your Company"
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseKey = "READ-LICENSE-KEY"
// After: one key covers generation and reading across all formats
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// After: one key covers generation and reading across all formats
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
' After: one key covers generation and reading across all formats
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Quaisquer arquivos de configuração, variáveis de ambiente ou repositórios de segredos que contenham chaves de licença do Neodynamic podem ser desativados após a verificação da migração.
Exemplos de migração de código
Gerando um código de barras Code 128
Abordagem neodinâmica:
using Neodynamic.SDK.Barcode;
using System.Drawing.Imaging;
public void GenerateCode128(string data, string outputPath)
{
var barcode = new BarcodeProfessional();
barcode.Code = data;
barcode.Symbology = Symbology.Code128;
barcode.BarcodeUnit = BarcodeUnit.Pixel;
System.Drawing.Image image = barcode.GetBarcodeImage();
image.Save(outputPath, ImageFormat.Png);
}
using Neodynamic.SDK.Barcode;
using System.Drawing.Imaging;
public void GenerateCode128(string data, string outputPath)
{
var barcode = new BarcodeProfessional();
barcode.Code = data;
barcode.Symbology = Symbology.Code128;
barcode.BarcodeUnit = BarcodeUnit.Pixel;
System.Drawing.Image image = barcode.GetBarcodeImage();
image.Save(outputPath, ImageFormat.Png);
}
Imports Neodynamic.SDK.Barcode
Imports System.Drawing.Imaging
Public Sub GenerateCode128(data As String, outputPath As String)
Dim barcode As New BarcodeProfessional()
barcode.Code = data
barcode.Symbology = Symbology.Code128
barcode.BarcodeUnit = BarcodeUnit.Pixel
Dim image As System.Drawing.Image = barcode.GetBarcodeImage()
image.Save(outputPath, ImageFormat.Png)
End Sub
Abordagem do IronBarcode:
using IronBarCode;
public void GenerateCode128(string data, string outputPath)
{
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.SaveAsPng(outputPath);
}
using IronBarCode;
public void GenerateCode128(string data, string outputPath)
{
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.SaveAsPng(outputPath);
}
Imports IronBarCode
Public Sub GenerateCode128(data As String, outputPath As String)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.SaveAsPng(outputPath)
End Sub
A importação System.Drawing.Imaging não é mais necessária. A instância BarcodeInfo e suas atribuições de propriedades são condensadas em uma única chamada de método. Para opções de dimensionamento, anotação e formato de saída, consulte o guia de criação de códigos de barras 1D .
Gerando um código QR
Abordagem neodinâmica:
using Neodynamic.SDK.Barcode;
public void GenerateQrCode(string data, string outputPath)
{
var barcode = new BarcodeProfessional();
barcode.Code = data;
barcode.Symbology = Symbology.QRCode;
barcode.QRCodeECL = QRCodeErrorCorrectionLevel.H;
barcode.GetBarcodeImage().Save(outputPath, System.Drawing.Imaging.ImageFormat.Png);
}
using Neodynamic.SDK.Barcode;
public void GenerateQrCode(string data, string outputPath)
{
var barcode = new BarcodeProfessional();
barcode.Code = data;
barcode.Symbology = Symbology.QRCode;
barcode.QRCodeECL = QRCodeErrorCorrectionLevel.H;
barcode.GetBarcodeImage().Save(outputPath, System.Drawing.Imaging.ImageFormat.Png);
}
Imports Neodynamic.SDK.Barcode
Imports System.Drawing.Imaging
Public Sub GenerateQrCode(data As String, outputPath As String)
Dim barcode As New BarcodeProfessional()
barcode.Code = data
barcode.Symbology = Symbology.QRCode
barcode.QRCodeECL = QRCodeErrorCorrectionLevel.H
barcode.GetBarcodeImage().Save(outputPath, ImageFormat.Png)
End Sub
Abordagem do IronBarcode:
using IronBarCode;
public void GenerateQrCode(string data, string outputPath)
{
QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng(outputPath);
}
using IronBarCode;
public void GenerateQrCode(string data, string outputPath)
{
QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng(outputPath);
}
Imports IronBarCode
Public Sub GenerateQrCode(data As String, outputPath As String)
QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.SaveAsPng(outputPath)
End Sub
A tradução de geração altera apenas a superfície da API. A principal diferença introduzida por essa migração é que o mesmo aplicativo agora também pode ler os códigos QR que gera, por meio da mesma biblioteca IronBarcode e da mesma licença. Para obter instruções completas sobre a criação de códigos de barras 2D, consulte o guia de criação de códigos de barras 2D .
Leitura de códigos de barras 1D
Abordagem neodinâmica:
using Neodynamic.SDK.BarcodeReader;
using System.Drawing;
public string[] Read1DBarcodes(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
var reader = new BarcodeReader();
var results = reader.Read(bitmap);
return results?.Select(r => r.Value).ToArray() ?? Array.Empty<string>();
}
using Neodynamic.SDK.BarcodeReader;
using System.Drawing;
public string[] Read1DBarcodes(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
var reader = new BarcodeReader();
var results = reader.Read(bitmap);
return results?.Select(r => r.Value).ToArray() ?? Array.Empty<string>();
}
Imports Neodynamic.SDK.BarcodeReader
Imports System.Drawing
Public Function Read1DBarcodes(imagePath As String) As String()
Using bitmap As New Bitmap(imagePath)
Dim reader As New BarcodeReader()
Dim results = reader.Read(bitmap)
Return If(results?.Select(Function(r) r.Value).ToArray(), Array.Empty(Of String)())
End Using
End Function
Abordagem do IronBarcode:
using IronBarCode;
public string[] Read1DBarcodes(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value).ToArray();
}
using IronBarCode;
public string[] Read1DBarcodes(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value).ToArray();
}
Imports IronBarCode
Public Function Read1DBarcodes(imagePath As String) As String()
Dim results = BarcodeReader.Read(imagePath)
Return results.Select(Function(r) r.Value).ToArray()
End Function
A construção Bitmap e a importação System.Drawing são removidas. O IronBarcode aceita o caminho do arquivo diretamente. O nome da propriedade result.Value é o mesmo em ambas as APIs, portanto, o código subsequente que processa os valores retornados não muda. Para opções de leitura e pré-processamento de imagens com múltiplos códigos de barras, consulte o guia de leitura de códigos de barras a partir de imagens .
Leitura de códigos QR (antes impossível)
Abordagem neodinâmica:
// This method could not be implemented with Neodynamic Barcode Reader
public string ReadQrCode(string imagePath)
{
throw new NotSupportedException(
"Neodynamic Barcode Reader does not support QR codes");
}
// This method could not be implemented with Neodynamic Barcode Reader
public string ReadQrCode(string imagePath)
{
throw new NotSupportedException(
"Neodynamic Barcode Reader does not support QR codes");
}
' This method could not be implemented with Neodynamic Barcode Reader
Public Function ReadQrCode(imagePath As String) As String
Throw New NotSupportedException("Neodynamic Barcode Reader does not support QR codes")
End Function
Abordagem do IronBarcode:
using IronBarCode;
public string ReadQrCode(string imagePath)
{
var result = BarcodeReader.Read(imagePath).FirstOrDefault();
return result?.Value;
}
using IronBarCode;
public string ReadQrCode(string imagePath)
{
var result = BarcodeReader.Read(imagePath).FirstOrDefault();
return result?.Value;
}
Imports IronBarCode
Public Function ReadQrCode(imagePath As String) As String
Dim result = BarcodeReader.Read(imagePath).FirstOrDefault()
Return If(result?.Value, Nothing)
End Function
Todo espaço reservado throw new NotSupportedException(...) que referencia a leitura de código de barras 2D se torna uma chamada de leitura padrão. O corpo do método passa de uma exceção lançada para uma implementação funcional. Não é necessário nenhum cuidado especial com os códigos QR; O IronBarcode identifica o formato automaticamente.
Leitura de códigos de barras em documentos PDF (Nova funcionalidade)
Abordagem neodinâmica:
// Neodynamic Reader cannot read barcodes from PDF files directly
// An image extraction step using a separate library was required before reading
// Não direct equivalent exists
// Neodynamic Reader cannot read barcodes from PDF files directly
// An image extraction step using a separate library was required before reading
// Não direct equivalent exists
' Neodynamic Reader cannot read barcodes from PDF files directly
' An image extraction step using a separate library was required before reading
' Não direct equivalent exists
Abordagem do IronBarcode:
using IronBarCode;
public void ReadBarcodesFromPdf(string pdfPath)
{
var results = BarcodeReader.Read(pdfPath);
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value} | Format: {result.Format} | Page: {result.PageNumber}");
}
}
using IronBarCode;
public void ReadBarcodesFromPdf(string pdfPath)
{
var results = BarcodeReader.Read(pdfPath);
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value} | Format: {result.Format} | Page: {result.PageNumber}");
}
}
Imports IronBarCode
Public Sub ReadBarcodesFromPdf(pdfPath As String)
Dim results = BarcodeReader.Read(pdfPath)
For Each result In results
Console.WriteLine($"Value: {result.Value} | Format: {result.Format} | Page: {result.PageNumber}")
Next
End Sub
O IronBarcode lê códigos de barras diretamente de documentos PDF em todas as páginas. O número da página em que cada código de barras foi encontrado é retornado no resultado. Essa funcionalidade não requer nenhuma biblioteca adicional nem etapa intermediária de extração de imagem.
Referência de mapeamento da API Neodynamic Barcode para IronBarcode
| API Neodinâmica | Equivalente ao IronBarcode | Notas |
|---|---|---|
BarcodeInfo.LicenseOwner = "..." |
IronBarCode.License.LicenseKey = "key" |
Fundidas em uma única chave |
BarcodeInfo.LicenseKey = "..." |
(part of single key above) | Não há campo de proprietário separado |
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseOwner |
(removed) | Não é necessário |
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseKey |
(removed) | Não é necessário |
new BarcodeInfo() |
BarcodeWriter.CreateBarcode(data, encoding) |
Estático, sem instância |
barcode.Value = data |
Primeiro parâmetro de CreateBarcode |
Aprovado na construção |
barcode.Symbology = Symbology.Code128 |
BarcodeEncoding.Code128 |
Segundo parâmetro |
barcode.Symbology = Symbology.QRCode |
BarcodeEncoding.QRCode |
Agora é possível viajar com ida e volta completas. |
barcode.QRCodeECL = QRCodeErrorCorrectionLevel.H |
QRCodeWriter.QrErrorCorrectionLevel.Highest |
Ponto de entrada de classe diferente |
barcode.GetImage().Save(path, ImageFormat.Png) |
.SaveAsPng(path) |
Fluente, sem enumeração ImageFormat |
BarcodeReader.Read(bitmap) |
BarcodeReader.Read(imagePath) |
O caminho do arquivo substitui o Bitmap |
result.Value |
result.Value |
Mesmo nome de propriedade |
Symbology.DataMatrix |
BarcodeEncoding.DataMatrix |
Geração apenas → geração e leitura |
throw new NotSupportedException(...) para leitura 2D |
BarcodeReader.Read(imagePath) |
Substitua por uma implementação funcional. |
Problemas e soluções comuns em migrações
Problema 1: Ordem de Remoção de Dois Pacotes
Problema: Desenvolvedores que removem apenas um pacote do Neodynamic e deixam o outro instalado causam erros de compilação, pois os dois SDKs não compartilham tipos, mas alguns arquivos de origem podem importar ambos os namespaces no mesmo arquivo.
Solução: Remova ambos os pacotes antes de fazer qualquer alteração no código-fonte. Após ambas serem removidas, procure por todas as diretivas using Neodynamic.SDK.Barcode e using Neodynamic.SDK.BarcodeReader e remova-as juntas:
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
Em seguida, realize a auditoria com:
grep -r "Neodynamic.SDK" --include="*.cs" .
grep -r "Neodynamic.SDK" --include="*.cs" .
Problema 2: Limpeza da configuração de licença dupla
Problema: Os dois blocos de licença Neodynamic frequentemente aparecem em locais diferentes — um na classe de inicialização da aplicação e outro em um inicializador de serviço. Se apenas um bloco for removido, o código restante fará referência a um namespace que não existe mais e a compilação falhará.
Solução: Procure todas as quatro atribuições de propriedades da licença Neodynamic e remova-as em conjunto antes de adicionar a chave IronBarcode:
grep -r "LicenseOwner\|LicenseKey" --include="*.cs" .
grep -r "LicenseOwner\|LicenseKey" --include="*.cs" .
Substitua todas as quatro linhas por uma única atribuição:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Problema 3: Remoção de NotSupportedException de blocos Catch
Problema: Algumas bases de código que usaram o Neodynamic Reader adicionaram blocos catch (NotSupportedException) especificamente para lidar com a falha silenciosa de leituras de código de barras 2D. Esses blocos de captura devem ser removidos juntamente com o código de lançamento; caso contrário, a cláusula catch refere-se a um caminho de código que não pode mais ocorrer.
Solução: Procure por NotSupportedException em arquivos relacionados a código de barras e reveja cada ocorrência. Se a exceção foi lançada em resposta a uma tentativa de leitura de formato 2D, remova tanto o lançamento quanto a captura da exceção:
grep -r "NotSupportedException" --include="*.cs" .
grep -r "NotSupportedException" --include="*.cs" .
Substitua o corpo do método lançador por BarcodeReader.Read(imagePath) e remova o bloco de captura correspondente de qualquer chamador.
Lista de verificação para migração de código de barras neodinâmico
Pré-migração
- Procure por todas as referências de pacote Neodynamic:
grep -r "Neodynamic.SDK" --include="*.csproj" . - Procure por todas as diretivas de uso de Neodynamic:
grep -r "using Neodynamic" --include="*.cs" . - Pesquise os locais de configuração da licença:
grep -r "LicenseOwner\|LicenseKey" --include="*.cs" . - Procure por todos os locais de instância
BarcodeInfo:grep -r "new BarcodeInfo\(\)" --include="*.cs" . - Procure por todas as chamadas de leitura Neodynamic:
grep -r "BarcodeReader.Read" --include="*.cs" . - Procure por todos os usos de
NotSupportedExceptionem caminhos de código de barras:grep -r "NotSupportedException" --include="*.cs" . - Identifique qualquer biblioteca de terceiros (ZXing .NET ou similar) que tenha sido adicionada especificamente para suprir a lacuna de leitura 2D — ela pode ser removida após a migração.
- Registre todas as chaves de licença da Neodynamic para que possam ser desativadas dos repositórios de segredos após a verificação.
Tarefas de atualização de código
- Execute
dotnet remove package Neodynamic.SDK.Barcode - Execute
dotnet remove package Neodynamic.SDK.BarcodeReader - Execute
dotnet add package IronBarcode - Remova todas as diretivas
using Neodynamic.SDK.Barcodeeusing Neodynamic.SDK.BarcodeReader - Adicione
using IronBarCodeem todos os arquivos que realizam operações de código de barras - Remova ambos os blocos de configuração de licença Neodynamic.
- Adicione
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"uma vez na inicialização do aplicativo - Substitua
new BarcodeInfo()+ atribuições de propriedades +barcode.GetImage().Save(...)porBarcodeWriter.CreateBarcode(data, encoding).SaveAsPng(path) - Substitua padrões
QRCodeWriteradequadamente usandoQRCodeWriter.CreateQrCode() - Substitua chamadas
BarcodeReader.Read(bitmap)removendo a construçãonew Bitmap(imagePath)e passando o caminho do arquivo diretamente paraBarcodeReader.Read(imagePath) - Remova todos os espaços reservados
throw new NotSupportedException(...)para leitura 2D e substitua porBarcodeReader.Read(imagePath) - Remova os blocos correspondentes
catch (NotSupportedException)dos chamadores - Remova qualquer biblioteca de terceiros que tenha sido adicionada exclusivamente para suprir a lacuna de leitura 2D da Neodynamic.
Testes pós-migração
- Verificar se a geração do código de barras Code 128 produz resultados com dimensões e configurações de DPI correspondentes às configurações anteriores.
- Verificar se a geração do código QR produz resultados legíveis por scanner.
- Verificar se a leitura do código de barras 1D retorna os mesmos valores que a implementação anterior do Neodynamic Reader.
- Verifique se a leitura de QR Code tem sucesso em imagens que anteriormente lançaram
NotSupportedException - Verifique se a leitura de DataMatrix e PDF417 é bem-sucedida caso esses formatos apareçam na entrada do aplicativo.
- Teste a leitura de código de barras em PDF se o aplicativo processar documentos PDF.
- Confirme se todas as referências à chave de licença do Neodynamic foram removidas dos arquivos de configuração e variáveis de ambiente.
- Confirme se a biblioteca 2D de terceiros (caso exista) foi completamente removida e se nenhuma importação restante a referencia.
Principais benefícios da migração para o IronBarcode
Capacidade unificada de leitura e gravação: após a migração, toda simbologia que o IronBarcode pode gerar também pode ser lida de volta através da mesma biblioteca. A assimetria entre o gerador e o leitor do Neodynamic — onde códigos QR, DataMatrix, PDF417 e Aztec podiam ser produzidos, mas não consumidos — é eliminada. Aplicações que anteriormente exigiam uma solução alternativa ou uma biblioteca de terceiros para leitura 2D agora obtêm essa capacidade sem qualquer trabalho adicional de integração.
Administração de Licença Única: Um pacote NuGet , uma chave de licença e um bloco de configuração substituem duas assinaturas de produto separadas. A renovação, a rotação de chaves e o gerenciamento de variáveis de ambiente tornam-se metade da complexidade. A redução dos custos administrativos é contínua, e não um ganho pontual.
Leitura nativa de códigos de barras em PDF: o IronBarcode lê códigos de barras diretamente de documentos PDF, retornando metadados de número de página juntamente com os valores dos códigos de barras. Aplicações que processam manifestos de envio, documentos de faturas ou registros médicos contendo códigos de barras incorporados não exigem mais uma etapa intermediária de extração de imagem ou uma biblioteca PDF adicional para suportar a leitura de códigos de barras. Consulte a lista completa de formatos de código de barras suportados para obter o conjunto completo de simbologias e tipos de entrada abrangidos.
Eliminação da Dependência do System.Drawing: Os SDKs da Neodynamic dependem de System.Drawing, o que exige configuração adicional de biblioteca nativa no Linux e em contêineres Docker.IronBarcode não possui dependência System.Drawing, o que significa que o mesmo código base roda no Windows, Linux e em ambientes de nuvem conteinerizados sem alterações específicas de plataforma.
Custo de licenciamento simplificado para funcionalidade completa: Um projeto que precisava dos SDKs da Neodynamic e de uma terceira biblioteca para leitura 2D estava pagando por três dependências para obter o que a IronBarcode oferece com uma única licença. Para projetos que exigem geração e leitura 2D, a migração consolida tanto a infraestrutura técnica quanto o custo de licenciamento em um único produto comercial. As informações atuais sobre preços estão disponíveis na página de licenciamento do IronBarcode .
Perguntas frequentes
Por que devo migrar do Neodynamic Barcode Professional 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 Neodynamic pelo 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 Neodynamic Barcode Professional 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 Neodynamic Barcode Professional 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 implementação do Docker em comparação com o Neodynamic Barcode Professional?
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 Neodynamic?
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 Neodynamic Barcode Professional 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.

