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

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()
$vbLabelText   $csharpLabel
// 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")
$vbLabelText   $csharpLabel

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
SHELL

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
SHELL

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
SHELL

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"
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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}}
YAML

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) ...
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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" .
SHELL

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

  1. Remova todos os cinco pacotes NuGet do FERRAMENTAS DE CHAVE (e o codec PDF, se presente).
  2. Instale IronBarcode via dotnet add package IronBarcode
  3. Substitua todas as importações de namespace using Leadtools.* por using IronBarCode
  4. Substitua todo o bloco de inicialização RasterSupport.SetLicense por IronBarCode.License.LicenseKey = "key"
  5. Remova todas as verificações RasterSupport.KernelExpired
  6. Remova todas as verificações RasterSupport.IsLocked(RasterSupportType.*)
  7. Remova todas as instâncias new BarcodeEngine()
  8. Remova todas as instâncias new RasterCodecs() dos caminhos de código de barras
  9. Substitua codecs.Load(path) + engine.Reader.ReadBarcodes(image, ...) por BarcodeReader.Read(path)
  10. Substitua new BarcodeData(...) + new RasterImage(...) + FillCommand + WriteBarcode + codecs.Save() por BarcodeWriter.CreateBarcode(...).SaveAsPng(path)
  11. Substitua referências de enum BarcodeSymbology.* por BarcodeEncoding.* (note: QR se torna QRCode)
  12. Remova linhas COPY LEADTOOLS.LIC de todos os Dockerfiles
  13. Remova as declarações de variáveis de ambiente LEADTOOLS_LICENSE_PATH e LEADTOOLS_DEVELOPER_KEY dos Dockerfiles e configurações de implantação
  14. Adicione a variável de ambiente IRONBARCODE_LICENSE aos Dockerfiles e configurações de segredos
  15. 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 .LIC e confirme se a aplicação inicializa corretamente
  • Execute o pipeline de CI/CD sem a etapa de provisionamento de arquivo .LIC e 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.

ObserveLEADTOOLS é uma marca registrada de seu respectivo proprietário. Este site não é afiliado, endossado ou patrocinado pela LEAD Technologies. 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 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.

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