跳至頁尾內容
與其他組件的比較

LEADTOOLS 條碼庫與 IronBarcode 比較:C# 條碼庫比較

NetBarcode對比 IronBarcode:僅限 1D 建立與完整條碼工具包比較

NetBarcode 的 Type 枚舉中沒有QR Code條目。 當運輸標籤專案在第三個月增加QR Code需求時,開發者會尋找第二個程式庫。 該第二個程式庫帶來了自己的 API 表面、自有的發行計畫,以及可能偏離NetBarcode所需版本的共同 SixLabors.ImageSharp 依賴。 此比較檢視了NetBarcode是什麼、適用於何處,以及 IronBarcode 如何在不增加第二或第三個程式包的情況下填補空白。

了解 NetBarcode

NetBarcode 是一個開源的 .NET 條碼生成程式庫,發佈於MIT授權之下。 它旨在從字串資料生成線性條碼圖像,並清晰地實現了這一目的。 該程式庫針對 Code128、EAN-13、Code39 及其他少數 1D 格式 - 所有格式均通過簡單的構造函式和方法集暴露。 它依賴於 SixLabors.ImageSharp 來提供圖像渲染層,從版本 1.8 開始,這一依賴在公共 API 中透過 Image<Rgba32> 返回型別在 GetImage() 中得到反映。

NetBarcode 不旨在成為通用的條碼工具包。 它沒有讀取功能,也不支援 2D 格式。 這些是故意的範疇決策。 該程式庫非常適合只需 1D 條碼的應用,並且它的MIT授權讓在開源環境中的採用變得簡單。

關鍵的結構特徵:

  • MIT 授權:該程式庫本身是MIT授權的,但其 SixLabors.ImageSharp 依賴有一個應用於收入門檻的分裂商業許可
  • 僅限 1D 設計:Type 枚舉在8個線性符號家庭中定義了11個值; 無 2D 條目,亦無 UPC-A、UPC-E、ITF 或 MSI 條目
  • SixLabors.ImageSharp 依賴:圖像渲染委託給 ImageSharp,從 v1.8 開始,GetImage() 方法返回 Image<Rgba32>,在公共 API 中直接暴露 ImageSharp 的型別
  • 基於構造函式的 API:條碼由 new Barcode(data, Type.X) 建立,並透過 SaveImageFile()GetImage() 保存或檢索
  • 無讀取 API:NetBarcode 僅用於建立; 沒有解碼條碼圖像的方法或類別
  • 無批次處理:每個條碼都是獨立的構造函式調用; no built-in enumeration or batch pipeline

型別枚舉設計邊界

Type 枚舉是NetBarcode可以生成的權威列表。 檢查它會揭示程式庫的範疇:

//NetBarcodeType enum — complete list as of v1.8
public enum Type
{
    Codabar,
    Code11,
    Code128,
    Code128A,
    Code128B,
    Code128C,
    Code39,
    Code39E,
    Code93,
    EAN13,
    EAN8
}

// These entries do not exist — attempting to use them produces a CS0117 compile error:
// Type.QRCode      — does not exist
// Type.DataMatrix  — does not exist
// Type.PDF417      — does not exist
// Type.Aztec       — does not exist
// Type.UPCA        — does not exist
// Type.UPCE        — does not exist
// Type.ITF         — does not exist
// Type.MSI         — does not exist
//NetBarcodeType enum — complete list as of v1.8
public enum Type
{
    Codabar,
    Code11,
    Code128,
    Code128A,
    Code128B,
    Code128C,
    Code39,
    Code39E,
    Code93,
    EAN13,
    EAN8
}

// These entries do not exist — attempting to use them produces a CS0117 compile error:
// Type.QRCode      — does not exist
// Type.DataMatrix  — does not exist
// Type.PDF417      — does not exist
// Type.Aztec       — does not exist
// Type.UPCA        — does not exist
// Type.UPCE        — does not exist
// Type.ITF         — does not exist
// Type.MSI         — does not exist
Public Enum Type
    Codabar
    Code11
    Code128
    Code128A
    Code128B
    Code128C
    Code39
    Code39E
    Code93
    EAN13
    EAN8
