How to Fix Barcode Orientation in C# | IronBarcode
从Telerik RadBarcode迁移到IronBarcode
本指南为超过RadBarcodeReader功能极限的.NET开发者提供从Telerik RadBarcode迁移到IronBarcode的完整路径。 它涵盖了软件包替换、命名空间更新、许可证初始化、代码级迁移示例、API 映射参考以及用于验证迁移是否完成的检查清单。 这些示例重点关注 Telerik 条形码迁移过程中最常遇到的场景:XAML 控件替换、读取格式扩展、服务器端部署和 PDF 处理。
为什么要从Telerik RadBarcode迁移?
Telerik RadBarcode 的迁移是由现有组件无法满足的具体技术需求触发的。 以下原因代表了已完成或正在评估此转型的团队最常报告的情况。
二维读取边界: WPF中的DecodeType枚举约束。 该枚举包含 1D 线性格式的条目——Code128、Code39、EAN13、EAN8、UPCA、UPCE、Codabar、ITF——除此之外,没有其他内容。 没有 QR 码、DataMatrix、PDF417 或 Aztec 的条目。 当需要处理入站QR码或从扫描文档中读取数据矩阵标签的新需求到来时,DecodeType约束成为一个无法解决的重大阻碍,在Telerik产品系列中没有可用的解决方案。
平台代码碎片化: 使用Telerik进行读取需要UI框架依赖:System.Drawing.Image)。 这些类型不能在共享的.NET库、控制台应用程序、 ASP.NET Core项目或Blazor服务器中引用。 如果团队希望将条形码读取逻辑集中在共享服务层中,那么使用 Telerik 类型是行不通的——读取器实现永久地与其各自的 UI 框架绑定在一起。
PDF 处理差距:许多条形码工作流程处理的是文档而不是图像文件。 Telerik RadBarcodeReader 仅接受位图图像。 读取嵌入在 PDF 页面中的条形码需要使用单独的库将页面转换为图像,然后将该图像提供给 Telerik 阅读器——这增加了依赖关系,但仍然只能获得 1D 结果。 对于文档主要为 PDF 格式的团队来说,这种变通方法会在工作流程的每个环节增加摩擦。
订阅许可: Telerik 条形码功能不作为独立软件包出售。 对RadBarcodeReader的访问与平台特定的UI套件订阅捆绑在一起—每个平台的Telerik UI订阅起价为每开发者每年$749(Lite级别),而Telerik公布的2026价格中说,所有平台组合的DevCraft UI为每开发者每年$1,149。 对于主要需求是条形码功能且不使用其他 Telerik UI 控件的团队来说,他们承担了整个Suite的费用,而该组件仅占所购组件的一小部分。
基本问题
Telerik 读取限制最明显的表现形式是,生成格式的组件无法将其与读取器进行往返转换:
// 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弥补了这一空白。生成和读取使用同一个软件包,读取引擎可以自动检测QR码、DataMatrix、PDF417以及所有其他格式:
// 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与 Telerik RadBarcode:功能对比
| 特征 | Telerik RadBarcode | IronBarcode |
|---|---|---|
| 一维条形码生成 | 是的(所有平台) | 是 |
| 二维条形码生成 | 是的(所有平台) | 是 |
| 一维条形码读取 | 仅限 WPF + WinForms | 是的(所有平台) |
| 二维码读取 | 仅限WPF | 是的(所有平台) |
| DataMatrix 读取 | 仅限WPF | 是的(所有平台) |
| PDF417 阅读 | 仅限WPF | 是的(所有平台) |
| 阿兹特克语 | 不可用 | 是 |
| 读取PDF文件 | 不可用 | 是的(母语) |
| 自动格式检测 | 否 — 需要解码类型 | 是 |
| ASP.NET Core阅读 | 不可用 | 是 |
| Blazor阅读 | 不可用 | 是 |
| Docker/Linux 阅读 | 不可用 | 是 |
| 共享服务库 | 不可能(平台类型) | 是 |
| 静态读取 API | 否(需要实例) | 是 |
| 独立NuGet包 | 不需要——需要用户界面Suite | 是 |
| 永久许可证 | 永久层可与订阅一起提供 | 是的——从749美元起(Lite) |
快速入门
步骤 1:替换 NuGet 软件包
移除项目中对应平台或多个平台的 Telerik UI 包:
# 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
如果您的项目还使用了同一软件包中的其他 Telerik 控件,请保留该软件包并继续执行步骤 2。您将删除条形码特定的 API 调用,而无需删除共享软件包。
安装IronBarcode:
dotnet add package IronBarcode
dotnet add package IronBarcode
一个软件包涵盖 WPF、WinForms、 ASP.NET Core、 Blazor Server、控制台应用程序、Docker、Azure Functions 和 AWS Lambda。 完整的平台兼容性详情文档列出了支持的确切.NET版本和操作系统目标。
步骤 2:更新命名空间
移除 Telerik 条形码命名空间导入,并将其替换为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
步骤 3:初始化许可证
在应用程序启动时,将 Telerik 许可证初始化替换为IronBarcode密钥分配:
// 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"
密钥分配在应用程序入口点进行一次。 没有需要部署的许可证文件,没有每个平台的初始化路径,也没有针对 WPF 与ASP.NET Core 的单独配置。
代码迁移示例
生成条形码:从 XAML 控件到基于代码的 API
Telerik在WPF中的生成是声明性的—RadBarcode XAML元素直接在用户界面树中渲染。 IronBarcode在代码中生成条形码,并返回一个BitmapSource以供WPF显示。
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" />
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)}"
Symbology枚举相同的符号。 切换到二维码生成方式只会更改枚举参数。 IronBarcode文档提供了完整的示例,详细介绍了2D 条形码生成选项,包括 QR 纠错级别和 DataMatrix 尺寸。
从桌面应用程序读取条形码
Telerik为桌面平台提供了两个独立的阅读器类—用于WPF的RadBarcodeReader—它们的类名、属性名和输入类型都不同。IronBarcode用一个在两种项目类型中都可以正常工作的静态调用来替代这两者。
Telerik WPF 方法:
WPF阅读需要一个reader.Decode()的调用。 结果属性是.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
Telerik WinForms 方法:
WinForms 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
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()是一个静态方法—无需阅读器实例。 它直接接受文件路径字符串,而无需System.Drawing.Image加载。 所有50多个支持类型的格式检测都是自动的。结果属性是.Text。 同样的调用无需修改即可在 WPF 和 WinForms 应用程序中运行——没有平台特定的变体。 它还可以读取二维码、DataMatrix 以及图像中存在的任何其他格式,这与 Telerik 阅读器仅限于一维格式不同。
读取二维码:Telerik 以前无法做到
如果您的代码库中包含注释或NotSupportedException记录QR读取不可用,这是它的替换方案。 Telerik 中不存在启用 QR 读取的配置路径——此场景在 Telerik 中没有等效方案。
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
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
读取EAN-13条形码的同一个BarcodeReader.Read()调用也可以读取QR码。 没有针对 2D 格式的单独配置。 有关读取和生成支持的条形码格式的完整列表,请参阅IronBarcode文档,其中包含 50 多个条目以及特定于格式的说明。
在ASP.NET Core端点中读取条形码
Telerik 没有为ASP.NET Core或Blazor提供条形码读取组件。 如果现有应用程序将上传的图像路由到桌面服务进行读取,因为 Web 层没有 Telerik 读取器,则该变通方法将被 Web 层中的直接读取所取代。
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
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
Stream,因此无需将上传的文件流写入磁盘。 该控制器无需修改即可部署到 Linux、Docker 或 Azure 应用服务。
从 PDF 文件中读取条形码
Telerik不具备PDF条形码读取功能。 向现有Telerik代码库中添加PDF读取功能需要一个PDF渲染库,将页面转换为图像后再传递给RadBarcodeReader。 IronBarcode直接读取 PDF 文件。
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
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
无需单独的PDF库。 无需页面提取步骤。无需图像转换。 传递 PDF 路径, IronBarcode会处理所有页面,并返回所有带有页码跟踪的条形码。 可以检测 PDF 页面上的一维和二维条形码。
Telerik RadBarcodeAPI 到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" /> |
服务器端生成返回ToPngBinaryData() |
Symbology.Code128 |
BarcodeEncoding.Code128 |
Symbology.QRCode |
BarcodeEncoding.QRCode |
new RadBarcodeReader()(WPF) |
静态类——无需实例 |
new RadBarcodeReader()(WinForms) |
静态类——无需实例 |
reader.DecodeTypes = new DecodeType[] { ... } (WPF) |
自动检测——无需指定 |
reader.DecodeType = new DecodeType[] { ... }(WinForms) |
自动检测——无需指定 |
reader.Decode(bitmapImage)(WPF) |
BarcodeReader.Read(imagePath) |
reader.Read(drawingImage)(WinForms) |
BarcodeReader.Read(imagePath) |
result.Text |
result.Value |
result.Symbology |
result.BarcodeType |
(WPF)需要BitmapImage作为输入 |
接受文件路径、Stream或字节数组 |
(WinForms)需要System.Drawing.Image作为输入 |
接受文件路径、Stream或字节数组 |
| 仅读取 1D 格式 | 支持 50 多种格式,包括所有 2D 类型 |
| WPF 和 WinForms 只读 | 所有.NET平台 |
| 不支持 PDF 阅读 | BarcodeReader.Read("file.pdf")—本地 |
常见迁移问题和解决方案
问题 1:XAML 条形码控件替换
Telerik:<telerik:RadBarcode>是一个视觉控件,直接在WPF UI元素树中渲染。 它不能被一个Image元素替代而无需代码更新。
解决方案:将<Image>控件,并在代码中生成条形码。 将BitmapSource:
// 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()
对于Blazor,用一个src属性接收服务器端生成的base64编码PNG。
问题 2:DecodeType 移除的副作用
Telerik:DecodeType(WinForms)属性过滤阅读器尝试检测的格式。 在IronBarcode迁移中移除此过滤器意味着IronBarcode现在将返回图像中存在的所有格式的结果,包括之前被过滤器排除的格式。
解决方案:完全删除DecodeType分配块。 如果其他检测到的格式在下游逻辑中导致意外结果—例如,如果代码假设只会返回一种条码格式—则添加可选过滤使用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)
这是可选的。 默认行为(检测所有格式)对于大多数使用场景都是正确的,并且能够产生以前的 Telerik 实现无法达到的结果。
问题 3:TelerikLicenseManager 清理
Telerik:App.xaml.cs(WPF)中。 密钥通常存储在应用程序设置、配置文件中,或者硬编码在启动方法中。
解决方案:移除TelerikLicenseManager.InstallLicense()调用。 将其替换为启动位置相同的IronBarcode密钥分配:
// 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"
如果Telerik软件包仍然安装(因为仍在使用其他非条码Telerik控件),则应保留这些控件的TelerikLicenseManager调用。 仅当 Telerik 软件包本身被完全移除时才移除调用。
Telerik RadBarcode迁移清单
迁移前任务
在进行任何代码更改之前,请审核代码库中所有 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" .
记录每一场比赛。 注意哪些文件包含 XAML 控件,哪些文件包含读取代码,以及每个文件属于哪个平台。
代码更新任务
- 删除 Telerik 条形码NuGet包(或根据需要保留用于其他控件的包)
- 在每个需要条形码功能的项目中安装
IronBarcodeNuGet包 - 在每个应用程序启动入口点添加
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY" - 移除Telerik命名空间导入并添加
using IronBarCode - 将
<telerik:RadBarcode>XAML元素替换为<Image>控件 - 使用
BarcodeWriter.CreateBarcode(...).ToBitmapSource()在代码中生成条形码图像 - 用服务器端生成的base64
<TelerikBarcode>Razor组件 - 用
new RadBarcodeReader()实例 - 用
new RadBarcodeReader()实例 - 删除所有
reader.DecodeTypes = new DecodeType[] { ... }andreader.DecodeType = new DecodeType[] { ... }块 - 用
reader.Decode(bitmapImage)调用 - 用
reader.Read(drawingImage)调用 - 将
result.Value在所有读取结果访问点 - 将
result.BarcodeType在所有格式检查点 - 用
Symbology.Code128及类似生成枚举值 - 在完全移除Telerik软件包的情况下移除
TelerikLicenseManager.InstallLicense()调用
迁移后测试
- 验证所有先前读取的一维条形码(Code128、EAN13 等)是否继续返回正确的值
- 确认测试图像中的二维码现在可以成功读取,而之前读取失败。
- 测试生成的条形码(保存为 PNG 格式或以字节形式提供)是否能够正确显示和扫描。
- 验证之前无法执行读取操作的ASP.NET Core或Blazor端点现在是否能够正常工作。
- 如果添加了 PDF 阅读功能,请确认每个 PDF 页面上的条形码及其页码均能被正确识别。
- 运行迁移前部分的 grep 审核命令,以确认没有剩余的 Telerik 条形码 API 引用
- 确认
BarcodeReader.Read()或BarcodeWriter.CreateBarcode()调用之前被设置
迁移到IronBarcode的主要优势
全面支持二维格式:迁移后,QR码、DataMatrix、PDF417和Aztec格式可通过之前读取Code128和EAN13的同一API调用进行读取。无需额外配置,也无需为二维格式单独开发库。 阅读引擎会自动处理格式识别。
统一跨平台API:同一个BarcodeWriter.CreateBarcode()调用在WPF、WinForms、ASP.NET Core、Blazor、控制台应用程序和Docker容器中相同地编译和运行。 在共享服务库中编写一次的条形码逻辑无需修改即可在解决方案中的每个项目类型中使用。
原生 PDF 文件处理: IronBarcode直接从 PDF 文件中读取条形码,处理所有页面并返回带有页码元数据的结果。 以前需要 PDF 渲染库和Telerik 读取步骤的工作流程现在合并为一个方法调用,从而消除了第三方依赖和中间图像转换步骤。
取消条形码访问的订阅依赖:迁移后,可通过IronBarcode的永久许可模式使用条形码功能。 继续使用无需每年续费。 对于主要使用 TelerikSuite处理条形码相关事务的团队来说,可以将经常性许可费用降低到一次性成本。
简化代码库:用一个带有自动检测结果集合的静态方法调用替换result.Text属性链。 以前 WPF 和 WinForms 读取需要不同实现的代码,现在合并成一个单一的共享实现。
常见问题解答
我为什么要从 Telerik Barcode 迁移到 IronBarcode?
常见原因包括简化许可(消除 SDK + 运行时密钥的复杂性)、消除吞吐量限制、获得原生 PDF 支持、改进 Docker/CI/CD 部署以及减少生产代码中的 API 样板代码。
如何用 IronBarcode 替换 Telerik API 调用?
用 `IronBarCode.License.LicenseKey = "key"` 替换实例创建和许可相关的样板代码。用 `BarcodeReader.Read(path)` 替换读取器调用,用 `BarcodeWriter.CreateBarcode(data, encoding)` 替换写入器调用。静态方法无需实例管理。
从 Telerik Barcode 迁移到 IronBarcode 时,代码需要做多少更改?
大多数迁移都能减少代码行数。许可样板代码、实例构造函数和显式格式配置都被移除。核心读/写操作映射到更简洁的 IronBarcode 等效代码,并生成更清晰的结果对象。
迁移过程中是否需要同时安装 Telerik Barcode 和 IronBarcode?
不。大多数迁移都是直接替换,而不是并行操作。一次迁移一个服务类,替换 NuGet 引用,并更新实例化和 API 调用模式,然后再迁移下一个类。
IronBarcode 的 NuGet 包名称是什么?
该软件包名为“IronBarCode”(B 和 C 大写)。使用“Install-Package IronBarCode”或“dotnet add package IronBarCode”进行安装。代码中的 using 指令为“using IronBarCode;”。
与 Telerik Barcode 相比,IronBarcode 如何简化 Docker 部署?
IronBarcode 是一个 NuGet 包,不包含任何外部 SDK 文件或已挂载的许可证配置。在 Docker 环境中,设置 IRONBARCODE_LICENSE_KEY 环境变量后,该包会在启动时自动处理许可证验证。
从 Telerik 迁移后,IronBarcode 是否能自动检测所有条形码格式?
是的。IronBarcode 可以自动检测所有支持格式的条码符号,无需显式枚举 BarcodeTypes。如果已知条码格式且性能至关重要,BarcodeReaderOptions 允许缩小搜索范围以进行优化。
IronBarcode 能否在不使用单独库的情况下读取 PDF 中的条形码?
是的。`BarcodeReader.Read("document.pdf")` 可以直接处理 PDF 文件。结果包括每个条形码的页码、格式、值和置信度。无需外部 PDF 渲染步骤。
IronBarcode如何处理并行条码处理?
IronBarcode 的静态方法是无状态且线程安全的。可以直接对文件列表使用 Parallel.ForEach,无需进行线程级实例管理。BarcodeReaderOptions.MaxParallelThreads 控制内部线程预算。
从 Telerik Barcode 迁移到 IronBarcode 时,结果属性会发生哪些变化?
常见重命名:BarcodeValue 变为 Value,BarcodeType 变为 Format。IronBarcode 结果还会添加 Confidence 和 PageNumber。解决方案范围内的查找替换功能会处理现有结果处理代码中的重命名。
如何在 CI/CD 流水线中设置 IronBarcode 许可?
将 IRONBARCODE_LICENSE_KEY 存储为管道密钥,并在应用程序启动代码中赋值 IronBarCode.License.LicenseKey。一个密钥即可覆盖所有环境,包括开发、测试、预发布和生产环境。
IronBarcode是否支持生成自定义样式的二维码?
是的。QRCodeWriter.CreateQrCode() 支持通过 ChangeBarCodeColor() 自定义颜色、通过 AddBrandLogo() 嵌入徽标、可配置纠错级别以及多种输出格式,包括 PNG、JPG、PDF 和流媒体。

