如何從流中讀取條碼C#
從barKoder SDK遷移到IronBarcode
Barkoder提供官方的.NET套件 — Barkoder.Xamarin — 但兩者都僅是移動相機掃描元件。 如果您評估了barKoder的MatrixSight算法、DeBlur模式、多條碼檢測或DPM支持,然後發現您需要文件輸入、PDF處理、伺服器部署或條碼生成,這些在.NET上的barKoder中都不可用。 本指南展示了IronBarcode如何滿足每項需求,並對每種情況提供有效的程式碼。
為何從barKoder SDK遷移
從barKoder評估轉向IronBarcode的團隊一致報告了相同的觸發因素:
僅限移動相機介面:Barkoder的.NET覆蓋範圍是Plugin.Maui.Barkoder(v1.6.8, 2026年3月)和Barkoder.Xamarin(v1.3.0)。 這兩者都包裝了本機iOS / Android SDK並暴露了一個BarkoderView相機控制。 沒有一般用途的Barkoder.NET庫,沒有ASP.NET Core目標,沒有控制台/工作器/桌面目標,沒有Linux伺服器目標。
僅限讀取架構:Barkoder是僅限掃描的SDK。 如果您的應用程式需要生成條碼——列印運輸標籤,為包裝建立QR碼,在文件中嵌入程式碼——Barkoder不提供任何支持。 發現項目中期需要生成功能的團隊需要一個涵蓋工作流程兩方面的程式庫。
無PDF處理:在.NET企業應用程式中,條碼經常出現在PDF文件中——發票,運輸清單,醫療記錄,合規文件。 Barkoder無法理解這個工作流程。 它為活相機輸入設計,無法處理PDF文件。
無伺服器端部署:Barkoder的處理模式是在裝置上的移動掃描。 它不能在ASP.NET Core、Azure Functions、Docker容器或AWS Lambda中運行。 建立伺服器端條碼API、文件處理流程或雲端功能的團隊無法使用Barkoder部署。
無文件/流輸入:即使在MAUI應用中,BarkoderView也僅消耗即時相機畫面。 沒有文件路徑、字節陣列或Stream重載,因此處理上傳的圖像或畫廊照片需要不同的程式庫。
基本邊界
Barkoder的MAUI表面是相機綁定的。 使用Plugin.Maui.Barkoder的.NET開發人員撰寫的程式碼如下所示:
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.SetFlashEnabled(false);
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
}
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.SetFlashEnabled(false);
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
}
Imports Barkoder.Maui
Public Partial Class ScanPage
Inherits ContentPage
Implements IBarkoderDelegate
Public Sub New()
InitializeComponent()
BarkoderView.SetFlashEnabled(False)
BarkoderView.StartScanning(Me)
End Sub
Public Sub DidFinishScanning(result As BarcodeResult()) Implements IBarkoderDelegate.DidFinishScanning
For Each r In result
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
Next
End Sub
End Class
IronBarcode為相同資料提供文件/流/PDF API:
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("scanned-label.png", options);
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format} | Value: {result.Value}");
}
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("scanned-label.png", options);
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format} | Value: {result.Value}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read("scanned-label.png", options)
For Each result In results
Console.WriteLine($"Format: {result.Format} | Value: {result.Value}")
Next
IronBarcodevs barKoder SDK: 功能比較
| 功能 | barKoder SDK | IronBarcode |
|---|---|---|
| .NET / C# API | 僅限MAUI / Xamarin相機UI | 完整的.NET表面 |
| NuGet套件 | Plugin.Maui.Barkoder, Barkoder.Xamarin |
BarCode |
| 損壞的條碼恢復 | MatrixSight / DeBlur | ReadingSpeed.ExtremeDetail + 機器學習 |
| 多條碼檢測 | 是 | ExpectMultipleBarcodes = true |
| DataMatrix / DPM | 是的(僅限讀取) | 是的 — 讀取和生成 |
| QR Code | 是的(僅限讀取) | 是的 — 讀取和生成 |
| PDF417 | 是 | 是 |
| Aztec | 是 | 是 |
| Code128, Code39, EAN | 是 | 是的 — 50 多種格式 |
| 條碼生成 | None | 完整 — 所有格式 |
| PDF處理 | None | 本地 |
| 文件/流/字節陣列輸入 | 無——僅相機畫面 | 是 |
| ASP.NET Core | None | 全面 |
| Docker / Linux | None | 全面 |
| Azure Functions | None | 全面 |
| AWS Lambda | None | 全面 |
| 離線/氣隙 | 在裝置上 | 完全本地 |
| 異步/等待 | 基於回調 | 全面 |
| 依賴注入 | None | 完整的.NET依賴注入 |
| 通過MAUI的iOS | Plugin.Maui.Barkoder(相機UI) |
程式化的(文件/流) |
| 通過MAUI的Android | Plugin.Maui.Barkoder(相機UI) |
程式化的(文件/流) |
| 定價 | 年度訂閱 | 從$749永久 |
快速入門:barKoder SDK到IronBarcode遷移
步驟 1:替換 NuGet 包
安裝IronBarcode:
dotnet add package BarCode
如果您的項目使用Barkoder.Xamarin僅用於非相機工作流程(或者您完全轉向文件/PDF處理),請移除它:
dotnet remove package Plugin.Maui.Barkoder
dotnet remove package Plugin.Maui.Barkoder
如果該應用仍需即時相機UI,保留Plugin.Maui.Barkoder並將IronBarcode新增到其旁邊以進行文件/PDF/生成工作。
步驟 2:更新命名空間
在不再需要的地方移除barKoder名稱空間,並新增IronBarcode名稱空間:
// Remove (if no longer needed)
// using Barkoder.Maui;
// Add
using IronBarCode;
// Remove (if no longer needed)
// using Barkoder.Maui;
// Add
using IronBarCode;
Imports IronBarCode
步驟 3:初始化授權
在應用程式啟動時新增授權初始化——在ASP.NET Core的Program.cs中,或在控制台或桌面應用程式中進行任何條碼操作之前:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
程式碼遷移範例
從圖像中讀取條碼
核心讀取方案從barKoder的即時相機畫面映射到IronBarcode的文件/流/字節陣列API。
barKoder MAUI方法:
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
{
Console.WriteLine($"Barcode: {r.TextualData}");
Console.WriteLine($"Type: {r.BarcodeTypeName}");
}
}
}
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
{
Console.WriteLine($"Barcode: {r.TextualData}");
Console.WriteLine($"Type: {r.BarcodeTypeName}");
}
}
}
Imports Barkoder.Maui
Public Partial Class ScanPage
Inherits ContentPage
Implements IBarkoderDelegate
Public Sub New()
InitializeComponent()
BarkoderView.StartScanning(Me)
End Sub
Public Sub DidFinishScanning(result As BarcodeResult()) Implements IBarkoderDelegate.DidFinishScanning
For Each r In result
Console.WriteLine($"Barcode: {r.TextualData}")
Console.WriteLine($"Type: {r.BarcodeTypeName}")
Next
End Sub
End Class
IronBarcode 方法:
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
}
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim results = BarcodeReader.Read("scan.png")
For Each result In results
Console.WriteLine($"Format: {result.Format}")
Console.WriteLine($"Value: {result.Value}")
Next
IronBarcode的BarcodeReader.Read()可以自動檢測條碼格式,不需要提前指定格式。 同一個調用適用於由移動裝置拍攝並上傳到伺服器的圖像、從文件系統載入的圖像或作為字節陣列從流接收的圖像。 有關全面的閱讀文件,請參閱IronBarcode讀取指南。
損壞條碼恢復(等效於DeBlur模式)
Barkoder 的 DeBlur 模式是其最常被引用的功能之一。IronBarcode通過 ReadingSpeed.ExtremeDetail 爲文件輸入提供了等效功能。
barKoder MAUI方法:
// Live camera scanning with DeBlur enabled via configuration
using Barkoder.Maui;
BarkoderView.SetEnabledBarcodeTypes(/* configure formats */);
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Recovered: {r.TextualData}");
}
// Live camera scanning with DeBlur enabled via configuration
using Barkoder.Maui;
BarkoderView.SetEnabledBarcodeTypes(/* configure formats */);
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Recovered: {r.TextualData}");
}
Imports Barkoder.Maui
' Live camera scanning with DeBlur enabled via configuration
BarkoderView.SetEnabledBarcodeTypes() ' configure formats
BarkoderView.StartScanning(Me)
Public Sub DidFinishScanning(result As BarcodeResult())
For Each r In result
Console.WriteLine($"Recovered: {r.TextualData}")
Next
End Sub
IronBarcode 方法:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("worn-shipping-label.png", options);
if (results.Any())
{
Console.WriteLine($"Recovered barcode: {results.First().Value}");
}
else
{
Console.WriteLine("Could not decode — image quality too low");
}
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("worn-shipping-label.png", options);
if (results.Any())
{
Console.WriteLine($"Recovered barcode: {results.First().Value}");
}
else
{
Console.WriteLine("Could not decode — image quality too low");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read("worn-shipping-label.png", options)
If results.Any() Then
Console.WriteLine($"Recovered barcode: {results.First().Value}")
Else
Console.WriteLine("Could not decode — image quality too low")
End If
ReadingSpeed.ExtremeDetail 運行多通道的機器學習圖像分析流程,應用對比度增強、銳化、旋轉校正和損壞恢復後才嘗試解碼。 對於批量工作流程,使用Balanced。
多條碼檢測
Barkoder的多條碼畫面掃描映射到IronBarcode的ExpectMultipleBarcodes選項,該選項在圖像和PDF上都有效。
barKoder MAUI方法:
// Live camera frame returns BarcodeResult[]; multi-scan configured on the view
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
// Live camera frame returns BarcodeResult[]; multi-scan configured on the view
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
Imports Barkoder.Maui
BarkoderView.StartScanning(Me)
Public Sub DidFinishScanning(result As BarcodeResult())
For Each r In result
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
Next
End Sub
IronBarcode 方法:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
// Works identically on images and PDFs
var results = BarcodeReader.Read("shipping-manifest.pdf", options);
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}");
}
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
// Works identically on images and PDFs
var results = BarcodeReader.Read("shipping-manifest.pdf", options);
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
' Works identically on images and PDFs
Dim results = BarcodeReader.Read("shipping-manifest.pdf", options)
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}")
Next
這是一個單一的方法調用。 沒有頁面提取,沒有多個請求,也沒有每條碼處理的額外開銷。 PDF是本地讀取的。
DataMatrix生成和讀取
Barkoder可以讀取DataMatrix但無法生成它。 IronBarcode涵蓋了工作流程的兩個方面,這是工業跟蹤系統中的常見需求。
barKoder MAUI方法:
// Camera-only DataMatrix scanning; no generation available
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Part ID: {r.TextualData}");
}
// Camera-only DataMatrix scanning; no generation available
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Part ID: {r.TextualData}");
}
Imports Barkoder.Maui
' Camera-only DataMatrix scanning; no generation available
BarkoderView.StartScanning(Me)
Public Sub DidFinishScanning(result As BarcodeResult())
For Each r In result
Console.WriteLine($"Part ID: {r.TextualData}")
Next
End Sub
IronBarcode 方法:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix)
.SaveAsPng("part-label.png");
// Read DataMatrix from a scanned industrial part image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("etched-part-photo.png", options);
foreach (var result in results)
{
Console.WriteLine($"Part Serial: {result.Value}");
Console.WriteLine($"Barcode Type: {result.Format}");
}
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix)
.SaveAsPng("part-label.png");
// Read DataMatrix from a scanned industrial part image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("etched-part-photo.png", options);
foreach (var result in results)
{
Console.WriteLine($"Part Serial: {result.Value}");
Console.WriteLine($"Barcode Type: {result.Format}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
' Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix) _
.SaveAsPng("part-label.png")
' Read DataMatrix from a scanned industrial part image
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read("etched-part-photo.png", options)
For Each result In results
Console.WriteLine($"Part Serial: {result.Value}")
Console.WriteLine($"Barcode Type: {result.Format}")
Next
有關支持的編碼格式和生成選項的完整列表,請參閱IronBarcode條碼生成文件。
具有品牌的QR碼生成
Barkoder不生成條碼。 IronBarcode生成嵌入品牌標志的QR碼,這是營銷、包裝和產品識別工作流程中的常見需求。
barKoder MAUI方法:
Not available — Plugin.Maui.Barkoder is a reader-only SDK with no
generation API on any platform.
IronBarcode 方法:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500)
.AddBrandLogo("company-logo.png")
.SaveAsPng("branded-qr.png");
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500)
.AddBrandLogo("company-logo.png")
.SaveAsPng("branded-qr.png");
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
' QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500) _
.AddBrandLogo("company-logo.png") _
.SaveAsPng("branded-qr.png")
ASP.NET Core條碼API端點
Barkoder沒有伺服器端部署模型。 相機掃描上傳端點的等效——接收來自任何客戶端的圖像並返回條碼資料——需要一個.NET程式庫。
barKoder方法:
Not available — Plugin.Maui.Barkoder runs only inside a MAUI app head
against a live camera. There is no ASP.NET Core integration and no
server-side execution model.
IronBarcode 方法:
// In Program.cs
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
app.MapPost("/api/scan", async (IFormFile file) =>
{
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
var results = BarcodeReader.Read(imageBytes, options);
return Results.Ok(results.Select(r => new
{
Value = r.Value,
Format = r.Format.ToString(),
}));
});
// In Program.cs
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
app.MapPost("/api/scan", async (IFormFile file) =>
{
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
var results = BarcodeReader.Read(imageBytes, options);
return Results.Ok(results.Select(r => new
{
Value = r.Value,
Format = r.Format.ToString(),
}));
});
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
app.MapPost("/api/scan", Async Function(file As IFormFile) As Task(Of IResult)
Using stream = file.OpenReadStream()
Dim imageBytes(CInt(stream.Length) - 1) As Byte
Await stream.ReadAsync(imageBytes, 0, imageBytes.Length)
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim results = BarcodeReader.Read(imageBytes, options)
Return Results.Ok(results.Select(Function(r) New With {
.Value = r.Value,
.Format = r.Format.ToString()
}))
End Using
End Function)
barKoder SDK API到IronBarcode映射引用
此表將barKoder的MAUI / Xamarin表面映射到等效的IronBarcode調用:
| barKoder API | IronBarcode等效 |
|---|---|
| 通過barKoder門戶 / 配置設置授權 | IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY" |
BarkoderView上的DeBlur配置 |
Speed = ReadingSpeed.ExtremeDetail |
BarkoderView上的多掃描配置 |
ExpectMultipleBarcodes = true |
SetEnabledBarcodeTypes(...) |
BarcodeEncoding.<Format>(讀取時自動檢測) |
BarkoderView.StartScanning(IBarkoderDelegate) |
BarcodeReader.Read("image.png") — 同步 |
BarcodeResult.TextualData |
result.Value |
BarcodeResult.BarcodeTypeName |
result.Format |
| MatrixSight損壞恢復 | ReadingSpeed.ExtremeDetail與機器學習預處理 |
| 即時相機畫面輸入 | 文件路徑 / Stream / byte[]輸入 |
| 在裝置上處理 | 完全本地——無網路請求 |
| 無生成支持 | BarcodeWriter.CreateBarcode() / QRCodeWriter.CreateQrCode() |
| 無PDF支援 | BarcodeReader.Read("document.pdf") — 原生 |
| 無伺服器部署 | 可在ASP.NET Core、Docker、Azure Functions、Lambda中使用 |
| 無頁面索引(不適用) | result.PageNumber — 可用於PDF讀取 |
常見遷移問題及解決方案
問題1:NuGet套件名稱
barKoder SDK:官方的.NET套件是Barkoder.Xamarin。 兩者都不涵蓋非移動場景。
解決方案:請安裝IronBarcode:
dotnet add package BarCode
如果Plugin.Maui.Barkoder不再需要(您完全改為文件/PDF/伺服器處理),請移除它:
dotnet remove package Plugin.Maui.Barkoder
dotnet add package BarCode
dotnet remove package Plugin.Maui.Barkoder
dotnet add package BarCode
問題2:相機畫面輸入vs文件輸入
barKoder SDK:所有輸入以即時相機畫面的方式到達——一個在裝置上處理的連續影片流。沒有文件路徑輸入模式。
解決方案:IronBarcode接受文件、流、字節陣列以及System.Drawing.Image物件。 對於從移動客戶端上傳的圖像,直接讀取請求流:
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var results = BarcodeReader.Read(imageBytes, options);
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var results = BarcodeReader.Read(imageBytes, options);
Imports System.IO
Using stream = file.OpenReadStream()
Dim imageBytes = New Byte(stream.Length - 1) {}
Await stream.ReadAsync(imageBytes, 0, imageBytes.Length)
Dim results = BarcodeReader.Read(imageBytes, options)
End Using
問題3:基於回調的API vs同步結果
barKoder SDK:DidFinishScanning(BarcodeResult[]) 當條碼在相機流中被檢測到是異步觸發的。
解決方案:IronBarcode的IEnumerable<BarcodeResult>。 在需要異步的ASP.NET Core環境中,包裝在Task.Run()中:
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
Dim results = Await Task.Run(Function() BarcodeReader.Read(imageBytes, options))
問題4:DeBlur模式配置
barKoder SDK:在掃描開始前在BarkoderView配置上啟用DeBlur並適用於所有後續掃描。
解決方案:在IronBarcode中,等效的是在BarcodeReaderOptions每次讀取。 建立一次選項物件並重複使用:
var deepOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
// Reuse across multiple reads
var results = BarcodeReader.Read("image.png", deepOptions);
var deepOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
// Reuse across multiple reads
var results = BarcodeReader.Read("image.png", deepOptions);
Imports System
Dim deepOptions As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
' Reuse across multiple reads
Dim results = BarcodeReader.Read("image.png", deepOptions)
問題5:缺少生成能力
barKoder SDK:Barkoder僅限讀取。 沒有生成條碼或QR碼的API。
解決方案:IronBarcode涵蓋了讀取和生成。 使用QRCodeWriter用於QR碼:
// Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
// QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500)
.SaveAsPng("product-qr.png");
// Get as bytes for embedding in API response or PDF
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128)
.ToPngBinaryData();
// Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
// QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500)
.SaveAsPng("product-qr.png");
// Get as bytes for embedding in API response or PDF
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128)
.ToPngBinaryData();
Imports System
' Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128) _
.SaveAsPng("shipping-label.png")
' QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500) _
.SaveAsPng("product-qr.png")
' Get as bytes for embedding in API response or PDF
Dim barcodeBytes As Byte() = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128) _
.ToPngBinaryData()
barKoder SDK遷移清單
遷移前任務
審核您的程式碼庫中barKoder的引用:
grep -r "Barkoder\|BarkoderView\|IBarkoderDelegate\|BarcodeResult" --include="*.cs" .
grep -r "Plugin.Maui.Barkoder\|Barkoder.Xamarin" --include="*.csproj" .
grep -r "Barkoder" --include="*.xaml" .
grep -r "Barkoder\|BarkoderView\|IBarkoderDelegate\|BarcodeResult" --include="*.cs" .
grep -r "Plugin.Maui.Barkoder\|Barkoder.Xamarin" --include="*.csproj" .
grep -r "Barkoder" --include="*.xaml" .
記錄當前實施或計劃中的條碼場景:
- 哪些條碼格式需要讀取(Code128,DataMatrix,QR,PDF417等)
- 是否需要損壞的條碼恢復(
ReadingSpeed.ExtremeDetail) - 是否需要多條碼檢測(
ExpectMultipleBarcodes = true) - 是否需要條碼生成(
BarcodeWriter,QRCodeWriter) - 是否需要PDF處理(
BarcodeReader.Read("doc.pdf")) - 部署目標(ASP.NET Core,Azure Functions,Docker,Lambda,桌面,MAUI)
程式碼更新任務
- 從
Barkoder.Xamarin - 安裝
BarCodeNuGet套件 - 移除不再需要的
using Barkoder.Maui;(或相關的Xamarin等效) - 向所有條碼處理文件新增
using IronBarCode; - 在應用程式啟動時新增
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; - 用
BarkoderView.StartScanning/DidFinishScanning回調 - 將
result.Value - 將
result.Format - 將DeBlur配置映射到
BarcodeReaderOptions中 - 將多掃描配置映射到
BarcodeReaderOptions中 - 為任何生成需求新增
BarcodeWriter.CreateBarcode()調用 - 為QR程式碼生成需求新增
QRCodeWriter.CreateQrCode()調用 - 用
BarcodeReader.Read("document.pdf")替換任何PDF預處理程式碼 - 為Async ASP.NET Core端點將同步
Task.Run()中
遷移後測試
完成程式碼更新後,請驗證以下內容:
- 確認
BarcodeReader.Read()返回所有使用的圖像格式的結果(PNG,JPEG,TIFF,BMP) - 驗證
ReadingSpeed.ExtremeDetail可以從測試集中的最低質量樣本中恢復條碼 - 確認
ExpectMultipleBarcodes = true從多條碼文件中返回正確的條碼數 - 測試PDF讀取與生產文件工作流中使用的所有PDF版本
- 驗證
BarcodeWriter.CreateBarcode()輸出可被您的目標掃描器掃描 - 驗證
QRCodeWriter.CreateQrCode()輸出可被移動QR讀碼器掃描 - 使用來自移動客戶端的文件上傳測試ASP.NET Core端點(如果適用)
- 確認在Docker、Azure或Lambda部署目標中的正確運行
- 運行端到端測試涵蓋完整的讀取-處理-生成迴圈(如適用)
遷移到IronBarcode的主要優勢
涵蓋非相機.NET的平台:IronBarcode從NuGet安裝並運行在任何.NET項目中——ASP.NET Core,Azure Functions,Lambda,Docker,控制台,工作器,WPF,WinForms,Avalonia,Blazor和MAUI。Barkoder的Plugin.Maui.Barkoder僅限於移動應用程式主題中的相機UI; IronBarcode涵蓋了其他所有。
無需相機的耐損讀取:使Barkoder令人信服的能力——DeBlur,MatrixSight,損壞恢復——在IronBarcode中通過ReadingSpeed.ExtremeDetail和ML基於圖像預處理中存在。 Barkoder在及時相機輸入上取得的相同精度提升,IronBarcode在文件、掃描文件和上傳圖片上取得。
完整讀取和生成工作流程:Barkoder僅限讀取。 IronBarcode涵蓋了從一個包中超過50種格式的條碼讀取和生成。 需要生成運輸標籤、建立包裝QR碼或在文件中嵌入條碼的團隊不需要第二個程式庫。
本機PDF支持:從PDF文件中讀取條碼——發票、報關單、醫療記錄、合規文件——是IronBarcode的一流功能。 無需中間圖像提取,無需每頁API調用,無需額外依賴。 多頁PDF在一個BarcodeReader.Read()調用中處理。
完整的伺服器側部署:IronBarcode運行在ASP.NET Core,Azure Functions,AWS Lambda,Docker容器以及其他任何.NET托管環境中。 它在本地處理條碼,無需網路調用,無需管理API金鑰,無需遠程服務增加的延遲。處理一個條碼或一百萬個條碼成本相同——無每次請求收費。
可預測的永久定價:IronBarcode以一次性永久授權形式提供,單個開發者起價$749,不收取每次請求費用,無量限制,無需訂閱續費。 對於建立生產應用程式將以規模處理條碼的團隊,成本模型簡單且可預測。
常見問題
為什麼我應該從Barkoder SDK遷移到IronBarcode?
常見的理由包括簡化授權(去除SDK +運行時鑰匙的複雜性)、消除吞吐量限制、獲得原生PDF支持、改善Docker/CI/CD部署,並減少生產程式碼中的API樣板。
我該如何用IronBarcode替換Barkoder API呼叫?
用IronBarCode.License.LicenseKey = "key"替換實例建立和授權樣板。用BarcodeReader.Read(path)替換讀取呼叫,用BarcodeWriter.CreateBarcode(data, encoding)替換寫入呼叫。靜態方法不需要實例管理。
從Barkoder SDK遷移到IronBarcode需要更改多少程式碼?
大多數遷移會導致較少的程式碼行。授權樣板、實例構造函式和顯式格式配置被移除。核心讀/寫操作映射為較短的IronBarcode等價物,且結果物件更清晰。
在遷移過程中,我是否需要同時安裝Barkoder SDK和IronBarcode?
不需要。大多數遷移是直接替換而不是並行操作。一次遷移一個服務類,替換NuGet引用,並更新實例化和API呼叫模式後再移動到下一個類。
IronBarcode的NuGet包名稱是什麼?
包名是'IronBarCode'(大寫B和C)。可以用'Install-Package IronBarCode'或'dotnet add package IronBarCode'安裝。程式碼中的using指令是'using IronBarCode;'。
IronBarcode在Docker部署方面如何比Barkoder SDK更簡化?
IronBarcode是沒有外部SDK文件或掛載許可配置的NuGet封裝。在Docker中,設置IRONBARCODE_LICENSE_KEY環境變數,包在啟動時處理許可驗證。
從Barkoder遷移後,IronBarcode是否自動檢測所有條碼格式?
是的。IronBarcode自動檢測所有支持的格式的符號學。不需要顯式的BarcodeTypes枚舉。如果格式已經知道並且性能很重要,BarcodeReaderOptions允許限制搜索空間作為優化。
IronBarcode是否可以不使用單獨的庫讀取PDF中的條碼?
可以。BarcodeReader.Read("document.pdf")原生處理PDF文件。結果包括每個條碼發現的頁碼、格式、值和置信度。不需要外部PDF渲染步驟。
IronBarcode如何處理並行條碼處理?
IronBarcode的靜態方法是無狀態且執行緒安全的。直接使用Parallel.ForEach遍歷文件列表,不需要每個執行緒的實例管理。BarcodeReaderOptions.MaxParallelThreads控制內部執行緒預算。
從Barkoder SDK遷移到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和流在內的多種輸出格式。