End Enum

' These entries do not exist — attempting to use them produces a BC30456 compile error:
' Type.QRCode      — does not exist
' Type.DataMatrix  — does not exist
' Type.PDF417      — does not exist
' Type.Aztec       — does not exist
' Type.UPCA        — does not exist
' Type.UPCE        — does not exist
' Type.ITF         — does not exist
' Type.MSI         — does not exist
$vbLabelText   $csharpLabel

該枚舉在八個線性符號家庭中有十一個條目,這反映了該程式庫的預期範疇。 任何需要 QR Code、DataMatrix、PDF417、Aztec、UPC-A、UPC-E、ITF 或 MSI 的應用程式必須獲得額外的程式包以提供這些格式。

理解IronBarcode

IronBarcode 是一個商業的 .NET 條碼程式庫,涵蓋生成和讀取於一個包中。 它由 Iron Software 開發和維護,對現有 .NET 版本的定期更新針對。 該程式庫的靜態 API 表面被設計成,從一種條碼格式切換到另一種格式只需更改一個常數 - 同樣的 BarcodeWriter.CreateBarcode 調用可以生成 Code128 以及 QR 碼、DataMatrix、PDF417 和 Aztec。

IronBarcode 透過 BarcodeReader 類處理條碼讀取,它接受圖像文件和 PDF 文件並返回解碼結果及格式識別。 這意味著建立和讀取共享一個依賴、一個授權鍵和一個釋出說明以供跟踪。

主要特徵:

  • 統一生成和讀取:BarcodeWriterBarcodeReader 都被包括在一個 NuGet 包中
  • 支援 50 多種格式:1D 格式包括所有NetBarcode等價物; 2D 格式包括 QR Code、DataMatrix、PDF417、Aztec 等
  • 流暢鏈式 API:BarcodeWriter.CreateBarcode(data, encoding) 返回 GeneratedBarcode 物件,其中包括 ToPngBinaryData() 和基於流的重載等輸出方法
  • 無 ImageSharp 依賴:IronBarcode 的圖像渲染是自包含的; 沒有引入 SixLabors 傳遞依賴
  • PDF 支援:讀取 API 除了圖像格式也直接接受 .pdf 文件
  • 商業授權:需要授權鍵; 試用模式可用,可在購買後移除水印

特性比較

特性 NetBarcode IronBarcode
1D 條碼建立
2D 條碼建立
條碼讀取
PDF 支援
總符號數 11 枚舉值 / 8 個家族 50+
ImageSharp 依賴 有(分裂授權)
授權模型 MIT (+ ImageSharp 條件) 商業

詳細特性比較

特性 NetBarcode IronBarcode
生成
Code128(及 128A/B/C)、Code39、Code39 擴展、Code93、Code11
EAN-13、EAN-8、Codabar
UPC-A、UPC-E、ITF、MSI
QR Code
DataMatrix
PDF417
Aztec
GS1-128、GS1 DataBar
郵政格式(Intelligent Mail、Royal Mail)
SVG輸出
讀取
解碼條碼圖像
從 PDF 文件中讀取
多條碼檢測
自動格式檢測
API 設計
基於構造函式的建立 無(靜態方法)
流暢輸出鏈
支援批量處理 手動 內建
授權和依賴關係
程式庫授權 MIT 商業
ImageSharp 依賴
商業支持 社區 專屬

格式覆蓋

NetBarcode方法

NetBarcode 通過 Type 枚舉提供 11 種線性條碼枚舉值,涵蓋 8 種符號家族。 在該範疇內,格式選擇很簡單——將適當的枚舉成員傳遞給構造函式。 邊界同樣明確:嘗試使用超出枚舉的格式會導致編譯時錯誤。

//NetBarcode— formats that compile and produce output
using NetBarcode;

var code128 = new Barcode("12345678901234", Type.Code128);
code128.SaveImageFile("shipping.png");

