从 二维码 迁移到 IronBarcode
本指南是为那些项目最初使用 二维码 开发,但后来发展到需要 QR 码生成以外的功能的开发团队编写的。 二维码 是一个维护良好、质量上乘的库,在其预期范围内表现出色,迁移并不反映其质量。 这是为了满足一些超出 二维码 设计功能范围的需求,例如格式扩展、条形码读取、PDF 集成等。 本指南涵盖了从 二维码 到IronBarcode的完整技术路径:软件包替换、命名空间更改、每个常见模式的代码转换、API 等效性映射以及过渡期间出现的问题的解决方案。
为什么要从 二维码 迁移?
除二维码外,格式要求: 二维码 仅生成二维码。 随着项目需要Code 128标签用于物流、EAN-13代码用于零售产品识别、DataMatrix用于制药序列化或PDF417用于政府文件合规,必须为每个新增格式引入一个单独的库。 随着所需格式数量的增加,独立软件包、API 和维护义务的数量也会增加。
条形码读取要求: 二维码 没有条形码读取 API——它本身就是一个仅用于生成条形码的库。 任何需要解码传入图像中的二维码、验证扫描文档上的条形码或处理发货标签的应用程序,都必须在 二维码 之外添加一个专用的读取库。 第二个库有它自己的 API 接口、自己的更新周期,以及每次.NET升级时自身的兼容性问题。
**多库维护:**基于 二维码 的项目的实际积累模式是从用于生成 QR 的 二维码 到用于运输标签的一维条形码库,再到用于解码的读取库。 管理三到四个独立的软件包意味着要跟踪不同的发行说明,在任何一个软件包更新时解决版本冲突,以及保持对整个开发团队中多个 API 的熟悉程度。 随着时间的推移,维护负担会以各种方式累积,而这些在最初的集成估算中是看不到的。
**PDF 支持:**在 PDF 文档中嵌入条形码或从传入的 PDF 文件中提取条形码均超出 二维码 的功能范围。 文档处理流程——发票处理、从 PDF 模板生成标签、合规性报告——很早就遇到了这个边界。 必须向 二维码 添加专用的 PDF 库,或者架构必须通过单独的子系统来处理条形码生成和 PDF 生成。
基本问题
QRCoder 可以高效地解决二维码生成问题。 一旦任何需求超出二维码范围,代码库就必须开始引入额外的软件包来填补每个空白:
// 二维码 handles QR generation well — but no further
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10));
// Now the shipping team asks for Code 128 — add NetBarcode
// Now the warehouse needs to scan barcodes — add ZXing.Net
// Now a report needs a barcode in a PDF — add a PDF library
// Each addition: new namespace, new API, new maintenance cycle
IronBarcode将 PDF 生成、读取和集成整合到一个 API 中:
//IronBarcode— one library covers all of the above
using IronBarCode;
// Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
// Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
// Read a barcode from an image — built in
var results = BarcodeReader.Read("incoming.png");
IronBarcode与 QRCoder:功能对比
| 特征 | 二维码 | IronBarcode |
|---|---|---|
| 二维码生成 | 是的——太棒了 | 是 |
| 微型 QR | 是 | 否 |
| 代码 128 / 代码 39 | 否 | 是 |
| EAN-13 / UPC-A | 否 | 是 |
| 数据矩阵 | 否 | 是 |
| PDF417 | 否 | 是 |
| 阿兹特克 | 否 | 是 |
| 总格式 | 1 | 50岁以上 |
| 条形码读取 | 否 | 是的——自动检测 |
| PDF条形码提取 | 否 | 是 |
| PDF条形码盖章 | 否 | 是 |
| 徽标嵌入 | 是 | 是 |
| 颜色定制 | 是 | 是 |
| SVG 输出 | 是 | 是 |
| 有效载荷生成器助手 | 是 | 不——手工弦乐制作 |
| 零外部依赖 | 是 | 自成一体 |
| 执照 | 麻省理工学院——不受限制 | 商业——Lite级别涵盖单个开发人员 |
快速入门:QRCoder 到IronBarcode 的迁移
步骤 1:替换 NuGet 软件包
从项目中移除 QRCoder:
dotnet remove package QRCoder
安装IronBarcode:
dotnet add package IronBarcode
如果该项目使用了 ZXing .NET和 二维码 进行条形码读取,那么也可以在此阶段移除该软件包:
dotnet remove package ZXing.Net
步骤 2:更新命名空间
将 二维码 命名空间导入替换为IronBarcode命名空间:
// Before (QRCoder)
using QRCoder;
// After (IronBarcode)
using IronBarCode;' Before (QRCoder)
Imports QRCoder
' After (IronBarcode)
Imports IronBarCode步骤 3:初始化许可证
在应用程序启动时添加许可证初始化——Startup.cs或静态构造函数:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"无需注册即可获得免费试用密钥。 生产环境部署需要购买许可证。
代码迁移示例
基本二维码生成
最常见的QRCoder模式需要三个对象:一个PngByteQRCode。 在IronBarcode中,一个静态调用即可取代此链。
QRCoder 方法:
using QRCoder;
public class BarcodeService
{
private readonly QRCodeGenerator _generator = new QRCodeGenerator();
public byte[] GenerateQR(string content)
{
var qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
return qrCode.GetGraphic(10); // 10px per module
}
}Imports QRCoder
Public Class BarcodeService
Private ReadOnly _generator As New QRCodeGenerator()
Public Function GenerateQR(content As String) As Byte()
Dim qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M)
Dim qrCode = New PngByteQRCode(qrCodeData)
Return qrCode.GetGraphic(10) ' 10px per module
End Function
End ClassIronBarcode方法:
using IronBarCode;
public class BarcodeService
{
public byte[] GenerateQR(string content)
{
return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode)
.ResizeTo(200, 200)
.ToPngBinaryData();
}
}Imports IronBarCode
Public Class BarcodeService
Public Function GenerateQR(content As String) As Byte()
Return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode) _
.ResizeTo(200, 200) _
.ToPngBinaryData()
End Function
End ClassBarcodeWriter是一个静态类——不需要实例,也没有中间数据对象。 GetGraphic中接受的每模块像素整数。 在QRCoder通过模块计数调整输出大小(例如,GetGraphic(10)为10px每模块的图像)时,IronBarcode接受绝对像素尺寸。
将二维码保存到文件
QRCoder 仅通过终端步骤将内存中的字节与文件输出分开——渲染器链也是如此。 IronBarcode在同一条链上使用不同的终端方法。
QRCoder 方法:
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var pngBytes = new PngByteQRCode(qrCodeData).GetGraphic(10);
File.WriteAllBytes("output.png", pngBytes);Imports QRCoder
Imports System.IO
Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim pngBytes = New PngByteQRCode(qrCodeData).GetGraphic(10)
File.WriteAllBytes("output.png", pngBytes)IronBarcode方法:
using IronBarCode;
// Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.SaveAsPng("output.png");
// Or obtain bytes for in-memory use
byte[] pngBytes = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.ToPngBinaryData();Imports IronBarCode
' Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.ResizeTo(300, 300) _
.SaveAsPng("output.png")
' Or obtain bytes for in-memory use
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.ResizeTo(300, 300) _
.ToPngBinaryData()SaveAsPng方法是一个直接写入磁盘的终端。 byte[]用于流、HTTP响应或数据库存储。
SVG 输出
QRCoder 方法:
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("output.svg", svgContent);Imports QRCoder
Imports System.IO
Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim svgContent As String = New SvgQRCode(qrCodeData).GetGraphic(10)
File.WriteAllText("output.svg", svgContent)IronBarcode方法:
using IronBarCode;
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsImage("output.svg");Imports IronBarCode
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsImage("output.svg").svg扩展将产生SVG输出)。
纠错级别映射
QRCoder在每次QRCodeGenerator.ECCLevel枚举显式选择ECC。 IronBarcode在使用QRCodeWriter.QrErrorCorrectionLevel提供显式控制。
QRCoder 方法:
using QRCoder;
var generator = new QRCodeGenerator();
// Medium — suitable for most generation without logos
var dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
// High — required when a logo will occlude part of the code
var dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);Imports QRCoder
Dim generator As New QRCodeGenerator()
' Medium — suitable for most generation without logos
Dim dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
' High — required when a logo will occlude part of the code
Dim dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H)IronBarcode方法:
using IronBarCode;
// Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("default-ecc.png");
// Explicit level via QRCodeWriter
var qr = QRCodeWriter.CreateQrCode(
"https://example.com",
500,
QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.SaveAsPng("high-ecc.png");Imports IronBarCode
' Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsPng("default-ecc.png")
' Explicit level via QRCodeWriter
Dim qr = QRCodeWriter.CreateQrCode( _
"https://example.com", _
500, _
QRCodeWriter.QrErrorCorrectionLevel.Highest _
)
qr.SaveAsPng("high-ecc.png")电平映射为:ECCLevel.L → ECCLevel.M → ECCLevel.Q → ECCLevel.H → Highest。
徽标嵌入
这两个库都支持在二维码中嵌入logo。 QRCoder通过System.Drawing.Bitmap参数路由此流程。 IronBarcode提供QRCodeWriter.CreateQrCodeWithLogo()作为专用工厂方法,接受用于URL和徽标的文件路径。 二维码样式定制指南涵盖徽标尺寸、位置和颜色组合选项。
QRCoder 方法:
using QRCoder;
using System.Drawing;
using System.Drawing.Imaging;
var generator = new QRCodeGenerator();
// ECCLevel.H is required — the logo occludes part of the code
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", ImageFormat.Png);Imports QRCoder
Imports System.Drawing
Imports System.Drawing.Imaging
Dim generator As New QRCodeGenerator()
' ECCLevel.H is required — the logo occludes part of the code
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H)
Dim qrCode As New QRCode(qrCodeData)
Dim logoBitmap As New Bitmap("logo.png")
Dim qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap)
qrBitmap.Save("qr-logo.png", ImageFormat.Png)IronBarcode方法:
using IronBarCode;
QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500)
.SaveAsPng("qr-logo.png");Imports IronBarCode
QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500) _
.SaveAsPng("qr-logo.png")CreateQrCodeWithLogo接受内容和徽标图像的文件路径字符串。 错误校正会自动设置为嵌入徽标所需的等级; 不需要明确的ECC配置。
有效载荷生成器.WiFi迁移
QRCoder的PayloadGenerator.WiFi格式化标准的WiFi QR有效负载字符串。 输出格式是QR码规范定义的公共标准(WIFI:T:{auth};S:{ssid};P:{password};;)。 迁移时,可以直接构建这些字符串。
QRCoder 方法:
using QRCoder;
var wifi = new PayloadGenerator.WiFi(
ssid: "OfficeNetwork",
password: "SecurePass123",
authenticationMode: PayloadGenerator.WiFi.Authentication.WPA
);
// wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;
var generator = new QRCodeGenerator();
var qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10));Imports QRCoder
Dim wifi = New PayloadGenerator.WiFi(
ssid:="OfficeNetwork",
password:="SecurePass123",
authenticationMode:=PayloadGenerator.WiFi.Authentication.WPA
)
' wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;
Dim generator = New QRCodeGenerator()
Dim qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M)
Dim qrCode = New PngByteQRCode(qrData)
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10))IronBarcode方法:
using IronBarCode;
// Construct the standard WiFi QR string directly
string wifiPayload = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;";
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.SaveAsPng("wifi.png");Imports IronBarCode
' Construct the standard WiFi QR string directly
Dim wifiPayload As String = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;"
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode) _
.ResizeTo(300, 300) _
.SaveAsPng("wifi.png")对于使用多种.ToString()输出生成的格式化字符串,然后直接或通过一个小的静态辅助方法构造该字符串。
二维码 API 到IronBarcode映射参考
| 二维码 | IronBarcode | 备注 |
|---|---|---|
new QRCodeGenerator() | 静态类——无实例 | BarcodeWriter不需要实例化 |
qrGenerator.CreateQrCode(data, ECCLevel.M) | BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) | 直接替换 |
new PngByteQRCode(qrCodeData) | 不需要 | 渲染是流畅链的一部分 |
byte[] | .ToPngBinaryData() | 通过.ResizeTo(w, h)调整大小 |
File.WriteAllBytes(path, bytes)模式 | .SaveAsPng(path) | GeneratedBarcode上的终端方法 |
new SvgQRCode(qrCodeData).GetGraphic(10) | .SaveAsImage(path) | 传递.svg扩展以输出SVG |
new QRCode(qrCodeData).GetGraphic(...) | QRCodeWriter.CreateQrCode(data, size, level) | 用于徽标和颜色定制 |
QRCodeGenerator.ECCLevel.L | QRCodeWriter.QrErrorCorrectionLevel.Low | |
QRCodeGenerator.ECCLevel.M | QRCodeWriter.QrErrorCorrectionLevel.Medium | 未指定时的默认值 |
QRCodeGenerator.ECCLevel.Q | QRCodeWriter.QrErrorCorrectionLevel.High | |
QRCodeGenerator.ECCLevel.H | QRCodeWriter.QrErrorCorrectionLevel.Highest | 需要用于嵌入徽标 |
PayloadGenerator.WiFi(...).ToString() | "WIFI:T:WPA;S:{ssid};P:{pass};;" | 直接构造标准字符串 |
PayloadGenerator.ContactData(...).ToString() | "BEGIN:VCARD\n..." | vCard 是一种公共标准 |
| 无读取 API | BarcodeReader.Read(path) | 新功能——无需单独的库 |
| 仅限二维码格式 | 通过BarcodeEncoding.*提供50多种格式 | 新功能 |
常见迁移问题和解决方案
问题 1:有效载荷生成器字符串格式更改
QRCoder:PayloadGenerator.ContactData和其他助手自动生成格式化字符串。 代码将助手对象的CreateQrCode。
**解决方案:**识别每个PayloadGenerator类型生成的字符串——其格式在QR码规范中有记录并且易于再现。 对于WiFi:WIFI:T:WPA;S:{ssid};P:{password};;。 对于vCard:标准的BEGIN:VCARD / END:VCARD块。 如果多个调用点使用相同的有效负载类型,请编写静态辅助方法:
public static string WifiPayload(string ssid, string password, string auth = "WPA")
=> $"WIFI:T:{auth};S:{ssid};P:{password};;";Public Shared Function WifiPayload(ssid As String, password As String, Optional auth As String = "WPA") As String
Return $"WIFI:T:{auth};S:{ssid};P:{password};;"
End Function问题 2:ECCLevel 枚举映射
QRCoder:H。 这是每次CreateQrCode调用的必需参数。
**解决方案:**使用QRCodeWriter.QrErrorCorrectionLevel等效项。 使用BarcodeWriter.CreateBarcode时,ECC级别会自动默认为Medium且不需要参数。 更新每个呼叫点:
// 二维码 ECCLevel.H →IronBarcodeQrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);
// 二维码 ECCLevel.M →IronBarcodedefault (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
问题 3:渲染器类移除
**QRCoder:**每个输出格式都需要其渲染器类实例化—QRCode。 这些类接受GetGraphic,具有不同的返回类型。
**解决方案:**移除所有渲染器类实例。 IronBarcode将格式输出构建到 fluent 链的终端方法中。 在.ToPngBinaryData()。 将.svg扩展)。 QRCodeData中间对象也消失了——在IronBarcode中不需要它。
问题 4:移除 PngByteQRCode 和基于模块的尺寸调整
QRCoder:PngByteQRCode.GetGraphic(int pixelsPerModule)通过每个QR模块的像素数量来调整输出大小。 最终图像尺寸取决于模块数量,而模块数量又随内容长度和 ECC 级别而变化。
**解决方案:**用ResizeTo(int width, int height)替换基于模块的大小,以获得绝对的像素尺寸。 如果你的代码是根据模块数量动态计算预期输出大小的,请切换到满足输出要求的固定目标大小:
// Before: GetGraphic(20) — output size varies with content
var bytes = new PngByteQRCode(qrData).GetGraphic(20);
// After: fixed 400×400 regardless of content
byte[] bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
.ResizeTo(400, 400)
.ToPngBinaryData();Imports System
' Before: GetGraphic(20) — output size varies with content
Dim bytes = New PngByteQRCode(qrData).GetGraphic(20)
' After: fixed 400×400 regardless of content
Dim bytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) _
.ResizeTo(400, 400) _
.ToPngBinaryData()二维码 迁移清单
迁移前任务
在进行任何更改之前,请审核代码库中所有 二维码 的使用情况:
# Find all 二维码 namespace imports
grep -r "using QRCoder" --include="*.cs" .
# Find all generator and renderer instantiations
grep -r "QRCodeGenerator\|PngByteQRCode\|SvgQRCode\|AsciiQRCode\|QRCode\b" --include="*.cs" .
# Find all PayloadGenerator usages
grep -r "PayloadGenerator\." --include="*.cs" .
# Find ECCLevel references
grep -r "ECCLevel\." --include="*.cs" .
# Find ZXing.Net usage to remove at the same time
grep -r "using ZXing" --include="*.cs" .
- 记录所有正在使用的
PayloadGenerator类型并注意其字符串输出格式 - 记录所有正在使用的ECC级别值及其调用位置
- 找出所有与 二维码 配对用于解码的 ZXing .NET读取代码——这可以同时替换。
- 获取IronBarcode许可证密钥(无需注册即可获得试用密钥)
代码更新任务
- 运行
dotnet remove package QRCoder - 如果它仅用于与QRCoder一起读取,则运行
dotnet remove package ZXing.Net - 运行
dotnet add package IronBarcode - 将
IronBarCode.License.LicenseKey = "YOUR-KEY";添加到应用程序启动中 - 将所有
using IronBarCode; - 删除所有
BarcodeWriter是静态的 - 用
generator.CreateQrCode(data, ECCLevel.X)+渲染器链模式 - 用
.ResizeTo(w, h) - 用
File.WriteAllBytes(path, bytes)保存模式 - 用
.svg扩展) - 用直接格式化字符串替换
PayloadGenerator.WiFi(...)和其他助手实例化 - 将每个
QRCodeWriter.QrErrorCorrectionLevel等效项 - 将任何ZXing.Net
BarcodeReader.Read(path) - 对于徽标嵌入,将
QRCodeWriter.CreateQrCodeWithLogo(data, logoPath, size)
迁移后测试
- 使用至少两个独立的二维码扫描应用程序扫描所有生成的二维码,以验证其可读性。
- 验证嵌入徽标的QR码是否能正确扫描——确认错误校正级别为
Highest - 将生成的代码的视觉输出与迁移前的示例进行比较,以确保外观一致性。
- 测试所有
PayloadGenerator替换项——确认WiFi、vCard和其他有效负载字符串能在目标设备上正确解码 - 如果ZXing.Net也被移除,验证所有条形码读取路径通过
BarcodeReader.Read功能正常 - 在一个干净的环境中运行应用程序,以确认没有残留的 二维码 或 ZXing .NET引用导致绑定失败。
- 验证IronBarcode许可证密钥是否已在生产环境和测试环境中正确加载
迁移到IronBarcode的主要优势
**用于所有条形码操作的单一API:**迁移后,每个条形码任务——生成、读取、PDF加盖——使用相同的IronBarCode命名空间和相同的入口点。 加入该项目的开发者只需学习一个 API 而不是三个。 条形码子系统内的代码审查变得一致。 文档查找是集中式的。
无需第二个库的条形码读取:BarcodeReader.Read处理图像文件、PDF页面、流和内存位图,支持自动格式检测。 以前需要 ZXing .NET才能实现的读取功能(以及其格式规范要求和线程安全考虑)现在只需一次方法调用即可立即使用。 从图像中读取条形码的指南涵盖多条形码检测、图像预处理和 PDF 页面扫描。
**无需新增依赖的格式扩展:**迁移后添加Code 128、EAN-13、DataMatrix、PDF417或任何其他支持的格式,只需不同的BarcodeEncoding参数值。 无需安装任何新软件包,无需学习任何新 API,也无需处理任何版本兼容性问题。 新的格式要求只需一行代码更改,而无需集成新的库。
**简化的QR码定制:**徽标嵌入、颜色变化和静区控制作为QRCodeWriter结果上的命名方法可用。 QRCoder对徽标嵌入所需的System.Drawing.Bitmap依赖项被简单的文件路径字符串替代。 二维码样式定制指南记录了所有可用的定制选项。
**内置 PDF 集成:**无需添加 PDF 库,即可从传入的 PDF 文档中读取条形码并将其添加到现有的 PDF 文件中。 以前需要单独依赖 PDF 的文档处理工作流程现在已将条形码和 PDF 功能整合在一起。
**减少长期维护开销:**从三四个独立包合并为一个包,消除了跟踪多个发布周期、解决库间版本冲突以及在.NET版本升级时更新多个测试套件所带来的累积开销。 条形码子系统的维护成本降低到仅依赖于单个软件包。

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。