LEADTOOLS 条形码库与 IronBarcode 对比:C# 条形码库比较
NetBarcode vs IronBarcode:1D 生成与完整条形码工具包的比较
NetBarcode的Type枚举没有QR码条目。 当一个货运标签项目在第三个月增加了二维码要求时,开发人员会求助于第二个库。 第二个库有自己的 API 接口、自己的发布计划,以及一个共享的 SixLabors.ImageSharp 依赖项,其版本可能与NetBarcode所需的版本不一致。 本文将对比分析NetBarcode的功能、适用场景以及IronBarcode如何弥补NetBarcode的不足,而无需添加第二个或第三个软件包。
了解 NetBarcode
NetBarcode 是一个开源的.NET条形码生成库,以麻省理工学院许可证发布。 它旨在根据字符串数据生成线性条形码图像,并且完美地实现了这一目的。 该库针对 Code128、EAN-13、Code39 及其他少数 1D 格式 —— 全部通过简单的构造方法和一小组输出方法进行公开。 它对SixLabors.ImageSharp的依赖提供了图像渲染层,自1.8版本起,该依赖通过Image<Rgba32>返回类型在公共API中体现。
NetBarcode 并不打算成为通用条形码工具包。 它不具备读取功能,也不支持二维格式。 这些都是经过深思熟虑的范围界定。 该库非常适合只需要一维条形码而不需要其他功能的应用,其麻省理工学院许可证使得在开源环境中采用该库变得非常简单。
主要架构特征:
- MIT 许可证:该库本身采用麻省理工学院许可证,但其 SixLabors.ImageSharp 依赖项采用分离式商业许可证,该许可证适用于达到收入门槛的情况。
- 仅限1D设计:
Type枚举在8种线性符号学家族中定义了11个值; 没有 2D 条目,也没有 UPC-A、UPC-E、ITF 或 MSI 条目 - SixLabors.ImageSharp依赖:图像渲染委托给ImageSharp,自v1.8起,
Image<Rgba32>,直接在公共API中暴露ImageSharp的类型。 - 基于构造函数的API:条形码通过
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
枚举在 8 个线性符号学家族中有 11 个条目,这反映了库的预期范围。 任何需要 QR 码、DataMatrix、PDF417、Aztec、UPC-A、UPC-E、ITF 或 MSI 的应用程序都必须获取单独的软件包以提供这些格式。
了解IronBarcode
IronBarcode是一个商业化的.NET条形码库,在一个软件包中涵盖了条形码的生成和读取。 它由Iron Software开发和维护,并定期更新以适应当前的.NET版本。 库的静态API表面设计为从一种条形码格式切换到另一种格式仅需更改一个常量——生成Code128的那个BarcodeWriter.CreateBarcode调用也生成QR码、DataMatrix、PDF417和Aztec。
IronBarcode通过BarcodeReader类处理条形码读取,接受图像文件和PDF文档并返回包含格式识别的解码结果。 这意味着生成和读取共享一个依赖项、一个许可证和一套发行说明来跟踪。
主要特点:
- 统一生成和读取:
BarcodeReader均包含在一个NuGet包中 -支持的格式超过 50 种: 1D 格式包括所有NetBarcode等效格式; 二维码格式包括二维码、DataMatrix、PDF417、Aztec 等。 - 流畅链式API:
ToPngBinaryData(),以及基于流的重载 -不依赖 ImageSharp:IronBarcode的图像渲染是独立的; 未引入 SixLabors 传递依赖关系 - PDF支持:读取API直接接受
.pdf文件,除了图像格式 -商业许可证:需要许可证密钥; 试用模式可用,购买后可去除水印。
功能对比
| 特征 | NetBarcode | IronBarcode |
|---|---|---|
| 一维条形码生成 | 是 | 是 |
| 二维条形码生成 | 否 | 是 |
| 条形码读取 | 否 | 是 |
| 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 | 否 | 是 |
| 二维码 | 否 | 是 |
| 数据矩阵 | 否 | 是 |
| PDF417 | 否 | 是 |
| 阿兹特克 | 否 | 是 |
| GS1-128,GS1 数据条 | 否 | 是 |
| 邮政格式(智能邮件、皇家邮政) | 否 | 是 |
| SVG 输出 | 否 | 是 |
| 阅读 | ||
| 解码条形码图像 | 否 | 是 |
| 读取 PDF 文档 | 否 | 是 |
| 多条形码检测 | 否 | 是 |
| 自动格式检测 | 否 | 是 |
| API 设计 | ||
| 基于构造器的创建 | 是 | 否(静态方法) |
| 流畅的输出链 | 否 | 是 |
| 批量处理支持 | 手册 | 内置 |
| 许可和依赖关系 | ||
| 图书馆许可 | 麻省理工学院 | 商业翻译 |
| ImageSharp依赖性 | 是 | 否 |
| 商业支持 | 社区 | 专业 |
格式覆盖范围
NetBarcode方法
NetBarcode通过Type枚举提供8种符号学家族中的11个线性条形码枚举值。 在这个范围内,格式选择很简单——将相应的枚举成员传递给构造函数即可。 界限同样清晰:尝试使用枚举范围之外的格式会产生编译时错误。
//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
在某些行业,这种边界会成为一种限制,例如药品追踪(根据 FDA 2D 条形码规定需要使用 DataMatrix)、航空公司登机牌(Aztec)、物流清单(PDF417)和移动营销(二维码)。 这些要求都使得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")
生成 API 设计
NetBarcode方法
NetBarcode 的生成模型是基于构造函数的。 一个Type枚举值实例化。 输出要么直接用Image<Rgba32>。 自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
GetImage()方法的返回类型将下游代码与ImageSharp库绑定在一起。 任何接受或存储结果的方法必须将其声明为Image<Rgba32>,从而在调用代码中引入传递依赖。
IronBarcode方法
IronBarcode使用流畅的链式架构。 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
IronBarcode文档中详细介绍了1D 条形码生成的选项,包括宽度、高度和标签配置。
读取能力
NetBarcode方法
NetBarcode没有读取API。 目前没有任何方法、类或配置可以将条形码图像解码回其数据字符串。 这是有意设定的范围界限,并非在发布前故意省略的内容。 使用NetBarcode生成条形码,之后需要读取条形码的项目(例如验证打印标签、扫描退货或从供应商发票中提取数值)必须为此目的引入单独的库。
//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
ZXing .NET库是与NetBarcode一起读取时最常见的附加组件,它带来了第三个 API 接口和第三个软件包,需要与NetBarcode和任何已添加的二维码库一起进行版本管理。
IronBarcode方法
IronBarcode在与BarcodeReader。 读取 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
从图像读取条形码指南涵盖了读取 API 中提供的速度调整、多条形码检测和图像校正选项。
依赖性和许可方面的考虑
NetBarcode和 ImageSharp
NetBarcode 采用麻省理工学院许可证。 它所依赖的 SixLabors.ImageSharp 库采用不同的模式:对于开源项目和年总收入低于规定阈值的公司是免费的,但超过该阈值则需要商业许可。 无论ImageSharp是否在项目的.csproj中显式列出,或者是否通过NetBarcode传递到达,此分割都适用。
<PackageReference Include="NetBarcode" Version="1.8.3" />
<PackageReference Include="NetBarcode" Version="1.8.3" />
对于大规模处理条形码的零售或物流公司(NetBarcode 的主要目标用例)而言,其年收入通常高于 ImageSharp 商业许可适用的门槛。 合规性审计可能会揭示出软件包树中蕴含的这项义务。
v1.8版本引入了ImageSharp依赖的另一后果:SixLabors.ImageSharp.Image<Rgba32>。 在没有显式类型的情况下调用SixLabors.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> |
.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时
二维码和二维格式要求
评估NetBarcode替代方案的最常见触发因素是对二维码的新需求。 最初为零售标签或货运清单生成一维条形码的应用,通常会有后续需求生成二维码——非接触式链接、移动应用深度链接、营销活动。 由于Type枚举没有QR条目,因此该要求不能在NetBarcode中满足。 如果团队添加单独的 QR 库来弥补差距,那么在制药集成需要 数据矩阵 或物流承运商要求在运输标签上使用PDF417时,他们将面临第二次评估。
条形码读取变得必不可少
有些项目从纯粹的生成开始,后来又增加了验证或文档处理要求:确认打印的条形码与其源数据匹配,从供应商发票中提取条形码值,或扫描退货标签。NetBarcode没有提供此路径。 添加 ZXing .NET或类似的读取库,会在同一个代码库中引入第三个需要学习和维护的 API,该代码库已经包含NetBarcode和 QR 库。 即使在未来的阶段,如果项目需要满足阅读需求,那么选择一个从一开始就能解决这两个问题的图书馆通常会更加高效。
ImageSharp商业许可审核
对第三方依赖项的法律和合规性审查有时会发现NetBarcode软件包树中嵌入的 SixLabors.ImageSharp 商业许可条件。 对于年总收入超过门槛的公司,无论 ImageSharp 是有意选择还是通过NetBarcode间接获得,都适用该义务。 如果团队在审计过程中(而不是在采用之前)发现这个问题,则需要进行追溯性补救,而不是计划性迁移。 在项目启动前评估依赖项许可证是更明智的做法。
降低多库复杂性
已经积累了用于生成一维条码的 NetBarcode、用于二维输出的 QR 专用库以及用于读取的 ZXing .NET的团队发现,他们需要在三个不同的软件包之间保持版本兼容性。 每次升级周期都需要检查这三个库是否对其共享的 ImageSharp 版本达成一致。 项目中的每个新开发人员都会遇到三个不同的 API,而这些 API 从概念上讲都是同一个问题。 将条码库整合为一个单一的条码库,可以简化上线流程,减少版本冲突,并将维护工作集中在一个发布周期内。
常见迁移注意事项
包交换和传递依赖清理
通过dotnet remove package NetBarcode移除NetBarcode是第一步。如果项目中的其他包也通过传递方式引入SixLabors.ImageSharp包,则可能会重新出现在依赖树中。 移除后,用dotnet list package --include-transitive检查恢复的包列表,以确认ImageSharp是否仍然存在及其商业许可条件是否仍适用。
GetImage() 返回类型替换
任何将Image<Rgba32>存储的代码都必须更新。 ImageSharp 类型在IronBarcode中没有直接对应的类型; 替换方式取决于图像在下游的用途。 可以直接在.SaveAsPng(stream)替换将图像保存到流的代码。 检索原始字节的代码可以使用.ToPngBinaryData()。 对返回的图像执行进一步 ImageSharp 操作的代码需要单独评估这些操作。
命名空间更新
导入using IronBarCode;替换这些指令。 在项目范围内搜索这些 using 语句,可以识别出在尝试构建之前需要注意的每个文件。
IronBarcode的其他功能
除了本次对比中涵盖的核心生成和读取功能外, IronBarcode还提供:
- SVG 条形码输出:生成适用于打印工作流程和可缩放标签设计的矢量格式条形码图像 -条形码样式:配置生成的条形码的条形颜色、背景颜色、注释字体、边距和旋转角度
- GS1-128 和 GS1 DataBar :用于零售和供应链合规性的应用标识符结构化条形码 -邮政格式:智能邮件、皇家邮政和其他用于邮件应用的邮政符号
- PDF条形码提取:无需单独的PDF库,即可直接从多页PDF文档中读取条形码。 -批量生成:在单个管道内高效处理条形码数据集合。
- MAUI 和移动目标: IronBarcode支持.NET MAUI应用程序,用于跨平台移动和桌面条码工作流程。
.NET兼容性和未来准备情况
IronBarcode针对当前的.NET版本,并保持与未迁移到现代.NET的项目兼容的.NET Standard兼容性。 Iron Software的定期发布节奏将兼容性更新与每个主要.NET版本的发布保持一致。NetBarcode的目标平台是.NET Standard 2.0,并且可以通过该兼容层在当前的运行时环境中运行,尽管该库的更新频率和 2D 格式集受其设计范围的限制。
结论
NetBarcode 和IronBarcode代表了条形码库范围的不同位置。 NetBarcode是一个专注且简洁的1D条码生成实现:涵盖八个线性符号家族的十一个枚举值,一个简明的构造函数API,以及MIT许可证,这使得在ImageSharp收入门槛内的开源项目采用起来无阻碍。 IronBarcode是一个功能更全面的工具包,涵盖 50 多种格式的条码生成、图像和 PDF 读取,以及对 1D 和 2D 格式一视同仁的流畅 API。
对于需求严格限制在线性条码生成支持集之内的项目——如一个为欧洲零售扫描仪生成EAN-13代码的销售点系统,或具有固定和短寿命的内部工具——NetBarcode提供所需功能而不引入商业依赖。 该库在其范围内构建良好,并且从第一次查看Type枚举开始这个范围就是显而易见的。
对于格式范围可能扩大、最终需要读取或需要对 ImageSharp 传递依赖项进行合规性审查的项目, IronBarcode通过一个软件包解决了所有这三个问题。 团队如果一开始使用NetBarcode生成一维条码,后来又添加了 QRCoder 生成二维条码,以及 ZXing .NET读取条码,就会累积三个独立的库维护义务; IronBarcode将这些功能整合为一个。
这一选择直接源于项目的需求。 如果NetBarcode的11种1D枚举值跨越8个符号家庭,并且没有读取能力能精确匹配规格,那么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 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 在单个 NuGet 包中支持 .NET Framework 4.6.2+、.NET Core 3.1 以及 .NET 5、6、7、8 和 9。平台目标包括 Windows x64/x86、Linux x64 和 macOS x64/ARM。
如何在.NET项目中安装IronBarcode?
通过 NuGet 安装 IronBarcode:在程序包管理器控制台中运行“Install-Package IronBarCode”,或在命令行界面中运行“dotnet add package IronBarCode”。无需其他 SDK 安装程序或运行时文件。
与NetBarcode不同,我可以在购买前评估IronBarcode吗?
是的。IronBarcode 的试用模式会返回完整的解码条形码值——只有生成的输出图像才会带有水印。您可以在购买前,用自己的文档测试读取准确率。
NetBarcode 和 IronBarcode 的价格有什么区别?
IronBarcode 的永久单开发者许可证起价为 749 美元,涵盖开发和生产环境。定价详情和批量许可选项请访问 IronBarcode 许可页面。无需单独的运行时许可证。
从NetBarcode迁移到IronBarcode是否很简单?
从 NetBarcode 迁移到 IronBarcode 主要涉及将基于实例的 API 调用替换为 IronBarcode 的静态方法、移除许可相关的样板代码以及更新结果属性名称。大多数迁移都是减少代码,而不是增加代码。
IronBarcode 能生成带有 logo 的二维码吗?
是的。`QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")` 可以将品牌图片原生嵌入二维码中,并支持配置纠错功能。此外,它还支持通过 `ChangeBarCodeColor()` 函数创建彩色二维码。