var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product.png");

//NetBarcode— formats that produce CS0117 compile errors
// var qr     = new Barcode("data", Type.QRCode);     // error CS0117
// var dm     = new Barcode("data", Type.DataMatrix);  // error CS0117
// var p417   = new Barcode("data", Type.PDF417);      // error CS0117
// var aztec  = new Barcode("data", Type.Aztec);       // error CS0117
// var upca   = new Barcode("data", Type.UPCA);        // error CS0117
// var itf    = new Barcode("data", Type.ITF);         // error CS0117
//NetBarcode— formats that compile and produce output
using NetBarcode;

var code128 = new Barcode("12345678901234", Type.Code128);
code128.SaveImageFile("shipping.png");

var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product.png");

//NetBarcode— formats that produce CS0117 compile errors
// var qr     = new Barcode("data", Type.QRCode);     // error CS0117
// var dm     = new Barcode("data", Type.DataMatrix);  // error CS0117
// var p417   = new Barcode("data", Type.PDF417);      // error CS0117
// var aztec  = new Barcode("data", Type.Aztec);       // error CS0117
// var upca   = new Barcode("data", Type.UPCA);        // error CS0117
// var itf    = new Barcode("data", Type.ITF);         // error CS0117
Imports NetBarcode

Dim code128 As New Barcode("12345678901234", Type.Code128)
code128.SaveImageFile("shipping.png")

Dim ean13 As New Barcode("5901234123457", Type.EAN13)
ean13.SaveImageFile("product.png")

'NetBarcode— formats that produce CS0117 compile errors
' Dim qr As New Barcode("data", Type.QRCode)     ' error CS0117
' Dim dm As New Barcode("data", Type.DataMatrix) ' error CS0117
' Dim p417 As New Barcode("data", Type.PDF417)   ' error CS0117
' Dim aztec As New Barcode("data", Type.Aztec)   ' error CS0117
' Dim upca As New Barcode("data", Type.UPCA)     ' error CS0117
' Dim itf As New Barcode("data", Type.ITF)       ' error CS0117
$vbLabelText   $csharpLabel

這種限制在制藥跟踪(根據 FDA 2D 條碼要求需要 DataMatrix)、航空公司登機牌(Aztec)、物流清單(PDF417)和移動營銷(QR Code)等行業中成為約束。 這些需求中的每一個都使NetBarcode作為獨立解決方案無法滿足。

IronBarcode方法

IronBarcode 透過相同的 BarcodeWriter.CreateBarcode 方法公開所有支援的格式。 從 1D 格式轉到 2D 格式時 API 不會改變——唯一不同的是 BarcodeEncoding 常量。

using IronBarCode;

// 1D formats — identical API to the 2D examples below
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("shipping.png");

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product.png");

// 2D formats — same method, different encoding constant
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-label.png");

BarcodeWriter.CreateBarcode("M1DOE/JOHN MR ABC123 JFKLHR 0012 123Y015A0001 100", BarcodeEncoding.Aztec)
    .SaveAsPng("boarding-pass.png");
using IronBarCode;

// 1D formats — identical API to the 2D examples below
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("shipping.png");

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product.png");

// 2D formats — same method, different encoding constant
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-label.png");

BarcodeWriter.CreateBarcode("M1DOE/JOHN MR ABC123 JFKLHR 0012 123Y015A0001 100", BarcodeEncoding.Aztec)
    .SaveAsPng("boarding-pass.png");
Imports IronBarCode

' 1D formats — identical API to the 2D examples below
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128) _
    .SaveAsPng("shipping.png")

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
    .SaveAsPng("product.png")

' 2D formats — same method, different encoding constant
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsPng("qr.png")

BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix) _
    .SaveAsPng("pharma-label.png")

BarcodeWriter.CreateBarcode("M1DOE/JOHN MR ABC123 JFKLHR 0012 123Y015A0001 100", BarcodeEncoding.Aztec) _
    .SaveAsPng("boarding-pass.png")
