跳至頁尾內容
影片

如何在C#中修正條碼方向 | IronBarcode

從Telerik RadBarcode遷移到IronBarcode

本指南為.NET開發者提供了一條完整的遷移路徑,從Telerik RadBarcode轉移到IronBarcode,適用於那些已經達到RadBarcodeReader所能實現的功能極限的開發者。 它涵蓋了包替換、命名空間更新、授權初始化、程式碼級遷移範例、API映射參考,以及驗證遷移完成的檢查清單。 範例著重於Telerik條碼遷移中最常遇到的場景:XAML控件替換、讀取格式擴展、伺服器端部署和PDF處理。

為什麼要從Telerik RadBarcode遷移

Telerik RadBarcode的遷移是由現有組件無法滿足的具體技術需求所驅動。 以下原因代表了已完成或正在評估此過渡的團隊最常報告的情況。

2D讀取邊界:WPF中的DecodeType枚舉所限制。 該枚舉包含了一維線性格式的條目——Code128, Code39, EAN13, EAN8, UPCA, UPCE, Codabar, ITF——除此之外沒有其他內容。 沒有為QR Code, DataMatrix, PDF417或Aztec提供條目。 當新需求出現以處理入境QR Codes或從掃描文件中讀取DataMatrix標籤時,DecodeType限制成為一個無法解決的困擾,Telerik產品系列中沒有可用的解決方案。

平台程式碼碎片化:使用Telerik進行讀取需要UI框架依賴:System.Drawing.Image)。 這些型別無法在共享的.NET庫(如控制台應用程式、ASP.NET Core項目或Blazor伺服器)中引用。 希望在共享服務層集中化條碼讀取邏輯的團隊無法使用Telerik型別來做到這一點——讀取器實現永久綁定到各自的UI框架。

PDF處理差距:許多條碼工作流在文件上運作而不是在圖像文件上。 Telerik RadBarcodeReader僅接受位圖圖像。 要讀取嵌入在PDF頁面中的條碼需要使用單獨的庫將頁面轉換為圖像,然後將該圖像傳遞給Telerik讀取器——增加了一個依賴,且最終只得到一維結果。 對於主要使用PDF文件的團隊來說,此權宜解決方案在工作流程的每一個點上都新增了摩擦。

訂閱授權:Telerik條碼功能不作為單獨的包售賣。 存取RadBarcodeReader被捆綁到平台特定的UI套件訂閱中——每平台Telerik UI訂閱從每開發者每年$749(Lite階層)開始,DevCraft UI的費用為每開發者每年$1,149,用於所有平台,這是Telerik公布的2026年定價。 主要需求是條碼功能但不使用其他Telerik UI控件的團隊,為代表購買物中一小部分的組件吸收了整個套件的費用。

基本問題

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

IronBarcode與Telerik RadBarcode:功能比較

功能 Telerik RadBarcode IronBarcode
1D 條碼生成 是(所有平台)
2D 條碼生成 是(所有平台)
1D 條碼讀取 WPF + WinForms 僅 是(所有平台)
QR 故讀取 僅 WPF 是(所有平台)
DataMatrix 讀取 僅 WPF 是(所有平台)
PDF417 讀取 僅 WPF 是(所有平台)
Aztec 讀取 不提供
PDF 檔讀取 不提供 是(原生)
自動格式檢測 否 — 需要 DecodeType
ASP.NET Core 讀取 不提供
Blazor 讀取 不提供
Docker / Linux讀取 不提供
共享服務庫 不可能(平台型別)
靜態讀取API 否(需要實例)
獨立的NuGet包 否 — 需要 UI 套件
永久許可 在訂閱旁邊提供永久階層 是的——從$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
SHELL

如果您的項目還使用來自同一個包的其他Telerik控件,保留該包並繼續執行第2步。您將在不移除共享包的情況下,移除條碼特定的API調用。

安裝IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

一個包適用於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
$vbLabelText   $csharpLabel

步驟 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"
$vbLabelText   $csharpLabel

金鑰分配只需在應用的入口點進行一次。 沒有需要部署的授權文件,沒有每平台初始化路徑,也沒有不同於WPF和ASP.NET Core的單獨配置。

程式碼遷移範例

生成條碼:從XAML控件到基於程式碼的API

Telerik在WPF中的生成是宣告性的——RadBarcode XAML元素直接在UI樹中渲染。 IronBarcode在程式碼中生成條碼並返回可保存為文件的BitmapSource

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>
XML
@* 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)}"
$vbLabelText   $csharpLabel

Symbology枚舉相同的符號。 切換到QR碼生成,只需改變枚舉參數。 要獲取完整範圍的2D條碼生成選項,包括QR錯誤校正級別和DataMatrix尺寸,IronBarcode文件提供了完整範例。

從桌面應用程式讀取條碼

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

是靜態方法——不需要讀取器實例。 它直接接受文件路徑字串,不需要System.Drawing.Image載入。 格式檢測對於所有支援的50+型別是自動的。結果屬性是.Text。 相同的調用在WPF和WinForms應用程式中都可以不做改動地工作——沒有平台特定的變體。 它還可以讀取QR碼、DataMatrix和影像中出現的任何其他格式,不像Telerik讀取器只被限制於1D格式。

讀取QR碼: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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

用於讀取EAN-13條碼的同一BarcodeReader.Read()調用也可以讀取QR碼。 2D格式沒有單獨的配置。 要獲取在讀取和生成中支援的條碼格式的完整列表,IronBarcode文件提供了50多個條目,包括格式特定注釋。

