Spire.Barcode 与 IronBarcode:C# 条形码库比较
Spire.Barcode 读取条形码时需要条形码类型:scanner.Scan(path, BarCodeType.Code128)。 如果您正在处理条形码格式不限的文档,则必须先编写格式检测循环才能提取值。 这项 API 决策决定了您使用 Spire.Barcode 构建条形码扫描工作流程的方方面面,因此在您决定采用它之前,有必要了解它。
了解 Spire.Barcode
Spire.Barcode 是一个商业.NET条形码库,由中国软件公司 E-iceblue 开发,该公司还生产 Spire.Doc、Spire.XLS 和 Spire.PDF 产品线。 该库支持对各种一维和二维条码进行生成和读取,并且旨在与更广泛的 E-iceblue 文档处理生态系统集成。
E-iceblue 发布了两个软件包:FreeSpire.Barcode(免费)和 Spire.Barcode(商业产品)。 免费套餐是永久限量产品,并有意设置了诸多限制,而不是限时试用。 商业版软件包解锁了完整的符号集,并取消了免费版中的限制,但需要单独购买许可证,才能用于任何其他 Spire 产品。
Spire.Barcode 的主要架构特征包括:
-必需的 BarCodeType 参数:每次调用 BarcodeScanner.Scan() 都需要一个 BarCodeType 枚举值。 没有只接受文件路径并执行自动格式检测的过载函数。
-设置对象生成模型:条形码生成以可变的 BarcodeSettings 对象为中心,该对象被传递给 BarCodeGenerator 实例,在生成任何输出之前需要进行多个属性赋值。
-不支持原生 PDF: Spire.Barcode 无法直接从 PDF 文件中读取条形码。 基于 PDF 的工作流程需要单独的 Spire.PDF 软件包、单独的许可证,以及开发者编写的手动页面和图像提取代码。
- FreeSpire.Barcode 免费版限制:免费版会在生成的条形码上应用大型评估水印,故意降低扫描性能,限制可用的符号集,并且需要从 E-iceblue 获取注册密钥才能抑制警告对话框。
- E-iceblue 生态系统集成:已经使用 Spire.Doc 或 Spire.XLS 的团队可能会发现 API 的熟悉性和潜在的捆绑定价很有益处。 单独使用 Spire.Barcode 的团队需要承担完整的产品许可费用,而无法享受生态系统带来的好处。
-返回类型:
BarcodeScanner.Scan()返回string[],其中不包含任何格式元数据。 检测到的类型未包含在结果中。
类型规格要求
Spire.Barcode 的 BarcodeScanner.Scan() 没有只接受文件路径的重载。 每次读取操作都要求调用代码预先声明条形码格式。 对于单一格式的工作流程,这种方法是可行的,但对于混合格式的文档处理,它会产生一个候选迭代循环:
// Spire.Barcode: multi-format detection requires a guessing loop
BarcodeScanner scanner = new BarcodeScanner();
var candidates = new[] { BarCodeType.Code128, BarCodeType.QRCode, BarCodeType.DataMatrix, BarCodeType.EAN13, BarCodeType.PDF417 };
string foundValue = null;
foreach (var type in candidates)
{
string[] found = scanner.Scan("barcode.png", type);
if (found.Length > 0)
{
foundValue = found[0];
break;
}
}
// Spire.Barcode: multi-format detection requires a guessing loop
BarcodeScanner scanner = new BarcodeScanner();
var candidates = new[] { BarCodeType.Code128, BarCodeType.QRCode, BarCodeType.DataMatrix, BarCodeType.EAN13, BarCodeType.PDF417 };
string foundValue = null;
foreach (var type in candidates)
{
string[] found = scanner.Scan("barcode.png", type);
if (found.Length > 0)
{
foundValue = found[0];
break;
}
}
Imports Spire.Barcode
Dim scanner As New BarcodeScanner()
Dim candidates = {BarCodeType.Code128, BarCodeType.QRCode, BarCodeType.DataMatrix, BarCodeType.EAN13, BarCodeType.PDF417}
Dim foundValue As String = Nothing
For Each type In candidates
Dim found As String() = scanner.Scan("barcode.png", type)
If found.Length > 0 Then
foundValue = found(0)
Exit For
End If
Next
候选数组中每增加一种类型,就需要额外进行一次扫描。 列表中未包含的任何格式都会被默默忽略。 开发人员负责维护详尽的类型清单,并在新格式进入工作流程时进行重新测试。
了解IronBarcode
IronBarcode是由Iron Software开发的商业.NET条形码库。 它通过静态 API 模型提供条形码读取和生成功能,无需实例管理。 该库以单个NuGet包的形式提供,包含原生 PDF 和图像处理支持,无需额外的依赖项。
IronBarcode 的读取引擎可在一次扫描过程中自动检测 50 多种条码格式。 BarcodeReader.Read() 返回的结果对象包括检测到的条形码类型、解码值以及上下文元数据,例如 PDF 源的页码和源图像中的边界坐标。
IronBarcode的主要特点包括:
-自动格式检测: BarcodeReader.Read() 不需要类型参数。 该库在扫描过程中识别符号系统,并将其包含在结果对象中。
-单包 PDF 支持: BarcodeReader.Read() 直接接受 PDF 文件,无需任何额外的 NuGet 包、许可证或手动页面提取代码。
- Fluent 生成 API:
BarcodeWriter.CreateBarcode()是一个静态工厂方法,它返回一个可链式对象,用于在单个表达式中设置大小、样式和保存。 -试用模式功能齐全: IronBarcode试用版与授权产品使用相同的软件包,提供完整的读取速度、完整的符号体系支持和完整的功能集。 试用模式下生成的输出带有一个小的边缘水印; 阅读行为不受影响。 BarcodeReaderOptions用于调整:读取速度、多条形码检测、图像预处理和预期符号过滤器均可配置,无需切换库产品。 -带有元数据的结果对象:BarcodeResults集合中的每个结果都公开Value、BarcodeType、PageNumber和图像区域数据。
功能对比
下表总结了 Spire.Barcode 和IronBarcode之间的主要区别:
| 特征 | Spire.Barcode | IronBarcode |
|---|---|---|
| 条形码读取 | 是的(需要 BarCodeType 类型) | 是的(自动检测) |
| 条形码生成 | 是 | 是 |
| 自动格式检测 | 否 | 是 |
| 原生 PDF 支持 | 否(需要 Spire.PDF) | 是 |
| 免费套餐 | FreeSpire.条形码(受限) | 试用模式(完整功能) |
| 符号计数 | 39+(商业) | 50岁以上 |
| 许可模式 | 按席位分级和订阅 | 永久支持(可选) |
详细功能对比
| 特征 | Spire.Barcode | IronBarcode |
|---|---|---|
| 阅读 | ||
| 自动格式检测 | 否 | 是 |
| 条形码类型必填 | 是 | 否 |
| 返回格式元数据 | 否 | 是 |
| 每张图片包含多个条形码 | 是 | 是 |
| 阅读速度控制 | 否 | 是的(条形码读取器选项) |
| 机器学习辅助纠错 | 否 | 是 |
| 一代 | ||
| API模型 | 设置对象 + 生成器 | 具有流畅链的静态工厂 |
| 带有自定义徽标的二维码 | 仅限商业层级 | 所有级别 |
| 输出格式 | 图片(PNG、JPEG、BMP) | PNG、JPEG、BMP、SVG、HTML、流媒体 |
| 流畅的链式 | 否 | 是 |
| PDF 支持 | ||
| 从 PDF 中读取条形码 | 需要 Spire.PDF | 原生应用,无需额外软件包 |
| 结果中的页码 | 手动跟踪 | 是 |
| 需要额外许可证 | 是的(Spire.PDF) | 否 |
| 平台 | ||
| .NET Framework | 是 | 是 |
| .NET Core / .NET 5+ | 是 | 是 |
| Docker / Linux | 是 | 是 |
| 符号学 | ||
| 一维条码(Code128、Code39、EAN、UPC) | 是 | 是 |
| 二维码(QR码、DataMatrix码、PDF417码) | 是 | 是 |
| 符号总数 | 39+(商业) | 50岁以上 |
| 许可 | ||
| 免费套餐 | FreeSpire.条形码(带水印,图像质量下降) | 试用模式(全速播放,小水印) |
| 免费套餐需要注册 | 是 | 否 |
| 许可模式 | 按席位永久使用权 + 订阅 | 永久有效,可续期。 |
| 定价切入点 | 349 美元(单个开发者) | 749 美元(Lite) |
条形码读取
Spire.条形码方法
Spire.Barcode 的 BarcodeScanner.Scan() 每次调用都需要一个 BarCodeType 参数。 当格式已知且有保证时,单类型调用是合适的:
// Spire.Barcode — type is mandatory
BarcodeScanner scanner = new BarcodeScanner();
string[] results = scanner.Scan("barcode.png", BarCodeType.Code128);
foreach (string value in results)
{
Console.WriteLine(value);
}
// Spire.Barcode — type is mandatory
BarcodeScanner scanner = new BarcodeScanner();
string[] results = scanner.Scan("barcode.png", BarCodeType.Code128);
foreach (string value in results)
{
Console.WriteLine(value);
}
Imports Spire.Barcode
Dim scanner As New BarcodeScanner()
Dim results As String() = scanner.Scan("barcode.png", BarCodeType.Code128)
For Each value As String In results
Console.WriteLine(value)
Next
当格式事先未知时,唯一可行的方法是遍历候选类型。每次遍历都是一次完整的扫描,任何不在列表中的格式都会被忽略。 结果是一个 string[],它不携带任何类型信息,因此基于格式的下游路由需要调用者进行额外的状态管理。
IronBarcode方法
IronBarcode 的 BarcodeReader.Read() 不需要类型参数。 该库只需一次扫描即可自动检测所有受支持符号体系的格式。 无论源图像包含多少种不同的条形码格式,从图像中读取条形码都只需要一次方法调用:
//IronBarcode— auto-detection built in
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
Console.WriteLine($"{result.BarcodeType}: {result.Value}");
}
//IronBarcode— auto-detection built in
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
Console.WriteLine($"{result.BarcodeType}: {result.Value}");
}
Imports IronBarcode
'IronBarcode— auto-detection built in
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
Console.WriteLine($"{result.BarcodeType}: {result.Value}")
Next
每个结果对象包含 BarcodeType、Value 和位置元数据。 基于格式的下游路由不需要额外的状态——类型本身就存在于结果中。
免费套餐限制
Spire.Barcode 免费层
FreeSpire.Barcode 会在生成的条形码图像上应用大型评估水印。 水印覆盖了条形码,使其不适合生产使用,并妨碍了对生产质量的有效评估。 免费版有意降低了扫描性能,这意味着评估期间进行的吞吐量测量并不能代表 Spire.Barcode 的商业性能。 免费版软件包还需要从 E-iceblue 获取注册密钥,才能在执行过程中抑制警告对话框。 免费版提供的符号集是商业版符号集的子集。 这些限制共同意味着,基于 FreeSpire.Barcode 进行的评估并不能准确反映商业产品的功能。
IronBarcode试用模式
IronBarcode 的试用版是无需许可证密钥即可使用的授权软件包。 阅读功能以全速运行,支持所有符号,且无行为限制。 阅读速度和准确度选项在试用模式和授权模式下表现完全相同。 试用模式下生成的条形码输出图像边缘带有一个小水印; 它不会遮挡条形码本身。 IronBarcode评估期间测量的行为就是最终部署到生产环境中的行为。
| 方面 | FreeSpire.Barcode | IronBarcode试用 |
|---|---|---|
| 生成输出上的水印 | 大号,覆盖条形码 | 仅图像边缘很小 |
| 阅读表现 | 故意降低 | 全速 |
| 符号学支持 | 有限子集(约20种类型) | 全套(50多种) |
| 需要注册 | 是的(E-iceblue提供的免费钥匙) | 否 |
| 可用功能 | 有限子集 | 完整功能集 |
| 时限 | 无 | 30天 |
PDF条形码支持
Spire.条形码方法
Spire.Barcode本身不具备PDF读取功能。 要从 PDF 文件中提取条形码,开发人员必须安装单独的 Spire.PDF 软件包,购买单独的 Spire.PDF 许可证,并编写手动页面迭代和图像提取代码,然后才能开始条形码扫描:
// Spire.Barcode + Spire.PDF: two libraries, two licenses
using Spire.Pdf;
var pdf = new PdfDocument();
pdf.LoadFromFile("document.pdf");
var scanner = new BarcodeScanner();
foreach (PdfPageBase page in pdf.Pages)
{
var images = page.ExtractImages();
foreach (var image in images)
{
// BarCodeType is still required even here
string[] results = scanner.Scan(image, BarCodeType.QRCode);
}
}
// Spire.Barcode + Spire.PDF: two libraries, two licenses
using Spire.Pdf;
var pdf = new PdfDocument();
pdf.LoadFromFile("document.pdf");
var scanner = new BarcodeScanner();
foreach (PdfPageBase page in pdf.Pages)
{
var images = page.ExtractImages();
foreach (var image in images)
{
// BarCodeType is still required even here
string[] results = scanner.Scan(image, BarCodeType.QRCode);
}
}
Imports Spire.Pdf
Dim pdf As New PdfDocument()
pdf.LoadFromFile("document.pdf")
Dim scanner As New BarcodeScanner()
For Each page As PdfPageBase In pdf.Pages
Dim images = page.ExtractImages()
For Each image In images
' BarCodeType is still required even here
Dim results As String() = scanner.Scan(image, BarCodeType.QRCode)
Next
Next
此模式需要两个NuGet包、两份许可协议以及开发人员编写的页面管理代码。 如果条形码嵌入在 PDF 的矢量内容中而不是栅格图像中,则图像提取方法可能会完全错过它们。
IronBarcode方法
IronBarcode可原生处理 PDF 文件,无需任何额外依赖。 从 PDF 文档中读取条形码只需调用一个方法,使用与图像文件相同的 BarcodeReader.Read() API。 每个结果对象中都包含页码:
// IronBarcode: native PDF support, no additional library
var results = BarcodeReader.Read("document.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.BarcodeType} = {barcode.Value}");
}
// IronBarcode: native PDF support, no additional library
var results = BarcodeReader.Read("document.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.BarcodeType} = {barcode.Value}");
}
Imports IronBarcode
Dim results = BarcodeReader.Read("document.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.BarcodeType} = {barcode.Value}")
Next
无需手动提取页面,无需二级软件包,也无需购买额外许可证。
生成 API
Spire.条形码方法
Spire.Barcode 的生成模型以可变的 BarcodeSettings 配置对象为中心。 开发人员实例化设置,分别分配属性,将设置对象传递给 BarCodeGenerator,然后调用 GenerateImage():
// Spire.Barcode generation
using Spire.Barcode;
BarcodeSettings settings = new BarcodeSettings();
settings.Type = BarCodeType.Code128;
settings.Data = "12345678";
settings.ShowText = true;
settings.TextMargin = 5;
settings.BarHeight = 60;
settings.Unit = GraphicsUnit.Pixel;
BarCodeGenerator generator = new BarCodeGenerator(settings);
Image barcodeImage = generator.GenerateImage();
barcodeImage.Save("barcode.png", ImageFormat.Png);
// Spire.Barcode generation
using Spire.Barcode;
BarcodeSettings settings = new BarcodeSettings();
settings.Type = BarCodeType.Code128;
settings.Data = "12345678";
settings.ShowText = true;
settings.TextMargin = 5;
settings.BarHeight = 60;
settings.Unit = GraphicsUnit.Pixel;
BarCodeGenerator generator = new BarCodeGenerator(settings);
Image barcodeImage = generator.GenerateImage();
barcodeImage.Save("barcode.png", ImageFormat.Png);
Imports Spire.Barcode
Imports System.Drawing
Imports System.Drawing.Imaging
Dim settings As New BarcodeSettings()
settings.Type = BarCodeType.Code128
settings.Data = "12345678"
settings.ShowText = True
settings.TextMargin = 5
settings.BarHeight = 60
settings.Unit = GraphicsUnit.Pixel
Dim generator As New BarCodeGenerator(settings)
Dim barcodeImage As Image = generator.GenerateImage()
barcodeImage.Save("barcode.png", ImageFormat.Png)
可变设置对象意味着,当在多个生成操作中重用单个实例时,配置可能会意外地在多个调用之间共享。 生成器类增加了一个额外的实例化步骤,该步骤本身不包含任何配置逻辑。
IronBarcode方法
IronBarcode使用静态工厂方法,并可选地进行流畅的链式调用。 没有设置对象,也没有生成器实例需要管理:
//IronBarcodegeneration
using IronBarCode;
BarcodeWriter.CreateBarcode("12345678", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
// With sizing:
BarcodeWriter.CreateBarcode("12345678", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
//IronBarcodegeneration
using IronBarCode;
BarcodeWriter.CreateBarcode("12345678", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
// With sizing:
BarcodeWriter.CreateBarcode("12345678", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
Imports IronBarCode
' IronBarcode generation
BarcodeWriter.CreateBarcode("12345678", BarcodeEncoding.Code128) _
.SaveAsPng("barcode.png")
' With sizing:
BarcodeWriter.CreateBarcode("12345678", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("barcode.png")
所有IronBarcode许可级别均提供带有自定义徽标的二维码:
var qr = QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);
qr.AddBrandLogo("logo.png");
qr.SaveAsPng("qr-with-logo.png");
var qr = QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);
qr.AddBrandLogo("logo.png");
qr.SaveAsPng("qr-with-logo.png");
Dim qr = QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
qr.AddBrandLogo("logo.png")
qr.SaveAsPng("qr-with-logo.png")
定价
Spire.Barcode 的定价结构包括四个等级:
| 许可证 | 价格 |
|---|---|
| 单一开发商 | $349 |
| 站点许可 | $1,398 |
| 原厂设备制造商 | $6,990 |
| 订阅 | 每年999美元 |
永久层级涵盖特定版本。 除了永久许可证外,持续更新和支持还需要有效的订阅。 团队从一名开发人员增加到两名开发人员,则直接从 349 美元的单开发人员级别升级到 1398 美元的站点许可证。 如果还需要 Spire.PDF 来进行 PDF 条形码提取,则该许可证需要额外付费。
IronBarcode 的授权许可采用三种永久授权级别:
| 许可证 | 价格 | 开发者 |
|---|---|---|
| 一点 | $749 | 1 |
| 专业 | $1,499 | 10 |
| 无限制 | $2,999 | 无限制 |
所有级别均为永久有效,并可选择添加年度支持和更新订阅。 Spire.Barcode 的站点许可证(1398 美元)Plus一年的订阅费(999 美元),一个五人开发团队第一年的总费用为 2397 美元,与IronBarcode专业的一次性购买价格 1499 美元(无需第二年费用)相当。
API 映射参考
| Spire.Barcode | IronBarcode |
|---|---|
new BarcodeScanner() |
静态 BarcodeReader.Read() |
scanner.Scan(path, BarCodeType.X) |
BarcodeReader.Read(path) |
BarCodeType.Code128(必填参数) |
自动检测; 无需等效物 |
string[] results |
BarcodeResults 集合 |
results[0](字符串) |
results[0].Value(字符串) |
new BarcodeSettings() |
参数至 BarcodeWriter.CreateBarcode() |
settings.Type = BarCodeType.Code128 |
BarcodeEncoding.Code128 作为第二个参数 |
settings.Data = "value" |
CreateBarcode() 的第一个参数 |
new BarCodeGenerator(settings) |
不需要; 静态工厂取代了这一点 |
generator.GenerateImage() + image.Save() |
.SaveAsPng(path) 或 .SaveAsJpeg(path) |
Spire.PDF(用于阅读PDF) |
不需要; 内置原生PDF支持 |
BarcodeSettings.ApplyKey("key") |
IronBarCode.License.LicenseKey = "key" |
Spire.License.LicenseProvider.SetLicenseKey("key") |
IronBarCode.License.LicenseKey = "key" |
当团队考虑从 Spire.Barcode 迁移到IronBarcode时
混合格式文档处理
最初只使用一种条形码格式的团队,往往会发现随着时间的推移,其条形码格式会变得越来越多样化。例如,一个最初使用 Code128 标签的仓储应用,现在可能会收到供应商使用 DataMatrix、GS1-128 或二维码的货物。 每次有新格式进入工作流程时,都需要更新类型猜测循环中的候选数组,重新测试检测逻辑,并确认迭代顺序不会改变现有格式。 当格式多样性达到一定程度,使得该循环的维护开销成为持续的开发成本时,团队会评估自动检测是否可以完全消除这种负担。
PDF集成
文档密集型应用程序经常会遇到需要从 PDF 文件而不是独立图像中提取条形码的情况。 在 Spire.Barcode 工作流程中,这种转变需要获得 Spire.PDF 许可证,集成第二个软件包,并编写页面迭代和图像提取基础架构,然后才能进行任何条形码读取。 如果团队在最初购买时没有预料到这一要求,他们就会发现自己需要管理两个产品许可证和两个 API 接口,而这项任务在概念上属于条形码读取。 发现 PDF 支持需要单独购买,是促使用户重新评估产品选择的常见原因。
免费层级评估限制
评估过 FreeSpire.Barcode 并购买了商业许可证的团队有时会报告说,商业产品的表现与他们的评估结果有所不同。 这是有意为之:免费层级故意降低读取性能并限制符号集,这意味着在评估期间进行的基准测试和格式覆盖率测试无法转移到商业部署中。 当团队在购买后发现这种差异时,他们通常会寻找替代品,这些替代品的试用行为能够代表生产行为。
减少产品数量
对技术栈进行标准化的组织有时会将 Spire.Barcode 视为不断增长的 E-iceblue 产品库中的一个组件,每个组件都有自己的许可费用和续订周期。 如果 Spire.Barcode 的主要驱动力是在文档处理流程中读取条形码,而不是与 Spire.Doc 或 Spire.XLS 深度集成,那么团队会评估一个独立的条形码库是否可以降低许可复杂性和支持范围。
常见迁移注意事项
移除 BarCodeType 参数
Spire.Barcode 代码库中的每个 scanner.Scan() 调用都带有一个 BarCodeType 参数。 将这些调用替换为 BarcodeReader.Read() 可以完全移除类型参数。 类型猜测循环——遍历候选 BarCodeType 值的 foreach 块——可以完全删除; 一次调用 BarcodeReader.Read() 即可替换整个循环。
更新退货类型
Spire.Barcode 的 Scan() 返回 string[]。IronBarcode返回一个 BarcodeResults 集合。 调用分配给 string[] 或将结果传递给期望该类型的方法的站点需要更新。 将值提取为数组使用 .Select(r => r.Value).ToArray(); 访问第一个结果使用 .First()?.Value。
移除 Spire.PDF 包
如果安装 Spire.PDF 仅仅是为了支持从 PDF 文件中提取条形码,那么在迁移到IronBarcode后可以将其删除。 所有 using Spire.Pdf; 导入和手动页面迭代块都被单个 BarcodeReader.Read("file.pdf") 调用所取代。 如果 Spire.PDF 用于条形码提取以外的其他文档操作,则应保留该条形码,并仅替换与条形码相关的代码路径。
命名空间变更
将 using Spire.Barcode; 替换为 using IronBarCode;。 枚举 BarCodeType 被 BarcodeEncoding 替换以进行生成,读取时不需要等效项。 许可证初始化从 BarcodeSettings.ApplyKey() 或 Spire.License.LicenseProvider.SetLicenseKey() 更改为在应用程序启动时进行单个 IronBarCode.License.LicenseKey 属性赋值。
IronBarcode的其他功能
以上对比中未涵盖以下IronBarcode功能:
-批量图像读取: BarcodeReader.Read() 接受文件路径数组、Stream 对象和 Bitmap 实例,无需手动遍历输入集合即可进行批量处理。
- BarcodeReaderOptions :读取速度、多条形码检测、最大候选数和图像增强预处理均可通过传递给
Read()的单个选项对象进行配置。 - SVG 和 HTML 输出:除了光栅图像格式外,
BarcodeWriter.CreateBarcode()还支持.SaveAsSvg()和.SaveAsHtmlFile(),从而实现可嵌入网页的条形码输出。 -带有徽标的二维码:QRCodeWriter.CreateQrCode()支持AddBrandLogo()在所有许可级别中,允许将自定义图像合成到二维码中心,而不会在适当的纠错级别下影响扫描可靠性。 -流和字节数组输出:生成的条形码可以导出为Stream或byte[],以便直接存储或写入 HTTP 响应,而无需中间文件。 - GS1-128 和结构化符号体系: IronBarcode包含对结构化 GS1 符号体系的支持,而 Spire.Barcode 商业版则不包含这些支持。
.NET兼容性和未来准备情况
IronBarcode支持.NET Framework 4.6.2 及更高版本、 .NET Core 3.1 以及所有版本的.NET 5 至.NET 9,预计随着 .NET 10 发布计划的逐步完善,将在 2026 年前推出对.NET 10 的兼容性更新。该库已在 Windows、Linux 和 macOS 上进行测试,并且可以在 Docker 容器中运行,无需额外的本机依赖项配置。 Spire.Barcode 也支持跨平台.NET部署,但其 Linux 和 Docker 配置可能需要根据所使用的版本进行额外的本地库设置。IronBarcode的定期发布节奏确保了新的 C# 语言特性和.NET运行时改进与平台兼容性更新一起被纳入其中。
结论
Spire.Barcode 和IronBarcode从根本上不同的角度看待条形码读取问题。 Spire.Barcode 将格式知识置于调用者身上——每次扫描操作都需要开发人员预先声明符号体系,这在封闭格式的工作流程中是一个可行的限制,但在开放格式的工作流程中则是一个维护负担。 IronBarcode将格式检测功能放在库内部,不需要类型参数,并将检测到的格式作为结果的一部分返回。
Spire.Barcode 对于处理单一有保证的条形码格式的应用程序来说是一个合理的选择,特别是当团队已经投入到 E-iceblue 产品生态系统中时。 设置对象生成模型对于喜欢显式配置的开发者来说很熟悉,而且商业许可对于单个开发者的项目来说也很有竞争力。 能够保证每次调用都返回 BarCodeType.Code128 的团队,对于强制性的类型参数,实际上无需支付任何成本。
IronBarcode更适合格式多样性不可预测或不断增长的应用,PDF 条形码提取是首要要求,以及评估准确性很重要的应用。 试验以全生产速度和全套符号集运行,使得评估期间进行的性能基准测试和格式覆盖率测试可以直接应用于生产部署。 原生 PDF 支持省去了对辅助库的需求以及相关的许可费用。 对于正在考虑使用IronBarcode作为 Spire.Barcode 替代方案的团队, Spire.Barcode 替代方案概述提供了有关比较的更多背景信息。
最终的决定取决于格式的可预测性和工作流程的范围。 对于采用固定 Code128 标签标准且没有 PDF 源文档的仓库系统而言,没有实际理由优先选择IronBarcode的自动检测功能。 对于从外部供应商接收条形码、处理混合符号体系并读取 PDF 附件的文档处理流程而言,强制性的类型参数和双库 PDF 要求会带来持续的维护成本,而IronBarcode可以消除这些成本。
常见问题解答
Spire.Barcode是什么?
Spire.Barcode 是一个 .NET 条形码库,用于在 C# 应用程序中生成和读取条形码。它是开发人员在为 .NET 项目选择条形码解决方案时评估的几个备选方案之一。
Spire.Barcode 和 IronBarcode 的主要区别是什么?
IronBarcode 使用静态、无状态的 API,无需实例管理,而 Spire.Barcode 通常需要在使用前创建和配置实例。IronBarcode 还提供原生 PDF 支持、自动格式检测以及跨所有环境的单密钥许可。
IronBarcode 的授权比 Spire.Barcode 更容易吗?
IronBarcode 使用单一许可证密钥,同时涵盖开发和生产部署。与将 SDK 密钥与运行时密钥分开的许可系统相比,这简化了 CI/CD 流水线和 Docker 配置。
IronBarcode 是否支持 Spire.Barcode 支持的所有条形码格式?
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 与 Spire.Barcode 相比,在批量处理方面有何不同?
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 安装程序或运行时文件。
与 Spire.Barcode 不同,我可以在购买前评估 IronBarcode 吗?
是的。IronBarcode 的试用模式会返回完整的解码条形码值——只有生成的输出图像才会带有水印。您可以在购买前,用自己的文档测试读取准确率。
Spire.Barcode 和 IronBarcode 的价格有什么区别?
IronBarcode 的永久单开发者许可证起价为 749 美元,涵盖开发和生产环境。定价详情和批量许可选项请访问 IronBarcode 许可页面。无需单独的运行时许可证。
从 Spire.Barcode 迁移到 IronBarcode 是否很简单?
从 Spire.Barcode 迁移到 IronBarcode 主要涉及将基于实例的 API 调用替换为 IronBarcode 的静态方法、移除许可相关的样板代码以及更新结果属性名称。大多数迁移都是减少代码,而不是增加代码。
IronBarcode 能生成带有 logo 的二维码吗?
是的。`QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")` 可以将品牌图片原生嵌入二维码中,并支持配置纠错功能。此外,它还支持通过 `ChangeBarCodeColor()` 函数创建彩色二维码。

