Como usar Async e Multithread em códigos de barras usando C#
Migrando deQRCoderpara IronBarcode
Este guia foi escrito para equipes de desenvolvimento cujos projetos começaram com oQRCodere evoluíram a ponto de exigirem recursos que vão além da geração de códigos QR. OQRCoderé uma biblioteca bem mantida e de alta qualidade para o propósito a que se destina, e a migração não reflete sua qualidade. É uma resposta a requisitos — expansão de formato, leitura de código de barras, integração com PDF — que estão fora do escopo para o qual oQRCoderfoi projetado. Este guia abrange todo o caminho técnico da migração doQRCoderpara o IronBarcode: substituição de pacotes, alterações de namespace, tradução de código para cada padrão comum, mapeamento de equivalências de API e soluções para os problemas que surgem durante a transição.
Por que migrar do QRCoder?
Requisitos de formato além do QR: OQRCodergera códigos QR exclusivamente. Projetos que crescem para exigir etiquetas Code 128 para logística, códigos EAN-13 para identificação de produtos de varejo,DataMatrixpara serialização farmacêutica ouPDF417para conformidade de documentos do governo devem introduzir uma biblioteca separada para cada formato adicional. À medida que o número de formatos necessários aumenta, também aumenta o número de pacotes independentes, APIs e obrigações de manutenção.
Requisitos de leitura de código de barras: OQRCodernão possui uma API de leitura de código de barras — ele foi projetado como uma biblioteca somente para geração de código de barras. Qualquer aplicação que precise decodificar códigos QR de imagens recebidas, verificar códigos de barras em documentos digitalizados ou processar etiquetas de envio deve adicionar uma biblioteca de leitura dedicada juntamente com o QRCoder. Essa segunda biblioteca traz sua própria superfície de API, seu próprio ciclo de atualização e suas próprias preocupações de compatibilidade a cada atualização do .NET .
Manutenção de múltiplas bibliotecas: O padrão de acumulação realista para um projeto baseado emQRCodervai doQRCoderpara geração de QR codes a uma biblioteca de códigos de barras 1D para etiquetas de envio e, finalmente, a uma biblioteca de leitura para decodificação. Gerenciar três ou quatro pacotes independentes significa acompanhar notas de versão separadas, resolver conflitos de versão quando qualquer um deles for atualizado e manter familiaridade com várias APIs em toda a equipe de desenvolvimento. O ônus da manutenção se acumula ao longo do tempo de maneiras que não são visíveis na estimativa inicial de integração.
Suporte a PDF: Incorporar códigos de barras em documentos PDF ou extrair códigos de barras de arquivos PDF recebidos estão fora do escopo do QRCoder. Os fluxos de processamento de documentos — como o gerenciamento de faturas, a geração de etiquetas a partir de modelos em PDF e a elaboração de relatórios de conformidade — encontram esse limite logo no início. Uma biblioteca PDF dedicada deve ser adicionada juntamente com o QRCoder, ou a arquitetura deve encaminhar a geração de código de barras e a geração de PDF por meio de subsistemas separados.
O problema fundamental
OQRCoderresolve a geração de QR Codes de forma eficiente. Não momento em que qualquer requisito ultrapassa o QR, a base de código deve começar a incorporar pacotes adicionais para preencher cada lacuna:
//QRCoderhandles QR generation well — but no further
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10));
// Now the shipping team asks for Code 128 — add NetBarcode
// Now the warehouse needs to scan barcodes — add ZXing.Net
// Now a report needs a barcode in a PDF — add a PDF library
// Each addition: new namespace, new API, new maintenance cycle
//QRCoderhandles QR generation well — but no further
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10));
// Now the shipping team asks for Code 128 — add NetBarcode
// Now the warehouse needs to scan barcodes — add ZXing.Net
// Now a report needs a barcode in a PDF — add a PDF library
// Each addition: new namespace, new API, new maintenance cycle
Imports QRCoder
Imports System.IO
Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M)
Dim qrCode As New PngByteQRCode(qrCodeData)
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10))
' Now the shipping team asks for Code 128 — add NetBarcode
' Now the warehouse needs to scan barcodes — add ZXing.Net
' Now a report needs a barcode in a PDF — add a PDF library
' Each addition: new namespace, new API, new maintenance cycle
IronBarcode consolida geração, leitura e integração de PDF em uma única API:
//IronBarcode— one library covers all of the above
using IronBarCode;
// Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
// Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
// Read a barcode from an image — built in
var results = BarcodeReader.Read("incoming.png");
//IronBarcode— one library covers all of the above
using IronBarCode;
// Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
// Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
// Read a barcode from an image — built in
var results = BarcodeReader.Read("incoming.png");
Imports IronBarCode
' Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode).SaveAsPng("qr.png")
' Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128).SaveAsPng("label.png")
' Read a barcode from an image — built in
Dim results = BarcodeReader.Read("incoming.png")
IronBarcode vs QRCoder: Comparação de Recursos
| Recurso | QRCoder | IronBarcode |
|---|---|---|
| Geração de código QR | Sim, excelente. | Sim |
| Micro QR | Sim | Não |
| Código 128 / Código 39 | Não | Sim |
| EAN-13 / UPC-A | Não | Sim |
| DataMatrix | Não | Sim |
| PDF417 | Não | Sim |
| asteca | Não | Sim |
| Formatos totais | 1 | 50+ |
| Leitura de código de barras | Não | Sim — detecção automática |
| Extração de código de barras em PDF | Não | Sim |
| Carimbo de código de barras em PDF | Não | Sim |
| Incorporação de logotipo | Sim | Sim |
| Personalização de cores | Sim | Sim |
| Saída SVG | Sim | Sim |
| Auxiliares do PayloadGenerator | Sim | Não — construção manual de cordas |
| Dependências externas zero | Sim | Autossuficiente |
| Licença | MIT — sem restrições | Comercial — o nível Lite cobre um único desenvolvedor |
Guia rápido: Migração doQRCoderpara o IronBarcode
Passo 1: Substitua o pacote NuGet
Remova oQRCoderdo projeto:
dotnet remove package QRCoder
dotnet remove package QRCoder
Instale o IronBarcode:
dotnet add package IronBarcode
dotnet add package IronBarcode
Se o projeto estiver usando o ZXing .NET juntamente com oQRCoderpara leitura de código de barras, esse pacote também pode ser removido nesta etapa:
dotnet remove package ZXing.Net
dotnet remove package ZXing.Net
Etapa 2: Atualizar Namespaces
Substitua a importação do namespaceQRCoderpelo namespace IronBarcode:
// Before (QRCoder)
using QRCoder;
// After (IronBarcode)
using IronBarCode;
// Before (QRCoder)
using QRCoder;
// After (IronBarcode)
using IronBarCode;
' Before (QRCoder)
Imports QRCoder
' After (IronBarcode)
Imports IronBarCode
Etapa 3: Inicializar a licença
Adicione a inicialização da licença na inicialização do aplicativo — Program.cs, Startup.cs ou um construtor estático:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Uma chave de avaliação gratuita está disponível sem necessidade de cadastro. Implantações em produção exigem uma licença adquirida.
Exemplos de migração de código
Geração básica de código QR
O padrão mais comum doQRCoderrequer três objetos: uma instância de QRCodeGenerator, um objeto intermediário QRCodeData e uma classe renderizadora como PngByteQRCode. Em IronBarcode, uma única chamada estática substitui essa cadeia.
Abordagem do QRCoder:
using QRCoder;
public class BarcodeService
{
private readonly QRCodeGenerator _generator = new QRCodeGenerator();
public byte[] GenerateQR(string content)
{
var qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
return qrCode.GetGraphic(10); // 10px per module
}
}
using QRCoder;
public class BarcodeService
{
private readonly QRCodeGenerator _generator = new QRCodeGenerator();
public byte[] GenerateQR(string content)
{
var qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
return qrCode.GetGraphic(10); // 10px per module
}
}
Imports QRCoder
Public Class BarcodeService
Private ReadOnly _generator As New QRCodeGenerator()
Public Function GenerateQR(content As String) As Byte()
Dim qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M)
Dim qrCode = New PngByteQRCode(qrCodeData)
Return qrCode.GetGraphic(10) ' 10px per module
End Function
End Class
Abordagem do IronBarcode:
using IronBarCode;
public class BarcodeService
{
public byte[] GenerateQR(string content)
{
return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode)
.ResizeTo(200, 200)
.ToPngBinaryData();
}
}
using IronBarCode;
public class BarcodeService
{
public byte[] GenerateQR(string content)
{
return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode)
.ResizeTo(200, 200)
.ToPngBinaryData();
}
}
Imports IronBarCode
Public Class BarcodeService
Public Function GenerateQR(content As String) As Byte()
Return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode) _
.ResizeTo(200, 200) _
.ToPngBinaryData()
End Function
End Class
BarcodeWriter é uma classe estática — nenhuma instância é necessária e não há objeto de dados intermediário. O método ResizeTo(width, height) substitui o inteiro pixel-por-módulo que oQRCoderaceita em GetGraphic. Onde oQRCoderdimensiona a saída por contagem de módulos (por exemplo, GetGraphic(10) para uma imagem de 10px por módulo), o IronBarcode toma dimensões absolutas de pixel.
Salvar códigos QR em um arquivo
OQRCodersepara os bytes na memória da saída do arquivo apenas na etapa do terminal — a cadeia de renderização é a mesma.IronBarcode utiliza diferentes métodos de terminal na mesma cadeia.
Abordagem do QRCoder:
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var pngBytes = new PngByteQRCode(qrCodeData).GetGraphic(10);
File.WriteAllBytes("output.png", pngBytes);
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var pngBytes = new PngByteQRCode(qrCodeData).GetGraphic(10);
File.WriteAllBytes("output.png", pngBytes);
Imports QRCoder
Imports System.IO
Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim pngBytes = New PngByteQRCode(qrCodeData).GetGraphic(10)
File.WriteAllBytes("output.png", pngBytes)
Abordagem do IronBarcode:
using IronBarCode;
// Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.SaveAsPng("output.png");
// Or obtain bytes for in-memory use
byte[] pngBytes = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.ToPngBinaryData();
using IronBarCode;
// Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.SaveAsPng("output.png");
// Or obtain bytes for in-memory use
byte[] pngBytes = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.ToPngBinaryData();
Imports IronBarCode
' Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.ResizeTo(300, 300) _
.SaveAsPng("output.png")
' Or obtain bytes for in-memory use
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.ResizeTo(300, 300) _
.ToPngBinaryData()
O método SaveAsPng é um terminal que grava diretamente no disco. ToPngBinaryData retorna um byte[] para streaming, respostas HTTP ou armazenamento no banco de dados.
Saída SVG
Abordagem do QRCoder:
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("output.svg", svgContent);
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("output.svg", svgContent);
Imports QRCoder
Imports System.IO
Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim svgContent As String = New SvgQRCode(qrCodeData).GetGraphic(10)
File.WriteAllText("output.svg", svgContent)
Abordagem do IronBarcode:
using IronBarCode;
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsImage("output.svg");
using IronBarCode;
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsImage("output.svg");
Imports IronBarCode
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsImage("output.svg")
A classe renderizadora SvgQRCode e sua chamada GetGraphic colapsam em um único método terminal SaveAsImage (passar uma extensão .svg produz uma saída SVG).
Mapeamento do nível de correção de erros
OQRCoderrequer seleção explícita de ECC em cada chamada CreateQrCode usando o enum QRCodeGenerator.ECCLevel. O IronBarcode aplica um padrão sensato ao usar BarcodeWriter.CreateBarcode e expõe controle explícito através de QRCodeWriter.QrErrorCorrectionLevel.
Abordagem do QRCoder:
using QRCoder;
var generator = new QRCodeGenerator();
// Medium — suitable for most generation without logos
var dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
// High — required when a logo will occlude part of the code
var dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
using QRCoder;
var generator = new QRCodeGenerator();
// Medium — suitable for most generation without logos
var dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
// High — required when a logo will occlude part of the code
var dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
Imports QRCoder
Dim generator As New QRCodeGenerator()
' Medium — suitable for most generation without logos
Dim dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
' High — required when a logo will occlude part of the code
Dim dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H)
Abordagem do IronBarcode:
using IronBarCode;
// Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("default-ecc.png");
// Explicit level via QRCodeWriter
var qr = QRCodeWriter.CreateQrCode(
"https://example.com",
500,
QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.SaveAsPng("high-ecc.png");
using IronBarCode;
// Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("default-ecc.png");
// Explicit level via QRCodeWriter
var qr = QRCodeWriter.CreateQrCode(
"https://example.com",
500,
QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.SaveAsPng("high-ecc.png");
Imports IronBarCode
' Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsPng("default-ecc.png")
' Explicit level via QRCodeWriter
Dim qr = QRCodeWriter.CreateQrCode( _
"https://example.com", _
500, _
QRCodeWriter.QrErrorCorrectionLevel.Highest _
)
qr.SaveAsPng("high-ecc.png")
O mapeamento de nível é: ECCLevel.L → Low, ECCLevel.M → Medium, ECCLevel.Q → High, ECCLevel.H → Highest.
Incorporação de logotipo
Ambas as bibliotecas suportam a incorporação de logotipos em códigos QR. OQRCoderroteia isso através da classe renderizadora QRCode (não PngByteQRCode) com parâmetros System.Drawing.Bitmap. O IronBarcode fornece QRCodeWriter.CreateQrCodeWithLogo() como um método de fábrica dedicado que aceita caminhos de arquivos tanto para o URL quanto para o logotipo. O guia de personalização do código QR abrange opções de tamanho, posicionamento e combinação de cores do logotipo.
Abordagem do QRCoder:
using QRCoder;
using System.Drawing;
using System.Drawing.Imaging;
var generator = new QRCodeGenerator();
// ECCLevel.H is required — the logo occludes part of the code
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", ImageFormat.Png);
using QRCoder;
using System.Drawing;
using System.Drawing.Imaging;
var generator = new QRCodeGenerator();
// ECCLevel.H is required — the logo occludes part of the code
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", ImageFormat.Png);
Imports QRCoder
Imports System.Drawing
Imports System.Drawing.Imaging
Dim generator As New QRCodeGenerator()
' ECCLevel.H is required — the logo occludes part of the code
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H)
Dim qrCode As New QRCode(qrCodeData)
Dim logoBitmap As New Bitmap("logo.png")
Dim qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap)
qrBitmap.Save("qr-logo.png", ImageFormat.Png)
Abordagem do IronBarcode:
using IronBarCode;
QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500)
.SaveAsPng("qr-logo.png");
using IronBarCode;
QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500)
.SaveAsPng("qr-logo.png");
Imports IronBarCode
QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500) _
.SaveAsPng("qr-logo.png")
A dependência System.Drawing.Bitmap é removida — CreateQrCodeWithLogo aceita strings de caminho de arquivo tanto para o conteúdo quanto para a imagem do logotipo. A correção de erros é configurada automaticamente para o nível exigido para incorporação de logotipos; nenhuma configuração de ECC explícita é necessária.
Gerador de carga útil. Migração para WiFi
O PayloadGenerator.WiFi doQRCoderformata a string padrão da carga útil do QR WiFi. O formato de saída é um padrão público (WIFI:T:{auth};S:{ssid};P:{password};;) definido pela especificação do código QR. Durante a migração, essas strings podem ser construídas diretamente.
Abordagem do QRCoder:
using QRCoder;
var wifi = new PayloadGenerator.WiFi(
ssid: "OfficeNetwork",
password: "SecurePass123",
authenticationMode: PayloadGenerator.WiFi.Authentication.WPA
);
// wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;
var generator = new QRCodeGenerator();
var qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10));
using QRCoder;
var wifi = new PayloadGenerator.WiFi(
ssid: "OfficeNetwork",
password: "SecurePass123",
authenticationMode: PayloadGenerator.WiFi.Authentication.WPA
);
// wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;
var generator = new QRCodeGenerator();
var qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10));
Imports QRCoder
Dim wifi = New PayloadGenerator.WiFi(
ssid:="OfficeNetwork",
password:="SecurePass123",
authenticationMode:=PayloadGenerator.WiFi.Authentication.WPA
)
' wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;
Dim generator = New QRCodeGenerator()
Dim qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M)
Dim qrCode = New PngByteQRCode(qrData)
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10))
Abordagem do IronBarcode:
using IronBarCode;
// Construct the standard WiFi QR string directly
string wifiPayload = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;";
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.SaveAsPng("wifi.png");
using IronBarCode;
// Construct the standard WiFi QR string directly
string wifiPayload = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;";
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.SaveAsPng("wifi.png");
Imports IronBarCode
' Construct the standard WiFi QR string directly
Dim wifiPayload As String = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;"
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode) _
.ResizeTo(300, 300) _
.SaveAsPng("wifi.png")
Para equipes com muitos tipos de PayloadGenerator em uso (vCard, CalendarEvent, Geo, SMS), a abordagem é a mesma: identificar a string formatada que cada gerador produz usando sua saída .ToString(), depois construir essa string diretamente ou através de um pequeno método auxiliar estático.
Referência de mapeamento da APIQRCoderpara IronBarcode
| QRCoder | IronBarcode | Notas |
|---|---|---|
new QRCodeGenerator() |
Classe estática — sem instância | BarcodeWriter não requer instanciação |
qrGenerator.CreateQrCode(data, ECCLevel.M) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) |
Substituição direta |
new PngByteQRCode(qrCodeData) |
Não é necessário | A renderização faz parte da cadeia fluente. |
qrCode.GetGraphic(20) retornando byte[] |
.ToPngBinaryData() |
Tamanho via .ResizeTo(w, h) |
Padrão File.WriteAllBytes(path, bytes) |
.SaveAsPng(path) |
Método terminal em GeneratedBarcode |
new SvgQRCode(qrCodeData).GetGraphic(10) |
.SaveAsImage(path) |
Passe extensão .svg para saída SVG |
new QRCode(qrCodeData).GetGraphic(...) |
QRCodeWriter.CreateQrCode(data, size, level) |
Utilizado para personalização de logotipos e cores. |
QRCodeGenerator.ECCLevel.L |
QRCodeWriter.QrErrorCorrectionLevel.Low |
|
QRCodeGenerator.ECCLevel.M |
QRCodeWriter.QrErrorCorrectionLevel.Medium |
Valor padrão quando não especificado |
QRCodeGenerator.ECCLevel.Q |
QRCodeWriter.QrErrorCorrectionLevel.High |
|
QRCodeGenerator.ECCLevel.H |
QRCodeWriter.QrErrorCorrectionLevel.Highest |
Necessário para incorporar o logotipo |
PayloadGenerator.WiFi(...).ToString() |
"WIFI:T:WPA;S:{ssid};P:{pass};;" |
Construa a string padrão diretamente |
PayloadGenerator.ContactData(...).ToString() |
"BEGIN:VCARD\n..." |
vCard é um padrão público. |
| Sem API de leitura | BarcodeReader.Read(path) |
Nova funcionalidade — sem biblioteca separada |
| Somente formato QR | 50+ formatos via BarcodeEncoding.* |
Nova capacidade |
Problemas e soluções comuns em migrações
Problema 1: Alteração no formato da string do PayloadGenerator
QRCoder: PayloadGenerator.WiFi, PayloadGenerator.ContactData e outros auxiliares produzem strings formatadas automaticamente. O código passa a saída do objeto auxiliar .ToString() para CreateQrCode.
Solução: Identifique a string que cada tipo PayloadGenerator produz — seu formato está documentado na especificação do código QR e é fácil de reproduzir. Para WiFi: WIFI:T:WPA;S:{ssid};P:{password};;. Para vCard: blocos padrão BEGIN:VCARD / END:VCARD. Escreva métodos auxiliares estáticos caso vários locais de chamada utilizem o mesmo tipo de carga útil:
public static string WifiPayload(string ssid, string password, string auth = "WPA")
=> $"WIFI:T:{auth};S:{ssid};P:{password};;";
public static string WifiPayload(string ssid, string password, string auth = "WPA")
=> $"WIFI:T:{auth};S:{ssid};P:{password};;";
Public Shared Function WifiPayload(ssid As String, password As String, Optional auth As String = "WPA") As String
Return $"WIFI:T:{auth};S:{ssid};P:{password};;"
End Function
Problema 2: Mapeamento de Enum ECCLevel
QRCoder: QRCodeGenerator.ECCLevel é um enum aninhado com os valores L, M, Q, H. É um parâmetro necessário em cada chamada CreateQrCode.
Solução: Mapeie cada valor para seu equivalente QRCodeWriter.QrErrorCorrectionLevel ao usar o caminho QRCodeWriter. Ao usar BarcodeWriter.CreateBarcode, o nível ECC padrão para Médio automaticamente e não requer parâmetro. Atualize cada local de chamada:
//QRCoderECCLevel.H →IronBarcode QrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);
//QRCoderECCLevel.M →IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
//QRCoderECCLevel.H →IronBarcode QrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);
//QRCoderECCLevel.M →IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
'QRCoderECCLevel.H →IronBarcode QrErrorCorrectionLevel.Highest
Dim qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
'QRCoderECCLevel.M →IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
Problema 3: Remoção da classe de renderização
QRCoder: Cada formato de saída requer sua própria instanciação da classe renderizadora — PngByteQRCode, SvgQRCode, AsciiQRCode, Base64QRCode, QRCode. Essas classes aceitam QRCodeData e expõem GetGraphic com diferentes tipos de retorno.
Solução: Remova todas as instâncias da classe de renderização. O IronBarcode incorpora a saída formatada nos métodos terminais da cadeia fluente. Substitua new PngByteQRCode(data).GetGraphic(n) por .ToPngBinaryData() após .ResizeTo(). Substitua new SvgQRCode(data).GetGraphic(n) por .SaveAsImage(path) (passando uma extensão .svg). O objeto intermediário QRCodeData também desaparece — não é necessário no IronBarcode.
Problema 4: Remoção de PngByteQRCode e dimensionamento baseado em módulos
QRCoder: PngByteQRCode.GetGraphic(int pixelsPerModule) dimensiona a saída pelo número de pixels por módulo QR. As dimensões da imagem resultante dependem do número de módulos, que varia de acordo com o comprimento do conteúdo e o nível de ECC.
Solução: Substitua o dimensionamento baseado em módulos por ResizeTo(int width, int height) para dimensões absolutas de pixel. Se o seu código calcula o tamanho de saída esperado dinamicamente a partir da contagem de módulos, mude para um tamanho de destino fixo que atenda aos seus requisitos de saída:
// Before: GetGraphic(20) — output size varies with content
var bytes = new PngByteQRCode(qrData).GetGraphic(20);
// After: fixed 400×400 regardless of content
byte[] bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
.ResizeTo(400, 400)
.ToPngBinaryData();
// Before: GetGraphic(20) — output size varies with content
var bytes = new PngByteQRCode(qrData).GetGraphic(20);
// After: fixed 400×400 regardless of content
byte[] bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
.ResizeTo(400, 400)
.ToPngBinaryData();
Imports System
' Before: GetGraphic(20) — output size varies with content
Dim bytes = New PngByteQRCode(qrData).GetGraphic(20)
' After: fixed 400×400 regardless of content
Dim bytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) _
.ResizeTo(400, 400) _
.ToPngBinaryData()
Lista de verificação para migração do QRCoder
Tarefas pré-migração
Antes de fazer qualquer alteração, audite o código-fonte de todos os usuários do QRCoder:
# Find allQRCodernamespace imports
grep -r "using QRCoder" --include="*.cs" .
# Find all generator and renderer instantiations
grep -r "QRCodeGenerator\|PngByteQRCode\|SvgQRCode\|AsciiQRCode\|QRCode\b" --include="*.cs" .
# Find all PayloadGenerator usages
grep -r "PayloadGenerator\." --include="*.cs" .
# Find ECCLevel references
grep -r "ECCLevel\." --include="*.cs" .
# Find ZXing.Net usage to remove at the same time
grep -r "using ZXing" --include="*.cs" .
# Find allQRCodernamespace imports
grep -r "using QRCoder" --include="*.cs" .
# Find all generator and renderer instantiations
grep -r "QRCodeGenerator\|PngByteQRCode\|SvgQRCode\|AsciiQRCode\|QRCode\b" --include="*.cs" .
# Find all PayloadGenerator usages
grep -r "PayloadGenerator\." --include="*.cs" .
# Find ECCLevel references
grep -r "ECCLevel\." --include="*.cs" .
# Find ZXing.Net usage to remove at the same time
grep -r "using ZXing" --include="*.cs" .
- Documente todos os tipos de
PayloadGeneratorem uso e anote seus formatos de saída de string - Observe todos os valores de nível ECC em uso e seus respectivos pontos de chamada.
- Identifique qualquer código de leitura ZXing .NET que tenha sido emparelhado com oQRCoderpara decodificação — este pode ser substituído ao mesmo tempo.
- Obtenha uma chave de licença do IronBarcode(chaves de avaliação estão disponíveis sem necessidade de cadastro)
Tarefas de atualização de código
- Execute
dotnet remove package QRCoder - Execute
dotnet remove package ZXing.Netse ele foi usado apenas para leitura junto com o QRCoder - Execute
dotnet add package IronBarcode - Adicione
IronBarCode.License.LicenseKey = "YOUR-KEY";à inicialização do aplicativo - Substitua todas as importações
using QRCoder;porusing IronBarCode; - Remova todas as declarações de instância
new QRCodeGenerator()—BarcodeWriteré estático - Substitua todos os padrões de corrente do renderizador +
generator.CreateQrCode(data, ECCLevel.X)por correntesBarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) - Substitua as chamadas
.GetGraphic(n)por.ToPngBinaryData()e adicione.ResizeTo(w, h)antes do terminal - Substitua os padrões de salvar
File.WriteAllBytes(path, bytes)por métodos terminais.SaveAsPng(path) - Substitua
new SvgQRCode(data).GetGraphic(n)por.SaveAsImage(path)(passe uma extensão.svg) - Substitua as instanciações do helper
PayloadGenerator.WiFi(...)e outros auxiliares por strings de formato direto - Mapeie cada valor
QRCodeGenerator.ECCLevelpara seu equivalenteQRCodeWriter.QrErrorCorrectionLevel - Substitua qualquer chamada
BarcodeReaderGeneric.Decode(bitmap)do ZXing.Net porBarcodeReader.Read(path) - Para a incorporação de logotipo, substitua
new QRCode(data).GetGraphic(n, ..., logoBitmap)porQRCodeWriter.CreateQrCodeWithLogo(data, logoPath, size)
Testes pós-migração
- Escaneie todos os códigos QR gerados com pelo menos dois aplicativos de leitura de código QR independentes para verificar a legibilidade.
- Verifique se os códigos QR incorporados no logotipo são escaneados corretamente — confirme se o nível de correção de erro é
Highest - Comparar a saída visual dos códigos gerados com amostras pré-migração onde a consistência visual é necessária.
- Teste todas as substituições
PayloadGenerator— confirme se WiFi, vCard e outras strings de carga útil são decodificadas corretamente nos dispositivos alvo - Se o ZXing.Net também foi removido, verifique se todos os caminhos de leitura de código de barras funcionam através de
BarcodeReader.Read - Execute o aplicativo em um ambiente limpo para confirmar que nenhuma referência residual aoQRCoderou ao ZXing .NET esteja causando falhas de vinculação.
- Verifique se a chave de licença do IronBarcode está carregada corretamente nos ambientes de produção e de teste.
Principais benefícios da migração para o IronBarcode
API Única para Todas as Operações de Código de Barras: Após a migração, toda tarefa de código de barras — geração, leitura, carimbo de PDF — usa o mesmo namespace IronBarCode e os mesmos pontos de entrada. Os desenvolvedores que ingressam no projeto aprendem apenas uma API, em vez de três. A revisão de código em todo o subsistema de código de barras torna-se consistente. A consulta de documentação é centralizada.
Leitura de Código de Barras Sem uma Segunda Biblioteca: BarcodeReader.Read lida com arquivos de imagem, páginas PDF, streamings e bitmaps na memória com detecção automática de formato. A capacidade de leitura que antes exigia o uso do ZXing .NET — com seus requisitos de especificação de formato e considerações de segurança de threads — está disponível imediatamente por meio de uma única chamada de método. O guia de leitura de código de barras a partir de imagens abrange a detecção de múltiplos códigos de barras, o pré-processamento de imagens e a digitalização de páginas PDF.
Expansão de Formato Sem Novas Dependências: Adicionar Code 128, EAN-13, DataMatrix, PDF417, ou qualquer outro formato suportado após a migração requer apenas um valor de parâmetro diferente BarcodeEncoding. Não há novos pacotes para instalar, novas APIs para aprender ou problemas de compatibilidade de versões para gerenciar. Os novos requisitos de formato passam a ser uma simples alteração de uma linha, em vez de uma nova integração de biblioteca.
Personalização Simplificada de Código QR: A incorporação de logotipo, mudanças de cor e controle de zona silenciosa estão disponíveis como métodos nomeados no resultado QRCodeWriter. A dependência System.Drawing.Bitmap que oQRCoderrequer para a incorporação de logotipo é substituída por uma simples string de caminho de arquivo. O guia de personalização do estilo de código QR documenta todas as opções de personalização disponíveis.
Integração com PDF integrada: os códigos de barras podem ser lidos de documentos PDF recebidos e inseridos em arquivos PDF existentes sem a necessidade de adicionar uma biblioteca PDF. Os fluxos de trabalho de processamento de documentos que exigiam uma dependência separada de PDF agora têm funcionalidades de código de barras e PDF consolidadas.
Redução dos custos de manutenção a longo prazo: A migração de três ou quatro pacotes independentes para um só elimina o acúmulo de custos associados ao acompanhamento de múltiplos ciclos de lançamento, à resolução de conflitos de versões entre bibliotecas e à atualização de múltiplos conjuntos de testes quando as versões do .NET são atualizadas. O custo de manutenção do subsistema de código de barras se reduz a uma única dependência de pacote.
Perguntas frequentes
Por que devo migrar do QRCoder.NET 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 QRCoder 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 QRCoder.NET 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 QRCoder.NET 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 QRCoder.NET?
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 QRCoder?
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 QRCoder.NET 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.