$vbLabelText   $csharpLabel

完整的支援常量列表可在 支援條碼格式 參考中找到,涵蓋所有 2D 條碼建立 格式及完整的 1D 集。

生成API設計

NetBarcode方法

NetBarcode 的生成模型是基於構造函式的。 一個 Barcode 物件使用資料字串和一個 Type 枚舉值被實例化。 輸出要麼直接保存在 SaveImageFile() 中,要麼透過 Image<Rgba32> 來檢索 GetImage()。 自1.8版起,GetImage() 的返回型別為 SixLabors.ImageSharp 型別,這意味著任何儲存或處理返回值的程式碼都必須導入並在 ImageSharp API 中操作。

using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

// Constructor-based creation
var barcode = new Barcode("12345678901234", Type.Code128);

// Save to file — straightforward
barcode.SaveImageFile("code128.png");

// GetImage() returns Image<Rgba32> — ImageSharp import required
Image<Rgba32> image = barcode.GetImage();

// Further processing requires familiarity with the ImageSharp API
using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

// Constructor-based creation
var barcode = new Barcode("12345678901234", Type.Code128);

// Save to file — straightforward
barcode.SaveImageFile("code128.png");

// GetImage() returns Image<Rgba32> — ImageSharp import required
Image<Rgba32> image = barcode.GetImage();

// Further processing requires familiarity with the ImageSharp API
using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
Imports NetBarcode
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats
Imports System.IO

' Constructor-based creation
Dim barcode As New Barcode("12345678901234", Type.Code128)

' Save to file — straightforward
barcode.SaveImageFile("code128.png")

' GetImage() returns Image(Of Rgba32) — ImageSharp import required
Dim image As Image(Of Rgba32) = barcode.GetImage()

' Further processing requires familiarity with the ImageSharp API
Using stream As New MemoryStream()
    image.SaveAsPng(stream)
    Dim bytes As Byte() = stream.ToArray()
End Using
$vbLabelText   $csharpLabel

GetImage() 方法的返回型別將下游程式碼與 ImageSharp 函式庫連結在一起。 任何接受或儲存結果的方法都必須將其聲明為 Image<Rgba32>,在調用程式碼中引入一個傳遞依賴。

IronBarcode方法

IronBarcode 使用流暢的鏈式方式。 BarcodeWriter.CreateBarcode 返回一個 GeneratedBarcode 物件,攜帶多個輸出方法。 圖像處理是內部進行的 — 沒有 ImageSharp 型別暴露給調用程式碼。

using IronBarCode;

// Fluent generation — save directly to file
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("code128.png");

// Multiple output options on the same GeneratedBarcode object
var barcode = BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128);
barcode.SaveAsPng("code128.png");
barcode.SaveAsJpeg("code128.jpg");
byte[] bytes = barcode.ToPngBinaryData();

using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
using IronBarCode;

// Fluent generation — save directly to file
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("code128.png");

// Multiple output options on the same GeneratedBarcode object
var barcode = BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128);
barcode.SaveAsPng("code128.png");
barcode.SaveAsJpeg("code128.jpg");
byte[] bytes = barcode.ToPngBinaryData();

using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
Imports IronBarCode

' Fluent generation — save directly to file
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128) _
    .SaveAsPng("code128.png")

' Multiple output options on the same GeneratedBarcode object
Dim barcode = BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
barcode.SaveAsPng("code128.png")
barcode.SaveAsJpeg("code128.jpg")
Dim bytes As Byte() = barcode.ToPngBinaryData()

Using stream As New MemoryStream()
    barcode.SaveAsPng(stream)
End Using
$vbLabelText   $csharpLabel

詳細選項包括1D 條碼建立的寬度、高度及標籤配置都在IronBarcode文件中覆蓋。

讀取能力

NetBarcode方法