在ASP.NET Core端點讀取條碼

Telerik並不為ASP.NET Core或Blazor提供條碼讀取組件。 如果現有應用程式將上傳的圖像路由到桌面服務進行讀取,因為網路層沒有Telerik讀取器,該權宜解決方案可被基於網路層的直接讀取取代。

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

Stream,因此上傳的文件流在不寫入磁盤的情況下直接傳遞。 此控制器可在不做修改的情況下部署到Linux, Docker或Azure App Service。

從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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

不需要單獨的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
BitmapImage作為輸入(WPF) 接受文件路徑、Stream或字節陣列
System.Drawing.Image作為輸入(WinForms) 接受文件路徑、Stream或字節陣列
僅限於讀取一維格式 支持包括所有二維型別的50+格式
僅 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()
$vbLabelText   $csharpLabel

對於Blazor,將<img>元素。

問題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)
$vbLabelText   $csharpLabel

這是可選的。 對於大多數使用場景,預設行為(檢測所有格式)是正確的並產生以前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"
$vbLabelText   $csharpLabel

如果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" .
SHELL

記錄每個匹配項。 註明哪些文件包含XAML控件,哪些包含讀碼程式碼,以及每個文件屬於哪個平台。

程式碼更新任務

  1. 移除Telerik條碼NuGet包(或保留,以便對其他控件需求)
  2. 在需要條碼功能的每個項目中安裝IronBarcode NuGet包
  3. 在每個應用程式啟動入口點新增IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
  4. 移除Telerik命名空間導入並新增using IronBarCode
  5. 使用<telerik:RadBarcode> XAML元素
  6. 使用BarcodeWriter.CreateBarcode(...).ToBitmapSource()從後端程式碼生成條碼圖像
  7. 替換由伺服器端生成的base64 <TelerikBarcode> Razor組件
  8. new RadBarcodeReader()實例
  9. new RadBarcodeReader()實例
  10. 刪除所有reader.DecodeTypes = new DecodeType[] { ... } and reader.DecodeType = new DecodeType[] { ... }
  11. reader.Decode(bitmapImage)調用
  12. reader.Read(drawingImage)調用
  13. 在所有讀取結果存取點將result.Value
  14. 在所有格式檢查點將result.BarcodeType
  15. 使用Symbology.Code128和類似生成枚舉值
  16. 在Telerik包完全移除時移除TelerikLicenseManager.InstallLicense()調用

遷移後測試

  • 驗證所有以前讀取的一維條碼(Code128, EAN13等)繼續返回正確值
  • 確認測試圖像中的QR碼現在被成功識別,而不是像以前那樣返回null
  • 測試生成的條碼(保存為PNG或以字節形式提供)是否可見並且能夠掃描正確
  • 驗證以前無法讀取的ASP.NET Core或Blazor端點現在運行正常
  • 如果新增了PDF讀取,確認在每個PDF頁面上的條碼都能以正確的頁碼檢測到
  • 執行預遷移部分中的grep審核命令確認沒有剩餘的Telerik條碼API引用
  • 確認BarcodeWriter.CreateBarcode()調用之前被設置

遷移到IronBarcode的主要優勢

完整的2D格式支持:遷移之後,QR Code, DataMatrix, PDF417和Aztec格式由同樣的API調用可被讀取,已經可讀取Code128和EAN13。不需要額外的配置,也不需要單獨的庫來支持2D格式。 讀取引擎自動處理格式識別。

統一跨平台API:相同的BarcodeWriter.CreateBarcode()調用在WPF, WinForms, ASP.NET Core, Blazor, 控制台應用程式和Docker容器中編譯並運行時相同。 在共享服務庫中編寫的一次條碼邏輯,適用於解決方案中的每個項目型別,無需修改。

本地PDF文件處理:IronBarcode直接從PDF文件中讀取條碼,處理所有頁面並返回結果附有頁碼元資料。 以前需要PDF渲染庫加上Telerik讀取步驟的工作流被合併為單一方法調用,移除了第三方依賴和中間圖像轉換步驟。

消除條碼存取的訂閱依賴:遷移後,條碼功能通過IronBarcode的永久授權模式可用。 持續存取不需要年度續約。 主要使用Telerik套件進行條碼相關功能的團隊,將其定期授權成本減少為一次性成本。

簡化的程式碼庫:result.Text屬性鏈都被具有自動檢測結果集合的單一靜態方法調用所取代。 以前需要為WPF和WinForms讀取的不同實現的程式碼現在合並成單一共享實現。

請注意Telerik是其各自所有者的註冊商標。 本網站與Progress Software無關,未被其支持或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供資訊參考,並反映了撰寫時公開可用的資訊。

常見問題

我為什麼應該從Telerik Barcode遷移到IronBarcode?

常見的理由包括簡化授權(去除SDK +運行時鑰匙的複雜性)、消除吞吐量限制、獲得原生PDF支持、改善Docker/CI/CD部署,並減少生產程式碼中的API樣板。

如何將Telerik API呼叫替換為IronBarcode?

用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;'。

IronBarcode如何簡化比Telerik Barcode更簡單的Docker部署?

IronBarcode是沒有外部SDK文件或掛載許可配置的NuGet封裝。在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是否支持生成帶有自定義樣式的QR碼?

支持。QRCodeWriter.CreateQrCode()支持通過ChangeBarCodeColor()自定義顏色,通過AddBrandLogo()嵌入logo,可配置錯誤校正級別,以及包括PNG、JPG、PDF和流在內的多種輸出格式。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話