在.NET开发中,应该使用哪个 C# 条形码库?
每个使用Aspose.BarCode的开发者都写过某种版本的这一行:new BarCodeReader(path, DecodeType.Code128)。 如果你知道图像的格式,它就能正常工作。 当您没有这样做时——当文档来自外部系统、供应商改变了标签格式或用户上传时——您要么猜测一个解码类型列表,要么使用DecodeType.AllSupportedTypes,这通常根据Aspose自己的指导会比较慢。 格式规范要求虽然不是致命缺陷,但它会在代码库的每次读取操作中造成日常摩擦。
PDF文件讲述的是预算故事。 如果您要处理 PDF 文档中的条形码,Aspose.BarCode 无法单独完成这项工作。 您需要Aspose.PDF for .NET来首先将页面渲染为图像。Aspose.PDF是一个独立的订阅产品,加在您已经支付的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支持80多种条形码符号体系,是任何商业.NET条码库中最完整的格式列表之一。 馆藏的广度是该图书馆最大的卖点。 API接口相应地很大,并且API的详细程度会随着功能的增加而增加。 生成一个基本的Code 128条形码需要实例化一个Save。 读取需要指定要搜索的解码类型,然后迭代由ReadBarCodes()返回的结果。 这两个操作都能正常工作——只是比实际需要的要冗长一些。
Aspose.BarCode 的主要架构特点:
- 格式优先读取模型: 每次读取操作都需要显式指定
DecodeType。 备用的DecodeType.AllSupportedTypes通常比有目标的列表慢,因为解码器会按序遍历每种已知的符号。 - 基于实例的API:
IDisposable的实例化对象。 它们应该被包裹在using块中以释放本机资源。 -不支持原生 PDF: Aspose.BarCode 无法直接打开或渲染 PDF 文档。 从PDF中读取条码需要Aspose.PDF,一个单独的订阅产品。 - 深参数层次结构: 自定义通过
generator.Parameters.Barcode.*属性链处理——需要记忆的多层对象层次结构。 - 订阅许可: 根据Aspose的公布价格,每位开发人员和站点层级是年订阅; 未列出独立的永久选项。
- 基于文件的许可激活: 生产部署需要在一个已知路径上访问
.lic文件,这为Docker和Kubernetes环境增加了一个部署步骤。
格式优先阅读模式
Aspose.BarCode 的读取 API 的设计前提是调用者知道条形码格式:
using Aspose.BarCode.BarCodeRecognition;
var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
foreach (var result in reader.ReadBarCodes())
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
using Aspose.BarCode.BarCodeRecognition;
var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
foreach (var result in reader.ReadBarCodes())
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
Imports Aspose.BarCode.BarCodeRecognition
Dim reader As New BarCodeReader("barcode.png", DecodeType.Code128)
For Each result In reader.ReadBarCodes()
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是资源泄漏。 IDisposable,虽然不处置它的后果没那么严重。 在这两种情况下,您都在管理对象生命周期,而静态工厂 API 会自动处理这些生命周期。
了解IronBarcode
IronBarcode使用静态工厂方法进行读取和写入。 没有实例可以构造、配置或释放。 默认情况下,读取 API 与格式无关,无论源文件是 PNG、JPEG、TIFF 还是 PDF,相同的调用都能正常工作。
IronBarcode由Iron Software开发和维护,这是一家专注于.NET开发人员工具的公司。 该库的设计原则是,条形码读取不应该需要事先了解条形码格式——该库的检测引擎会根据图像内容确定格式。 对于生成过程,流畅的方法链取代了其他库中常见的多级参数层次结构。
IronBarcode的主要特点:
- 自动格式检测:
DecodeType等价物。 -静态无状态 API:所有读写操作均为静态方法。 无需管理一次性实例,并且 API 自然是线程安全的,可同时使用。 - 本机PDF支持:
result.PageNumber。 - 流畅生成API:
BarcodeWriter.CreateBarcode()返回一个可链式调用的对象。 自定义功能使用方法链而不是属性层次结构。 -永久授权模式:所有级别均提供一次性购买,无需每年续费。 - 基于字符串的许可激活: 许可密钥通过
IronBarCode.License.LicenseKey设置,与环境变量和CI/CD秘密管理器兼容。
功能对比
| 特征 | Aspose.BarCode | IronBarcode |
|---|---|---|
| 格式检测 | 手动——必须指定AllSupportedTypes |
所有支持的格式均自动运行 |
| 符号计数 | 80岁以上 | 50岁以上 |
| PDF 支持 | 不支持原生功能——需要单独的 Aspose.PDF 许可证 | 本地——BarcodeReader.Read("doc.pdf")内置于包中 |
| 定价模式 | 仅限订阅 - 年度层级从$999/年起 | 永久使用权,一次性付款 749 美元起 |
| 永久许可 | 不可用 | 是的,所有级别 |
| API 风格 | 基于实例的详细配置 | 静态工厂方法,流畅 API |
| 一次性要求 | 是——BarcodeGenerator |
否——无状态静态方法 |
| 线程安全 | 每个线程需要单独的实例 | 静态API - 请参阅IronBarcode文档获取线程指导 |
详细功能对比
| 特征 | Aspose.BarCode | IronBarcode |
|---|---|---|
| 一代 | ||
| API 风格 | new BarcodeGenerator(EncodeTypes.X, "data") |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.X) |
| 定制模式 | generator.Parameters.Barcode.*属性层次结构 |
流畅的方法链(.ChangeBarCodeColor()) |
| 带有徽标的二维码 | 生成后手动 GDI+ 叠加 | .AddBrandLogo("logo.png")内置 |
| 输出到字节 | generator.GenerateBarCodeImage() |
.ToPngBinaryData() |
| 彩色条形码 | generator.Parameters.Barcode.BarColor |
.ChangeBarCodeColor(Color.X) |
| 阅读 | ||
| 格式规范 | 必需(DecodeType) |
无需 — 自动 |
| 未知格式回退 | DecodeType.AllSupportedTypes(慢) |
同样的调用——无需备用模式 |
| 性能调校 | QualitySettings参数设置 |
ReadingSpeed枚举——三级 |
| 一次性阅读器 | 是——using var reader = new BarCodeReader(...) |
不——这是静态调用,没有对象需要释放。 |
| 结果访问 | 迭代reader.ReadBarCodes() |
返回值BarcodeReader.Read() |
| 条形码值属性 | result.CodeText |
result.Value |
| 格式名称属性 | result.CodeTypeName |
result.Format.ToString() |
| PDF 支持 | ||
| 原生 PDF 阅读 | 否 | 是 |
| PDF文件必需 | Aspose.PDF(单独订阅) | 无额外包裹 |
| 结果中的页码 | 不适用 | result.PageNumber |
| 许可 | ||
| 许可模式 | 仅限订阅,每年续订 | 永久购买,一次性购买 |
| 单一开发商 | 每年999美元 | 一次性 749 美元 |
| 10 位开发者 | 4,995美元/年(站点许可) | 一次性支付 2,999 美元(Professional) |
| 无限制部署(10名开发者) | $13,986/年(网站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) |
| 视窗 | 是 | 是的(x64/x86) |
| Linux | 是 | 是的(x64) |
| MacOS | 是 | 是的(x64/ARM) |
| 多克 | 是 | 是 |
| Azure/AWS Lambda | 是 | 是 |
生成 API
在日常代码中,生成 API 最能体现出这两个库在代码冗长程度上的差异。
Aspose.BarCode 方法
Aspose.BarCode使用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没有提供一键式品牌标识助手用于QR码; 文档化方法是生成条形码图像然后将标志合成在上面(例如使用System.Drawing.Graphics)。 IronBarcode的AddBrandLogo一次调用处理复合,并自动适当地设置错误校正。
PDF条形码读取
对许多团队来说,这才是最重要的比较。从 PDF 文档中读取条形码是常见的工作流程:例如,收到的发票、保存为 PDF 格式的货运标签以及扫描的文档存档。
Aspose.BarCode 方法
Aspose.BarCode 本身不支持 PDF。 要使用 Aspose 从 PDF 中读取条形码,您需要 Aspose.PDF 来加载 PDF 并将页面渲染为图像,还需要 Aspose.BarCode 来扫描这些渲染后的图像。 两者都是订阅产品。 两者都需要激活许可证。 您为大多数开发者认为的单一功能支付了两个年度订阅。
// 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
这是两个许可设置、两个使用语句来自两个命名空间、一个渲染管道、内存流管理和一个嵌套循环。此时图像提取通常不知道条形码使用的格式,因此也使用DecodeType.AllSupportedTypes。
IronBarcode方法
IronBarcode在内部处理 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;
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;
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
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.ReadBarCodes() |
返回值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 = "YOUR-LICENSE-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(或在Site级别每年支付$4,995)用于条形码功能将促使进行比较。 对话通常是这样的:"我们要永远每年都支付这笔费用。"IronBarcode的一次性费用是多少?Professional版(10 位开发人员 2,999 美元)的IronBarcode在第一年内即可通过站点许可收回成本。
对于使用Aspose.Total的团队来说,Aspose.BarCode与许多其他Aspose产品捆绑在一起,数学计算结果不同。 在该捆绑包中,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.Value的重命名。 对整个代码库进行搜索可以快速解决这个问题:
grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
result.Value。 result.Format.ToString()。 BarcodeEncoding枚举值,它还允许在需要时进行类型化比较。
解码类型移除
代码库中的每个DecodeType.*引用都可以去除:
grep -r "DecodeType\." --include="*.cs" .
grep -r "DecodeType\." --include="*.cs" .
如果列出一个特定的BarcodeReaderOptions中提供了类似的好处,而不需要格式知识要求。
许可证初始化变更
Aspose.BarCode使用通过.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文件。 在Docker中,移除ENV IRONBARCODE_LICENSE条目替换。
编码类型到条形码编码的映射
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。该库会根据微软的.NET发布节奏定期更新。 Aspose.BarCode支持类似的.NET版本范围,因此在当前版本上,两个库都没有兼容性优势。 对于未来的准备而言,真正重要的区别在于许可方式:今天购买的IronBarcode永久许可证可以涵盖未来的.NET版本,无需额外费用,而 Aspose.BarCode 订阅需要不断续订才能访问更新的版本。
结论
Aspose.BarCode 和IronBarcode代表了条形码库设计中的两种不同理念。 Aspose.BarCode 基于显式的、基于实例的 API 构建,调用者通过属性层次结构指定格式、管理对象生命周期并配置每个操作。 IronBarcode基于静态的、与格式无关的 API 构建,该库在内部处理检测、对象生命周期和 PDF 渲染。 两种方法本身都没有绝对的正确性——正确的选择取决于应用程序的需求。
对于已经在 Aspose 生态系统中运营的团队来说,Aspose.BarCode 是更强大的选择。 当Aspose.Total已获得许可证时,Aspose.BarCode不会增加边际成本,其80多个符号列表是任何商业.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()` 函数创建彩色二维码。