NetBarcode 沒有讀取 API。 沒有方法、類別或配置可以將條碼圖像解碼回其資料字串。 這是刻意的範疇邊界而非尚未釋出的省略。 一個生成條碼且後來需要讀取它們的專案 — 例如驗證已列印標籤、掃描退貨包裝或從供應商發票中提取值 — 必須引入一個單獨的程式庫來實現該目的。

//NetBarcode— no reading method exists
// The following does not compile because the method does not exist:
// var result = barcode.Read("image.png");  // method does not exist

// The typical workaround requires ZXing.Net as a third-party dependency
//NetBarcode— no reading method exists
// The following does not compile because the method does not exist:
// var result = barcode.Read("image.png");  // method does not exist

// The typical workaround requires ZXing.Net as a third-party dependency
'NetBarcode— no reading method exists
' The following does not compile because the method does not exist:
' Dim result = barcode.Read("image.png")  ' method does not exist

' The typical workaround requires ZXing.Net as a third-party dependency
$vbLabelText   $csharpLabel

ZXing.Net 程式庫是與NetBarcode一起進行讀取的最常見補充,帶來第三個 API 表面並且一個與已經存在於QR Code的 2D 程式庫同時需要版本管理的包。

IronBarcode方法

IronBarcode 包含 BarcodeReaderBarcodeWriter 在相同的包中。 讀取 API 接受圖像文件和 PDF 文件,並返回解碼結果集合,每個結果包含條碼值、格式型別和頁碼(如果是從 PDF 中讀取的情況下)。

using IronBarCode;

// Read barcodes from an image file
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
    Console.WriteLine($"{r.Format}: {r.Value}");
}

// Read barcodes from a PDF document — no additional library required
var pdfResults = BarcodeReader.Read("invoice.pdf");
foreach (var r in pdfResults)
{
    Console.WriteLine($"Page {r.PageNumber}: {r.Value}");
}
using IronBarCode;

// Read barcodes from an image file
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
    Console.WriteLine($"{r.Format}: {r.Value}");
}

// Read barcodes from a PDF document — no additional library required
var pdfResults = BarcodeReader.Read("invoice.pdf");
foreach (var r in pdfResults)
{
    Console.WriteLine($"Page {r.PageNumber}: {r.Value}");
}
Imports IronBarCode

' Read barcodes from an image file
Dim imageResults = BarcodeReader.Read("shipping-label.png")
For Each r In imageResults
    Console.WriteLine($"{r.Format}: {r.Value}")
Next

' Read barcodes from a PDF document — no additional library required
Dim pdfResults = BarcodeReader.Read("invoice.pdf")
For Each r In pdfResults
    Console.WriteLine($"Page {r.PageNumber}: {r.Value}")
Next
$vbLabelText   $csharpLabel

從圖像讀取條碼指南涵蓋了讀取 API 中可用的速度調整、多條碼檢測及圖像校正選項。

依賴與授權考量

NetBarcodeand ImageSharp

NetBarcode 是MIT授權的。 它所依賴的 SixLabors.ImageSharp 程式庫使用的是不同的模型:對開源專案免費使用及適用於年營收在定義門檻以下的公司,但在超過門檻時需要商業授權。 這一分裂條件適用於,不論 ImageSharp 是否被專案的 .csproj 中明確列出或是經由NetBarcode傳遞地引入。


<PackageReference Include="NetBarcode" Version="1.8.3" />

<PackageReference Include="NetBarcode" Version="1.8.3" />
XML

對於在大規模處理條碼的零售或物流公司來說 — 應對NetBarcode主要目標的用例 — 年收入通常高於 ImageSharp 商業授權適用的門檻。 合規審計可能揭示這種義務嵌入於包樹中。

v1.8 版本引入了 ImageSharp 依賴的另一個後果:GetImage() 的返回型別從內部表示變成 SixLabors.ImageSharp.Image<Rgba32>。 現有未加型別聲明調用 GetImage() 的程式碼在編譯時中斷,並且新 using 指令必須可用於 SixLabors.ImageSharpSixLabors.ImageSharp.PixelFormats。 當 ImageSharp 在未來版本中自身 API 演變時,NetBarcode 的公共 API 表面會受影響。

