Como personalizar e adicionar logotipos a códigos QR em C# | IronBracode
Migrando de Código de barrasSyncfusionpara IronBarcode
Este guia fornece um caminho completo de migração dos controles de código de barras doSyncfusion— SfBarcode para WinForms e WPF, SfBarcodeGenerator para Blazor e MAUI — para IronBarcode. O documento aborda os motivos estruturais pelos quais as equipes fazem essa transição, um guia rápido passo a passo para substituir os pacotes NuGet e configurar as licenças, exemplos de código completos de antes e depois para cada cenário comum e uma lista de verificação de migração para auditar uma base de código existente. Se o projeto também usar outros componentes daSyncfusion(grades, gráficos, agendadores), esses pacotes e seus registros não serão afetados — apenas o código específico do código de barras será alterado.
Por que migrar doSyncfusionBarcode?
Lacuna de Leitura: SfBarcode e SfBarcodeGenerator são controles de geração sem capacidade de leitura. Não há método .Read() ou .Scan() em nenhuma das classes. Quando um projeto exige a leitura de códigos de barras a partir de imagens carregadas, documentos digitalizados ou arquivos PDF, o controle de código de barras daSyncfusionnão oferece nenhuma solução. A documentação daSyncfusiondireciona as equipes para o Barcode Reader OPX como solução, que é um produto comercial separado que deve ser adquirido, licenciado e mantido independentemente.
OPX como um Wrapper Pago para Software Livre: Leitor de Código de Barras. O OPX utiliza internamente o ZXing .NET — uma biblioteca de código aberto para leitura de códigos de barras publicada sob a licença Apache 2.0. Apache 2.0 é uma licença permissiva; qualquer desenvolvedor .NET pode instalar ZXing.Net diretamente com dotnet add package ZXing.Net e usá-lo em aplicativos comerciais sem custo. Um fluxo de trabalho completo de leitura e geração doSyncfusionrequer dois produtosSyncfusionseparados, dois contratos de licença e duas superfícies de API — enquanto a capacidade de leitura poderia ter sido obtida diretamente da biblioteca gratuita que a OPX envolve.
Limitação da Licença Comunitária: A Licença Comunitária daSyncfusionexige que quatro condições sejam atendidas simultaneamente e continuamente: receita bruta anual inferior a US$ 1.000.000, cinco ou menos desenvolvedores, dez ou menos funcionários no total e capital externo total captado inferior a US$ 3.000.000. Organizações governamentais não são elegíveis, independentemente do porte. O descumprimento de qualquer uma dessas condições gera uma obrigação imediata de obter uma licença comercial. Uma rodada de financiamento Série A normalmente eleva o capital arrecadado para mais de US$ 3.000.000 no dia do fechamento, acionando uma taxa de licenciamento independentemente do tamanho da equipe ou da receita. A transição comercial passa de $0 para uma assinatura anual Essencial Estúdio por desenvolvedor — e essa assinatura cobre toda a suíte, não apenas o componente de código de barras. O caminho publicado doSyncfusioné uma cotação personalizada das vendas.
Rotação de chaves específica da versão: as chaves de licença daSyncfusionestão vinculadas a intervalos de versões específicos do Essential Studio. A atualização da versão 24.x para a 25.x requer a obtenção de uma nova chave no portal da conta, a atualização dessa chave no repositório de segredos de cada ambiente de implantação e a reimplementação para evitar que marcas d'água de avaliação apareçam nas saídas de produção. Para equipes com ciclos de lançamento frequentes ou múltiplos alvos de implantação, essa rotação se torna uma sobrecarga operacional recorrente, desproporcional à necessidade fundamental de gerar uma imagem de código de barras.
O problema fundamental
A arquitetura de controle daSyncfusiontorna a geração programática de arquivos indireta. Produzir um arquivo de código de barras com SfBarcode requer pré-alocação de um Bitmap, chamando DrawToBitmap, e então salvando o bitmap — um padrão de renderização WinForms que carrega o runtime do Windows Forms como dependência:
//SyncfusionSfBarcode: indirect file output through DrawToBitmap
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
var barcode = new SfBarcode();
barcode.Text = "SHIP-2024-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.Width = 400;
barcode.Height = 150;
using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("shipping-label.png", ImageFormat.Png);
// Reading: not possible — requires separate OPX purchase
//SyncfusionSfBarcode: indirect file output through DrawToBitmap
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
var barcode = new SfBarcode();
barcode.Text = "SHIP-2024-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.Width = 400;
barcode.Height = 150;
using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("shipping-label.png", ImageFormat.Png);
// Reading: not possible — requires separate OPX purchase
Imports Syncfusion.Licensing
Imports System.Drawing
Imports System.Drawing.Imaging
' SyncfusionSfBarcode: indirect file output through DrawToBitmap
SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY")
Dim barcode As New SfBarcode()
barcode.Text = "SHIP-2024-001"
barcode.Symbology = BarcodeSymbolType.Code128A
barcode.Width = 400
barcode.Height = 150
Using bitmap As New Bitmap(barcode.Width, barcode.Height)
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle)
bitmap.Save("shipping-label.png", ImageFormat.Png)
End Using
' Reading: not possible — requires separate OPX purchase
O IronBarcode gera arquivos diretamente e os lê com o mesmo pacote:
// IronBarcode: direct generation and reading in one package
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.SaveAsPng("shipping-label.png");
// Read — same package, no additional product required
var results = BarcodeReader.Read("shipping-label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
// IronBarcode: direct generation and reading in one package
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.SaveAsPng("shipping-label.png");
// Read — same package, no additional product required
var results = BarcodeReader.Read("shipping-label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
Imports IronBarCode
' IronBarcode: direct generation and reading in one package
License.LicenseKey = "YOUR-LICENSE-KEY"
' Generate
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128) _
.ResizeTo(400, 150) _
.SaveAsPng("shipping-label.png")
' Read — same package, no additional product required
Dim results = BarcodeReader.Read("shipping-label.png")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
IronBarcode vsSyncfusionBarcode: Comparação de Recursos
| Recurso | Código de barrasSyncfusion | IronBarcode |
|---|---|---|
| Geração de código de barras | Sim — controle de interface do usuário (WinForms, WPF, Blazor, MAUI) | Sim — API estática, todos os ambientes |
| Leitura de código de barras | Não — é necessário um leitor de código de barras OPX separado. | Sim — mesmo pacote |
| O produto de leitura OPX envolve o ZXing .NET (Apache 2.0) | Sim | N / D |
| Saída de código de barras em PDF | Não — requer o arquivo .pdf daSyncfusionadicionalmente. | Sim — SaveAsPdf() embutido |
| Leitura de código de barras em PDF | Não | Sim — nativo |
| Geração do lado do servidor / sem interface gráfica | Requer execução do WinForms (DrawToBitmap) |
Nativo — sem dependência de interface do usuário |
| Implantação Docker/Linux | Limitado | Suporte total |
| API mínima do ASP.NET Core | Não há suporte direto. | Suporte total |
| Código QR com logotipo incorporado | Não | Sim — .AddBrandLogo() |
| Detecção automática de formato na leitura | N / D | Sim |
| Comunidade / nível gratuito | Licença comunitária (quatro condições simultâneas) | Teste gratuito de 30 dias (apenas marca d'água) |
| Modelo de licença comercial | Assinatura anual (Estúdio Essencial) | Perpétuo (uma vez, veja ironsoftware.com/csharp/barcode/licensing) |
| Escopo da chave de licença | Específico da versão, alterna com as principais atualizações do NuGet. | Versão estável dentro da versão principal |
| Etapas de registro na plataforma | 3 a 4 etapas (Registrar licença + Adicionar SyncfusionBlazor + Configurar SyncfusionCore + importações Razor ) | Uma linha, todas as plataformas |
| Faixa de formato 1D | Código 128, Código 39, EAN, UPC, Codabar e outros. | Todos os formatosSyncfusion, Plus de PDF417, Aztec, MaxiCode, GS1, USPS IMb e mais de 50 outros. |
| faixa de formato 2D | Código QR, DataMatrix | Código QR, DataMatrix, PDF417, Micro PDF417, Aztec, MaxiCode |
Início rápido
Passo 1: Substituir pacotes NuGet
Remova o pacote de código de barrasSyncfusionpara a plataforma em uso. Se o projeto for destinado a várias plataformas, execute a remoção para cada uma delas:
# Blazor
dotnet remove package Syncfusion.Blazor.BarcodeGenerator
# WinForms
dotnet remove package Syncfusion.SfBarcode.Windows
# WPF
dotnet remove package Syncfusion.SfBarcode.WPF
# MAUI
dotnet remove package Syncfusion.Maui.Barcode
# Blazor
dotnet remove package Syncfusion.Blazor.BarcodeGenerator
# WinForms
dotnet remove package Syncfusion.SfBarcode.Windows
# WPF
dotnet remove package Syncfusion.SfBarcode.WPF
# MAUI
dotnet remove package Syncfusion.Maui.Barcode
Se não houver mais nenhum pacote daSyncfusionno projeto após a remoção do pacote de código de barras, remova também o pacote de licenciamento:
dotnet remove package Syncfusion.Licensing
dotnet remove package Syncfusion.Licensing
Instale o IronBarcode— um pacote para todas as plataformas:
dotnet add package IronBarcode
dotnet add package IronBarcode
Etapa 2: Atualizar Namespaces
Remova os namespaces de código de barras daSyncfusione adicione o namespace IronBarcode:
// Remove these (barcode-specific; leave others if non-barcodeSyncfusioncontrols remain)
using Syncfusion.Windows.Forms.Barcode;
using Syncfusion.Licensing;
// @using Syncfusion.Blazor.BarcodeGenerator (in _Imports.razor)
// Add this
using IronBarCode;
// Remove these (barcode-specific; leave others if non-barcodeSyncfusioncontrols remain)
using Syncfusion.Windows.Forms.Barcode;
using Syncfusion.Licensing;
// @using Syncfusion.Blazor.BarcodeGenerator (in _Imports.razor)
// Add this
using IronBarCode;
Imports IronBarCode
Etapa 3: Inicializar a licença
Remova o registro da licençaSyncfusione a configuração da plataforma da inicialização do aplicativo. Em seguida, adicione uma única linha de licença IronBarcode no mesmo local de inicialização:
// Remove from Program.cs / App.xaml.cs / MauiProgram.cs:
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
builder.Services.AddSyncfusionBlazor(); // Blazor only — remove if no otherSyncfusioncontrols
builder.ConfigureSyncfusionCore(); // MAUI only — remove if no otherSyncfusioncontrols
// Add at the same startup point:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Remove from Program.cs / App.xaml.cs / MauiProgram.cs:
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
builder.Services.AddSyncfusionBlazor(); // Blazor only — remove if no otherSyncfusioncontrols
builder.ConfigureSyncfusionCore(); // MAUI only — remove if no otherSyncfusioncontrols
// Add at the same startup point:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Remove from Program.vb / App.xaml.vb / MauiProgram.vb:
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY")
builder.Services.AddSyncfusionBlazor() ' Blazor only — remove if no other Syncfusion controls
builder.ConfigureSyncfusionCore() ' MAUI only — remove if no other Syncfusion controls
' Add at the same startup point:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Para pipelines de CI/CD e contêineres Docker, armazene a chave em uma variável de ambiente:
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
Imports System
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
Exemplos de migração de código
WinForms SfBarcode para BarcodeWriter
A migração do WinForms elimina a indiação de DrawToBitmap e a substitui por uma cadeia de saída de arquivo direta. O padrão deSyncfusionrequer pré-alocação de um Bitmap de dimensões conhecidas; O IronBarcode calcula as dimensões como parte da chamada de geração.
AbordagemSyncfusion:
using Syncfusion.Windows.Forms.Barcode;
using System.Drawing;
using System.Drawing.Imaging;
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
var barcode = new SfBarcode();
barcode.Text = "ORD-20240315-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.BarHeight = 100;
barcode.NarrowBarWidth = 1;
barcode.ShowText = true;
barcode.Width = 400;
barcode.Height = 150;
using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("order-label.png", ImageFormat.Png);
using Syncfusion.Windows.Forms.Barcode;
using System.Drawing;
using System.Drawing.Imaging;
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
var barcode = new SfBarcode();
barcode.Text = "ORD-20240315-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.BarHeight = 100;
barcode.NarrowBarWidth = 1;
barcode.ShowText = true;
barcode.Width = 400;
barcode.Height = 150;
using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("order-label.png", ImageFormat.Png);
Imports Syncfusion.Windows.Forms.Barcode
Imports System.Drawing
Imports System.Drawing.Imaging
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY")
Dim barcode As New SfBarcode()
barcode.Text = "ORD-20240315-001"
barcode.Symbology = BarcodeSymbolType.Code128A
barcode.BarHeight = 100
barcode.NarrowBarWidth = 1
barcode.ShowText = True
barcode.Width = 400
barcode.Height = 150
Using bitmap As New Bitmap(barcode.Width, barcode.Height)
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle)
bitmap.Save("order-label.png", ImageFormat.Png)
End Using
Abordagem do IronBarcode:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
BarcodeWriter.CreateBarcode("ORD-20240315-001", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.AddBarcodeText()
.SaveAsPng("order-label.png");
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
BarcodeWriter.CreateBarcode("ORD-20240315-001", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.AddBarcodeText()
.SaveAsPng("order-label.png");
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
BarcodeWriter.CreateBarcode("ORD-20240315-001", BarcodeEncoding.Code128) _
.ResizeTo(400, 150) _
.AddBarcodeText() _
.SaveAsPng("order-label.png")
BarcodeSymbolType.Code128A mapeia para BarcodeEncoding.Code128. A sequência DrawToBitmap + Bitmap.Save colapsa em .SaveAsPng(). Se o código de barras precisar ser exibido dentro de um PictureBox do WinForms em vez de ser salvo em disco, use .ToPngBinaryData() para carregar a imagem no controle. A gama completa de formatos de código de barras 1D no IronBarcode vai muito além da lista suportada pelo controladorSyncfusion.
Blazor SfBarcodeGenerator para endpoint de API mínimo
A migração para o Blazor é uma mudança estrutural, e não uma substituição linha por linha. SfBarcodeGenerator é um componente Razor que apresenta no navegador através da camada JavaScript do Syncfusion.IronBarcode não possui componente Razor ; É uma biblioteca do lado do servidor. O padrão de substituição é um endpoint de API mínimo no servidor que retorna bytes de código de barras, referenciados na página Razor como uma fonte de imagem.
AbordagemSyncfusion:
@page "/fulfillment"
@using Syncfusion.Blazor.BarcodeGenerator
<SfBarcodeGenerator
Width="300px"
Height="150px"
Type="BarcodeType.Code128"
Value="@orderNumber">
<BarcodeGeneratorDisplayText Visibility="true"></BarcodeGeneratorDisplayText>
</SfBarcodeGenerator>
@code {
private string orderNumber = "ORD-20240315-001";
}
Abordagem do IronBarcode:
Adicione um ponto de extremidade de geração em Program.cs:
using IronBarCode;
app.MapGet("/barcode/{value}", (string value) =>
{
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(300, 150)
.AddBarcodeText()
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});
using IronBarCode;
app.MapGet("/barcode/{value}", (string value) =>
{
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(300, 150)
.AddBarcodeText()
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});
Imports IronBarCode
app.MapGet("/barcode/{value}", Function(value As String)
Dim bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) _
.ResizeTo(300, 150) _
.AddBarcodeText() _
.ToPngBinaryData()
Return Results.File(bytes, "image/png")
End Function)
Referencie o endpoint no componente Razor :
@page "/fulfillment"
<img src="/barcode/@orderNumber" alt="Order barcode: @orderNumber" />
@code {
private string orderNumber = "ORD-20240315-001";
}
Este endpoint pode ser testado de forma independente, é reutilizável a partir de qualquer cliente HTTP e é compatível com Blazor Server, Blazor WebAssembly com um backend de API hospedado e qualquer outro frontend web.
Geração de código QR
O componente QR daSyncfusiontambém é renderizado no navegador, sem um caminho de saída no servidor. O IronBarcode gera códigos QR no servidor com saída direta em arquivo.
AbordagemSyncfusion:
@using Syncfusion.Blazor.BarcodeGenerator
<SfQRCodeGenerator
Width="300px"
Height="300px"
Value="https://example.com/product/ABC-123">
<QRCodeGeneratorDisplayText Visibility="false">
</QRCodeGeneratorDisplayText>
</SfQRCodeGenerator>
Abordagem do IronBarcode:
using IronBarCode;
// Standard QR code
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 300,
QRCodeWriter.QrErrorCorrectionLevel.High)
.SaveAsPng("product-qr.png");
// QR code with embedded brand logo — not available in Syncfusion
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("company-logo.png")
.SaveAsPng("product-qr-branded.png");
using IronBarCode;
// Standard QR code
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 300,
QRCodeWriter.QrErrorCorrectionLevel.High)
.SaveAsPng("product-qr.png");
// QR code with embedded brand logo — not available in Syncfusion
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("company-logo.png")
.SaveAsPng("product-qr-branded.png");
Imports IronBarCode
' Standard QR code
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 300, QRCodeWriter.QrErrorCorrectionLevel.High) _
.SaveAsPng("product-qr.png")
' QR code with embedded brand logo — not available in Syncfusion
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo("company-logo.png") _
.SaveAsPng("product-qr-branded.png")
Substituição de leitura OPX
Se o projeto utilizou o leitor de código de barras OPX — ou adiou a necessidade de leitura para uma futura aquisição do OPX — o IronBarcode substitui essa dependência pelo pacote já instalado. Sem produto secundário, sem segunda licença.
AbordagemSyncfusion(Leitor de código de barras OPX):
// Requires separate Código de barrasSyncfusionReader OPX purchase
// OPX wraps ZXing.Net internally (Apache 2.0 — free to use directly)
using Syncfusion.BarcodeReader;
var reader = new BarcodeReader();
var results = reader.ReadBarcodes("warehouse-scan.png");
foreach (var result in results)
Console.WriteLine($"Value: {result.Value}");
// Requires separate Código de barrasSyncfusionReader OPX purchase
// OPX wraps ZXing.Net internally (Apache 2.0 — free to use directly)
using Syncfusion.BarcodeReader;
var reader = new BarcodeReader();
var results = reader.ReadBarcodes("warehouse-scan.png");
foreach (var result in results)
Console.WriteLine($"Value: {result.Value}");
Imports Syncfusion.BarcodeReader
Dim reader As New BarcodeReader()
Dim results = reader.ReadBarcodes("warehouse-scan.png")
For Each result In results
Console.WriteLine($"Value: {result.Value}")
Next
Abordagem do IronBarcode:
using IronBarCode;
// Included in the same NuGet package as generation — no second product required
var results = BarcodeReader.Read("warehouse-scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Confidence: {result.Confidence}%");
}
using IronBarCode;
// Included in the same NuGet package as generation — no second product required
var results = BarcodeReader.Read("warehouse-scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Confidence: {result.Confidence}%");
}
Imports IronBarCode
' Included in the same NuGet package as generation — no second product required
Dim results = BarcodeReader.Read("warehouse-scan.png")
For Each result In results
Console.WriteLine($"Format: {result.Format}")
Console.WriteLine($"Value: {result.Value}")
Console.WriteLine($"Confidence: {result.Confidence}%")
Next
A documentação sobre leitura de código de barras abrange a leitura de matrizes de bytes para manipuladores de upload, o ajuste de velocidade versus precisão e a detecção de múltiplos códigos de barras.
Geração de código de barras em PDF
Os controles de código de barras daSyncfusionnão possuem um caminho de saída em PDF. O IronBarcode trata o PDF como um formato de saída de primeira classe.
AbordagemSyncfusion:
// Não direct path — requires combining Syncfusion.Barcode.WinForms and Syncfusion.Pdf
// Step 1: Generate to Bitmap via DrawToBitmap
// Step 2: LoadSyncfusionPDF document
// Step 3: Insert bitmap as image element
// Two packages, two APIs, two license obligations
// Não direct path — requires combining Syncfusion.Barcode.WinForms and Syncfusion.Pdf
// Step 1: Generate to Bitmap via DrawToBitmap
// Step 2: LoadSyncfusionPDF document
// Step 3: Insert bitmap as image element
// Two packages, two APIs, two license obligations
' Não direct path — requires combining Syncfusion.Barcode.WinForms and Syncfusion.Pdf
' Step 1: Generate to Bitmap via DrawToBitmap
' Step 2: LoadSyncfusionPDF document
' Step 3: Insert bitmap as image element
' Two packages, two APIs, two license obligations
Abordagem do IronBarcode:
using IronBarCode;
// Generate directly to PDF — no secondary library required
BarcodeWriter.CreateBarcode("PALLET-2024-0891", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.SaveAsPdf("pallet-label.pdf");
// Read barcodes from an existing PDF
var pdfResults = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in pdfResults)
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
using IronBarCode;
// Generate directly to PDF — no secondary library required
BarcodeWriter.CreateBarcode("PALLET-2024-0891", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.SaveAsPdf("pallet-label.pdf");
// Read barcodes from an existing PDF
var pdfResults = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in pdfResults)
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
Imports IronBarCode
' Generate directly to PDF — no secondary library required
BarcodeWriter.CreateBarcode("PALLET-2024-0891", BarcodeEncoding.Code128) _
.ResizeTo(400, 150) _
.SaveAsPdf("pallet-label.pdf")
' Read barcodes from an existing PDF
Dim pdfResults = BarcodeReader.Read("shipping-manifest.pdf")
For Each result In pdfResults
Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
O guia de geração de PDFs com código de barras aborda a criação de PDFs com várias páginas e a incorporação de códigos de barras junto com outros conteúdos do documento.
Referência de mapeamento da API de código de barras daSyncfusionpara o IronBarcode
| Syncfusion | IronBarcode |
|---|---|
SyncfusionLicenseProvider.RegisterLicense("KEY") |
IronBarCode.License.LicenseKey = "key" |
builder.Services.AddSyncfusionBlazor() |
Não é necessário |
builder.ConfigureSyncfusionCore() |
Não é necessário |
new SfBarcode() |
BarcodeWriter.CreateBarcode() (estático) |
barcode.Text = "value" |
Primeiro parâmetro de CreateBarcode() |
barcode.Symbology = BarcodeSymbolType.Code128A |
BarcodeEncoding.Code128 |
barcode.Symbology = BarcodeSymbolType.QRBarcode |
QRCodeWriter.CreateQrCode() |
barcode.BarHeight = 100 |
.ResizeTo(width, 100) |
barcode.ShowText = true |
.AddBarcodeText() |
barcode.DrawToBitmap(bitmap, rect) |
.SaveAsPng(path) |
Manual Bitmap → MemoryStream |
.ToPngBinaryData() |
<SfBarcodeGenerator Type="BarcodeType.Code128" Value="..."> |
BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) no ponto de extremidade da API |
<SfQRCodeGenerator Value="..."> |
QRCodeWriter.CreateQrCode(value, size) no ponto de extremidade da API |
BarcodeType.Code128 (enum Blazor) |
BarcodeEncoding.Code128 |
| Leitor de código de barras OPX (produto separado, utiliza o ZXing .NET) | BarcodeReader.Read(path) — nativo, mesmo pacote |
| Nenhuma API de leitura em controle | BarcodeReader.Read(path) |
| Sem saída em PDF no controle | .SaveAsPdf(path) |
| Sem leitura de PDF | BarcodeReader.Read("document.pdf") |
Problemas e soluções comuns em migrações
Problema 1: Marcas d'água de avaliação após atualização do NuGet
Syncfusion: A atualização do Essential Studio 24.x para a versão 25.x invalida a chave de licença existente. Qualquer saída gerada antes da atualização do repositório de segredos exibirá uma marca d'água de teste. Trata-se de uma falha silenciosa — o aplicativo continua em execução, mas produz resultados não conformes.
Solução: Após atualizar o pacote NuGet do IronBarcode, a chave de licença não muda dentro da mesma versão principal. Não é necessária nenhuma atualização ou reimplementação de segredos para versões secundárias ou de correção. Ao atualizar para uma nova versão principal, atualize a chave uma única vez no ponto de entrada do aplicativo:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Problema 2: DrawToBitmap falha em ambientes sem interface gráfica.
Syncfusion: SfBarcode.DrawToBitmap depende do pipeline de renderização do Windows Forms. Em um processo ASP.NET Core, Função Azure ou contêiner Docker Linux, chamar DrawToBitmap lançará InvalidOperationException ou produzirá um bitmap em branco porque não há um loop de mensagens do Windows Forms presente.
Solução: Substituir por BarcodeWriter.CreateBarcode(). O IronBarcode realiza a geração em código gerenciado, sem qualquer dependência de tempo de execução da interface do usuário:
// Works in ASP.NET Core, Azure Functions, Docker on Linux, console apps
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.ToPngBinaryData();
// Works in ASP.NET Core, Azure Functions, Docker on Linux, console apps
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.ToPngBinaryData();
' Works in ASP.NET Core, Azure Functions, Docker on Linux, console apps
Dim bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) _
.ResizeTo(400, 150) _
.ToPngBinaryData()
Problema 3: SfBarcodeGenerator não possui saída no servidor
Syncfusion: SfBarcodeGenerator é um componente Razor sem superfície de API do lado do servidor. As tentativas de utilizá-lo em uma ação de controlador ou serviço em segundo plano não encontrarão nenhum método aplicável para gerar bytes de código de barras.
Solução: Crie um endpoint de API mínimo que gere o código de barras no servidor e o retorne como uma resposta HTTP. Referencie o ponto de extremidade do componente Razor através de uma tag <img src="...">:
app.MapGet("/barcode/{value}", (string value) =>
{
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(300, 150)
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});
app.MapGet("/barcode/{value}", (string value) =>
{
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(300, 150)
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
app.MapGet("/barcode/{value}", Function(value As String)
Dim bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) _
.ResizeTo(300, 150) _
.ToPngBinaryData()
Return Results.File(bytes, "image/png")
End Function)
Problema 4: Falta de capacidade de leitura (OPX não adquirido)
Syncfusion: Projetos que adiaram a leitura de código de barras porque o OPX ainda não havia sido adquirido não possuem código de leitura para migrar. Adicionar a capacidade de leitura do zero requer a aquisição do OPX, a integração e um novo contrato de licença.
Solução: A leitura de código de IronBarcode está incluída no mesmo pacote. Não é necessário adquirir nenhuma licença adicional. Adicione BarcodeReader.Read(path) onde quer que a leitura seja necessária:
var results = BarcodeReader.Read("incoming-scan.png");
var results = BarcodeReader.Read("incoming-scan.png");
Dim results = BarcodeReader.Read("incoming-scan.png")
Problema 5: Expiração da licença da comunidade durante a migração
Syncfusion: Uma equipe que utiliza a Licença Comunitária e ultrapassa qualquer limite de elegibilidade durante o período de migração — incluindo o encerramento de uma rodada de financiamento — pode constatar que os controles daSyncfusionparam de produzir resultados válidos antes da conclusão da migração.
Solução: O período de teste de 30 dias do IronBarcode permite uma avaliação completa sem condições de receita, pessoal ou capital. A marca d'água de teste aparece na saída gerada; A ativação de uma chave de licença adquirida a remove. Não existem limites de tamanho organizacional no modelo de licenciamento do IronBarcode.
Lista de verificação para migração de código de barras da Syncfusion
Tarefas pré-migração
Analise o código-fonte para localizar todos os arquivos que fazem referência ao código de barras daSyncfusion:
grep -r "SyncfusionLicenseProvider.RegisterLicense\|AddSyncfusionBlazor\|ConfigureSyncfusionCore" --include="*.cs" .
grep -r "new SfBarcode\(\)\|SfBarcodeGenerator\|SfQRCodeGenerator" --include="*.cs" --include="*.razor" .
grep -r "BarcodeSymbolType\.\|BarcodeType\." --include="*.cs" --include="*.razor" .
grep -r "DrawToBitmap\|barcode\.Text\s*=" --include="*.cs" .
grep -r "Syncfusion\.Barcode\|Syncfusion\.Blazor\.BarcodeGenerator" --include="*.csproj" .
grep -r "SyncfusionLicenseProvider.RegisterLicense\|AddSyncfusionBlazor\|ConfigureSyncfusionCore" --include="*.cs" .
grep -r "new SfBarcode\(\)\|SfBarcodeGenerator\|SfQRCodeGenerator" --include="*.cs" --include="*.razor" .
grep -r "BarcodeSymbolType\.\|BarcodeType\." --include="*.cs" --include="*.razor" .
grep -r "DrawToBitmap\|barcode\.Text\s*=" --include="*.cs" .
grep -r "Syncfusion\.Barcode\|Syncfusion\.Blazor\.BarcodeGenerator" --include="*.csproj" .
Documente o seguinte antes de escrever qualquer código de migração:
- Liste todos os arquivos que chamam
SyncfusionLicenseProvider.RegisterLicense - Liste todas as instanciações de
SfBarcodee suas atribuições de propriedades - Liste todas as utilizações de componentes Razor
<SfBarcodeGenerator>e<SfQRCodeGenerator> - Liste todas as chamadas
DrawToBitmape o caminho de salvamento ou exibição a jusante - Confirme se o leitor de código de barras OPX está instalado; Em caso afirmativo, liste todas as chamadas de leitura.
Tarefas de atualização de código
- Remova os pacotes NuGet de código de barras daSyncfusionpara cada plataforma no projeto.
- Remova o pacote NuGet
Syncfusion.Licensingse nenhum outro controleSyncfusionpermanecer - Instale o pacote NuGet
IronBarcode - Substitua
SyncfusionLicenseProvider.RegisterLicense("KEY")porIronBarCode.License.LicenseKey = "KEY"no ponto de entrada da aplicação - Remove
builder.Services.AddSyncfusionBlazor()se nenhum outro controleSyncfusionpermanecer - Remove
builder.ConfigureSyncfusionCore()se nenhum outro controleSyncfusionpermanecer - Remove
@using Syncfusion.Blazore@using Syncfusion.Blazor.BarcodeGeneratorde_Imports.razorse aplicável - Substitua
using Syncfusion.Windows.Forms.Barcodeeusing Syncfusion.Licensingporusing IronBarCode - Substitua cada bloco
new SfBarcode()+ atribuições de propriedades +DrawToBitmapporBarcodeWriter.CreateBarcode(value, BarcodeEncoding.X).ResizeTo(w, h).SaveAsPng(path) - Substitua
BarcodeSymbolType.Code128A(e equivalente) porBarcodeEncoding.Code128 - Substitua
BarcodeType.Code128(enum Blazor) porBarcodeEncoding.Code128 - Substitua cada componente Razor
<SfBarcodeGenerator>por um ponto de extremidade de API mínimo e uma referência<img src="...">no componente - Substitua cada componente Razor
<SfQRCodeGenerator>por um ponto de extremidadeQRCodeWriter.CreateQrCode()e uma referência<img src="..."> - Substitua todas as chamadas de leitura do Barcode Reader OPX por
BarcodeReader.Read(path) - Adicione
BarcodeReader.Read(path)onde quer que a capacidade de leitura estivesse anteriormente ausente devido à OPX não ter sido adquirida
Testes pós-migração
- Verifique se as imagens de código de barras geradas são válidas para leitura usando um leitor de hardware ou um aplicativo de leitura de referência.
- Verifique se não há marcas d'água de avaliação nos arquivos gerados após a ativação da chave de licença.
- Confirme que
BarcodeReader.Read()retorna o valor esperado e o formato para cada tipo de código de barras em uso - Teste a saída em PDF com
.SaveAsPdf()para confirmar que as dimensões da página e as dimensões do código de barras atendem aos requisitos do design - Teste o endpoint da API mínima do Blazor diretamente (via navegador ou cliente HTTP) antes de testá-lo dentro do componente Razor.
- Confirme se a implantação do Docker e do Linux produz resultados idênticos aos das máquinas de desenvolvimento Windows.
- Execute uma auditoria final
greppara confirmar que não há referências restantes aSfBarcode,SfBarcodeGenerator,DrawToBitmap,BarcodeSymbolTypeouSyncfusionLicenseProvider
Principais benefícios da migração para o IronBarcode
Geração e leitura unificadas: após a migração, tanto a geração quanto a leitura operam por meio de um único pacote NuGet sob uma única licença. Não há nenhum produto secundário para comprar, nenhuma segunda interface de API para aprender e nenhuma dependência do wrapper .NET do ZXing consumindo um orçamento de licença que poderia ser destinado à biblioteca de código aberto direta.
Eliminação da rotação de chaves específica da versão: as chaves de licença do IronBarcode permanecem válidas em atualizações secundárias e de correção dentro de uma versão principal. A sobrecarga operacional de obter uma nova chave, atualizar segredos em cada ambiente de implantação e reimplantar para remover marcas d'água de avaliação em cada atualização principal da versão NuGet é completamente eliminada.
Implantação independente de plataforma: o mesmo pacote IronBarcode e a mesma API de geração funcionam em aplicativos desktop WinForms, serviços ASP.NET Core , Azure Functions, aplicativos de console e contêineres Docker Linux. A dependência do runtime do Windows Forms introduzida por DrawToBitmap é removida, e as implementações Blazor mudam de componentes renderizados no navegador para pontos de extremidade de API do lado do servidor que são testáveis de forma independente e agnósticos ao cliente.
Suporte nativo a PDF: a geração e a leitura são suportadas nativamente em PDF. Gerar um PDF com código de barras não exige mais a coordenação de dois produtos daSyncfusion; A leitura de códigos de barras em manifestos PDF e documentos de remessa não requer mais uma etapa separada de extração de PDF.
Economia de licenciamento previsível: o modelo de licença perpétua da IronBarcode não impõe limites de receita, número de funcionários, número de colaboradores ou capital. Equipes que já ultrapassaram os requisitos de elegibilidade da Licença Comunitária daSyncfusion— ou que preveem ultrapassá-los — migram para um modelo de licenciamento em que o crescimento organizacional não gera um evento de conformidade.
Perguntas frequentes
Por que devo migrar do Syncfusion 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 da Syncfusion 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 Syncfusion 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 Syncfusion 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 Syncfusion 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 Syncfusion?
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 Syncfusion 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.

