Como corrigir a orientação do código de barras em C# | IronBarcode
Migrando deTelerik RadBarcodepara IronBarcode
Este guia fornece um caminho de migração completo doTelerik RadBarcodepara o IronBarcode para desenvolvedores .NET que atingiram os limites do que RadBarcode e RadBarcodeReader podem fazer. Abrange a substituição de pacotes, atualizações de namespace, inicialização de licenças, exemplos de migração em nível de código, uma referência de mapeamento de API e uma lista de verificação para garantir que a migração esteja completa. Os exemplos se concentram nos cenários mais comuns encontrados durante as migrações de código de barras da Telerik: substituição de controles XAML, expansão do formato de leitura, implantação no servidor e processamento de PDF.
Por que migrar do Telerik RadBarcode?
As migrações doTelerik RadBarcodesão motivadas por requisitos técnicos concretos que os componentes existentes não conseguem satisfazer. Os motivos abaixo representam as condições mais comumente relatadas por equipes que concluíram ou estão avaliando essa transição.
Limite de Leitura de 2D: O componente RadBarcodeReader no WPF e o componente RadBarcodeReader no WinForms compartilham o mesmo mecanismo de leitura, que é delimitado pelo enum DecodeType. Essa enumeração contém entradas para formatos lineares 1D — Code128, Code39, EAN13, EAN8, UPCA, UPCE, Codabar, ITF — e nada mais. Não existe nenhuma entrada para QR Code, DataMatrix, PDF417 ou Aztec. Quando um novo requisito chega para processar códigos QR de entrada ou ler etiquetas DataMatrix de documentos digitalizados, a restrição DecodeType se torna um bloqueio rígido sem solução alternativa disponível dentro da família de produtos Telerik.
Fragmentação de Código de Plataforma: A leitura com Telerik requer dependências do framework de UI: RadBarcodeReader usa tipos WPF (BitmapImage) e RadBarcodeReader usa tipos WinForms (System.Drawing.Image). Esses tipos não podem ser referenciados em uma biblioteca .NET compartilhada, um aplicativo de console, um projeto ASP.NET Core ou um servidor Blazor . Uma equipe que deseja centralizar a lógica de leitura de código de barras em uma camada de serviço compartilhada não pode fazê-lo com os tipos da Telerik — as implementações de leitores estão permanentemente vinculadas às suas respectivas estruturas de interface do usuário.
Lacuna no processamento de PDFs: Muitos fluxos de trabalho de código de barras operam em documentos em vez de arquivos de imagem. O leitor de código de barras RadBarcodeReader da Telerik aceita apenas imagens bitmap. A leitura de um código de barras incorporado em uma página PDF exige a conversão da página em uma imagem usando uma biblioteca separada e, em seguida, o envio dessa imagem para o leitor Telerik — adicionando uma dependência e ainda recebendo apenas resultados unidimensionais. Para equipes cujos documentos são principalmente PDFs, essa solução alternativa adiciona atrito em todos os pontos do fluxo de trabalho.
Licenciamento por assinatura: a funcionalidade de código de barras da Telerik não é vendida como um pacote independente. O acesso a RadBarcode e RadBarcodeReader está incluído em assinaturas de suíte de UI específicas de plataforma — as assinaturas de UI Telerik por plataforma começam em US$749 por desenvolvedor por ano (nível Lite) e DevCraft UI custa US$1.149 por desenvolvedor por ano para todas as plataformas combinadas, conforme a precificação publicada pela Telerik para 2026. Equipes cuja principal necessidade é a funcionalidade de código de barras, e que não utilizam outros controles da Telerik UI, absorvem o custo total do Suite por um componente que representa uma pequena fração do que é adquirido.
O problema fundamental
A expressão mais clara da limitação de leitura da Telerik é que o componente que gera um formato não pode enviá-lo de ida e volta através do leitor:
// Telerik — generates a QR code, then cannot read it back
var qrBarcode = new RadBarcode();
qrBarcode.Value = "https://example.com/order/4821";
qrBarcode.Symbology = new QRCode { ErrorCorrectionLevel = ErrorCorrectionLevel.H };
// Save to file...
// Attempt to read the same QR code:
var reader = new RadBarcodeReader();
// DecodeType.QR does not exist — QR cannot be added to this list
reader.DecodeTypes = new[] { DecodeType.Code128, DecodeType.EAN13 };
var bitmap = new BitmapImage(new Uri("qr-output.png", UriKind.Absolute));
var result = reader.Decode(bitmap);
// result == null — always, for any QR code image
// Telerik — generates a QR code, then cannot read it back
var qrBarcode = new RadBarcode();
qrBarcode.Value = "https://example.com/order/4821";
qrBarcode.Symbology = new QRCode { ErrorCorrectionLevel = ErrorCorrectionLevel.H };
// Save to file...
// Attempt to read the same QR code:
var reader = new RadBarcodeReader();
// DecodeType.QR does not exist — QR cannot be added to this list
reader.DecodeTypes = new[] { DecodeType.Code128, DecodeType.EAN13 };
var bitmap = new BitmapImage(new Uri("qr-output.png", UriKind.Absolute));
var result = reader.Decode(bitmap);
// result == null — always, for any QR code image
' Telerik — generates a QR code, then cannot read it back
Dim qrBarcode As New RadBarcode()
qrBarcode.Value = "https://example.com/order/4821"
qrBarcode.Symbology = New QRCode With {.ErrorCorrectionLevel = ErrorCorrectionLevel.H}
' Save to file...
' Attempt to read the same QR code:
Dim reader As New RadBarcodeReader()
' DecodeType.QR does not exist — QR cannot be added to this list
reader.DecodeTypes = New DecodeType() {DecodeType.Code128, DecodeType.EAN13}
Dim bitmap As New BitmapImage(New Uri("qr-output.png", UriKind.Absolute))
Dim result = reader.Decode(bitmap)
' result == null — always, for any QR code image
O IronBarcode resolve essa lacuna. A geração e a leitura utilizam o mesmo pacote, e o mecanismo de leitura detecta automaticamente códigos QR, DataMatrix, PDF417 e todos os outros formatos:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate a QR code
BarcodeWriter.CreateBarcode("https://example.com/order/4821", BarcodeEncoding.QRCode)
.SaveAsPng("qr-output.png");
// Read that same QR code back — no format specification needed
var results = BarcodeReader.Read("qr-output.png");
Console.WriteLine(results.First().Value);
// Output: https://example.com/order/4821
// NuGet: dotnet add package IronBarcode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate a QR code
BarcodeWriter.CreateBarcode("https://example.com/order/4821", BarcodeEncoding.QRCode)
.SaveAsPng("qr-output.png");
// Read that same QR code back — no format specification needed
var results = BarcodeReader.Read("qr-output.png");
Console.WriteLine(results.First().Value);
// Output: https://example.com/order/4821
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
' Generate a QR code
BarcodeWriter.CreateBarcode("https://example.com/order/4821", BarcodeEncoding.QRCode) _
.SaveAsPng("qr-output.png")
' Read that same QR code back — no format specification needed
Dim results = BarcodeReader.Read("qr-output.png")
Console.WriteLine(results.First().Value)
' Output: https://example.com/order/4821
IronBarcode vs Telerik RadBarcode: Comparação de Recursos
| Recurso | Telerik RadBarcode | IronBarcode |
|---|---|---|
| Geração de código de barras 1D | Sim (todas as plataformas) | Sim |
| Geração de código de barras 2D | Sim (todas as plataformas) | Sim |
| Leitura de código de barras 1D | Somente WPF + WinForms | Sim (todas as plataformas) |
| leitura de código QR | Somente WPF | Sim (todas as plataformas) |
| Leitura de DataMatrix | Somente WPF | Sim (todas as plataformas) |
| Leitura PDF417 | Somente WPF | Sim (todas as plataformas) |
| Leitura asteca | Não disponível | Sim |
| leitura de arquivos PDF | Não disponível | Sim (nativo) |
| Detecção automática de formato | Não — DecodeType obrigatório | Sim |
| Leitura de ASP.NET Core | Não disponível | Sim |
| Blazor lendo | Não disponível | Sim |
| Docker / Leitura Linux | Não disponível | Sim |
| Biblioteca de serviços compartilhados | Não é possível (tipos de plataforma) | Sim |
| API de leitura estática | Não (requer instância) | Sim |
| Pacote NuGet independente | Não — é necessário um Suite de interface de usuário. | Sim |
| Licença perpétua | Tier perpétua disponível junto com assinatura | Sim — a partir de $749 (Lite) |
Início rápido
Passo 1: Substitua o pacote NuGet
Remova o pacote Telerik UI para a plataforma ou plataformas do seu projeto:
# WPF
dotnet remove package Telerik.UI.for.Wpf.60.Xaml
# WinForms
dotnet remove package Telerik.UI.for.WinForms.Common
dotnet remove package Telerik.UI.for.WinForms.Barcode
# Blazor
dotnet remove package Telerik.UI.for.Blazor
# WPF
dotnet remove package Telerik.UI.for.Wpf.60.Xaml
# WinForms
dotnet remove package Telerik.UI.for.WinForms.Common
dotnet remove package Telerik.UI.for.WinForms.Barcode
# Blazor
dotnet remove package Telerik.UI.for.Blazor
Se o seu projeto também utiliza outros controles Telerik do mesmo pacote, mantenha o pacote instalado e prossiga para o passo 2. Você removerá as chamadas de API específicas para código de barras sem remover o pacote compartilhado.
Instale o IronBarcode:
dotnet add package IronBarcode
dotnet add package IronBarcode
Um único pacote abrange WPF, WinForms, ASP.NET Core, Blazor Server, aplicativos de console, Docker, Azure Functions e AWS Lambda. O documento completo com os detalhes de compatibilidade da plataforma especifica as versões exatas do .NET e os sistemas operacionais suportados.
Etapa 2: Atualizar Namespaces
Remova as importações do namespace de código de barras da Telerik e substitua-as pelo namespace do IronBarcode:
// Remove these namespace imports:
// using Telerik.Windows.Controls.Barcode; // WPF reader and generator
// using Telerik.Windows.Controls; // WPF general
// using Telerik.WinControls.UI; // WinForms
// using Telerik.WinControls.UI.Barcode; // WinForms barcode reader
// Add this:
using IronBarCode;
// Remove these namespace imports:
// using Telerik.Windows.Controls.Barcode; // WPF reader and generator
// using Telerik.Windows.Controls; // WPF general
// using Telerik.WinControls.UI; // WinForms
// using Telerik.WinControls.UI.Barcode; // WinForms barcode reader
// Add this:
using IronBarCode;
Imports IronBarCode
Etapa 3: Inicializar a licença
Substitua a inicialização da licença Telerik pela atribuição da chave IronBarcode na inicialização do aplicativo:
// Remove:
// Telerik.WinControls.TelerikLicenseManager.InstallLicense("key");
// Add at application startup (Program.cs, App.xaml.cs, or composition root):
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Remove:
// Telerik.WinControls.TelerikLicenseManager.InstallLicense("key");
// Add at application startup (Program.cs, App.xaml.cs, or composition root):
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Remove:
' Telerik.WinControls.TelerikLicenseManager.InstallLicense("key")
' Add at application startup (Program.vb, App.xaml.vb, or composition root):
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
A atribuição da chave é feita apenas uma vez no ponto de entrada do aplicativo. Não há arquivo de licença para implantar, nenhum caminho de inicialização por plataforma e nenhuma configuração separada para WPF versus ASP.NET Core.
Exemplos de migração de código
Geração de um código de barras: Controle XAML para API baseada em código
A geração da Telerik no WPF é declarativa — o elemento XAML RadBarcode renderiza diretamente na árvore de UI.IronBarcode gera códigos de barras em código e retorna um objeto GeneratedBarcode que pode ser salvo como um arquivo ou convertido em um BitmapSource para exibição no WPF.
Abordagem da Telerik:
<Window xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation">
<telerik:RadBarcode Value="PROD-2026-00184" Symbology="Code128" />
</Window>
<Window xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation">
<telerik:RadBarcode Value="PROD-2026-00184" Symbology="Code128" />
</Window>
@* Blazor — TelerikBarcode renders as a Razor component *@
<TelerikBarcode Value="PROD-2026-00184" Type="@BarcodeType.Code128" />
Abordagem do IronBarcode:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
// Save to file — replaces XAML generation + manual export
BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
// Display in WPF — assign to an Image control's Source property
var bitmapSource = BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128)
.ToBitmapSource();
barcodeImageControl.Source = bitmapSource;
// Serve in Blazor or ASP.NET Core — return as base64 src attribute
byte[] bytes = BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
string imgSrc = $"data:image/png;base64,{Convert.ToBase64String(bytes)}";
// NuGet: dotnet add package IronBarcode
using IronBarCode;
// Save to file — replaces XAML generation + manual export
BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
// Display in WPF — assign to an Image control's Source property
var bitmapSource = BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128)
.ToBitmapSource();
barcodeImageControl.Source = bitmapSource;
// Serve in Blazor or ASP.NET Core — return as base64 src attribute
byte[] bytes = BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
string imgSrc = $"data:image/png;base64,{Convert.ToBase64String(bytes)}";
Imports IronBarCode
' Save to file — replaces XAML generation + manual export
BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("barcode.png")
' Display in WPF — assign to an Image control's Source property
Dim bitmapSource = BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128) _
.ToBitmapSource()
barcodeImageControl.Source = bitmapSource
' Serve in Blazor or ASP.NET Core — return as base64 src attribute
Dim bytes As Byte() = BarcodeWriter.CreateBarcode("PROD-2026-00184", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.ToPngBinaryData()
Dim imgSrc As String = $"data:image/png;base64,{Convert.ToBase64String(bytes)}"
O enum BarcodeEncoding cobre as mesmas simbologias que o enum Symbology da Telerik. A mudança para a geração de código QR altera apenas o argumento enum. Para conhecer todas as opções de geração de códigos de barras 2D , incluindo os níveis de correção de erros QR e as dimensões DataMatrix, a documentação do IronBarcode fornece exemplos completos.
Leitura de códigos de barras em aplicativos de computador
A Telerik fornece duas classes leitoras separadas para plataformas desktop — RadBarcodeReader para WPF e RadBarcodeReader para WinForms — com nomes de classes diferentes, nomes de propriedades diferentes e tipos de entrada diferentes.IronBarcode substitui ambos com uma única chamada estática que funciona de forma idêntica em qualquer tipo de projeto.
Abordagem WPF da Telerik:
A leitura no WPF requer uma instância de RadBarcodeReader, configuração explícita de DecodeType, um objeto BitmapImage carregado a partir de um URI e uma chamada para reader.Decode(). A propriedade de resultado é .Text.
using Telerik.Windows.Controls.Barcode;
using System.Windows.Media.Imaging;
public string ReadProductBarcode(string imagePath)
{
var reader = new RadBarcodeReader();
reader.DecodeTypes = new DecodeType[]
{
DecodeType.Code128,
DecodeType.Code39,
DecodeType.EAN13,
DecodeType.EAN8,
DecodeType.UPCA,
DecodeType.UPCE,
DecodeType.Codabar,
DecodeType.ITF
};
var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
var result = reader.Decode(bitmap);
return result?.Text ?? "No barcode found";
}
using Telerik.Windows.Controls.Barcode;
using System.Windows.Media.Imaging;
public string ReadProductBarcode(string imagePath)
{
var reader = new RadBarcodeReader();
reader.DecodeTypes = new DecodeType[]
{
DecodeType.Code128,
DecodeType.Code39,
DecodeType.EAN13,
DecodeType.EAN8,
DecodeType.UPCA,
DecodeType.UPCE,
DecodeType.Codabar,
DecodeType.ITF
};
var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
var result = reader.Decode(bitmap);
return result?.Text ?? "No barcode found";
}
Imports Telerik.Windows.Controls.Barcode
Imports System.Windows.Media.Imaging
Public Function ReadProductBarcode(imagePath As String) As String
Dim reader = New RadBarcodeReader()
reader.DecodeTypes = New DecodeType() {
DecodeType.Code128,
DecodeType.Code39,
DecodeType.EAN13,
DecodeType.EAN8,
DecodeType.UPCA,
DecodeType.UPCE,
DecodeType.Codabar,
DecodeType.ITF
}
Dim bitmap = New BitmapImage(New Uri(imagePath, UriKind.Absolute))
Dim result = reader.Decode(bitmap)
Return If(result?.Text, "No barcode found")
End Function
Abordagem Telerik WinForms:
A classe RadBarcodeReader no WinForms usa um nome diferente, um nome de propriedade diferente (DecodeType singular em vez de DecodeTypes plural) e aceita um System.Drawing.Image em vez de um BitmapImage.
using Telerik.WinControls.UI.Barcode;
using System.Drawing;
public string ReadShippingLabel(string imagePath)
{
var reader = new RadBarcodeReader();
reader.DecodeType = new DecodeType[]
{
DecodeType.Code128,
DecodeType.ITF,
DecodeType.EAN13
};
using var image = Image.FromFile(imagePath);
var result = reader.Read(image);
return result?.Text ?? "No barcode found";
}
using Telerik.WinControls.UI.Barcode;
using System.Drawing;
public string ReadShippingLabel(string imagePath)
{
var reader = new RadBarcodeReader();
reader.DecodeType = new DecodeType[]
{
DecodeType.Code128,
DecodeType.ITF,
DecodeType.EAN13
};
using var image = Image.FromFile(imagePath);
var result = reader.Read(image);
return result?.Text ?? "No barcode found";
}
Imports Telerik.WinControls.UI.Barcode
Imports System.Drawing
Public Function ReadShippingLabel(imagePath As String) As String
Dim reader = New RadBarcodeReader()
reader.DecodeType = New DecodeType() {
DecodeType.Code128,
DecodeType.ITF,
DecodeType.EAN13
}
Using image = Image.FromFile(imagePath)
Dim result = reader.Read(image)
Return If(result?.Text, "No barcode found")
End Using
End Function
Abordagem do IronBarcode:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public string ReadProductBarcode(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public string ReadProductBarcode(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
}
Imports IronBarCode
Public Function ReadProductBarcode(imagePath As String) As String
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")
End Function
BarcodeReader.Read() é um método estático — nenhuma instância de leitor é necessária. Aceita diretamente uma string de caminho de arquivo sem exigir um carregamento de BitmapImage ou System.Drawing.Image. A detecção de formato é automática em todos os mais de 50 tipos suportados. A propriedade de resultado é .Value em vez de .Text. Essa mesma chamada funciona sem modificações tanto em aplicações WPF quanto em aplicações WinForms — não existe uma variante específica para cada plataforma. Ele também lê códigos QR, DataMatrix e qualquer outro formato presente na imagem, ao contrário dos leitores da Telerik, que são restritos a formatos 1D.
Leitura de códigos QR: algo antes impossível com a Telerik
Se a sua base de código contém um comentário ou uma NotSupportedException documentando que a leitura de QR não está disponível, esta é a sua substituição. Não existe nenhum caminho de configuração no Telerik que habilite a leitura de QR Code — este cenário não tem equivalente no Telerik.
Abordagem da Telerik:
// RadBarcodeReader does not support QR codes.
// DecodeType.QR does not exist in the Telerik enum.
public string ReadQrCode(string imagePath)
{
throw new NotSupportedException(
"Telerik RadBarcodeReader cannot read QR codes. " +
"DecodeType.QR is not a valid enum value.");
}
// RadBarcodeReader does not support QR codes.
// DecodeType.QR does not exist in the Telerik enum.
public string ReadQrCode(string imagePath)
{
throw new NotSupportedException(
"Telerik RadBarcodeReader cannot read QR codes. " +
"DecodeType.QR is not a valid enum value.");
}
' RadBarcodeReader does not support QR codes.
' DecodeType.QR does not exist in the Telerik enum.
Public Function ReadQrCode(imagePath As String) As String
Throw New NotSupportedException("Telerik RadBarcodeReader cannot read QR codes. " & _
"DecodeType.QR is not a valid enum value.")
End Function
Abordagem do IronBarcode:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public string ReadQrCode(string imagePath)
{
// QR codes, DataMatrix, PDF417, and Aztec are all detected automatically
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No QR code found";
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public string ReadQrCode(string imagePath)
{
// QR codes, DataMatrix, PDF417, and Aztec are all detected automatically
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No QR code found";
}
Imports IronBarCode
Public Function ReadQrCode(imagePath As String) As String
' QR codes, DataMatrix, PDF417, and Aztec are all detected automatically
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No QR code found")
End Function
A mesma chamada BarcodeReader.Read() que lê códigos de barras EAN-13 lê códigos QR. Não existe uma configuração separada para formatos 2D. Para obter uma lista completa dos formatos de código de barras suportados para leitura e geração, a documentação do IronBarcode abrange todas as mais de 50 entradas com notas específicas para cada formato.
Leitura de códigos de barras em um endpoint ASP.NET Core
A Telerik não fornece nenhum componente de leitura de código de barras para ASP.NET Core ou Blazor. Se um aplicativo existente encaminhava imagens carregadas para um serviço de desktop para leitura porque a camada web não possuía um leitor Telerik, essa solução alternativa é substituída pela leitura direta na camada web.
Abordagem da Telerik:
// No Telerik reading API available in ASP.NET Core.
// Workaround: forward uploaded file to a WPF or WinForms service
// that can reference Telerik.Windows.Controls.Barcode.
[HttpPost("read")]
public async Task<IActionResult> ReadBarcode(IFormFile imageFile)
{
// Must proxy to desktop service — no Telerik reader available here
var bytes = await ReadAllBytesAsync(imageFile);
var result = await _desktopBridgeService.ReadAsync(bytes);
return Ok(result);
}
// No Telerik reading API available in ASP.NET Core.
// Workaround: forward uploaded file to a WPF or WinForms service
// that can reference Telerik.Windows.Controls.Barcode.
[HttpPost("read")]
public async Task<IActionResult> ReadBarcode(IFormFile imageFile)
{
// Must proxy to desktop service — no Telerik reader available here
var bytes = await ReadAllBytesAsync(imageFile);
var result = await _desktopBridgeService.ReadAsync(bytes);
return Ok(result);
}
Imports Microsoft.AspNetCore.Mvc
' No Telerik reading API available in ASP.NET Core.
' Workaround: forward uploaded file to a WPF or WinForms service
' that can reference Telerik.Windows.Controls.Barcode.
<HttpPost("read")>
Public Async Function ReadBarcode(imageFile As IFormFile) As Task(Of IActionResult)
' Must proxy to desktop service — no Telerik reader available here
Dim bytes = Await ReadAllBytesAsync(imageFile)
Dim result = Await _desktopBridgeService.ReadAsync(bytes)
Return Ok(result)
End Function
Abordagem do IronBarcode:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/barcode")]
public class BarcodeController : ControllerBase
{
[HttpPost("read")]
public IActionResult ReadBarcode(IFormFile imageFile)
{
using var stream = imageFile.OpenReadStream();
var results = BarcodeReader.Read(stream);
return Ok(results.Select(r => new
{
Format = r.BarcodeType.ToString(),
Value = r.Value
}));
}
[HttpGet("generate")]
public IActionResult GenerateBarcode([FromQuery] string data)
{
var bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
return File(bytes, "image/png");
}
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/barcode")]
public class BarcodeController : ControllerBase
{
[HttpPost("read")]
public IActionResult ReadBarcode(IFormFile imageFile)
{
using var stream = imageFile.OpenReadStream();
var results = BarcodeReader.Read(stream);
return Ok(results.Select(r => new
{
Format = r.BarcodeType.ToString(),
Value = r.Value
}));
}
[HttpGet("generate")]
public IActionResult GenerateBarcode([FromQuery] string data)
{
var bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
return File(bytes, "image/png");
}
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("api/barcode")>
Public Class BarcodeController
Inherits ControllerBase
<HttpPost("read")>
Public Function ReadBarcode(imageFile As IFormFile) As IActionResult
Using stream = imageFile.OpenReadStream()
Dim results = BarcodeReader.Read(stream)
Return Ok(results.Select(Function(r) New With {
.Format = r.BarcodeType.ToString(),
.Value = r.Value
}))
End Using
End Function
<HttpGet("generate")>
Public Function GenerateBarcode(<FromQuery> data As String) As IActionResult
Dim bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.ToPngBinaryData()
Return File(bytes, "image/png")
End Function
End Class
BarcodeReader.Read() aceita um Stream diretamente, então o stream de arquivo carregado é passado sem escrever no disco. Este controlador pode ser implantado em Linux, Docker ou no Serviço de Aplicativos do Azure sem necessidade de modificações.
Leitura de códigos de barras em arquivos PDF
A Telerik não possui capacidade de leitura de código de barras em PDF. Adicionar a leitura de PDF a uma base de código existente baseada em Telerik requer uma biblioteca de renderização de PDF para converter páginas em imagens antes de passá-las para RadBarcodeReader. O IronBarcode lê arquivos PDF diretamente.
Abordagem da Telerik:
// No direct PDF reading support in RadBarcodeReader.
// Workaround: use a separate PDF library to extract page images
using SomePdfLibrary; // third-party dependency
using Telerik.Windows.Controls.Barcode;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var results = new List<string>();
var pages = PdfRenderer.ExtractPages(pdfPath); // third-party call
foreach (var pageImage in pages)
{
var reader = new RadBarcodeReader();
reader.DecodeTypes = new[] { DecodeType.Code128, DecodeType.EAN13 };
var bitmap = ConvertToBitmapImage(pageImage); // conversion required
var result = reader.Decode(bitmap);
if (result != null)
results.Add(result.Text); // 1D only — QR codes on PDF pages are missed
}
return results;
}
// No direct PDF reading support in RadBarcodeReader.
// Workaround: use a separate PDF library to extract page images
using SomePdfLibrary; // third-party dependency
using Telerik.Windows.Controls.Barcode;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var results = new List<string>();
var pages = PdfRenderer.ExtractPages(pdfPath); // third-party call
foreach (var pageImage in pages)
{
var reader = new RadBarcodeReader();
reader.DecodeTypes = new[] { DecodeType.Code128, DecodeType.EAN13 };
var bitmap = ConvertToBitmapImage(pageImage); // conversion required
var result = reader.Decode(bitmap);
if (result != null)
results.Add(result.Text); // 1D only — QR codes on PDF pages are missed
}
return results;
}
Imports SomePdfLibrary ' third-party dependency
Imports Telerik.Windows.Controls.Barcode
Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
Dim results As New List(Of String)()
Dim pages = PdfRenderer.ExtractPages(pdfPath) ' third-party call
For Each pageImage In pages
Dim reader As New RadBarcodeReader()
reader.DecodeTypes = New DecodeType() {DecodeType.Code128, DecodeType.EAN13}
Dim bitmap = ConvertToBitmapImage(pageImage) ' conversion required
Dim result = reader.Decode(bitmap)
If result IsNot Nothing Then
results.Add(result.Text) ' 1D only — QR codes on PDF pages are missed
End If
Next
Return results
End Function
Abordagem do IronBarcode:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var results = BarcodeReader.Read(pdfPath);
return results.Select(r =>
$"Page {r.PageNumber}: {r.BarcodeType} — {r.Value}").ToList();
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var results = BarcodeReader.Read(pdfPath);
return results.Select(r =>
$"Page {r.PageNumber}: {r.BarcodeType} — {r.Value}").ToList();
}
Imports IronBarCode
Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
Dim results = BarcodeReader.Read(pdfPath)
Return results.Select(Function(r) $"Page {r.PageNumber}: {r.BarcodeType} — {r.Value}").ToList()
End Function
Não é necessária nenhuma biblioteca PDF separada. Sem etapa de extração de página. Sem conversão de imagem. Informe o caminho do PDF e o IronBarcode processará todas as páginas, retornando todos os códigos de barras com o número da página. São detectados códigos de barras 1D e 2D em páginas PDF.
Referência de mapeamento da API RadBarcode da Telerik para o IronBarcode
| Telerik RadBarcode | IronBarcode |
|---|---|
TelerikLicenseManager.InstallLicense("key") |
IronBarCode.License.LicenseKey = "key" |
<telerik:RadBarcode Value="..." Symbology="Code128" /> |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) |
<TelerikBarcode Type="@BarcodeType.Code128" /> |
Geração no lado do servidor retornando ToPngBinaryData() |
Symbology.Code128 |
BarcodeEncoding.Code128 |
Symbology.QRCode |
BarcodeEncoding.QRCode |
new RadBarcodeReader() (WPF) |
Classe estática — não é necessária nenhuma instância. |
new RadBarcodeReader() (WinForms) |
Classe estática — não é necessária nenhuma instância. |
reader.DecodeTypes = new DecodeType[] { ... } (WPF) |
Detecção automática — nenhuma especificação necessária |
reader.DecodeType = new DecodeType[] { ... } (WinForms) |
Detecção automática — nenhuma especificação necessária |
reader.Decode(bitmapImage) (WPF) |
BarcodeReader.Read(imagePath) |
reader.Read(drawingImage) (WinForms) |
BarcodeReader.Read(imagePath) |
result.Text |
result.Value |
result.Symbology |
result.BarcodeType |
BitmapImage necessário como entrada (WPF) |
Caminho de arquivo, Stream ou array de bytes aceitos |
System.Drawing.Image necessário como entrada (WinForms) |
Caminho de arquivo, Stream ou array de bytes aceitos |
| Formatos 1D apenas para leitura | Mais de 50 formatos, incluindo todos os tipos 2D. |
| WPF e WinForms somente leitura | Todas as plataformas .NET |
| Sem suporte para leitura de PDF | BarcodeReader.Read("file.pdf") — nativo |
Problemas e soluções comuns em migrações
Problema 1: Substituição do controle de código de barras XAML
Telerik: <telerik:RadBarcode> é um controle visual que renderiza diretamente na árvore de elementos de UI do WPF. Não pode ser substituído por um elemento Image sem alterações no código-behind.
Solução: Substituir o elemento <telerik:RadBarcode> por um controle <Image> e gerar o código de barras no código-behind. Vincule o Image.Source a um BitmapSource gerado pelo IronBarcode:
// In code-behind or ViewModel
using IronBarCode;
var generated = BarcodeWriter.CreateBarcode(barcodeValue, BarcodeEncoding.Code128)
.ResizeTo(400, 100);
BarcodeImage.Source = generated.ToBitmapSource();
// In code-behind or ViewModel
using IronBarCode;
var generated = BarcodeWriter.CreateBarcode(barcodeValue, BarcodeEncoding.Code128)
.ResizeTo(400, 100);
BarcodeImage.Source = generated.ToBitmapSource();
Imports IronBarCode
' In code-behind or ViewModel
Dim generated = BarcodeWriter.CreateBarcode(barcodeValue, BarcodeEncoding.Code128) _
.ResizeTo(400, 100)
BarcodeImage.Source = generated.ToBitmapSource()
Para Blazor, substitua <TelerikBarcode> por um elemento <img> cujo atributo src recebe um PNG codificado em base64 gerado no lado do servidor.
Problema 2: Efeitos colaterais da remoção do DecodeType
Telerik: A propriedade DecodeTypes (WPF) ou DecodeType (WinForms) filtra quais formatos o leitor tenta detectar. Remover esse filtro em uma migração do IronBarcode significa que o IronBarcode agora retornará resultados para todos os formatos presentes na imagem, incluindo formatos que foram previamente excluídos pelo filtro.
Solução: Remover completamente o bloco de atribuição DecodeType. Se os formatos adicionais detectados causarem resultados inesperados na lógica subsequente — por exemplo, se o código assumir que apenas um formato de código de barras seria retornado — adicione filtragem opcional usando BarcodeReaderOptions:
using IronBarCode;
var options = new BarcodeReaderOptions
{
ExpectedBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.EAN13
};
var results = BarcodeReader.Read(imagePath, options);
using IronBarCode;
var options = new BarcodeReaderOptions
{
ExpectedBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.EAN13
};
var results = BarcodeReader.Read(imagePath, options);
Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.ExpectedBarcodeTypes = BarcodeEncoding.Code128 Or BarcodeEncoding.EAN13
}
Dim results = BarcodeReader.Read(imagePath, options)
Isso é opcional. O comportamento padrão (detectar todos os formatos) é correto para a maioria dos casos de uso e produz resultados que a implementação anterior da Telerik não conseguia.
Problema 3: Limpeza do TelerikLicenseManager
Telerik: Chamadas Telerik.WinControls.TelerikLicenseManager.InstallLicense(key) aparecem na inicialização do aplicativo, tipicamente em Program.cs (WinForms) ou App.xaml.cs (WPF). A chave geralmente é armazenada nas configurações do aplicativo, em um arquivo de configuração ou está codificada no método de inicialização.
Solução: Remover a chamada TelerikLicenseManager.InstallLicense(). Substitua-o pela atribuição de chave IronBarcode no mesmo local de inicialização:
// Remove:
// Telerik.WinControls.TelerikLicenseManager.InstallLicense("TELERIK-KEY");
// Add:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Remove:
// Telerik.WinControls.TelerikLicenseManager.InstallLicense("TELERIK-KEY");
// Add:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Remove:
' Telerik.WinControls.TelerikLicenseManager.InstallLicense("TELERIK-KEY")
' Add:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Se o pacote Telerik permanecer instalado (porque outros controles Telerik não relacionados a códigos de barras ainda estão em uso), a chamada TelerikLicenseManager para esses controles deve ser preservada. Só remova a chamada se os pacotes Telerik estiverem sendo completamente removidos.
Lista de verificação para migração do Telerik RadBarcode
Tarefas pré-migração
Antes de fazer alterações no código, verifique se há alguma menção ao uso de códigos de barras da Telerik:
# License initialization
grep -r "TelerikLicenseManager.InstallLicense" --include="*.cs" .
# XAML generation controls
grep -r "RadBarcode" --include="*.xaml" .
grep -r "TelerikBarcode" --include="*.razor" .
# Code-behind generation references
grep -r "RadBarcode" --include="*.cs" .
grep -r "Symbology\." --include="*.cs" .
# Reading API — WPF
grep -r "RadBarcodeReader" --include="*.cs" .
grep -r "DecodeTypes\." --include="*.cs" .
grep -r "reader\.Decode(" --include="*.cs" .
# Reading API — WinForms
grep -r "BarCodeReader" --include="*.cs" .
grep -r "DecodeType\." --include="*.cs" .
grep -r "reader\.Read(" --include="*.cs" .
# Result property access
grep -r "result\.Text" --include="*.cs" .
grep -r "result\.Symbology" --include="*.cs" .
# License initialization
grep -r "TelerikLicenseManager.InstallLicense" --include="*.cs" .
# XAML generation controls
grep -r "RadBarcode" --include="*.xaml" .
grep -r "TelerikBarcode" --include="*.razor" .
# Code-behind generation references
grep -r "RadBarcode" --include="*.cs" .
grep -r "Symbology\." --include="*.cs" .
# Reading API — WPF
grep -r "RadBarcodeReader" --include="*.cs" .
grep -r "DecodeTypes\." --include="*.cs" .
grep -r "reader\.Decode(" --include="*.cs" .
# Reading API — WinForms
grep -r "BarCodeReader" --include="*.cs" .
grep -r "DecodeType\." --include="*.cs" .
grep -r "reader\.Read(" --include="*.cs" .
# Result property access
grep -r "result\.Text" --include="*.cs" .
grep -r "result\.Symbology" --include="*.cs" .
Documente cada partida. Observe quais arquivos contêm controles XAML, quais contêm código de leitura e a qual plataforma cada arquivo pertence.
Tarefas de atualização de código
- Remova os pacotes NuGet de código de barras da Telerik (ou mantenha-os, se necessários para outros controles).
- Instale o pacote NuGet
IronBarcodeem cada projeto que necessitar de funcionalidade de código de barras - Adicione
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"em cada ponto de entrada de inicialização do aplicativo - Remova as importações de namespace Telerik e adicione
using IronBarCode - Substitua os elementos XAML
<telerik:RadBarcode>por controles<Image> - Gere imagens de código de barras no código-behind usando
BarcodeWriter.CreateBarcode(...).ToBitmapSource() - Substitua os componentes Razor
<TelerikBarcode>por fontes base64<img>geradas no lado do servidor - Substitua as instâncias
new RadBarcodeReader()por chamadas estáticasBarcodeReader.Read(path) - Substitua as instâncias
new RadBarcodeReader()por chamadas estáticasBarcodeReader.Read(path) - Exclua todos os
reader.DecodeTypes = new DecodeType[] { ... }andreader.DecodeType = new DecodeType[] { ... }blocos - Substitua as chamadas
reader.Decode(bitmapImage)porBarcodeReader.Read(imagePath) - Substitua as chamadas
reader.Read(drawingImage)porBarcodeReader.Read(imagePath) - Renomeie
result.Textpararesult.Valueem todos os pontos de acesso a resultados de leitura - Renomeie
result.Symbologypararesult.BarcodeTypeem todos os pontos de verificação de formato - Substitua
Symbology.Code128e valores similares de enum de geração porBarcodeEncoding.Code128 - Remova as chamadas
TelerikLicenseManager.InstallLicense()onde os pacotes Telerik estão totalmente removidos
Testes pós-migração
- Verifique se todos os códigos de barras 1D lidos anteriormente (Code128, EAN13, etc.) continuam retornando valores corretos.
- Confirme se os códigos QR nas imagens de teste agora são lidos com sucesso, enquanto anteriormente retornavam valor nulo.
- Testar se os códigos de barras gerados (salvos como PNG ou fornecidos como bytes) são exibidos corretamente e lidos de forma adequada.
- Verifique se os endpoints do ASP.NET Core ou Blazor que anteriormente não conseguiam realizar leituras agora funcionam corretamente.
- Caso a leitura de PDF tenha sido adicionada, confirme se os códigos de barras em cada página do PDF são detectados com os números de página corretos. Execute os comandos grep audit da seção Pré-Migração para confirmar que não há referências restantes à API de código de barras da Telerik.
- Confirme que
IronBarCode.License.LicenseKeyestá configurado antes da primeira chamadaBarcodeReader.Read()ouBarcodeWriter.CreateBarcode()
Principais benefícios da migração para o IronBarcode
Suporte completo a formatos 2D: Após a migração, os formatos QR Code, DataMatrix, PDF417 e Aztec podem ser lidos pela mesma chamada de API que já lia Code128 e EAN13. Nenhuma configuração adicional é necessária e nenhuma biblioteca separada é requerida para formatos 2D. O mecanismo de leitura realiza a identificação do formato automaticamente.
API Unificada Multiplataforma: As mesmas chamadas BarcodeReader.Read() e BarcodeWriter.CreateBarcode() compilam e executam de forma idêntica no WPF, WinForms, ASP.NET Core, Blazor, aplicações de console e contêineres Docker. A lógica de código de barras, escrita uma única vez em uma biblioteca de serviços compartilhada, funciona em todos os tipos de projeto da solução sem necessidade de modificações.
Processamento nativo de arquivos PDF: o IronBarcode lê códigos de barras diretamente de arquivos PDF, processando todas as páginas e retornando os resultados com metadados de número de página. Fluxos de trabalho que antes exigiam uma biblioteca de renderização de PDF e uma etapa de leitura da Telerik foram consolidados em uma única chamada de método, eliminando a dependência de terceiros e a etapa intermediária de conversão de imagem.
Eliminação da dependência de assinatura para acesso a códigos de barras: após a migração, a funcionalidade de código de barras estará disponível por meio do modelo de licenciamento perpétuo da IronBarcode. O acesso contínuo não requer renovação anual. As equipes cujo uso principal do Suite Telerik estava relacionado a códigos de barras reduzem seus custos recorrentes de licenciamento a um custo único.
Base de Código Simplificada: O bloco de configuração DecodeType, a etapa de carregamento BitmapImage, a seleção da classe de leitor específica da plataforma e a cadeia de propriedades result.Text são todos substituídos por uma única chamada de método estático com uma coleção de resultados de detecção automática. O código que antes exigia implementações diferentes para leitura em WPF e WinForms agora é consolidado em uma única implementação compartilhada.
Perguntas frequentes
Por que devo migrar do Telerik 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 Telerik 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 Telerik 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 Telerik 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 Telerik 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 Telerik?
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 Telerik 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.