IronBarcode

IronBarcode 無 SixLabors.ImageSharp 依賴。 其授權條款在IronBarcode 授權頁面上直接說明,沒有分裂門檻或傳遞商業義務。 提供試用鍵以供評估; 購買的授權可以移除生成輸出中的試用水印。

API對映參考

NetBarcode IronBarcode 注意
new Barcode(data, Type.Code128) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) 建構函式 → 靜態方法
new Barcode(data, Type.Code128A/B/C) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) IronBarcode 自動選擇子集
new Barcode(data, Type.EAN13) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN13) 直接映射
new Barcode(data, Type.EAN8) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN8) 直接映射
new Barcode(data, Type.Code39) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code39) 直接映射
new Barcode(data, Type.Code39E) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code39Extended) 直接映射
new Barcode(data, Type.Code93) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code93) 直接映射
new Barcode(data, Type.Code11) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code11) 直接映射
new Barcode(data, Type.Codabar) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Codabar) 直接映射
barcode.SaveImageFile("x.png") .SaveAsPng("x.png") 方法重命名
barcode.SaveImageFile("x.jpg") .SaveAsJpeg("x.jpg") 方法重命名
barcode.GetImage()Image<Rgba32> .ToPngBinaryData().SaveAsPng() 無 ImageSharp 型別曝光
Type.UPCA / UPCE / ITF / MSI BarcodeEncoding.UPCA / UPCE / ITF / MSI 新能力
Type.QRCode BarcodeEncoding.QRCode 新能力
Type.DataMatrix BarcodeEncoding.DataMatrix 新能力
Type.PDF417 BarcodeEncoding.PDF417 新能力
Type.Aztec BarcodeEncoding.Aztec 新能力
無讀取API BarcodeReader.Read(path) 新能力
using NetBarcode; using IronBarCode; 命名空間替換
using SixLabors.ImageSharp; 移除 不再需要

完整的格式參考可在支援條碼格式文件中找到。

當團隊考慮從NetBarcode轉向 IronBarcode

QR Code和 2D 格式需求

評估NetBarcode替代方案的最頻繁觸發因素是新的QR Code需求。 為零售標籤或運輸清單開始 1D 條碼建立的應用程式通常會收到後續對於QR Code的需求 — 無接觸連結、行動應用深層連結、行銷活動。 由於 Type 枚舉中沒有 QR 條目,這一需求在NetBarcode無法實現。 解決這一缺口的團隊加入了單獨的 QR 程式庫,當需要DataMatrix用於制藥整合時,或物流貨運商要求其在運輸標籤上使用PDF417時,則面臨第二次評估。

條碼讀取變得必要

某些專案以純生成開始,然後新增驗證或文件處理需求:確認已列印條碼與其來源資料匹配,從進口供應商發票中提取條碼值,或掃描退貨包裝標籤。NetBarcode沒有為此提供途徑。 新增 ZXing.Net 或類似的讀取程式庫會在已經有NetBarcode和 QR 程式庫的程式碼基礎中引入第三個需學習和維護的 API。 即使未來的階段可能出現讀取需求的專案通常發現選擇一個同時解決兩者問題的初始程式庫更有效率。

ImageSharp 商業授權審計

對第三方依賴關係進行的法律和合規審查偶爾會在NetBarcode包樹中影響的 ImageSharp 商業授權條件浮現。 對於年營收超過門檻的公司來說,這一義務無論是 ImageSharp 是故意選擇還是經由NetBarcode傳遞引入適用。 在審計過程中 — 而非在採用之前 — 發現這一點的團隊面臨的是追溯補救而非計劃遷移。 在開始專案前評估依賴授權是更乾淨的路徑。

減少多程式庫複雜性

