Aspose.BarCode for .NET 与 IronBarcode:C# 条形码库比较
每个使用过 Aspose.BarCode 的开发者都编写过类似这样的代码行:new BarCodeReader(path, DecodeType.Code128)。 如果你知道图像的格式,它就能正常工作。 当你没有这样做时——当文档来自外部系统、更改了标签格式的供应商或用户上传时——你要么猜测解码类型列表,要么使用 DecodeType.AllSupportedTypes,这明显慢得多。 格式规范要求虽然不是致命缺陷,但它会在代码库的每次读取操作中造成日常摩擦。
PDF文件讲述的是预算故事。 如果您要处理 PDF 文档中的条形码,Aspose.BarCode 无法单独完成这项工作。 您需要 Aspose.PDF for .NET来先将页面渲染成图像。Aspose.PDF 是另一项订阅服务:每年 999 美元到 4,995 美元不等,这还不包括您已经支付的 Aspose.BarCode 费用。 对于大多数开发者来说,这明明是一个任务,却需要两个订阅才能完成。
IronBarcode能够自动检测条形码格式,在一个软件包中原生读取 PDF 文件,并提供起价 749 美元的永久许可证。本文将详细比较这两个库,以便您做出明智的选择。
了解 Aspose.BarCode
多年来,Aspose 一直在为.NET、Java 和其他平台构建文档处理库。 Aspose.BarCode 是该系列众多产品之一,其他产品包括 Aspose.Words、Aspose.Cells、Aspose.PDF、Aspose.Slides 以及其他十几个产品。 对于已经付费使用 Aspose.Total(包含所有 Aspose 产品)的团队来说,Aspose.BarCode 无需额外费用。但对于只需要条形码库的团队而言,订阅模式的合理性就难以体现了。
Aspose.BarCode 支持 60 多种条形码符号体系,是所有商业.NET条形码库中最完整的格式列表。 馆藏的广度是该图书馆最大的卖点。 API接口相应地很大,并且API的详细程度会随着功能的增加而增加。 生成基本的 Code 128 条形码需要实例化 BarcodeGenerator,设置 XDimension、BarHeight 和其他参数,然后使用显式格式参数调用 Save。 读取需要指定要搜索的解码类型,调用 ReadBarCodes(),然后迭代 FoundBarCodes。 这两个操作都能正常工作——只是比实际需要的要冗长一些。
Aspose.BarCode 的主要架构特点:
-格式优先读取模型:每次读取操作都需要显式指定 DecodeType。 回退方案 DecodeType.AllSupportedTypes 比目标列表慢得多,因为解码器会按顺序运行每个已知的符号系统。
-基于实例的 API: BarCodeReader 和 BarcodeGenerator 都是实现了 IDisposable 的实例化对象。 如果不将它们包裹在 using 代码块中,会导致资源泄漏。
-不支持原生 PDF: Aspose.BarCode 无法直接打开或渲染 PDF 文档。 从 PDF 中读取条形码需要 Aspose.PDF,这是一个单独的订阅产品,每年价格为 999 美元至 4,995 美元。
-深度参数层次结构:自定义是通过 generator.Parameters.Barcode.* 属性链处理的——这是一个需要记忆的多级对象层次结构。
-仅限订阅许可:所有级别均为年度订阅。 目前没有单独提供永久授权选项。
-基于文件的许可证激活:生产部署需要一个位于已知路径的 .lic 文件,这为多克和 Kubernetes 环境增加了一个部署步骤。
格式优先阅读模式
Aspose.BarCode 的读取 API 的设计前提是调用者知道条形码格式:
// Aspose.BarCode: must specify format or use slow AllSupportedTypes
using Aspose.BarCode.BarCodeRecognition;
var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
reader.ReadBarCodes();
foreach (var result in reader.FoundBarCodes)
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
// Aspose.BarCode: must specify format or use slow AllSupportedTypes
using Aspose.BarCode.BarCodeRecognition;
var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
reader.ReadBarCodes();
foreach (var result in reader.FoundBarCodes)
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
Imports Aspose.BarCode.BarCodeRecognition
' Aspose.BarCode: must specify format or use slow AllSupportedTypes
Dim reader As New BarCodeReader("barcode.png", DecodeType.Code128)
reader.ReadBarCodes()
For Each result In reader.FoundBarCodes
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
Next
如果你知道条形码格式,这种模式就没问题。问题就在于"如果你知道条形码格式"。处理供应商发票的采购系统无法保证每个供应商都使用同一种条形码类型。 接受用户上传的文档管理系统无法预测扫描仪使用的格式。 在这种情况下,DecodeType.AllSupportedTypes 是备用方案,它比有针对性的解码类型列表慢得多。
解码器也必须被丢弃:
using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
不使用 using 会导致资源泄漏。 BarcodeGenerator 也实现了 IDisposable,尽管不释放它的后果不太严重。 在这两种情况下,您都在管理对象生命周期,而静态工厂 API 会自动处理这些生命周期。
了解IronBarcode
IronBarcode使用静态工厂方法进行读取和写入。 没有实例可以构造、配置或释放。 默认情况下,读取 API 与格式无关,无论源文件是 PNG、JPEG、TIFF 还是 PDF,相同的调用都能正常工作。
IronBarcode由Iron Software开发和维护,该公司专注于.NET开发人员工具。 该库的设计原则是,条形码读取不应该需要事先了解条形码格式——该库的检测引擎会根据图像内容确定格式。 对于生成过程,流畅的方法链取代了其他库中常见的多级参数层次结构。
IronBarcode的主要特点:
-自动格式检测: BarcodeReader.Read() 从图像内容中识别条形码符号,而无需调用者指定 DecodeType 等效项。
-静态无状态 API:所有读写操作均为静态方法。 无需管理一次性实例,并且 API 自然是线程安全的,可同时使用。
-原生 PDF 支持: BarcodeReader.Read("doc.pdf") 可以直接从 PDF 文件读取,无需任何额外的打包或渲染步骤。结果包括 result.PageNumber。
- Fluent Generation API:
BarcodeWriter.CreateBarcode()返回一个可链式对象。 自定义功能使用方法链而不是属性层次结构。 -永久授权模式:所有级别均提供一次性购买,无需每年续费。 -基于字符串的许可证激活:许可证密钥通过IronBarCode.License.LicenseKey设置,与环境变量和 CI/CD 密钥管理器兼容。
功能对比
| 特征 | Aspose.BarCode | IronBarcode |
|---|---|---|
| 格式检测 | 手动 — 必须指定 DecodeType 或使用慢速的 AllSupportedTypes |
所有支持的格式均自动运行 |
| 符号计数 | 60岁以上 | 50岁以上 |
| PDF 支持 | 不支持原生功能——需要单独的 Aspose.PDF 许可证 | Native — BarcodeReader.Read("doc.pdf") 内置于软件包中 |
| 定价模式 | 订阅价格:999美元至4995美元/年 | 永久使用权,一次性付款 749 美元起 |
| 永久许可 | 不可用 | 是的,所有级别 |
| API 风格 | 基于实例的详细配置 | 静态工厂方法,流畅 API |
| 一次性要求 | 是的——BarCodeReader 和 BarcodeGenerator |
否——无状态静态方法 |
| 线程安全 | 每个线程需要单独的实例 | 无状态——自然可安全用于并发使用 |
详细功能对比
| 特征 | Aspose.BarCode | IronBarcode |
|---|---|---|
| 一代 | ||
| API 风格 | new BarcodeGenerator(EncodeTypes.X, "data") |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.X) |
| 定制模式 | generator.Parameters.Barcode.* 属性层次结构 |
流畅的方法链(.ResizeTo(), .ChangeBarCodeColor()) |
| 带有徽标的二维码 | 生成后手动 GDI+ 叠加 | .AddBrandLogo("logo.png") 内置 |
| 输出到字节 | generator.GenerateBarCodeImage() |
.ToPngBinaryData() |
| 彩色条形码 | generator.Parameters.Barcode.BarColor |
.ChangeBarCodeColor(Color.X) |
| 阅读 | ||
| 格式规范 | 必填 (DecodeType) |
无需 — 自动 |
| 未知格式回退 | DecodeType.AllSupportedTypes(慢) |
同样的调用——无需备用模式 |
| 性能调校 | 12+ QualitySettings 参数 |
ReadingSpeed 枚举 — 三级 |
| 一次性阅读器 | 是的 — using var reader = new BarCodeReader(...) |
不——这是静态调用,没有对象需要释放。 |
| 结果访问 | reader.FoundBarCodes 在调用 ReadBarCodes() 之后 |
返回值 BarcodeReader.Read() |
| 条形码值属性 | result.CodeText |
result.Value |
| 格式名称属性 | result.CodeTypeName |
result.Format.ToString() |
| PDF 支持 | ||
| 原生 PDF 阅读 | 否 | 是 |
| PDF文件必需 | Aspose.PDF(每年额外收费 999 美元至 4,995 美元) | 无额外包裹 |
| 结果中的页码 | 不适用 | result.PageNumber |
| 许可 | ||
| 许可模式 | 仅限订阅,每年续订 | 永久购买,一次性购买 |
| 单一开发商 | 每年999美元 | 一次性 749 美元 |
| 10 位开发者 | 4,995美元/年(站点许可) | 一次性支付 2,999 美元(Professional) |
| 无限开发者 | 14,985 美元/年(OEM) | 一次性支付 5,999 美元(无限量) |
| 包含 PDF 支持 | 不——需要单独订阅 Aspose.PDF。 | 是 |
| 平台和部署 | ||
| 许可证激活 | .lic 文件路径 |
字符串键 — 环境变量 |
| Docker部署 | 必须将 .lic 文件复制到镜像中或挂载它 |
环境变量——无需文件 |
| .NET Framework | 是 | 是的(4.6.2+) |
| .NET Core / .NET 5+ | 是 | 是的(.NET Core 3.1+,. .NET 5/6/7/8/9) |
| 视窗 | 是 | 是的(x64/x86) |
| Linux | 是 | 是的(x64) |
| MacOS | 是 | 是的(x64/ARM) |
| 多克 | 是 | 是 |
| Azure/AWS Lambda | 是 | 是 |
生成 API
在日常代码中,生成 API 最能体现出这两个库在代码冗长程度上的差异。
Aspose.BarCode 方法
Aspose.BarCode 使用 BarcodeGenerator 类,并具有 Parameters 层次结构进行配置。 最小生成调用需要三个步骤——实例化、保存调用和格式规范。 实际使用通常需要导航到 generator.Parameters.Barcode.*:
using Aspose.BarCode.Generation;
using System.Drawing;
var generator = new BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345");
// Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2;
generator.Parameters.Barcode.BarHeight.Pixels = 100;
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial";
generator.Parameters.Barcode.Padding.Left.Pixels = 10;
generator.Parameters.Barcode.Padding.Right.Pixels = 10;
generator.Parameters.BackColor = Color.White;
generator.Parameters.Resolution = 300;
generator.Save("barcode.png", BarCodeImageFormat.Png);
using Aspose.BarCode.Generation;
using System.Drawing;
var generator = new BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345");
// Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2;
generator.Parameters.Barcode.BarHeight.Pixels = 100;
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial";
generator.Parameters.Barcode.Padding.Left.Pixels = 10;
generator.Parameters.Barcode.Padding.Right.Pixels = 10;
generator.Parameters.BackColor = Color.White;
generator.Parameters.Resolution = 300;
generator.Save("barcode.png", BarCodeImageFormat.Png);
Imports Aspose.BarCode.Generation
Imports System.Drawing
Dim generator As New BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345")
' Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2
generator.Parameters.Barcode.BarHeight.Pixels = 100
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial"
generator.Parameters.Barcode.Padding.Left.Pixels = 10
generator.Parameters.Barcode.Padding.Right.Pixels = 10
generator.Parameters.BackColor = Color.White
generator.Parameters.Resolution = 300
generator.Save("barcode.png", BarCodeImageFormat.Png)
每个自定义项都会导航到 generator.Parameters.Barcode.*,这是一个多级对象层次结构。 一旦记住了,就不复杂——但需要记忆。
IronBarcode方法
IronBarcode将参数层次结构替换为流畅的方法链。 默认设置可在大多数情况下产生正确的结果,自定义设置可直接在代码中表达:
using IronBarCode;
// Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
// Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
// Get as bytes instead of saving to disk
byte[] pngData = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ToPngBinaryData();
using IronBarCode;
// Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
// Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
// Get as bytes instead of saving to disk
byte[] pngData = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ToPngBinaryData();
Imports IronBarCode
' Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.SaveAsPng("barcode.png")
' Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("barcode.png")
' Get as bytes instead of saving to disk
Dim pngData As Byte() = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.ToPngBinaryData()
对于二维码, IronBarcode 的二维码生成 API包含品牌徽标支持,无需手动合成图像:
using IronBarCode;
using IronSoftware.Drawing;
// With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
// With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode(
"https://example.com",
500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded-high-ecc.png");
// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
.ChangeBarCodeColor(Color.DarkBlue)
.SaveAsPng("qr-colored.png");
using IronBarCode;
using IronSoftware.Drawing;
// With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
// With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode(
"https://example.com",
500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded-high-ecc.png");
// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
.ChangeBarCodeColor(Color.DarkBlue)
.SaveAsPng("qr-colored.png");
Imports IronBarCode
Imports IronSoftware.Drawing
' With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.AddBrandLogo("logo.png") _
.SaveAsPng("qr-branded.png")
' With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode( _
"https://example.com", _
500, _
QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo("logo.png") _
.SaveAsPng("qr-branded-high-ecc.png")
' Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300) _
.ChangeBarCodeColor(Color.DarkBlue) _
.SaveAsPng("qr-colored.png")
Aspose.BarCode 需要手动 GDI+ 绘图才能将徽标叠加到二维码上——生成条形码图像,然后使用 System.Drawing.Graphics 将徽标合成到其中心。IronBarcode的 AddBrandLogo 只需一次调用即可处理该问题,并自动设置适当的纠错。
PDF条形码读取
对许多团队来说,这才是最重要的比较。从 PDF 文档中读取条形码是常见的工作流程:例如,收到的发票、保存为 PDF 格式的货运标签以及扫描的文档存档。
Aspose.BarCode 方法
Aspose.BarCode 本身不支持 PDF。 要使用 Aspose 从 PDF 中读取条形码,您需要 Aspose.PDF 来加载 PDF 并将页面渲染为图像,还需要 Aspose.BarCode 来扫描这些渲染后的图像。 两者都是订阅产品。 两者都需要激活许可证。 综合起来,每年您需要花费 1,998 美元到 9,990 美元,而大多数开发人员认为这只是一项单一功能。
// Requires both Aspose.PDF (separate license) and Aspose.BarCode
using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.BarCode.BarCodeRecognition;
using System.IO;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var barcodeValues = new List<string>();
// Step 1: Load and render the PDF using Aspose.PDF
var pdfDocument = new Aspose.Pdf.Document(pdfPath);
var resolution = new Resolution(300);
var device = new PngDevice(resolution);
for (int pageNum = 1; pageNum <= pdfDocument.Pages.Count; pageNum++)
{
using var pageStream = new MemoryStream();
device.Process(pdfDocument.Pages[pageNum], pageStream);
pageStream.Seek(0, SeekOrigin.Begin);
// Step 2: Scan the rendered image for barcodes using Aspose.BarCode
using var reader = new BarCodeReader(pageStream, DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
barcodeValues.Add(result.CodeText);
}
}
return barcodeValues;
}
// Requires both Aspose.PDF (separate license) and Aspose.BarCode
using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.BarCode.BarCodeRecognition;
using System.IO;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var barcodeValues = new List<string>();
// Step 1: Load and render the PDF using Aspose.PDF
var pdfDocument = new Aspose.Pdf.Document(pdfPath);
var resolution = new Resolution(300);
var device = new PngDevice(resolution);
for (int pageNum = 1; pageNum <= pdfDocument.Pages.Count; pageNum++)
{
using var pageStream = new MemoryStream();
device.Process(pdfDocument.Pages[pageNum], pageStream);
pageStream.Seek(0, SeekOrigin.Begin);
// Step 2: Scan the rendered image for barcodes using Aspose.BarCode
using var reader = new BarCodeReader(pageStream, DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
barcodeValues.Add(result.CodeText);
}
}
return barcodeValues;
}
Imports Aspose.Pdf
Imports Aspose.Pdf.Devices
Imports Aspose.BarCode.BarCodeRecognition
Imports System.IO
Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
Dim barcodeValues As New List(Of String)()
' Step 1: Load and render the PDF using Aspose.PDF
Dim pdfDocument As New Aspose.Pdf.Document(pdfPath)
Dim resolution As New Resolution(300)
Dim device As New PngDevice(resolution)
For pageNum As Integer = 1 To pdfDocument.Pages.Count
Using pageStream As New MemoryStream()
device.Process(pdfDocument.Pages(pageNum), pageStream)
pageStream.Seek(0, SeekOrigin.Begin)
' Step 2: Scan the rendered image for barcodes using Aspose.BarCode
Using reader As New BarCodeReader(pageStream, DecodeType.AllSupportedTypes)
For Each result In reader.ReadBarCodes()
barcodeValues.Add(result.CodeText)
Next
End Using
End Using
Next
Return barcodeValues
End Function
这涉及到两套许可证设置、来自两个命名空间的两条 using 语句、渲染管线、内存流管理以及嵌套循环。此外,它还使用了 DecodeType.AllSupportedTypes,因为在图像提取时,通常无法确定条形码的格式。
IronBarcode方法
IronBarcode在内部处理 PDF 解析、页面渲染和条形码检测。 你调用 Read,路径以 .pdf 结尾,它会返回包含 result.PageNumber 的条形码结果,这样你就知道每个结果来自哪个页面。 没有第二个软件包,没有第二个许可证,没有渲染代码。
using IronBarCode;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var results = BarcodeReader.Read(pdfPath);
return results.Select(r => r.Value).ToList();
}
using IronBarCode;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var results = BarcodeReader.Read(pdfPath);
return results.Select(r => 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) r.Value).ToList()
End Function
// With page number context
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
// With page number context
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
Imports System
' With page number context
Dim results = BarcodeReader.Read("invoice-batch.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}")
Next
IronBarcode PDF 读取文档涵盖多页批量处理和页面范围筛选选项。
读取未知条形码格式
当您不知道图像包含的条形码格式时,这两个库的处理方式截然不同。
Aspose.BarCode 方法
DecodeType.AllSupportedTypes 是 Aspose 针对格式未知场景的解决方案。 Aspose 自己的文档也承认,这种方法比指定目标列表要慢,因为解码器会按顺序遍历每个已知的符号体系。 对于大批量处理——例如仓库每分钟扫描数千个标签——这种性能差异可不是微不足道的。
using Aspose.BarCode.BarCodeRecognition;
// AllSupportedTypes scans for every known format — significantly slower
using var reader = new BarCodeReader("unknown-format.png");
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
}
using Aspose.BarCode.BarCodeRecognition;
// AllSupportedTypes scans for every known format — significantly slower
using var reader = new BarCodeReader("unknown-format.png");
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
}
Imports Aspose.BarCode.BarCodeRecognition
' AllSupportedTypes scans for every known format — significantly slower
Using reader As New BarCodeReader("unknown-format.png")
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes)
For Each result In reader.ReadBarCodes()
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
Next
End Using
IronBarcode方法
根据格式知识的不同,不存在"慢速模式"和"快速模式"。IronBarcode的检测算法与图像中包含 Code 128 或 DataMatrix 时使用的算法相同。 如果您想在性能和准确性之间进行权衡,可以使用 ReadingSpeed 选项,而无需了解格式:
using IronBarCode;
// The same call regardless of format — always auto-detects
var results = BarcodeReader.Read("unknown-format.png");
foreach (var result in results)
{
Console.WriteLine($"{result.Format}: {result.Value}");
}
using IronBarCode;
// The same call regardless of format — always auto-detects
var results = BarcodeReader.Read("unknown-format.png");
foreach (var result in results)
{
Console.WriteLine($"{result.Format}: {result.Value}");
}
Imports IronBarCode
' The same call regardless of format — always auto-detects
Dim results = BarcodeReader.Read("unknown-format.png")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read("document.png", options);
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read("document.png", options);
Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim results = BarcodeReader.Read("document.png", options)
ReadingSpeed.Faster 优先考虑吞吐量。 ReadingSpeed.Detailed 优先保证受损或低对比度图像的准确性。 两者都不需要你事先知道格式。 有关所有调优参数,请参阅IronBarcode读取选项。
API 映射参考
| Aspose.BarCode | IronBarcode |
|---|---|
new BarCodeGenerator(EncodeTypes.Code128, "data") |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
generator.Save("file.png", BarCodeImageFormat.Png) |
.SaveAsPng("file.png") |
new BarCodeReader(path, DecodeType.Code128) |
BarcodeReader.Read(path) |
DecodeType.AllSupportedTypes(缓慢、彻底的扫描) |
自动——始终快速,所有格式均采用相同的调用方式 |
reader.ReadBarCodes() |
(part of BarcodeReader.Read — returns results directly) |
reader.FoundBarCodes |
返回值 BarcodeReader.Read |
result.CodeText |
result.Value |
result.CodeTypeName |
result.Format.ToString() |
result.Confidence |
result.Confidence |
Aspose.BarCode + Aspose.PDF for PDF reading |
BarcodeReader.Read("doc.pdf") — 一个包裹 |
license.SetLicense("Aspose.BarCode.lic") |
IronBarCode.License.LicenseKey = "key" |
new Aspose.BarCode.Metered() + .SetMeteredKey() |
(not needed — single key covers all environments) |
generator.GenerateBarCodeImage() |
.ToPngBinaryData() 或 .SaveAsPng() |
QREncodeMode.Auto + QRErrorLevel.LevelH + 手动徽标叠加 |
QRCodeWriter.CreateQrCode().AddBrandLogo() |
当团队考虑从 Aspose.BarCode 迁移到IronBarcode时
通常情况下,开发团队会在多种情况下评估IronBarcode作为 Aspose.BarCode 的替代方案。
订阅续费通知已到
年度订阅续订是团队最常重新审视图书馆决策的时候。 如果 Aspose.BarCode 是 Aspose 产品组合中唯一的产品,那么每年 999 美元到 4995 美元的条形码功能价格就足以引发人们的比较。 对话通常是这样的:"我们要永远每年都支付这笔费用。"IronBarcode的一次性费用是多少?Professional版(10 位开发人员 2,999 美元)的IronBarcode在第一年内即可通过站点许可收回成本。
对于使用 Aspose.Total 的团队(其中 Aspose.BarCode 与 20 多个其他产品捆绑在一起),计算方法有所不同。 在该捆绑包中,Aspose.BarCode 的边际成本接近于零。 这些球队就没有太多理由做出改变。
PDF支持成为一项必要条件
许多项目最初都是从图像中读取条形码,后来当利益相关者意识到传入的文档是 PDF 而不是图像文件时,才添加了 PDF 支持。 此时,Aspose.BarCode 团队面临一个决定:添加 Aspose.PDF(另一个订阅),寻找第三方 PDF 渲染器,或者重新评估条形码库。
添加 Aspose.PDF 可以解决眼前的需求,但会使订阅费用翻倍。寻找第三方渲染器则会增加依赖项和集成工作。 重新评估条形码库,并发现IronBarcode只需一次性付费即可原生读取 PDF,这通常是最终结果。
生产环境中格式未知的情况
接受文档上传的面向客户的应用程序无法控制上传文档使用的条形码格式。 如果应用程序是假设 Code 128 输入而客户上传了 DataMatrix 标签,则硬编码的 DecodeType.Code128 将静默地不返回任何结果。 改为 DecodeType.AllSupportedTypes 可以修复正确性问题,但会带来性能损失。
遇到此问题的团队——随着生产环境中出现新的格式,向其读取器配置中添加越来越多的 DecodeType 值——最终往往需要维护一个列表,而每次添加新的格式源时都需要更新该列表。IronBarcode的自动检测功能使该列表变得不必要。
云和容器化部署
Aspose.BarCode 的文件许可增加了一个部署步骤:许可证文件必须在运行时可以从应用程序可以读取的路径访问。 在 GitOps 工作流程中,许可证文件要么最终进入源代码控制(存在安全风险),要么需要通过挂载的密钥卷注入。IronBarcode基于密钥的方法可以完美地融入 Kubernetes secrets 和 CI/CD secret 变量中,无需在容器镜像中管理任何文件。
常见迁移注意事项
从 Aspose.BarCode 过渡到IronBarcode 的团队会遇到一些可预见的技术调整。
属性名称映射
交换软件包后最常见的编译错误是 result.CodeText 到 result.Value 的重命名。 对整个代码库进行搜索可以快速解决这个问题:
grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
result.CodeText 变为 result.Value。 result.CodeTypeName 变为 result.Format.ToString()。 result.Format 属性是一个 BarcodeEncoding 枚举值,它还允许在需要时进行类型比较。
解码类型移除
代码库中所有 DecodeType.* 引用都可以删除:
grep -r "DecodeType\." --include="*.cs" .
grep -r "DecodeType\." --include="*.cs" .
如果列出了特定的 DecodeType 以提高已知格式的性能,则 ReadingSpeed.Faster 在 BarcodeReaderOptions 中提供类似的好处,而无需了解格式要求。
许可证初始化变更
Aspose.BarCode 使用通过 license.SetLicense() 加载的 .lic 文件。 IronBarcode使用字符串键:
IronBarCode.License.LicenseKey =
Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
?? throw new InvalidOperationException("IronBarcode license key not configured");
IronBarCode.License.LicenseKey =
Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
?? throw new InvalidOperationException("IronBarcode license key not configured");
Imports IronBarCode
Imports System
License.LicenseKey = If(Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE"), Throw New InvalidOperationException("IronBarcode license key not configured"))
从存储库中移除 .lic 文件并构建工件。 在多克中,删除 COPY Aspose.BarCode.lic 行,并替换为 ENV IRONBARCODE_LICENSE 条目。
编码类型到条形码编码的映射
EncodeTypes.QR 映射到 BarcodeEncoding.QRCode — 命名差异是团队在迁移生成代码后最常遇到的第一个编译错误。 所有其他映射都是直接等效的,并且命名一致。
IronBarcode的其他功能
除了核心对比点之外, IronBarcode还提供了一些可能与应用场景相关的功能:
-每张图像的多条形码检测: ExpectMultipleBarcodes = true 返回在单个图像中找到的所有条形码,以及每个条形码的位置坐标。
-将条形码添加到 PDF 中:无需单独的 PDF 库,即可将条形码直接写入现有的 PDF 页面。
- TIFF 多帧读取:一次调用即可读取多页 TIFF 中所有帧的条形码。 -样式化的二维码:颜色、徽标和纠错级别均通过流畅的流程设置,无需外部图像处理。
- Azure Functions 和 AWS Lambda 支持:标准许可证支持在这两个平台上进行无服务器部署。 -二进制数据编码:将字节数组直接编码为 Data Matrix 或 PDF417 条形码,用于二进制有效载荷用例。
.NET兼容性和未来准备情况
IronBarcode支持.NET Framework 4.6.2+、. .NET Core 3.1+ 以及.NET 5、6、7、8 和 9。该库会定期更新,与微软的.NET发布节奏保持一致,确保与预计于 2026 年底发布的.NET 10 兼容。Aspose.BarCode 也支持相同的.NET版本范围,因此这两个库在当前版本上没有兼容性优势。 对于未来的准备而言,真正重要的区别在于许可方式:今天购买的IronBarcode永久许可证可以涵盖未来的.NET版本,无需额外费用,而 Aspose.BarCode 订阅需要不断续订才能访问更新的版本。
结论
Aspose.BarCode 和IronBarcode代表了条形码库设计中的两种不同理念。 Aspose.BarCode 基于显式的、基于实例的 API 构建,调用者通过属性层次结构指定格式、管理对象生命周期并配置每个操作。 IronBarcode基于静态的、与格式无关的 API 构建,该库在内部处理检测、对象生命周期和 PDF 渲染。 两种方法本身都没有绝对的正确性——正确的选择取决于应用程序的需求。
对于已经在 Aspose 生态系统中运营的团队来说,Aspose.BarCode 是更强大的选择。 如果 Aspose.Total 已经获得许可,Aspose.BarCode 不会增加任何边际成本,而且其 60 多个符号体系列表是任何商业.NET条码库中最广泛的。 对于需要特殊格式(MaxiCode、DotCode 或IronBarcode50 多个列表中未包含的特定邮政符号)的应用,Aspose.BarCode 可能是唯一可行的选择。 其成熟度和形式广度是真正的优势。
对于正在评估 Aspose.BarCode 是否值得单独购买的团队来说,其价值计算就比较困难了。 格式规范要求给每次读取操作都带来了不便。 由于缺少原生 PDF 支持, IronBarcode的基本套餐中包含的这项功能,其订阅费用翻了一番。 订阅模式意味着成本会逐年累积——一个 10 人开发团队每年 4,995 美元,五年下来就是 24,975 美元,而一次性购买IronBarcode Professional 的价格为 2,999 美元。IronBarcode的自动检测、原生 PDF 读取和永久许可在一个软件包中解决了所有这三个问题。
最终的决定取决于生态系统的契合度和符号学的要求。 与 Aspose 产品深度集成的团队,或者需要IronBarcode支持列表之外的格式的团队,应该使用 Aspose.BarCode。 对于需要独立永久许可证、原生 PDF 阅读功能以及无需每次读取都了解格式的 API 的团队来说, IronBarcode是更实用的选择。
常见问题解答
什么是适用于 .NET 的 Aspose.BarCode?
Aspose.BarCode for .NET 是一个 .NET 条形码库,用于在 C# 应用程序中生成和读取条形码。它是开发人员在为 .NET 项目选择条形码解决方案时评估的几个备选方案之一。
Aspose.BarCode for .NET 和 IronBarcode 的主要区别是什么?
IronBarcode 使用静态、无状态的 API,无需实例管理,而 Aspose.BarCode for .NET 通常需要在使用前创建和配置实例。IronBarcode 还提供原生 PDF 支持、自动格式检测以及跨所有环境的单密钥许可。
IronBarcode 的授权是否比 Aspose.BarCode for .NET 更容易?
IronBarcode 使用单一许可证密钥,同时涵盖开发和生产部署。与将 SDK 密钥与运行时密钥分开的许可系统相比,这简化了 CI/CD 流水线和 Docker 配置。
IronBarcode 是否支持 Aspose.BarCode for .NET 支持的所有条形码格式?
IronBarcode 支持超过 30 种条码符号体系,包括 QR 码、Code 128、Code 39、DataMatrix、PDF417、Aztec、EAN-13、UPC-A、GS1 等等。格式自动检测功能意味着无需显式枚举格式。
IronBarcode是否支持原生PDF条码读取?
是的。IronBarcode 可以直接从 PDF 文件中读取条形码,使用 `BarcodeReader.Read("document.pdf")` 方法,无需单独的 PDF 渲染库。每页的读取结果包括页码、条形码格式、数值和置信度评分。
与 Aspose.BarCode for .NET 相比,IronBarcode 在批量处理方面有何不同?
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 安装程序或运行时文件。
与 Aspose.BarCode 不同,我可以在购买前评估 IronBarcode 吗?
是的。IronBarcode 的试用模式会返回完整的解码条形码值——只有生成的输出图像才会带有水印。您可以在购买前,用自己的文档测试读取准确率。
Aspose.BarCode for .NET 和 IronBarcode 的价格有什么区别?
IronBarcode 的永久单开发者许可证起价为 749 美元,涵盖开发和生产环境。定价详情和批量许可选项请访问 IronBarcode 许可页面。无需单独的运行时许可证。
从 Aspose.BarCode for .NET 迁移到 IronBarcode 是否简单?
从 Aspose.BarCode for .NET 迁移到 IronBarcode 主要涉及将基于实例的 API 调用替换为 IronBarcode 的静态方法、移除许可相关的样板代码以及更新结果属性名称。大多数迁移都是减少代码,而不是增加代码。
IronBarcode 能生成带有 logo 的二维码吗?
是的。`QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")` 可以将品牌图片原生嵌入二维码中,并支持配置纠错功能。此外,它还支持通过 `ChangeBarCodeColor()` 函数创建彩色二维码。

