How to Customize and Style Barcodes in C#
从 条形码 迁移到 IronBarcode
本指南涵盖了从 条形码 到IronBarcode的完整迁移路径。 它介绍了三步设置变更,为每种常见模式提供了变更前后的代码示例,将 条形码 API 映射到其IronBarcode等效项,记录了迁移过程中出现的问题,并提供了一个搜索词清单,用于在认为迁移完成之前审核您的代码库。
为什么要从 条形码 迁移?
双SKU采购成本: 条形码 为Generator SDK(仅线性和线性+2D级别)提供永久定价,并将Reader SDK列为单独定价的产品。 需要这两种功能的组织必须完成两次采购流程,针对两个SKU——选择所用符号的正确Generator级别,然后单独购买Reader——才能确定总成本。 摩擦是由于两次采购而不是单个项目项的重复。
分离式产品开销:生成和读取是两个独立的产品,分别具有独立的NuGet包、独立的许可证命名空间、独立的许可证密钥和独立的版本计划。 使用这两个产品的项目必须在启动时配置两个许可证密钥,在升级过程中跟踪两个软件包版本,并保持对两个独立发布周期的了解。 如果将阅读要求添加到原本只考虑生成功能的项目中,则第二个产品必须重复整个采购和集成过程。
PDF 工作流程缺陷: 条形码 本身不支持从 PDF 文档中读取条形码。 处理嵌入在发票、发货清单、采购订单或档案扫描件中的条形码的项目必须单独获取一个 PDF 转图像渲染库,将其集成到流程中,单独管理其许可证,并将渲染后的页面逐个传递给 条形码 Reader SDK。这样就产生了一个双重依赖的解决方案,而原本一个依赖的解决方案就足够了。
API 详细信息: 条形码 生成器需要实例化一个 Barcode 对象,分配多个属性——包括具有合理默认值的属性,例如 BarWidth 和 BarHeight——然后调用生成方法。 使用静态工厂 API 可以用更少的代码生成相同的输出。 通过批量生成,属性赋值模式会产生大量重复代码,这些代码必须进行审查和维护。
基本问题
对于任何既需要生成又需要读取的项目来说,双许可证配置是最直接的摩擦点。 条形码 需要在启动时分别调用两个不同的许可证命名空间:
// OnBarcode: two products, two DLL references, no runtime key
// 条形码 uses pre-licensed DLLs — the purchased DLL is already activated.
// There is no runtime SetLicense() call; the license is baked into the downloaded assembly.
using OnBarcode.Barcode;
using OnBarcode.Barcode;
// OnBarcode: two products, two DLL references, no runtime key
// 条形码 uses pre-licensed DLLs — the purchased DLL is already activated.
// There is no runtime SetLicense() call; the license is baked into the downloaded assembly.
using OnBarcode.Barcode;
using OnBarcode.Barcode;
Imports OnBarcode.Barcode
Imports OnBarcode.Barcode
IronBarcode将其简化为一个属性赋值,该赋值涵盖所有功能——生成、读取、PDF 支持和批量操作——所有这些都归于一个键之下:
// IronBarcode: one package, one key, one line
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// IronBarcode: one package, one key, one line
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
应用程序中的每一个条形码操作——无论是生成、读取还是处理 PDF——都在该单一配置下运行。
IronBarcode与 OnBarcode:功能对比
| 特征 | 条形码 | IronBarcode |
|---|---|---|
| 条形码生成 | 是 | 是 |
| 条形码读取 | 独立产品,单独购买 | 包括 |
| PDF条形码读取 | 原生不支持 | 原生应用——无需外部库 |
| 读取时自动检测格式 | 否 — 需要明确的 BarcodeType[] |
是 |
| 结果元数据(格式、位置、页码) | 不可用 — 仅限原始 string[] |
是 — 带完整元数据的 BarcodeResults |
| 带有徽标叠加层的二维码 | 需要手动编写 GDI+ 代码 | 内置 |
| 出版定价 | 是的——每个产品页面(Generator级别+单独的Reader) | 是的——单页包含所有功能 |
| 一个许可证密钥即可使用所有功能 | 不——每个产品都有单独的密钥 | 是 |
| NuGet分发 | 可用,伴随旧版DLL下载 | 自发布以来即可使用 |
| 源代码访问 | 仅限无限流量套餐 | 不可用 |
| 支持.NET 8/9 | 是 | 是 |
| Docker/云许可证配置 | 手册 | 环境变量支持 |
快速入门:OnBarcode 到IronBarcode 的迁移
步骤 1:移除 条形码 包引用
如果您的项目使用了NuGet包,请删除这两项:
dotnet remove package OnBarcode.Barcode.Generator
dotnet remove package OnBarcode.Barcode.Reader
dotnet remove package OnBarcode.Barcode.Generator
dotnet remove package OnBarcode.Barcode.Reader
如果您的项目使用旧的基于DLL的分发,也请从您的.csproj中移除手动引用块:
<ItemGroup>
<Reference Include="OnBarcode.Barcode">
<HintPath>lib\OnBarcode.Barcode.dll</HintPath>
<Private>true</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Reference Include="OnBarcode.Barcode">
<HintPath>lib\OnBarcode.Barcode.dll</HintPath>
<Private>true</Private>
</Reference>
</ItemGroup>
从lib/目录或存储DLL文件的任何地方删除这些DLL文件。 如果将旧程序集与新的NuGet包一起保留,则会在编译时产生命名空间冲突。
步骤 2:添加IronBarcode
一个软件包涵盖生成、读取和 PDF 支持:
dotnet add package IronBarcode
dotnet add package IronBarcode
阅读时无需第二个软件包。 支持 PDF 不需要第二个软件包。
步骤 3:更新命名空间并替换双许可证配置
将两个 条形码 使用指令替换为单个IronBarcode导入:
// Remove
using OnBarcode.Barcode;
using OnBarcode.Barcode;
// Add
using IronBarCode;
// Remove
using OnBarcode.Barcode;
using OnBarcode.Barcode;
// Add
using IronBarCode;
Imports IronBarCode
用一个单一的键分配替换双DLL引用。 在应用程序启动初期,任何条形码操作运行之前,只需添加一次此代码:
// Remove the 条形码 DLL references and using directives
// Add
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Remove the 条形码 DLL references and using directives
// Add
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Remove the 条形码 DLL references and Imports statements
' Add
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
代码迁移示例
Code 128条码生成
Code 128 的基本案例说明了属性赋值模式与静态工厂模式的区别。
条形码方法:
using OnBarcode.Barcode;
Linear barcode = new Linear();
barcode.Type = BarcodeType.CODE128;
barcode.Data = "SHIP-2024-001";
barcode.Resolution = 96;
barcode.X = 1;
barcode.BarcodeHeight = 80;
barcode.ShowText = true;
barcode.drawBarcode("shipping-label.png");
using OnBarcode.Barcode;
Linear barcode = new Linear();
barcode.Type = BarcodeType.CODE128;
barcode.Data = "SHIP-2024-001";
barcode.Resolution = 96;
barcode.X = 1;
barcode.BarcodeHeight = 80;
barcode.ShowText = true;
barcode.drawBarcode("shipping-label.png");
Imports OnBarcode.Barcode
Dim barcode As New Linear()
barcode.Type = BarcodeType.CODE128
barcode.Data = "SHIP-2024-001"
barcode.Resolution = 96
barcode.X = 1
barcode.BarcodeHeight = 80
barcode.ShowText = True
barcode.drawBarcode("shipping-label.png")
IronBarcode方法:
using IronBarCode;
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128) _
.SaveAsPng("shipping-label.png")
数据和编码类型作为参数传递给CreateBarcode。 分辨率和条形高度等属性并非生成可扫描输出的必要条件; 默认设置适用于大多数用途。 当需要自定义尺寸时,可以在SaveAsPng之间以链式调用的方式添加,而不会引入可变对象状态。
生成带有徽标的二维码
带有标志的QR码需要OnBarcode回退到System.Drawing进行图像叠加步骤。IronBarcode提供此作为内置操作。
条形码方法:
using OnBarcode.Barcode;
using System.Drawing;
QRCode qr = new QRCode();
qr.Data = "https://example.com/product/4891";
qr.QRCodeDataMode = QRCodeDataMode.Auto;
qr.QRCodeECL = QRCodeECL.H; // H-level error correction required for logo overlay
Image qrImage = qr.drawBarcode();
using (Graphics g = Graphics.FromImage(qrImage))
{
Image logo = Image.FromFile("brand-logo.png");
int logoSize = qrImage.Width / 5;
int x = (qrImage.Width - logoSize) / 2;
int y = (qrImage.Height - logoSize) / 2;
g.DrawImage(logo, x, y, logoSize, logoSize);
}
qrImage.Save("product-qr.png");
using OnBarcode.Barcode;
using System.Drawing;
QRCode qr = new QRCode();
qr.Data = "https://example.com/product/4891";
qr.QRCodeDataMode = QRCodeDataMode.Auto;
qr.QRCodeECL = QRCodeECL.H; // H-level error correction required for logo overlay
Image qrImage = qr.drawBarcode();
using (Graphics g = Graphics.FromImage(qrImage))
{
Image logo = Image.FromFile("brand-logo.png");
int logoSize = qrImage.Width / 5;
int x = (qrImage.Width - logoSize) / 2;
int y = (qrImage.Height - logoSize) / 2;
g.DrawImage(logo, x, y, logoSize, logoSize);
}
qrImage.Save("product-qr.png");
Imports OnBarcode.Barcode
Imports System.Drawing
Dim qr As New QRCode()
qr.Data = "https://example.com/product/4891"
qr.QRCodeDataMode = QRCodeDataMode.Auto
qr.QRCodeECL = QRCodeECL.H ' H-level error correction required for logo overlay
Dim qrImage As Image = qr.drawBarcode()
Using g As Graphics = Graphics.FromImage(qrImage)
Dim logo As Image = Image.FromFile("brand-logo.png")
Dim logoSize As Integer = qrImage.Width \ 5
Dim x As Integer = (qrImage.Width - logoSize) \ 2
Dim y As Integer = (qrImage.Height - logoSize) \ 2
g.DrawImage(logo, x, y, logoSize, logoSize)
End Using
qrImage.Save("product-qr.png")
IronBarcode方法:
using IronBarCode;
var qr = QRCodeWriter.CreateQrCodeWithLogo("https://example.com/product/4891", "brand-logo.png", 500);
qr.SaveAsPng("product-qr.png");
using IronBarCode;
var qr = QRCodeWriter.CreateQrCodeWithLogo("https://example.com/product/4891", "brand-logo.png", 500);
qr.SaveAsPng("product-qr.png");
Imports IronBarCode
Dim qr = QRCodeWriter.CreateQrCodeWithLogo("https://example.com/product/4891", "brand-logo.png", 500)
qr.SaveAsPng("product-qr.png")
纠错级别、徽标尺寸计算和图像合成均由内部处理。 无需System.Drawing依赖。
从图像中读取条形码
从图像文件中读取数据最能清晰地说明产品整合情况。 使用 条形码 时,读取需要单独的 Reader SDK、单独的许可证调用和明确的格式规范。 使用IronBarcode,只需使用同一个包和密钥进行一次静态调用即可。
条形码方法:
using OnBarcode.Barcode;
// 条形码 reader is distributed as a pre-licensed DLL — no runtime SetLicense() call.
BarcodeScanner scanner = new BarcodeScanner();
scanner.BarcodeTypes = new BarcodeType[] { BarcodeType.Code128, BarcodeType.QRCode };
string[] results = scanner.Scan("received-label.png");
foreach (string value in results)
Console.WriteLine(value);
using OnBarcode.Barcode;
// 条形码 reader is distributed as a pre-licensed DLL — no runtime SetLicense() call.
BarcodeScanner scanner = new BarcodeScanner();
scanner.BarcodeTypes = new BarcodeType[] { BarcodeType.Code128, BarcodeType.QRCode };
string[] results = scanner.Scan("received-label.png");
foreach (string value in results)
Console.WriteLine(value);
Imports OnBarcode.Barcode
' 条形码 reader is distributed as a pre-licensed DLL — no runtime SetLicense() call.
Dim scanner As New BarcodeScanner()
scanner.BarcodeTypes = New BarcodeType() {BarcodeType.Code128, BarcodeType.QRCode}
Dim results As String() = scanner.Scan("received-label.png")
For Each value As String In results
Console.WriteLine(value)
Next
IronBarcode方法:
using IronBarCode;
var results = BarcodeReader.Read("received-label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
using IronBarCode;
var results = BarcodeReader.Read("received-label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
Imports IronBarCode
Dim results = BarcodeReader.Read("received-label.png")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
无需创建实例,无需格式化数组,无需单独配置许可证。 系统会自动检测格式。 每个结果都包含解码值和检测到的格式。 有关读取选项和支持的图像类型的详细信息,请参阅如何从图像中读取条形码的指南。
从 PDF 文件中读取条形码
此迁移示例适用于在将 PDF 页面渲染为图像之前,使用第三方库将这些图像传递给 条形码 Reader SDK 的团队。
条形码方法:
// 条形码 has no native PDF support.
// A separate PDF rendering library was required — for example PdfiumViewer or Aspose.PDF.
var pageImages = RenderPdfPagesToImages("invoices.pdf"); // external library call
using OnBarcode.Barcode;
BarcodeScanner scanner = new BarcodeScanner();
scanner.BarcodeTypes = new BarcodeType[] { BarcodeType.Code128, BarcodeType.QRCode };
foreach (var pageImage in pageImages)
{
string[] results = scanner.Scan(pageImage);
foreach (string value in results)
Console.WriteLine(value);
}
// 条形码 has no native PDF support.
// A separate PDF rendering library was required — for example PdfiumViewer or Aspose.PDF.
var pageImages = RenderPdfPagesToImages("invoices.pdf"); // external library call
using OnBarcode.Barcode;
BarcodeScanner scanner = new BarcodeScanner();
scanner.BarcodeTypes = new BarcodeType[] { BarcodeType.Code128, BarcodeType.QRCode };
foreach (var pageImage in pageImages)
{
string[] results = scanner.Scan(pageImage);
foreach (string value in results)
Console.WriteLine(value);
}
Imports OnBarcode.Barcode
' 条形码 has no native PDF support.
' A separate PDF rendering library was required — for example PdfiumViewer or Aspose.PDF.
Dim pageImages = RenderPdfPagesToImages("invoices.pdf") ' external library call
Dim scanner As New BarcodeScanner()
scanner.BarcodeTypes = New BarcodeType() {BarcodeType.Code128, BarcodeType.QRCode}
For Each pageImage In pageImages
Dim results As String() = scanner.Scan(pageImage)
For Each value As String In results
Console.WriteLine(value)
Next
Next
IronBarcode方法:
using IronBarCode;
var results = BarcodeReader.Read("invoices.pdf");
foreach (var result in results)
Console.WriteLine($"Page {result.PageNumber}: {result.Format} — {result.Value}");
using IronBarCode;
var results = BarcodeReader.Read("invoices.pdf");
foreach (var result in results)
Console.WriteLine($"Page {result.PageNumber}: {result.Format} — {result.Value}");
Imports IronBarCode
Dim results = BarcodeReader.Read("invoices.pdf")
For Each result In results
Console.WriteLine($"Page {result.PageNumber}: {result.Format} — {result.Value}")
Next
无需渲染步骤,无需外部PDF库,无需格式数组。 PDF条形码读取功能可自动处理所有页面,并在每个结果中包含页码。
批量生成
为一组商品生成条形码与单个商品生成条形码遵循相同的模式差异。
条形码方法:
using OnBarcode.Barcode;
foreach (var item in inventoryItems)
{
Linear barcode = new Linear();
barcode.Type = BarcodeType.CODE128;
barcode.Data = item.Sku;
barcode.Resolution = 96;
barcode.BarWidth = 1;
barcode.BarHeight = 80;
barcode.ShowText = true;
barcode.drawBarcode($"labels/{item.Id}.png");
}
using OnBarcode.Barcode;
foreach (var item in inventoryItems)
{
Linear barcode = new Linear();
barcode.Type = BarcodeType.CODE128;
barcode.Data = item.Sku;
barcode.Resolution = 96;
barcode.BarWidth = 1;
barcode.BarHeight = 80;
barcode.ShowText = true;
barcode.drawBarcode($"labels/{item.Id}.png");
}
Imports OnBarcode.Barcode
For Each item In inventoryItems
Dim barcode As New Linear()
barcode.Type = BarcodeType.CODE128
barcode.Data = item.Sku
barcode.Resolution = 96
barcode.BarWidth = 1
barcode.BarHeight = 80
barcode.ShowText = True
barcode.drawBarcode($"labels/{item.Id}.png")
Next
IronBarcode方法:
using IronBarCode;
foreach (var item in inventoryItems)
{
BarcodeWriter.CreateBarcode(item.Sku, BarcodeEncoding.Code128)
.SaveAsPng($"labels/{item.Id}.png");
}
using IronBarCode;
foreach (var item in inventoryItems)
{
BarcodeWriter.CreateBarcode(item.Sku, BarcodeEncoding.Code128)
.SaveAsPng($"labels/{item.Id}.png");
}
Imports IronBarCode
For Each item In inventoryItems
BarcodeWriter.CreateBarcode(item.Sku, BarcodeEncoding.Code128) _
.SaveAsPng($"labels/{item.Id}.png")
Next
条形码 API 到IronBarcode映射参考
| 条形码 | IronBarcode | 备注 |
|---|---|---|
| 预许可DLL(无需运行时键调用) | IronBarCode.License.LicenseKey = "key" |
财产转让; 启动时调用一次 |
| 两个DLL引用(生成器+读取器) | 单个 NuGet 软件包 | 一个包涵盖所有功能 |
new Linear() |
BarcodeWriter.CreateBarcode(data, encoding) |
静态工厂; 没有对象实例 |
barcode.BarcodeType = BarcodeType.CODE128 |
BarcodeEncoding.Code128 作为参数 |
作为第二个参数传递给CreateBarcode |
barcode.Data = "..." |
CreateBarcode的第一个参数 |
数据是首要论据 |
barcode.drawBarcode("file.png") |
.SaveAsPng("file.png") |
格式化方法 |
barcode.drawBarcode("file.jpg") |
.SaveAsJpeg("file.jpg") |
格式化方法 |
barcode.drawBarcode("file.pdf") |
.SaveAsPdf("file.pdf") |
原生 PDF 输出 |
BarcodeType.CODE128 |
BarcodeEncoding.Code128 |
常量重命名 |
BarcodeType.QRCode |
BarcodeEncoding.QRCode |
直接映射 |
BarcodeType.EAN13 |
BarcodeEncoding.EAN13 |
直接映射 |
BarcodeType.DataMatrix |
BarcodeEncoding.DataMatrix |
直接映射 |
BarcodeType.PDF417 |
BarcodeEncoding.PDF417 |
直接映射 |
new BarcodeScanner() { BarcodeTypes = [...] } |
BarcodeReader.Read(path) — 静态 |
没有实例,也没有格式规范 |
scanner.Scan("file.png") → string[] |
BarcodeReader.Read("file.png") → BarcodeResults |
更丰富的返回类型 |
results[0] (原始字符串) |
result.Value |
解码后的字符串值 |
| 不适用 | result.Format |
检测到的格式——OnBarcode 中不支持。 |
| 不适用 | result.PageNumber |
PDF 读取的页面源代码 |
| 不适用 | BarcodeReader.Read("document.pdf") |
原生PDF阅读; 没有 条形码 等效项 |
| 手动 GDI+ 叠加 QR 标志 | QRCodeWriter.CreateQrCodeWithLogo() |
内置徽标支持 |
BarcodeType[] 配置 |
不要求 | 自动检测是默认设置 |
常见迁移问题和解决方案
问题 1:DLL 引用冲突
OnBarcode: 在旧版DLL分发的项目中,.csproj 中包含指向 lib\OnBarcode.Barcode.dll 或类似路径的 <Reference> 元素。 如果添加IronBarcode时旧的 DLL 仍然存在于磁盘上,编译器将看到两个程序集提供相同的命名空间前缀,从而产生歧义引用错误。
解决方案: 在运行<ItemGroup>引用块。 从磁盘中删除 DLL 文件。 使用全新构建版本验证是否没有残留过时的程序集引用。
# Search for lingering 条形码 DLL references in project files
grep -r "OnBarcode" --include="*.csproj" .
grep -r "OnBarcode" --include="*.props" .
# Search for lingering 条形码 DLL references in project files
grep -r "OnBarcode" --include="*.csproj" .
grep -r "OnBarcode" --include="*.props" .
问题2:分阶段迁移期间的类型名称冲突
OnBarcode: 读取器命名空间导出一个名为BarcodeScanner的类。IronBarcode有一个静态类,名为 BarcodeReader。 这些名称不直接冲突,但任何同时导入BarcodeEncoding。 在迁移过程中保持两个命名空间同时活动会导致任何BarcodeType引用的编译错误。
解决方案: 完整地完成每个文件的迁移——在同一次编辑中删除using IronBarCode。 不要让两个 using 指令同时存在于任何文件中。如果需要分阶段实施,请暂时使用完全限定名称:
// Temporary disambiguation during phased migration
var results = IronBarCode.BarcodeReader.Read("file.png");
// Temporary disambiguation during phased migration
var results = IronBarCode.BarcodeReader.Read("file.png");
' Temporary disambiguation during phased migration
Dim results = IronBarCode.BarcodeReader.Read("file.png")
问题 3:移除条形码类型数组
OnBarcode:读取器需要 reader.BarcodeTypes = new BarcodeType[] { ... } 到函数。 开发人员在迁移读取器代码时,有时会习惯于明确指定格式,并在IronBarcode中查找等效配置。
解决方案:完全移除格式规范。 BarcodeReader.Read 在所有支持的格式中执行自动检测。 无需配置,并且IronBarcode中不存在BarcodeType[]的等效内容,因为它是不需要的。
// No format configuration required
var results = BarcodeReader.Read("label.png");
// No format configuration required
var results = BarcodeReader.Read("label.png");
Dim results = BarcodeReader.Read("label.png")
条形码 迁移清单
迁移前任务
在进行任何更改之前,请审核代码库,找出所有 条形码 的使用情况:
# Find all 条形码 namespace imports
grep -rn "using OnBarcode" --include="*.cs" .
# Find all license configuration calls
grep -rn "SetLicense" --include="*.cs" .
# Find all generator usage
grep -rn "new Linear\|new QRCode\|drawBarcode\|BarcodeType\." --include="*.cs" .
# Find all reader usage
grep -rn "BarcodeScanner\|\.Scan(\|BarcodeType\[\]" --include="*.cs" .
# Find DLL references in project files
grep -rn "OnBarcode" --include="*.csproj" .
grep -rn "OnBarcode" --include="*.sln" .
# Find all 条形码 namespace imports
grep -rn "using OnBarcode" --include="*.cs" .
# Find all license configuration calls
grep -rn "SetLicense" --include="*.cs" .
# Find all generator usage
grep -rn "new Linear\|new QRCode\|drawBarcode\|BarcodeType\." --include="*.cs" .
# Find all reader usage
grep -rn "BarcodeScanner\|\.Scan(\|BarcodeType\[\]" --include="*.cs" .
# Find DLL references in project files
grep -rn "OnBarcode" --include="*.csproj" .
grep -rn "OnBarcode" --include="*.sln" .
记录哪些文件仅使用生成功能,哪些文件使用读取功能,哪些文件两者都使用。 请注意任何包含手动<Reference> DLL 块而非NuGet包引用的文件。
代码更新任务
- 移除
OnBarcode.Barcode.GeneratorNuGet包 - 移除
OnBarcode.Barcode.ReaderNuGet包 - 从
<Reference>DLL条目 - 从存储库中删除 条形码 DLL 文件
- 运行
dotnet add package IronBarcode - 在每个文件中用
using OnBarcode.Barcode - 在每个文件中用
using OnBarcode.Barcode.Reader - 移除两个OnBarcode DLL
<Reference>条目(生成器和读取器)——无需替换运行时代码调用 - 在应用程序启动时一次性地添加
IronBarCode.License.LicenseKey = "YOUR-KEY" - 将每个
new QRCode()+ 属性分配块转换为BarcodeWriter.CreateBarcode(data, encoding) - 用
barcode.drawBarcode("file.png") - 用
new BarcodeScanner() { BarcodeTypes = [...] }+.Scan(path) - 将结果处理从
BarcodeResults上 - 移除所有用于绕过 条形码 PDF 限制的 PDF 转图像渲染代码
- 用单次
BarcodeReader.Read("file.pdf")调用替换多步骤PDF渲染和扫描循环
迁移后测试
- 验证项目中使用的每种条形码类型(Code 128、QR、EAN、Data Matrix、PDF417)是否都能生成可扫描的输出。
- 使用物理扫描仪或移动设备扫描生成的条形码,以确认其可读性
- 验证条形码读取是否能为已知的测试图像返回正确的值
- 确认 PDF 读取功能能够为多页测试文档返回正确的值和页码。
- 在任何持续集成 (CI) 环境中运行应用程序,以确认许可证密钥配置在流水线中正常工作。
- 在迁移完成后,检查
OnBarcode字符串
迁移到IronBarcode的主要优势
整合的软件包和许可证:迁移后,一个NuGet包和一个许可证密钥即可涵盖所有条形码操作。 无需采购单独的产品,无需跟踪独立的版本更新计划,也无需在启动时维护双重许可配置。双产品架构的复杂性被单一依赖关系所取代。
透明采购: IronBarcode在产品网站上公布了永久许可级别的价格。企业无需与销售人员沟通,即可确定总成本、提交采购订单并完成采购。 IronBarcode许可页面包含所有级别的定价以及 Docker 和云环境的关键配置详情。
原生 PDF 支持:以前需要单独的 PDF 渲染库来处理嵌入条形码的 PDF 的项目可以完全消除这种依赖性。 单次BarcodeReader.Read调用处理PDF文档的所有页面,不需要任何渲染步骤,并且每个结果都包含提取页面的页码。
更丰富的读取结果: BarcodeResults返回类型提供了解码值、检测到的条形码格式、源图像中的坐标框以及PDF读取的页码。 以前使用平面string[]的应用程序现在可以显示格式信息、支持注释工作流或实施基于置信度的过滤,而无需增加额外处理。
减少 API 接口:静态工厂模式取代了属性赋值模型。 常见的生成操作需要的代码行数较少,读取操作不需要创建实例或预先配置格式。 批量操作的优势在于每个项目的代码占用空间更小,更容易进行审查和长期维护。
常见问题解答
我为什么要从OnBarcode迁移到IronBarcode?
常见原因包括简化许可(消除 SDK + 运行时密钥的复杂性)、消除吞吐量限制、获得原生 PDF 支持、改进 Docker/CI/CD 部署以及减少生产代码中的 API 样板代码。
如何用 IronBarcode 替换 OnBarcode API 调用?
用 `IronBarCode.License.LicenseKey = "key"` 替换实例创建和许可相关的样板代码。用 `BarcodeReader.Read(path)` 替换读取器调用,用 `BarcodeWriter.CreateBarcode(data, encoding)` 替换写入器调用。静态方法无需实例管理。
从 OnBarcode 迁移到 IronBarcode 时,代码需要做多少更改?
大多数迁移都能减少代码行数。许可样板代码、实例构造函数和显式格式配置都被移除。核心读/写操作映射到更简洁的 IronBarcode 等效代码,并生成更清晰的结果对象。
迁移过程中是否需要同时安装 OnBarcode 和 IronBarcode?
不。大多数迁移都是直接替换,而不是并行操作。一次迁移一个服务类,替换 NuGet 引用,并更新实例化和 API 调用模式,然后再迁移下一个类。
IronBarcode 的 NuGet 包名称是什么?
该软件包名为“IronBarCode”(B 和 C 大写)。使用“Install-Package IronBarCode”或“dotnet add package IronBarCode”进行安装。代码中的 using 指令为“using IronBarCode;”。
与 OnBarcode 相比,IronBarcode 如何简化 Docker 部署?
IronBarcode 是一个 NuGet 包,不包含任何外部 SDK 文件或已挂载的许可证配置。在 Docker 环境中,设置 IRONBARCODE_LICENSE_KEY 环境变量后,该包会在启动时自动处理许可证验证。
从 OnBarcode 迁移后,IronBarcode 是否能自动检测所有条形码格式?
是的。IronBarcode 可以自动检测所有支持格式的条码符号,无需显式枚举 BarcodeTypes。如果已知条码格式且性能至关重要,BarcodeReaderOptions 允许缩小搜索范围以进行优化。
IronBarcode 能否在不使用单独库的情况下读取 PDF 中的条形码?
是的。`BarcodeReader.Read("document.pdf")` 可以直接处理 PDF 文件。结果包括每个条形码的页码、格式、值和置信度。无需外部 PDF 渲染步骤。
IronBarcode如何处理并行条码处理?
IronBarcode 的静态方法是无状态且线程安全的。可以直接对文件列表使用 Parallel.ForEach,无需进行线程级实例管理。BarcodeReaderOptions.MaxParallelThreads 控制内部线程预算。
从 OnBarcode 迁移到 IronBarcode 时,哪些结果属性会发生变化?
常见重命名:BarcodeValue 变为 Value,BarcodeType 变为 Format。IronBarcode 结果还会添加 Confidence 和 PageNumber。解决方案范围内的查找替换功能会处理现有结果处理代码中的重命名。
如何在 CI/CD 流水线中设置 IronBarcode 许可?
将 IRONBARCODE_LICENSE_KEY 存储为管道密钥,并在应用程序启动代码中赋值 IronBarCode.License.LicenseKey。一个密钥即可覆盖所有环境,包括开发、测试、预发布和生产环境。
IronBarcode是否支持生成自定义样式的二维码?
是的。QRCodeWriter.CreateQrCode() 支持通过 ChangeBarCodeColor() 自定义颜色、通过 AddBrandLogo() 嵌入徽标、可配置纠错级别以及多种输出格式,包括 PNG、JPG、PDF 和流媒体。