積累了NetBarcode用於 1D 建立、一個 QR 專用程式庫的 2D 輸出及 ZXing.Net 進行讀取的團隊發現自己在維護三個程式包的版本相容性。 每次升級週期都需要檢查三個程式庫是否在其共享的 ImageSharp 版本上達成一致。 每位專案新開發人員都會遇到三個不同的 API,而它們在概念上是一個問題。 合併到一個條碼程式庫簡化了入門階段,減少版本衝突面,並且專注於一個釋出週期的維護。

常見的遷移考慮因素

包替換及傳遞依賴清理

dotnet remove package NetBarcode 移除NetBarcode是第一步。 如果專案中的其他包也經由傳遞的方式引入,SixLabors.ImageSharp 包可能會重新出現在依賴樹中。 在移除後,使用 dotnet list package --include-transitive 檢查恢復的包列表以確認 ImageSharp 是否仍然存在以及其商業授權條件是否仍然適用。

GetImage() 返回型別替代

所有以 GetImage() 的結果儲存為 Image<Rgba32> 的程式碼必須更新。 ImageSharp 型別在IronBarcode中沒有直接等效物; 替代方案取決於圖像在下游的使用方式。 保存到流的程式碼可以直接用 .SaveAsPng(stream)GeneratedBarcode 物件上替換。 檢索原始字節的程式碼可以使用 .ToPngBinaryData()。 返回圖像進一步使用 ImageSharp 操作的程式碼需要單獨進行這些操作的評估。

命名空間更新

匯入 using NetBarcode;using SixLabors.ImageSharp;using SixLabors.ImageSharp.PixelFormats;using SixLabors.Fonts; 的文件需要這些指令替換為 using IronBarCode;。 專案範圍內搜索這些使用語句可識別每個在嘗試建置前需要注意的文件。

額外的IronBarcode能力

在這次比較中覆蓋的核心生成和讀取功能外,IronBarcode 提供:

  • SVG 條碼輸出生成適用於列印工作流程和可擴展標籤設計的向量格式條碼圖像
  • 條碼樣式化配置生成條碼上的條形顏色、背景顏色、註釋字型、邊距及旋轉
  • GS1-128 和 GS1 DataBar零售和供應鏈合規的應用識別符結構條碼
  • 郵政格式Intelligent Mail、Royal Mail 及其他郵政符號學為郵寄應用
  • PDF 條碼擷取直接從多頁面 PDF 文件中讀取條碼而不需要額外 PDF 程式庫
  • 批次生成在單一路徑線中有效地處理條碼資料集合
  • MAUI 和行動目標IronBarcode 支援 .NET MAUI 應用的跨平台行動和桌面條碼工作流程

.NET相容性和未來準備

IronBarcode 針對當前 .NET 版本並維持 .NET Standard 的相容性,以供尚未遷移到最新 .NET 的專案使用。 Iron Software 的定期發行速度與每一個主要 .NET 發行對應地進行相容性更新。NetBarcode針對 .NET Standard 2.0 並在當前運行時間上透過該相容層正常運行,儘管其程式庫的更新頻率及 2D 格式集由其設計範疇固定。

結論

NetBarcode 和IronBarcode代表了條碼程式庫範疇上的不同定位。NetBarcode是專注的、乾淨的 1D 條碼建立實現:於八個線性符號家庭內的十一個枚舉值、一個簡單的構造函式 API 和一個讓開源專案此間易於採用的MIT授權,僅在 ImageSharp 的收入門檻內。IronBarcode是一個涵蓋超過 50 種格式的建立、更能讀取圖像和 PDF 的廣泛工具包,同時以語句流暢 API 以同等待遇處理 1D 和 2D 格式。

對於需求真實地限於支援集內的線性條碼建立的專案而言 — 一個為歐洲零售掃描儀生成 EAN-13 編碼的銷售點系統或壽命固定且短暫的內部工具 —NetBarcode提供了所需且不引入商業依賴。 該程式庫在其預定範疇內構建良好,從第一眼看 Type 枚舉中即清楚表明該範疇。

