Cómo Solucionar la Orientación del Código de Barras en C# | IronBarcode
Migrating from Telerik RadBarcodeto IronBarcode
Esta guía proporciona un camino completo de migración de Telerik RadBarcodea IronBarcode para los desarrolladores de .NET que han alcanzado los límites de lo que RadBarcode y RadBarcodeReader pueden hacer. Abarca la sustitución de paquetes, las actualizaciones de espacios de nombres, la inicialización de licencias, ejemplos de migración a nivel de código, una referencia de asignación de API y una lista de verificación para comprobar que la migración se ha completado. Los ejemplos se centran en los escenarios más comunes que se presentan durante las migraciones de códigos de barras de Telerik: reemplazo de controles XAML, expansión del formato de lectura, implementación en el servidor y procesamiento de PDF.
¿Por qué migrar desde Telerik RadBarcode?
Las migraciones de Telerik RadBarcodese desencadenan por requisitos técnicos concretos que los componentes existentes no pueden satisfacer. Las razones que se exponen a continuación representan las condiciones más comúnmente reportadas por los equipos que han completado o están evaluando esta transición.
Límite de Lectura 2D: El componente RadBarcodeReader en WPF y el componente RadBarcodeReader en WinForms comparten el mismo motor de lectura, que está limitado por el enum DecodeType. Esa enumeración contiene entradas para formatos lineales 1D — Code128, Code39, EAN13, EAN8, UPCA, UPCE, Codabar, ITF — y nada más. No existe ninguna entrada para Código QR, DataMatrix, PDF417 o Aztec. Cuando llega un nuevo requerimiento para procesar códigos QR entrantes o leer etiquetas DataMatrix de documentos escaneados, la restricción DecodeType se convierte en un obstáculo sin solución posible dentro de la familia de productos Telerik.
Fragmentación de Código de Plataforma: Leer con Telerik requiere dependencias del marco de UI: RadBarcodeReader utiliza tipos WPF (BitmapImage) y RadBarcodeReader utiliza tipos WinForms (System.Drawing.Image). Estos tipos no pueden ser referenciados en una biblioteca .NET compartida, una aplicación de consola, un proyecto ASP.NET Core o un servidor Blazor . Un equipo que quiera centralizar la lógica de lectura de códigos de barras en una capa de servicio compartido no puede hacerlo con los tipos de Telerik, ya que las implementaciones de los lectores están vinculadas permanentemente a sus respectivos marcos de interfaz de usuario.
Brecha en el procesamiento de PDF: Muchos flujos de trabajo de códigos de barras operan sobre documentos en lugar de archivos de imagen. Telerik RadBarcodeReader solo acepta imágenes de mapa de bits. Para leer un código de barras incrustado en una página PDF, es necesario convertir la página en una imagen utilizando una biblioteca independiente y, a continuación, introducir esa imagen en el lector Telerik, lo que añade una dependencia y sigue obteniendo solo resultados unidimensionales. Para los equipos cuyos documentos son principalmente archivos PDF, esta solución alternativa añade fricción en cada punto del flujo de trabajo.
Licencias por suscripción: La funcionalidad de códigos de barras de Telerik no se vende como un paquete independiente. El acceso a RadBarcode y RadBarcodeReader está incluido en suscripciones específicas de la suite de UI por plataforma; las suscripciones de UI de Telerik comienzan en $749 por desarrollador por año (nivel Lite) y DevCraft UI es $1,149 por desarrollador por año para todas las plataformas combinadas, según los precios publicados por Telerik para 2026. Los equipos cuyo requisito principal es la funcionalidad de código de barras, y que no utilizan otros controles de la interfaz de usuario de Telerik, asumen el coste total del Suite por un componente que representa una pequeña fracción de lo que se compra.
El problema fundamental
La expresión más clara de la limitación de lectura de Telerik es que el componente que genera un formato no puede procesarlo de ida y vuelta a través del lector:
// 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
IronBarcode soluciona este problema. La generación y la lectura utilizan el mismo paquete, y el motor de lectura detecta automáticamente códigos QR, DataMatrix, PDF417 y todos los demás 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: Comparación de características
| Característica | Telerik RadBarcode | IronBarcode |
|---|---|---|
| Generación de códigos de barras 1D | Sí (todas las plataformas) | Sí |
| Generación de códigos de barras 2D | Sí (todas las plataformas) | Sí |
| Lectura de códigos de barras 1D | Solo WPF + WinForms | Sí (todas las plataformas) |
| Lectura de código QR | Solo WPF | Sí (todas las plataformas) |
| Lectura de DataMatrix | Solo WPF | Sí (todas las plataformas) |
| Lectura del PDF417 | Solo WPF | Sí (todas las plataformas) |
| Lectura azteca | No disponible | Sí |
| Lectura de archivos PDF | No disponible | Sí (nativo) |
| Detección de formato automático | No — Se requiere DecodeType | Sí |
| Lectura ASP.NET Core | No disponible | Sí |
| Lectura de Blazor | No disponible | Sí |
| Lectura sobre Docker/Linux | No disponible | Sí |
| Biblioteca de servicios compartidos | No es posible (tipos de plataforma) | Sí |
| API de lectura estática | No (requiere instancia) | Sí |
| Paquete NuGet independiente | No — Se requiere Suite de interfaz de usuario | Sí |
| Licencia perpetua | Nivel perpetuo disponible junto con la suscripción | Sí — desde $749 (Lite) |
Inicio rápido
Paso 1: Sustituir el paquete NuGet
Elimine el paquete Telerik UI para la plataforma o plataformas de su proyecto:
# 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
Si su proyecto también utiliza otros controles de Telerik del mismo paquete, deje el paquete en su lugar y continúe con el paso 2. Eliminará las llamadas a la API específicas para códigos de barras sin eliminar el paquete compartido.
Instalar IronBarcode:
dotnet add package IronBarcode
dotnet add package IronBarcode
Un único paquete abarca WPF, WinForms, ASP.NET Core, Blazor Server, aplicaciones de consola, Docker, Azure Functions y AWS Lambda. La documentación completa sobre la compatibilidad de la plataforma detalla las versiones exactas de .NET y los sistemas operativos compatibles.
Paso 2: Actualizar los espacios de nombres
Elimine las importaciones del espacio de nombres de códigos de barras de Telerik y reemplácelas con el espacio de nombres de 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
Paso 3: Inicializar licencia
Sustituya la inicialización de la licencia de Telerik por la asignación de clave de IronBarcode al iniciar la aplicación:
// 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"
La asignación clave se realiza una sola vez en el punto de entrada de la aplicación. No hay ningún archivo de licencia que implementar, ni ruta de inicialización por plataforma, ni configuración separada para WPF frente a ASP.NET Core.
Ejemplos de migración de código
Generación de un código de barras: del control XAML a una API basada en código.
La generación de Telerik en WPF es declarativa — el elemento XAML RadBarcode se renderiza directamente en el árbol de UI. IronBarcode genera códigos de barras en código y devuelve un objeto GeneratedBarcode que se puede guardar como archivo o convertir en un BitmapSource para mostrar en WPF.
Enfoque de 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" />
Enfoque de 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)}"
El enum BarcodeEncoding cubre las mismas simbologías que el enum Symbology de Telerik. Cambiar a la generación de códigos QR solo modifica el argumento de enumeración. Para conocer todas las opciones de generación de códigos de barras 2D , incluidos los niveles de corrección de errores QR y las dimensiones DataMatrix, la documentación de IronBarcode proporciona ejemplos completos.
Lectura de códigos de barras desde aplicaciones de escritorio
Telerik proporciona dos clases de lector separadas para plataformas de escritorio — RadBarcodeReader para WPF y RadBarcodeReader para WinForms — con diferentes nombres de clase, diferentes nombres de propiedad y diferentes tipos de entrada. IronBarcode las reemplaza con una única llamada estática que funciona de manera idéntica en cualquier tipo de proyecto.
Enfoque de Telerik WPF:
La lectura en WPF requiere una instancia RadBarcodeReader, configuración explícita de DecodeType, un objeto BitmapImage cargado desde un URI, y una llamada a reader.Decode(). La propiedad de resultado es .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
Enfoque de Telerik WinForms:
La clase RadBarcodeReader de WinForms usa un nombre diferente, un nombre de propiedad diferente (DecodeType singular en lugar de DecodeTypes plural), y toma un System.Drawing.Image en lugar de un 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
Enfoque de 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() es un método estático — no se necesita instancia de lector. Acepta una cadena de ruta de archivo directamente sin requerir una carga de BitmapImage o System.Drawing.Image. La detección de formato es automática en los más de 50 tipos soportados. La propiedad de resultado es .Value en lugar de .Text. Esta misma llamada funciona sin modificaciones tanto en aplicaciones WPF como WinForms; no existe ninguna variante específica de la plataforma. Además, lee códigos QR, DataMatrix y cualquier otro formato presente en la imagen, a diferencia de los lectores Telerik, que están restringidos a formatos 1D.
Lectura de códigos QR: Antes imposible con Telerik
Si su base de código contiene un comentario o un NotSupportedException documentando que la lectura de códigos QR no está disponible, esto es su reemplazo. En Telerik no existe ninguna ruta de configuración que permita la lectura de códigos QR; este escenario no tiene equivalente en Telerik.
Enfoque de 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
Enfoque de 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
La misma llamada BarcodeReader.Read() que lee códigos de barras EAN-13 lee códigos QR. No existe una configuración independiente para formatos 2D. Para obtener una lista completa de los formatos de código de barras compatibles, tanto para lectura como para generación, la documentación de IronBarcode cubre las más de 50 entradas con notas específicas para cada formato.
Lectura de códigos de barras en un endpoint de ASP.NET Core
Telerik no proporciona ningún componente de lectura de códigos de barras para ASP.NET Core o Blazor. Si una aplicación existente redirige las imágenes cargadas a un servicio de escritorio para su lectura porque la capa web no dispone de un lector Telerik, esa solución alternativa se sustituye por la lectura directa en la capa web.
Enfoque de 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
Enfoque de 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() acepta un Stream directamente, por lo que el flujo de archivos cargado se pasa sin escribirlo en disco. Este controlador se implementa en Linux, Docker o Azure App Service sin necesidad de modificaciones.
Lectura de códigos de barras en archivos PDF
Telerik no tiene capacidad para leer códigos de barras PDF. Agregar lectura de PDF a una base de código existente basada en Telerik requiere una biblioteca de renderización de PDF para convertir páginas en imágenes antes de pasarlas a RadBarcodeReader. IronBarcode lee archivos PDF directamente.
Enfoque de 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
Enfoque de 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
No se necesita una biblioteca de PDF aparte. Sin paso de extracción de página. Sin conversión de imagen. Indique la ruta del PDF e IronBarcode procesará todas las páginas, devolviendo todos los códigos de barras con el número de página correspondiente. Se detectan tanto los códigos de barras 1D como los 2D en las páginas PDF.
Referencia de mapeo de la API de Telerik RadBarcodea 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" /> |
Generación del lado del servidor devolviendo ToPngBinaryData() |
Symbology.Code128 |
BarcodeEncoding.Code128 |
Symbology.QRCode |
BarcodeEncoding.QRCode |
new RadBarcodeReader() (WPF) |
Clase estática: no se necesita instancia. |
new RadBarcodeReader() (WinForms) |
Clase estática: no se necesita instancia. |
reader.DecodeTypes = new DecodeType[] { ... } (WPF) |
Detección automática: no se requiere ninguna especificación. |
reader.DecodeType = new DecodeType[] { ... } (WinForms) |
Detección automática: no se requiere ninguna especificación. |
reader.Decode(bitmapImage) (WPF) |
BarcodeReader.Read(imagePath) |
reader.Read(drawingImage) (WinForms) |
BarcodeReader.Read(imagePath) |
result.Text |
result.Value |
result.Symbology |
result.BarcodeType |
Se requiere BitmapImage como entrada (WPF) |
Se acepta ruta de archivo, Stream o arreglo de bytes |
Se requiere System.Drawing.Image como entrada (WinForms) |
Se acepta ruta de archivo, Stream o arreglo de bytes |
| Formatos 1D solo en lectura | Más de 50 formatos, incluyendo todos los tipos 2D. |
| WPF y WinForms solo lectura | Todas las plataformas .NET |
| No admite la lectura de archivos PDF. | BarcodeReader.Read("file.pdf") — nativo |
Problemas comunes de migración y soluciones
Problema 1: Reemplazo del control de código de barras XAML
Telerik: <telerik:RadBarcode> es un control visual que se renderiza directamente en el árbol de elementos UI de WPF. No puede ser reemplazado con un elemento Image sin cambios en el código detrás.
Solución: Reemplace el elemento <telerik:RadBarcode> con un control <Image> y genere el código de barras en el código detrás. Vincule el Image.Source a un BitmapSource generado por 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, reemplace <TelerikBarcode> con un elemento <img> cuyo atributo src reciba un PNG codificado en base64 generado del lado del servidor.
Problema 2: Efectos secundarios de la eliminación de DecodeType
Telerik: La propiedad DecodeTypes (WPF) o DecodeType (WinForms) filtra qué formatos intenta detectar el lector. Eliminar este filtro en una migración de IronBarcode significa que IronBarcode ahora devolverá resultados para todos los formatos presentes en la imagen, incluidos los formatos que anteriormente estaban excluidos por el filtro.
Solución: Elimine el bloque de asignación DecodeType por completo. Si los formatos adicionales detectados causan resultados inesperados en la lógica posterior, por ejemplo, si el código asumió que solo un formato de código de barras sería devuelto siempre, agregue filtro 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)
Esto es opcional. El comportamiento predeterminado (detectar todos los formatos) es correcto para la mayoría de los casos de uso y produce resultados que la implementación anterior de Telerik no podía ofrecer.
Problema 3: Limpieza de TelerikLicenseManager
Telerik: Las llamadas Telerik.WinControls.TelerikLicenseManager.InstallLicense(key) aparecen al iniciar la aplicación, generalmente en Program.cs (WinForms) o App.xaml.cs (WPF). La clave suele estar almacenada en la configuración de la aplicación, en un archivo de configuración o codificada directamente en el método de inicio.
Solución: Elimine la llamada TelerikLicenseManager.InstallLicense(). Reemplácelo con la asignación de clave de IronBarcode en la misma ubicación de inicio:
// 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"
Si el paquete Telerik sigue instalado (porque otros controles de Telerik que no son de códigos de barras todavía se están utilizando), la llamada TelerikLicenseManager para esos controles debe mantenerse. Solo elimine la llamada si se van a eliminar por completo los paquetes de Telerik.
Lista de verificación para la migración de Telerik RadBarcode
Tareas previas a la migración
Antes de realizar cambios en el código, revise el código fuente para detectar cualquier uso de códigos de barras de 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" .
Documenta cada partido. Indique qué archivos contienen controles XAML, cuáles contienen código de lectura y a qué plataforma pertenece cada archivo.
Tareas de actualización de código
- Elimine los paquetes NuGet de códigos de barras de Telerik (o consérvelos si son necesarios para otros controles).
- Instale el paquete NuGet
IronBarcodeen cada proyecto que requiera funcionalidad de códigos de barras - Agregue
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"en cada punto de entrada al inicio de la aplicación - Elimine las importaciones de espacio de nombres de Telerik y agregue
using IronBarCode - Reemplace los elementos XAML
<telerik:RadBarcode>con controles<Image> - Genere imágenes de códigos de barras en el código detrás usando
BarcodeWriter.CreateBarcode(...).ToBitmapSource() - Reemplace los componentes Razor
<TelerikBarcode>con fuentes base64 de<img>generadas del lado del servidor - Reemplace instancias
new RadBarcodeReader()con llamadas estáticasBarcodeReader.Read(path) - Reemplace instancias
new RadBarcodeReader()con llamadas estáticasBarcodeReader.Read(path) - Eliminar todos los
reader.DecodeTypes = new DecodeType[] { ... }andreader.DecodeType = new DecodeType[] { ... }bloques - Reemplace llamadas
reader.Decode(bitmapImage)conBarcodeReader.Read(imagePath) - Reemplace llamadas
reader.Read(drawingImage)conBarcodeReader.Read(imagePath) - Renombre
result.Textaresult.Valueen todos los puntos de acceso al resultado de lectura - Renombre
result.Symbologyaresult.BarcodeTypeen todos los puntos de verificación de formato - Reemplace enum de generación
Symbology.Code128y valores similares conBarcodeEncoding.Code128 - Elimine llamadas
TelerikLicenseManager.InstallLicense()donde los paquetes de Telerik se eliminan por completo
Pruebas posteriores a la migración
- Verificar que todos los códigos de barras 1D leídos previamente (Code128, EAN13, etc.) sigan devolviendo valores correctos.
- Confirme que los códigos QR en las imágenes de prueba ahora se leen correctamente donde anteriormente devolvían un valor nulo.
- Comprobar que los códigos de barras generados (guardados como PNG o servidos como bytes) se visualizan correctamente y se escanean sin problemas.
- Verificar que los puntos finales de ASP.NET Core o Blazor que anteriormente no podían realizar lecturas ahora funcionen correctamente.
- Si se agregó la lectura de PDF, confirme que los códigos de barras en cada página del PDF se detectan con los números de página correctos.
- Ejecute los comandos grep audit de la sección Pre-Migración para confirmar que no queden referencias a la API de códigos de barras de Telerik.
- Confirme que
IronBarCode.License.LicenseKeyesté configurado antes de la primera llamada aBarcodeReader.Read()oBarcodeWriter.CreateBarcode()
Principales ventajas de migrar a IronBarcode
Compatibilidad total con formatos 2D: Tras la migración, los formatos QR Code, DataMatrix, PDF417 y Aztec se pueden leer mediante la misma llamada a la API que ya leía Code128 y EAN13. No se requiere ninguna configuración adicional ni ninguna biblioteca independiente para los formatos 2D. El motor de lectura se encarga automáticamente de la identificación del formato.
API Unificada Multiplataforma: Las mismas llamadas BarcodeReader.Read() y BarcodeWriter.CreateBarcode() se compilan y ejecutan de manera idéntica en WPF, WinForms, ASP.NET Core, Blazor, aplicaciones de consola y contenedores Docker. La lógica del código de barras, escrita una sola vez en una biblioteca de servicios compartidos, funciona en todos los tipos de proyectos de la solución sin necesidad de modificaciones.
Procesamiento nativo de archivos PDF: IronBarcode lee los códigos de barras directamente de los archivos PDF, procesa todas las páginas y devuelve los resultados con metadatos que incluyen el número de página. Los flujos de trabajo que antes requerían una biblioteca de renderizado de PDF más un paso de lectura de Telerik se consolidan en una única llamada a un método, eliminando la dependencia de terceros y el paso intermedio de conversión de imágenes.
Eliminada la dependencia de suscripción para el acceso a códigos de barras: tras la migración, la funcionalidad de códigos de barras está disponible a través del modelo de licencia perpetua de IronBarcode. El acceso continuado no requiere renovación anual. Los equipos cuyo uso principal del Suite Telerik está relacionado con códigos de barras reducen sus gastos recurrentes de licencias a un coste único.
Base de Código Simplificada: El bloque de configuración DecodeType, el paso de carga BitmapImage, la selección de la clase de lector específica de la plataforma, y la cadena de propiedades result.Text son todos reemplazados por una única llamada a método estático con una colección de resultados que se autodeduce. El código que antes requería implementaciones diferentes para la lectura en WPF y WinForms ahora se simplifica a una única implementación compartida.
Preguntas Frecuentes
¿Por qué debería migrar de Telerik Barcode a IronBarcode?
Entre las razones más comunes se incluyen la simplificación de licencias (eliminando la complejidad de SDK + clave de tiempo de ejecución), la eliminación de límites de rendimiento, la obtención de compatibilidad nativa con PDF, la mejora de la implementación de Docker/CI/CD y la reducción de la repetición de API en el código de producción.
¿Cómo puedo sustituir las llamadas a la API de Telerik por IronBarcode?
Sustituya la creación de instancias y la repetición de licencias por IronBarCode.License.LicenseKey = "key". Sustituya las llamadas al lector por BarcodeReader.Read(path) y las llamadas al escritor por BarcodeWriter.CreateBarcode(data, encoding). Los métodos estáticos no requieren gestión de instancias.
¿Cuánto código cambia al migrar de Telerik Barcode a IronBarcode?
La mayoría de las migraciones se traducen en menos líneas de código. Se eliminan la repetición de licencias, los constructores de instancias y la configuración explícita de formatos. Las operaciones básicas de lectura/escritura se traducen a equivalentes IronBarcode más cortos con objetos de resultado más limpios.
¿Necesito mantener instalados Telerik Barcode e IronBarcode durante la migración?
No. La mayoría de las migraciones son sustituciones directas en lugar de operaciones paralelas. Migre una clase de servicio cada vez, sustituya la referencia NuGet y actualice los patrones de instanciación y llamada a la API antes de pasar a la siguiente clase.
¿Cuál es el nombre del paquete NuGet para IronBarcode?
El paquete es 'IronBarCode' (con B y C mayúsculas). Instálalo con 'Install-Package IronBarCode' o 'dotnet add package IronBarCode'. La directiva using en el código es 'using IronBarCode;'.
¿Cómo simplifica IronBarcode el despliegue de Docker en comparación con Telerik Barcode?
IronBarcode es un paquete NuGet sin archivos SDK externos ni configuración de licencia montada. En Docker, establezca la variable de entorno IRONBARCODE_LICENSE_KEY y el paquete se encargará de la validación de la licencia al inicio.
¿IronBarcode detecta automáticamente todos los formatos de código de barras tras la migración desde Telerik?
Sí, IronBarcode detecta automáticamente la simbología de todos los formatos compatibles. No es necesaria la enumeración explícita de BarcodeTypes. Si ya se conoce el formato y el rendimiento es importante, BarcodeReaderOptions permite restringir el espacio de búsqueda como optimización.
¿Puede IronBarcode leer códigos de barras de PDF sin una biblioteca independiente?
Sí. BarcodeReader.Read("document.pdf") procesa archivos PDF de forma nativa. Los resultados incluyen PageNumber, Format, Value y Confidence para cada código de barras encontrado. No es necesario ningún paso externo de procesamiento de PDF.
¿Cómo gestiona IronBarcode el procesamiento paralelo de códigos de barras?
Los métodos estáticos de IronBarcode no tienen estado y son seguros para los hilos. Utilice Parallel.ForEach directamente sobre listas de archivos sin gestión de instancias por subproceso. BarcodeReaderOptions.MaxParallelThreads controla el presupuesto interno de hilos.
¿Qué propiedades de los resultados cambian al migrar de Telerik Barcode a IronBarcode?
Cambios de nombre comunes: BarcodeValue se convierte en Value, BarcodeType se convierte en Format. Los resultados de IronBarcode también añaden Confidence y PageNumber. Una búsqueda y sustitución en toda la solución gestiona los cambios de nombre en el código de procesamiento de resultados existente.
¿Cómo configuro las licencias de IronBarcode en un proceso CI/CD?
Almacene IRONBARCODE_LICENSE_KEY como un secreto de canalización y asigne IronBarCode.License.LicenseKey en el código de inicio de la aplicación. Un secreto cubre todos los entornos, incluidos los de desarrollo, prueba, montaje y producción.
¿Admite IronBarcode la generación de códigos QR con estilos personalizados?
Sí. QRCodeWriter.CreateQrCode() admite colores personalizados mediante ChangeBarCodeColor(), incrustación de logotipos mediante AddBrandLogo(), niveles de corrección de errores configurables y múltiples formatos de salida, incluidos PNG, JPG, PDF y stream.

