Como criar um código de barras a partir de dados em C#
Migrando de Código de barras FERRAMENTAS DE CHAVE para IronBarcode
Este guia abrange a migração completa do Código de barras FERRAMENTAS DE CHAVE para o IronBarcode para desenvolvedores .NET . Aborda a remoção dos pacotes NuGet do FERRAMENTAS DE CHAVE e uma dependência do tempo de execução nativa, a substituição da sequência de inicialização da licença FERRAMENTAS DE CHAVE baseada em arquivo por uma chave string e a tradução dos padrões de leitura e escrita do FERRAMENTAS DE CHAVE para a API fluente estática do IronBarcode. São fornecidos exemplos de código para cada cenário principal de migração, juntamente com uma tabela de mapeamento de API, uma lista de verificação estruturada e orientações sobre problemas que surgem durante a transição.
Por que migrar do código de barras LEADTOOLS?
Implantação de Licença Baseada em Arquivo: O licenciamento do FERRAMENTAS DE CHAVE requer que um arquivo .LIC esteja fisicamente presente em disco em um caminho conhecido em cada máquina onde a aplicação é executada. Estações de trabalho de desenvolvedores, agentes de compilação de CI, servidores de teste e contêineres de produção exigem que o arquivo seja provisionado antes que o aplicativo seja inicializado. Este é um modelo operacional fundamentalmente diferente dos segredos baseados em strings, que se integram perfeitamente a variáveis de ambiente, gerenciadores de segredos e configuração de pipelines de CI/CD. Cada novo ambiente adicionado a uma topologia de implantação — uma nova região de nuvem, um novo pool de nós do Kubernetes, uma nova integração de desenvolvedores — requer uma etapa de provisionamento de arquivos que o licenciamento baseado em strings não exige.
Impressão Digital do SDK: A instalação de código de barras do FERRAMENTAS DE CHAVE requer o pacote NuGet Leadtools.Barcode (que inclui Leadtools, Leadtools.Codecs, e dependências relacionadas). A extração de código de barras PDF adiciona Leadtools.Pdf. Não Windows, o MSVC++ 2017 Runtime é uma dependência nativa separada. O arquivo de saída publicado de um aplicativo de código de barras FERRAMENTAS DE CHAVE tem aproximadamente 148 MB. Aplicações que necessitam apenas de leitura ou geração de códigos de barras carregam todo o peso de uma plataforma de imagem abrangente — infraestrutura de OCR, arquitetura de codecs de formato e recursos de visualização de documentos — independentemente de esses recursos serem usados ou não.
Design da API legada: As operações de código de barras do FERRAMENTAS DE CHAVE exigem a construção de múltiplos objetos em uma sequência específica antes que qualquer operação possa ser realizada. Ler um código de barras requer uma instância RasterCodecs para carregar a imagem e uma instância BarcodeEngine para escaneá-la, com um array BarcodeSymbology explícito declarando quais formatos procurar. Gerar um código de barras requer construir um objeto BarcodeData, criar um RasterImage em branco com parâmetros de pixel explícitos, preenchê-lo com uma cor de fundo usando FillCommand, escrever o código de barras sobre ele, e salvar com RasterCodecs. Essa API reflete os padrões de design da sua época. O IronBarcode executa as mesmas operações por meio de chamadas de métodos estáticos que aceitam caminhos de arquivo diretamente.
Transparência de preços: As licenças de implantação do FERRAMENTAS DE CHAVE para servidores de produção são cotadas separadamente pela equipe de vendas do FERRAMENTAS DE CHAVE e não são publicadas em seu site. Equipes que precisam de uma visão completa do custo antes de iniciar o desenvolvimento devem entrar em contato com as vendas antes de poderem confirmar que o FERRAMENTAS DE CHAVE se adequa ao orçamento.IronBarcode oferece uma licença perpétua única que cobre desenvolvimento e implantação juntos, sem necessidade de licença de produção separada.
O problema fundamental
A sequência de inicialização do FERRAMENTAS DE CHAVE requer mais de 20 linhas e quatro etapas de verificação antes que um BarcodeEngine possa ser criado.IronBarcode substitui toda a sequência por uma única atribuição:
// LEADTOOLS: file path, expiry check, three feature lock checks, engine creation
using Leadtools;
using Leadtools.Barcode;
RasterSupport.SetLicense(
@"C:\LEADTOOLS23\Support\Common\License\LEADTOOLS.LIC",
"your-developer-key-here");
if (RasterSupport.KernelExpired)
throw new InvalidOperationException("LEADTOOLS license has expired");
if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead))
throw new InvalidOperationException("1D barcode reading is locked");
if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead))
throw new InvalidOperationException("2D barcode reading is locked");
if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite))
throw new InvalidOperationException("Barcode writing is locked");
var engine = new BarcodeEngine();
// LEADTOOLS: file path, expiry check, three feature lock checks, engine creation
using Leadtools;
using Leadtools.Barcode;
RasterSupport.SetLicense(
@"C:\LEADTOOLS23\Support\Common\License\LEADTOOLS.LIC",
"your-developer-key-here");
if (RasterSupport.KernelExpired)
throw new InvalidOperationException("LEADTOOLS license has expired");
if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead))
throw new InvalidOperationException("1D barcode reading is locked");
if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead))
throw new InvalidOperationException("2D barcode reading is locked");
if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite))
throw new InvalidOperationException("Barcode writing is locked");
var engine = new BarcodeEngine();
Imports Leadtools
Imports Leadtools.Barcode
' LEADTOOLS: file path, expiry check, three feature lock checks, engine creation
RasterSupport.SetLicense("C:\LEADTOOLS23\Support\Common\License\LEADTOOLS.LIC", "your-developer-key-here")
If RasterSupport.KernelExpired Then
Throw New InvalidOperationException("LEADTOOLS license has expired")
End If
If RasterSupport.IsLocked(RasterSupportType.Barcode1DRead) Then
Throw New InvalidOperationException("1D barcode reading is locked")
End If
If RasterSupport.IsLocked(RasterSupportType.Barcode2DRead) Then
Throw New InvalidOperationException("2D barcode reading is locked")
End If
If RasterSupport.IsLocked(RasterSupportType.BarcodeWrite) Then
Throw New InvalidOperationException("Barcode writing is locked")
End If
Dim engine As New BarcodeEngine()
// IronBarcode: one line, no file required
using IronBarCode;
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
// IronBarcode: one line, no file required
using IronBarCode;
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
Imports IronBarCode
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
IronBarcode vs. FERRAMENTAS DE CHAVE Barcode: Comparação de Recursos
| Recurso | Código de barras FERRAMENTAS DE CHAVE | IronBarcode |
|---|---|---|
| Modelo de licença | Arquivo + chave de desenvolvedor | Somente a chave de string |
| Pacotes NuGet necessários | 5+ | 1 |
| Dependência de tempo de execução nativa | MSVC++ 2017 (Windows) | None |
| Tamanho de saída publicado | ~148 MB | ~39 MB |
| Simbologias totais suportadas | 40+ | 50+ |
| Detecção automática do formato do código de barras | Limitado | Sim |
| Extração de código de barras PDF | É necessário um pacote separado. | Embutido |
| Correção de erros de aprendizado de máquina | Não | Sim |
| Logotipo de código QR | Não | Sim |
| Implantação em Docker | Montagem de arquivo necessária | Variável de ambiente |
| Código de inicialização | Mais de 20 linhas | 1 linha |
| Estilo API | Gráfico de objetos legados | Estático fluente |
| Multiplataforma | Parcial (dependências nativas) | Completo (.NET Standard) |
| Preços das licenças de implantação | Contatar o departamento de vendas (não publicado) | Incluído na compra perpétua |
Guia de Início Rápido: Migração de código de barras FERRAMENTAS DE CHAVE para IronBarcode
Passo 1: Remova os pacotes LEADTOOLS
Remova todos os pacotes FERRAMENTAS DE CHAVE do projeto:
dotnet remove package Leadtools.Barcode
dotnet remove package Leadtools
dotnet remove package Leadtools.Codecs
dotnet remove package Leadtools.Codecs.Png
dotnet remove package Leadtools.Codecs.Jpeg
dotnet remove package Leadtools.Barcode
dotnet remove package Leadtools
dotnet remove package Leadtools.Codecs
dotnet remove package Leadtools.Codecs.Png
dotnet remove package Leadtools.Codecs.Jpeg
Caso o codec PDF tenha sido adicionado para extração de código de barras de arquivos PDF:
dotnet remove package Leadtools.Pdf
dotnet remove package Leadtools.Pdf
Em implantações do Windows Server, o MSVC++ 2017 Runtime pode ser removido dos scripts de provisionamento após a conclusão da migração.IronBarcode não possui dependências de tempo de execução nativas em nenhuma plataforma.
Passo 2: Instale o IronBarcode
dotnet add package IronBarcode
dotnet add package IronBarcode
Este pacote único inclui suporte para todos os formatos de imagem, extração nativa de código de barras em PDF, correção de erros por aprendizado de máquina e todas as mais de 50 simbologias suportadas. Não são necessários pacotes de codecs adicionais.
Etapa 3: Inicializar a licença
Substitua todo o bloco de inicialização do FERRAMENTAS DE CHAVE por uma única linha. Localize cada chamada para RasterSupport.SetLicense no código — geralmente haverá exatamente uma, na inicialização do aplicativo — e substitua toda a sequência de inicialização ao redor:
// Before: entire FERRAMENTAS DE CHAVE initialization block (20+ lines)
// After:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Before: entire FERRAMENTAS DE CHAVE initialization block (20+ lines)
// After:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
A chave de licença pode ser obtida de qualquer mecanismo de configuração capaz de strings: uma variável de ambiente, appsettings.json, Azure Key Vault, AWS Secrets Manager, ou um segredo do Kubernetes. Para obter informações sobre configuração de licenças baseadas em ambiente, padrões de implantação do Docker e todas as abordagens de configuração suportadas, consulte a documentação de configuração da chave de licença .
Exemplos de migração de código
Lendo Códigos de Barras de Imagens
O FERRAMENTAS DE CHAVE separa o carregamento de imagens da leitura de código de barras em duas camadas de objetos distintas. Uma instância RasterCodecs carrega o arquivo de imagem em um RasterImage, e uma instância BarcodeEngine o escaneia. O chamador também deve fornecer um array explícito de valores BarcodeSymbology; Os formatos não listados na matriz não serão detectados.
Abordagem LEADTOOLS:
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
using var codecs = new RasterCodecs();
using var image = codecs.Load("scan.png");
var engine = new BarcodeEngine();
var symbologies = new[]
{
BarcodeSymbology.Code128,
BarcodeSymbology.Code39,
BarcodeSymbology.QR,
BarcodeSymbology.DataMatrix,
BarcodeSymbology.EAN13,
BarcodeSymbology.UPCA
};
var barcodes = engine.Reader.ReadBarcodes(
image,
LogicalRectangle.Empty,
0,
symbologies);
foreach (var barcode in barcodes)
Console.WriteLine($"{barcode.Symbology}: {barcode.Value}");
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
using var codecs = new RasterCodecs();
using var image = codecs.Load("scan.png");
var engine = new BarcodeEngine();
var symbologies = new[]
{
BarcodeSymbology.Code128,
BarcodeSymbology.Code39,
BarcodeSymbology.QR,
BarcodeSymbology.DataMatrix,
BarcodeSymbology.EAN13,
BarcodeSymbology.UPCA
};
var barcodes = engine.Reader.ReadBarcodes(
image,
LogicalRectangle.Empty,
0,
symbologies);
foreach (var barcode in barcodes)
Console.WriteLine($"{barcode.Symbology}: {barcode.Value}");
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs
Dim codecs As New RasterCodecs()
Using codecs
Dim image = codecs.Load("scan.png")
Using image
Dim engine As New BarcodeEngine()
Dim symbologies = New BarcodeSymbology() {
BarcodeSymbology.Code128,
BarcodeSymbology.Code39,
BarcodeSymbology.QR,
BarcodeSymbology.DataMatrix,
BarcodeSymbology.EAN13,
BarcodeSymbology.UPCA
}
Dim barcodes = engine.Reader.ReadBarcodes(
image,
LogicalRectangle.Empty,
0,
symbologies)
For Each barcode In barcodes
Console.WriteLine($"{barcode.Symbology}: {barcode.Value}")
Next
End Using
End Using
Abordagem do IronBarcode:
using IronBarCode;
var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
using IronBarCode;
var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
Imports IronBarCode
Dim results = BarcodeReader.Read("scan.png")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
O IronBarcode aceita o caminho do arquivo diretamente, carrega a imagem internamente e detecta automaticamente os formatos em todas as mais de 50 simbologias suportadas, sem exigir que o usuário enumere os tipos esperados. Para configurações avançadas — ajuste da velocidade de leitura, detecção de múltiplos códigos de barras e tratamento de imagens de baixa qualidade — consulte o guia de leitura de códigos de barras a partir de imagens .
Gerando um código de barras Code 128
A geração FERRAMENTAS DE CHAVE requer a construção de um objeto BarcodeData, alocar um RasterImage em branco com flags de memória explícitos, profundidade de pixel e ordem de bytes, preencher a imagem com uma cor de fundo, escrever o código de barras sobre ela, e então salvar com RasterCodecs. O IronBarcode executa todas essas etapas por meio de uma única cadeia de métodos fluente.
Abordagem LEADTOOLS:
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
var engine = new BarcodeEngine();
var barcodeData = new BarcodeData()
{
Symbology = BarcodeSymbology.Code128,
Value = "ITEM-98765",
Bounds = new LeadRect(0, 0, 500, 120)
};
using var image = new RasterImage(
RasterMemoryFlags.Conventional,
500, 120, 24,
RasterByteOrder.Bgr,
RasterViewPerspective.TopLeft,
null, IntPtr.Zero, 0);
new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, barcodeData, null);
using var codecs = new RasterCodecs();
codecs.Save(image, "item-barcode.png", RasterImageFormat.Png, 0);
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
var engine = new BarcodeEngine();
var barcodeData = new BarcodeData()
{
Symbology = BarcodeSymbology.Code128,
Value = "ITEM-98765",
Bounds = new LeadRect(0, 0, 500, 120)
};
using var image = new RasterImage(
RasterMemoryFlags.Conventional,
500, 120, 24,
RasterByteOrder.Bgr,
RasterViewPerspective.TopLeft,
null, IntPtr.Zero, 0);
new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, barcodeData, null);
using var codecs = new RasterCodecs();
codecs.Save(image, "item-barcode.png", RasterImageFormat.Png, 0);
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs
Dim engine As New BarcodeEngine()
Dim barcodeData As New BarcodeData() With {
.Symbology = BarcodeSymbology.Code128,
.Value = "ITEM-98765",
.Bounds = New LeadRect(0, 0, 500, 120)
}
Using image As New RasterImage(
RasterMemoryFlags.Conventional,
500, 120, 24,
RasterByteOrder.Bgr,
RasterViewPerspective.TopLeft,
Nothing, IntPtr.Zero, 0)
Dim fillCommand As New FillCommand(RasterColor.White)
fillCommand.Run(image)
engine.Writer.WriteBarcode(image, barcodeData, Nothing)
Using codecs As New RasterCodecs()
codecs.Save(image, "item-barcode.png", RasterImageFormat.Png, 0)
End Using
End Using
Abordagem do IronBarcode:
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128)
.ResizeTo(500, 120)
.SaveAsPng("item-barcode.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128)
.ResizeTo(500, 120)
.SaveAsPng("item-barcode.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128) _
.ResizeTo(500, 120) _
.SaveAsPng("item-barcode.png")
Para obter um passo a passo completo sobre dimensionamento, estilo, controle de margens e formatos de saída compatíveis, consulte Criação de imagens de código de barras .
Geração de um código QR com personalização de logotipo
A geração de código QR do FERRAMENTAS DE CHAVE segue o mesmo padrão de construção RasterImage em várias etapas que outros tipos de código de barras. O IronBarcode fornece QRCodeWriter com um método dedicado AddBrandLogo para embutir um logotipo no centro de um código QR.
Abordagem LEADTOOLS:
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
var engine = new BarcodeEngine();
var qrData = new BarcodeData()
{
Symbology = BarcodeSymbology.QR,
Value = "https://example.com/product/12345",
Bounds = new LeadRect(0, 0, 400, 400)
};
using var image = new RasterImage(
RasterMemoryFlags.Conventional,
400, 400, 24,
RasterByteOrder.Bgr,
RasterViewPerspective.TopLeft,
null, IntPtr.Zero, 0);
new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, qrData, null);
using var codecs = new RasterCodecs();
codecs.Save(image, "product-qr.png", RasterImageFormat.Png, 0);
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
var engine = new BarcodeEngine();
var qrData = new BarcodeData()
{
Symbology = BarcodeSymbology.QR,
Value = "https://example.com/product/12345",
Bounds = new LeadRect(0, 0, 400, 400)
};
using var image = new RasterImage(
RasterMemoryFlags.Conventional,
400, 400, 24,
RasterByteOrder.Bgr,
RasterViewPerspective.TopLeft,
null, IntPtr.Zero, 0);
new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, qrData, null);
using var codecs = new RasterCodecs();
codecs.Save(image, "product-qr.png", RasterImageFormat.Png, 0);
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs
Dim engine As New BarcodeEngine()
Dim qrData As New BarcodeData() With {
.Symbology = BarcodeSymbology.QR,
.Value = "https://example.com/product/12345",
.Bounds = New LeadRect(0, 0, 400, 400)
}
Using image As New RasterImage(
RasterMemoryFlags.Conventional,
400, 400, 24,
RasterByteOrder.Bgr,
RasterViewPerspective.TopLeft,
Nothing, IntPtr.Zero, 0)
Dim fillCommand As New FillCommand(RasterColor.White)
fillCommand.Run(image)
engine.Writer.WriteBarcode(image, qrData, Nothing)
Using codecs As New RasterCodecs()
codecs.Save(image, "product-qr.png", RasterImageFormat.Png, 0)
End Using
End Using
Abordagem do IronBarcode:
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com/product/12345", 400, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("brand-logo.png")
.SaveAsPng("product-qr.png");
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com/product/12345", 400, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("brand-logo.png")
.SaveAsPng("product-qr.png");
Imports IronBarCode
QRCodeWriter.CreateQrCode("https://example.com/product/12345", 400, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo("brand-logo.png") _
.SaveAsPng("product-qr.png")
Extraindo códigos de barras de documentos PDF
A extração de código de barras PDF do FERRAMENTAS DE CHAVE requer o pacote separado Leadtools.Pdf, configuração explícita de carregamento de PDF, uma consulta manual de contagem de páginas e um loop sobre cada página. Cada página deve ser carregada individualmente como um RasterImage antes da digitalização. O IronBarcode inclui suporte a PDF no pacote básico e lida com a iteração de páginas internamente.
Abordagem LEADTOOLS:
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
// Requires: dotnet add package Leadtools.Pdf
using var codecs = new RasterCodecs();
codecs.Options.Pdf.Load.Resolution = 300;
codecs.Options.Pdf.Load.DisplayDepth = 24;
var engine = new BarcodeEngine();
var results = new List<string>();
int pageCount = codecs.GetTotalPages("shipment.pdf");
for (int page = 1; page <= pageCount; page++)
{
using var image = codecs.Load(
"shipment.pdf", 0,
CodecsLoadByteOrder.BgrOrGray,
page, page);
var barcodes = engine.Reader.ReadBarcodes(
image, LogicalRectangle.Empty, 0, null);
foreach (var barcode in barcodes)
results.Add($"Page {page}: {barcode.Value}");
}
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;
// Requires: dotnet add package Leadtools.Pdf
using var codecs = new RasterCodecs();
codecs.Options.Pdf.Load.Resolution = 300;
codecs.Options.Pdf.Load.DisplayDepth = 24;
var engine = new BarcodeEngine();
var results = new List<string>();
int pageCount = codecs.GetTotalPages("shipment.pdf");
for (int page = 1; page <= pageCount; page++)
{
using var image = codecs.Load(
"shipment.pdf", 0,
CodecsLoadByteOrder.BgrOrGray,
page, page);
var barcodes = engine.Reader.ReadBarcodes(
image, LogicalRectangle.Empty, 0, null);
foreach (var barcode in barcodes)
results.Add($"Page {page}: {barcode.Value}");
}
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs
' Requires: dotnet add package Leadtools.Pdf
Using codecs As New RasterCodecs()
codecs.Options.Pdf.Load.Resolution = 300
codecs.Options.Pdf.Load.DisplayDepth = 24
Dim engine As New BarcodeEngine()
Dim results As New List(Of String)()
Dim pageCount As Integer = codecs.GetTotalPages("shipment.pdf")
For page As Integer = 1 To pageCount
Using image = codecs.Load("shipment.pdf", 0, CodecsLoadByteOrder.BgrOrGray, page, page)
Dim barcodes = engine.Reader.ReadBarcodes(image, LogicalRectangle.Empty, 0, Nothing)
For Each barcode In barcodes
results.Add($"Page {page}: {barcode.Value}")
Next
End Using
Next
End Using
Abordagem do IronBarcode:
using IronBarCode;
var results = BarcodeReader.Read("shipment.pdf");
foreach (var result in results)
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
using IronBarCode;
var results = BarcodeReader.Read("shipment.pdf");
foreach (var result in results)
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
Imports IronBarCode
Dim results = BarcodeReader.Read("shipment.pdf")
For Each result In results
Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
Implantação do Docker
A necessidade de gerenciamento de arquivos que define cada implantação do Docker do FERRAMENTAS DE CHAVE é completamente eliminada ao migrar para o IronBarcode.
Abordagem LEADTOOLS:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY publish/ .
# License file must be physically present in the container image
COPY LEADTOOLS.LIC /app/license/LEADTOOLS.LIC
ENV LEADTOOLS_LICENSE_PATH=/app/license/LEADTOOLS.LIC
ENV LEADTOOLS_DEVELOPER_KEY=your-developer-key
ENTRYPOINT ["dotnet", "YourApp.dll"]
Abordagem do IronBarcode:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY publish/ .
ENV IRONBARCODE_LICENSE=your-license-key
ENTRYPOINT ["dotnet", "YourApp.dll"]
A chave de licença é injetada no tempo de execução do contêiner por meio de segredos do Docker, segredos do Kubernetes ou qualquer mecanismo de variável de ambiente. Não é necessário provisionar nenhum arquivo. O guia de implantação do Docker e do Linux aborda imagens base Alpine e Debian, compilações em várias etapas e padrões de implantação do Kubernetes.
Referência de mapeamento da API de código de barras FERRAMENTAS DE CHAVE para o IronBarcode
| FERRAMENTAS DE CHAVE | IronBarcode | Notas |
|---|---|---|
RasterSupport.SetLicense(path, key) |
IronBarCode.License.LicenseKey = "key" |
Somente a chave — nenhum arquivo |
RasterSupport.KernelExpired |
(removed) | Não é necessário verificar a data de validade. |
RasterSupport.IsLocked(RasterSupportType.Barcode1DRead) |
(removed) | Todas as funcionalidades incluídas |
RasterSupport.IsLocked(RasterSupportType.Barcode2DRead) |
(removed) | Todas as funcionalidades incluídas |
RasterSupport.IsLocked(RasterSupportType.BarcodeWrite) |
(removed) | Todas as funcionalidades incluídas |
new BarcodeEngine() |
Estático — nenhuma instância | BarcodeReader, BarcodeWriter são estáticos |
new RasterCodecs() |
(removed) | Passe o caminho do arquivo diretamente |
codecs.Load(imagePath) |
(removed) | Passe o caminho do arquivo diretamente |
engine.Reader.ReadBarcodes(image, LogicalRectangle.Empty, 0, symbologies) |
BarcodeReader.Read(imagePath) |
Detecta simbologias automaticamente |
BarcodeData.Value |
result.Value |
Mesmo nome de propriedade |
BarcodeData.Symbology |
result.Format |
Propriedade renomeada |
new BarcodeData() { Symbology = BarcodeSymbology.Code128 } |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) |
Criação fluente |
BarcodeSymbology.Code128 |
BarcodeEncoding.Code128 |
Alteração de namespace |
BarcodeSymbology.QR |
BarcodeEncoding.QRCode |
Mudança de nome |
BarcodeSymbology.DataMatrix |
BarcodeEncoding.DataMatrix |
Mesmo nome |
BarcodeSymbology.PDF417 |
BarcodeEncoding.PDF417 |
Mesmo nome |
BarcodeSymbology.EAN13 |
BarcodeEncoding.EAN13 |
Mesmo nome |
BarcodeSymbology.UPCA |
BarcodeEncoding.UPCA |
Mesmo nome |
BarcodeSymbology.Interleaved2of5 |
BarcodeEncoding.Interleaved2of5 |
Mesmo nome |
BarcodeSymbology.Codabar |
BarcodeEncoding.Codabar |
Mesmo nome |
engine.Writer.WriteBarcode(image, data, null) + codecs.Save(...) |
.SaveAsPng(path) |
Uma cadeia de métodos |
new RasterImage(...) + new FillCommand(RasterColor.White).Run(image) |
(removed) | Interno ao IronBarcode |
Problemas e soluções comuns em migrações
Problema 1: Referências a arquivos .LIC em CI/CD
LEADTOOLS: Pipelines de CI/CD que constroem ou implantam aplicações FERRAMENTAS DE CHAVE devem provisionar o arquivo .LIC — seja checando-o no controle de versão, decodificando-o de um segredo base64, ou montando-o como um artefato de volume. Cada etapa do pipeline que executa a aplicação precisa ter o arquivo acessível.
Solução: Remova todo o manuseio de arquivo .LIC do pipeline. Substitua por um string secreto:
# Example: GitHub Actions environment variable
env:
IRONBARCODE_LICENSE: ${{secrets.IRONBARCODE_LICENSE}}
# Example: GitHub Actions environment variable
env:
IRONBARCODE_LICENSE: ${{secrets.IRONBARCODE_LICENSE}}
O valor da string é armazenado no repositório de segredos de CI/CD juntamente com outras credenciais que também são strings. Não é necessário decodificar arquivos, provisionar artefatos ou configurar volumes.
Problema 2: Dependência do runtime do MSVC++ no Windows
LEADTOOLS: As implementações do Windows Server exigem que o MSVC++ 2017 Runtime esteja instalado no host. Os scripts de provisionamento, as imagens base de contêiner e as AMIs do Windows usadas para implementações do FERRAMENTAS DE CHAVE geralmente incluem uma etapa para instalar esse runtime.
Solução: Remova a etapa de instalação do MSVC++ 2017 Runtime de todos os scripts de provisionamento do Windows e imagens de contêiner.IronBarcode não possui dependências de tempo de execução nativas. A imagem base dotnet/aspnet é suficiente sem pacotes de tempo de execução adicionais.
Problema 3: Verificações de bloqueio de recursos do tipo de suporte raster
LEADTOOLS: A sequência de inicialização inclui verificações RasterSupport.IsLocked() para cada recurso de código de barras — Barcodes1D, Barcodes2D, e BarcodeWrite. Essas verificações são códigos de segurança exigidos pela arquitetura FERRAMENTAS DE CHAVE para garantir que o arquivo de licença cubra todas as funcionalidades necessárias.
Solução: Remova todas as chamadas RasterSupport.IsLocked(). O IronBarcode inclui todas as funcionalidades de leitura e gravação em uma única licença. Não existem estados de bloqueio por funcionalidade e nenhuma etapa de verificação de funcionalidade é necessária:
// Remove these lines entirely:
// if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite)) ...
// Remove these lines entirely:
// if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite)) ...
' Remove these lines entirely:
' If RasterSupport.IsLocked(RasterSupportType.Barcode1DRead) ...
' If RasterSupport.IsLocked(RasterSupportType.Barcode2DRead) ...
' If RasterSupport.IsLocked(RasterSupportType.BarcodeWrite) ...
Problema 4: Remoção da matriz de simbologia de código de barras
LEADTOOLS: Cada chamada para engine.Reader.ReadBarcodes() requer um parâmetro BarcodeSymbology[] explícito. Códigos de barras cuja simbologia não esteja listada na matriz não serão detectados, o que pode causar falhas silenciosas de leitura quando um novo tipo de código de barras for introduzido em um documento de entrada.
Solução: Remova a matriz de simbologia. BarcodeReader.Read() detecta automaticamente todos os formatos suportados. Se for necessário ajuste de desempenho para um conjunto de formatos conhecido, BarcodeReaderOptions fornece dicas opcionais sem exigir enumeração exaustiva:
// Optional: hint the reader for performance in format-known scenarios
var options = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("scan.png", options);
// Optional: hint the reader for performance in format-known scenarios
var options = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("scan.png", options);
Imports System
' Optional: hint the reader for performance in format-known scenarios
Dim options As New BarcodeReaderOptions With {
.ExpectBarcodeTypes = BarcodeEncoding.Code128 Or BarcodeEncoding.QRCode
}
Dim results = BarcodeReader.Read("scan.png", options)
Lista de verificação para migração de código de barras LEADTOOLS
Tarefas pré-migração
Antes de fazer qualquer alteração, verifique toda a utilização do FERRAMENTAS DE CHAVE no código-fonte:
grep -r "using Leadtools" --include="*.cs" .
grep -r "RasterSupport\|BarcodeEngine\|RasterCodecs" --include="*.cs" .
grep -r "BarcodeSymbology\|BarcodeData\|RasterImage" --include="*.cs" .
grep -r "LEADTOOLS.LIC\|SetLicense\|KernelExpired" --include="*.cs" .
grep -r "COPY LEADTOOLS.LIC\|LEADTOOLS_LICENSE_PATH" --include="*.dockerfile" --include="Dockerfile" .
grep -r "using Leadtools" --include="*.cs" .
grep -r "RasterSupport\|BarcodeEngine\|RasterCodecs" --include="*.cs" .
grep -r "BarcodeSymbology\|BarcodeData\|RasterImage" --include="*.cs" .
grep -r "LEADTOOLS.LIC\|SetLicense\|KernelExpired" --include="*.cs" .
grep -r "COPY LEADTOOLS.LIC\|LEADTOOLS_LICENSE_PATH" --include="*.dockerfile" --include="Dockerfile" .
Documente a quantidade e a localização dos blocos de inicialização, dos pontos de chamada de leitura, dos pontos de chamada de escrita e das referências do Dockerfile antes de iniciar as alterações no código.
Tarefas de atualização de código
- Remova todos os cinco pacotes NuGet do FERRAMENTAS DE CHAVE (e o codec PDF, se presente).
- Instale
IronBarcodeviadotnet add package IronBarcode - Substitua todas as importações de namespace
using Leadtools.*porusing IronBarCode - Substitua todo o bloco de inicialização
RasterSupport.SetLicenseporIronBarCode.License.LicenseKey = "key" - Remova todas as verificações
RasterSupport.KernelExpired - Remova todas as verificações
RasterSupport.IsLocked(RasterSupportType.*) - Remova todas as instâncias
new BarcodeEngine() - Remova todas as instâncias
new RasterCodecs()dos caminhos de código de barras - Substitua
codecs.Load(path)+engine.Reader.ReadBarcodes(image, ...)porBarcodeReader.Read(path) - Substitua
new BarcodeData(...)+new RasterImage(...)+FillCommand+WriteBarcode+codecs.Save()porBarcodeWriter.CreateBarcode(...).SaveAsPng(path) - Substitua referências de enum
BarcodeSymbology.*porBarcodeEncoding.*(note:QRse tornaQRCode) - Remova linhas
COPY LEADTOOLS.LICde todos os Dockerfiles - Remova as declarações de variáveis de ambiente
LEADTOOLS_LICENSE_PATHeLEADTOOLS_DEVELOPER_KEYdos Dockerfiles e configurações de implantação - Adicione a variável de ambiente
IRONBARCODE_LICENSEaos Dockerfiles e configurações de segredos - Remover a instalação do MSVC++ 2017 Runtime dos scripts de provisionamento do Windows
Testes pós-migração
- Verifique se todas as operações de leitura de código de barras retornam valores esperados em todos os tipos de simbologia anteriormente cobertos pelo array
BarcodeSymbology[] - Verificar se o Código 128, o código QR e quaisquer outros tipos de código de barras gerados produzem uma saída válida e legível por scanner.
- Confirme se a extração de código de barras PDF funciona corretamente sem
Leadtools.Pdf - Construa e inicie a imagem do container sem montar nenhum arquivo
.LICe confirme se a aplicação inicializa corretamente - Execute o pipeline de CI/CD sem a etapa de provisionamento de arquivo
.LICe confirme se todas as etapas são concluídas com sucesso - Verifique se o tamanho da saída publicada e o tempo de obtenção da imagem do contêiner foram aprimorados.
Principais benefícios da migração para o IronBarcode
Arquitetura de Implantação Simplificada: Após a migração, todos os ambientes — desenvolvimento, CI, teste e produção — recebem a licença por meio do mesmo mecanismo de segredos com valores de string usado para chaves de API, senhas de banco de dados e outras credenciais. Não é necessário provisionamento de arquivos, manipulação de artefatos ou montagem de volumes. Adicionar um novo ambiente de implantação é a mesma operação que adicionar qualquer outro segredo.
Superfície de Dependência Reduzida: Um pacote NuGet substitui cinco, e o requisito do MSVC++ 2017 Runtime é eliminado. O tamanho do arquivo de saída publicado por um serviço de código de barras cai de aproximadamente 148 MB para aproximadamente 39 MB. Imagens menores significam downloads de contêineres mais rápidos, custos de armazenamento mais baixos em registros de contêineres e tempos de inicialização a frio reduzidos em ambientes sem servidor e de escalonamento automático.
Inicialização simplificada do aplicativo: a sequência de inicialização do FERRAMENTAS DE CHAVE de 20 linhas — resolução de caminho de arquivo, verificação de expiração e três verificações de bloqueio por recurso — é substituída por uma única linha. A inicialização do aplicativo é mais rápida e o caminho do código de inicialização não possui dependência do sistema de arquivos que possa falhar em um novo ambiente.
Detecção abrangente de formatos: o IronBarcode lê todas as mais de 50 simbologias suportadas sem exigir que o usuário especifique os formatos esperados. O risco de leituras silenciosas perdidas — causadas por omitir uma simbologia do array BarcodeSymbology[] do FERRAMENTAS DE CHAVE — é eliminado. Quando um novo tipo de código de barras aparece em um documento de entrada, o IronBarcode o detecta sem exigir uma alteração no código.
Custo Total Previsível: Uma única compra de licença perpétua cobre desenvolvimento, testes e implantações ilimitadas em produção, sem necessidade de rastreamento de implantação, renovação anual ou obtenção de uma licença de produção separada. As equipes podem confirmar o custo total da biblioteca antes de iniciar o desenvolvimento, sem a necessidade de uma conversa com o vendedor.
Design Moderno de API: BarcodeReader.Read() e BarcodeWriter.CreateBarcode() são pontos de entrada estáticos que aceitam caminhos de arquivo diretamente. A construção de objetos em múltiplas camadas que a leitura e a gravação do FERRAMENTAS DE CHAVE exigem — instâncias de codec, instâncias de mecanismo, alocação de imagem, preenchimento de fundo — é tratada internamente. O código que lê e gera códigos de barras é mais curto, mais fácil de revisar e mais fácil de testar.
Perguntas frequentes
Por que devo migrar do LEADTOOLS Barcode 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 LEADTOOLS 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 LEADTOOLS Barcode 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 LEADTOOLS Barcode 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 LEADTOOLS Barcode?
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 LEADTOOLS?
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 LEADTOOLS Barcode 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.