對於範疇可能擴大的專案、最終將需要讀取的專案或對 ImageSharp 傳遞依賴的合規性審核有顧慮的專案,IronBarcode 繞開這三者都在一個包中解決。 開始以NetBarcode該 1D 建立並於後來增加 QRCoder 以求 2D 與 ZXing.Net 進行讀取的團隊將形成三個獨立的程式庫維護責任;IronBarcode將其合併為一。

選擇直接根據專案的需求決定。 若NetBarcode的 1D 枚舉值覆蓋八個符號家族並且無讀取能力完全符合具體規範,那麼NetBarcode是一個技術上健全的選擇。 若規範包括任何 2D 格式、任何讀取工作流程或者對 ImageSharp 授權條件的任何顧慮,IronBarcode 是更完整的回答。

常見問題

什麼是 NetBarcode?

NetBarcode 是一個 .NET 條碼程式庫,用於在 C# 應用程式中生成和讀取條碼。它是開發者在為 .NET 專案選擇條碼解決方案時評估的幾個選擇之一。

NetBarcode 和 IronBarcode 之間的主要區別是什麼?

IronBarcode 使用靜態、無狀態的 API,不需要實例管理,而 NetBarcode 通常需要在使用前建立和配置實例。IronBarcode 還提供原生的 PDF 支援、自動格式檢測,以及跨所有環境的單鍵授權。

IronBarcode 的授權比 NetBarcode 更容易嗎?

IronBarcode使用一個覆蓋開發和生產部署的單一授權金鑰。相比於將SDK金鑰與運行時金鑰分開的授權系統,這簡化了CI/CD管道和Docker配置。

IronBarcode 是否支持 NetBarcode 支援的所有條碼格式?

IronBarcode支持超過30種條碼符號,包括QR Code、Code 128、Code 39、DataMatrix、PDF417、Aztec、EAN-13、UPC-A、GS1等。格式自動檢測意味著不需要顯式的格式枚舉。

IronBarcode支持原生PDF條碼讀取嗎?

是的。IronBarcode可以直接從PDF文件中讀取條碼,使用BarcodeReader.Read("document.pdf"),無需單獨的PDF渲染程式庫。每頁結果包括頁碼、條碼格式、值和置信分數。

IronBarcode 如何處理批處理與 NetBarcode 相比?

IronBarcode的靜態方法無狀態且天然執行緒安全,可以直接使用Parallel.ForEach而無需每個執行緒的實例管理。任何價格級別下都沒有吞吐量上限。

IronBarcode支持哪些.NET版本?

IronBarcode支持.NET Framework 4.6.2+、.NET Core 3.1,以及.NET 5、6、7、8和9,單一NuGet包。平台目標包括Windows x64/x86、Linux x64和macOS x64/ARM。

如何在.NET專案中安裝IronBarcode?

通過NuGet安裝IronBarcode:在Package Manager Console中運行 'Install-Package IronBarCode',或在CLI中運行 'dotnet add package IronBarCode'。不需要額外的SDK安裝程式或運行時文件。

我可以在購買前評估 IronBarcode,而不像 NetBarcode嗎?

可以。IronBarcode的試用模式返回完整解碼的條碼值——只有生成的輸出圖像上有水印。您可以在自己的文件上評估讀取準確性,然後再決定購買。

NetBarcode 和 IronBarcode 的價格差異是多少?

IronBarcode起價為$749,為單開發者所適用的永久授權,覆蓋開發和生產。價格詳情和批量選項可在IronBarcode授權頁面獲得。無需單獨的運行時授權。

從 NetBarcode 遷移到 IronBarcode 是否簡單?

從 NetBarcode 遷移到 IronBarcode 主要涉及用 IronBarcode 的靜態方法替換基於實例的 API 呼叫,移除授權樣板,和更新結果屬性名稱。大多數遷移涉及減少程式碼而非增加。

IronBarcode可以生成帶有Logo的QR碼嗎?

可以。QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") 可以原生嵌入品牌圖像進QR碼,並可配置錯誤更正。也支持通過ChangeBarCodeColor() 生成彩色QR碼。

Curtis Chau
技術作家

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

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

Iron 支援團隊

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