Dynamsoft 条码阅读器与 IronBarcode:C# 条码库对比
Dynamsoft 条形码阅读器在其设计用途方面确实非常出色:以每秒 30 帧的速度从实时摄像头画面中读取条形码。 算法速度快,符号支持范围广,而且在 iOS 和 Android 上封装它的移动 SDK 是该领域中较好的选择之一。 如果你的产品是一款仓库扫描应用程序,工人将手机对准托盘标签,并期望在 100 毫秒内完成识别,那么 Dynamsoft 是一个可靠的选择。
如果您的条形码位于无法访问互联网的服务器上的 PDF 文件中,则该库与使用场景不匹配——许可证验证会在每次启动时提醒您。BarcodeReader.InitLicense 会向 Dynamsoft 的许可证服务器发起网络调用。 在与互联网物理隔离的数据中心、隔离的 VPC 或任何限制出站互联网访问的环境中,即使没有解码任何条形码,该调用也会失败。 离线替代方案——从 Dynamsoft 支持部门获取与 UUID 关联的设备特定许可证文件——虽然可行,但会增加大多数文档处理工作流程未预算的操作开销。
此比较侧重于用例匹配度,而非库的质量。 Dynamsoft 构建了一个以相机为中心的库,并且构建得很好。 问题是,以摄像头为先的假设是否适用于服务器端文档处理工作流程。
了解 Dynamsoft 条码阅读器
Dynamsoft 的架构体现了其相机行业的渊源。 启动序列需要在线许可证验证,设置模型包含针对实时帧处理优化的超时值,API 公开了诸如 DeblurLevel 之类的概念,这些概念专门用于手持相机的可变焦距和运动模糊条件:
// Dynamsoft: license server call required at startup
using Dynamsoft.DBR;
// This call contacts Dynamsoft's license server — fails in air-gapped environments
int errorCode = BarcodeReader.InitLicense("YOUR-LICENSE-KEY", out string errorMsg);
if (errorCode != (int)EnumErrorCode.DBR_OK)
throw new InvalidOperationException($"License validation failed: {errorMsg}");
var reader = new BarcodeReader();
// Settings tuned for camera frame processing
var settings = reader.GetRuntimeSettings();
settings.DeblurLevel = 5; // compensates for camera motion blur
settings.ExpectedBarcodesCount = 1; // camera focus: one barcode at a time
settings.Timeout = 100; // 100ms — optimized for 30fps video pipeline
reader.UpdateRuntimeSettings(settings);
// Dynamsoft: license server call required at startup
using Dynamsoft.DBR;
// This call contacts Dynamsoft's license server — fails in air-gapped environments
int errorCode = BarcodeReader.InitLicense("YOUR-LICENSE-KEY", out string errorMsg);
if (errorCode != (int)EnumErrorCode.DBR_OK)
throw new InvalidOperationException($"License validation failed: {errorMsg}");
var reader = new BarcodeReader();
// Settings tuned for camera frame processing
var settings = reader.GetRuntimeSettings();
settings.DeblurLevel = 5; // compensates for camera motion blur
settings.ExpectedBarcodesCount = 1; // camera focus: one barcode at a time
settings.Timeout = 100; // 100ms — optimized for 30fps video pipeline
reader.UpdateRuntimeSettings(settings);
Imports Dynamsoft.DBR
' Dynamsoft: license server call required at startup
' This call contacts Dynamsoft's license server — fails in air-gapped environments
Dim errorCode As Integer = BarcodeReader.InitLicense("YOUR-LICENSE-KEY", errorMsg:=Nothing)
If errorCode <> CType(EnumErrorCode.DBR_OK, Integer) Then
Throw New InvalidOperationException($"License validation failed: {errorMsg}")
End If
Dim reader As New BarcodeReader()
' Settings tuned for camera frame processing
Dim settings = reader.GetRuntimeSettings()
settings.DeblurLevel = 5 ' compensates for camera motion blur
settings.ExpectedBarcodesCount = 1 ' camera focus: one barcode at a time
settings.Timeout = 100 ' 100ms — optimized for 30fps video pipeline
reader.UpdateRuntimeSettings(settings)
这是一个设计精良的API,完全符合其用途。 当您以每秒 30 帧的速度处理来自摄像机的图像,并且不能承受在单个帧上花费 500 毫秒的时间时,Timeout = 100 设置是有意义的。 对于处理上传的 PDF 文件的服务器而言,100 毫秒的超时限制毫无意义,并且可能导致读取密度较高的条形码失败。
基于实例的设计 — new BarcodeReader(), reader.Dispose() — 遵循相机会话语义:打开会话,处理帧,关闭会话。 对于文件处理而言,此生命周期增加了样板代码,却没有带来任何好处。
PDF问题
Dynamsoft 条码阅读器本身不支持 PDF 文件。 当输入为 PDF 文件时,您的代码必须先将每一页渲染成图像,然后将该图像传递给 Dynamsoft。 这需要一个单独的 PDF 渲染库——通常使用 PdfiumViewer——它会增加一个NuGet依赖项、一个本地二进制依赖项(Windows 上的 pdfium.dll 或 Linux 上的 libpdfium),并且每个 PDF 操作都会增加一个渲染循环:
// Dynamsoft PDF processing — requires PdfiumViewer (external dependency)
// dotnet add package PdfiumViewer
// dotnet add package PdfiumViewer.Native.x86_64.v8-xfa (platform-specific)
using PdfiumViewer;
using System.Drawing.Imaging;
using Dynamsoft.DBR;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var results = new List<string>();
using (var pdfDoc = PdfDocument.Load(pdfPath))
{
for (int page = 0; page < pdfDoc.PageCount; page++)
{
// Render each page at 300 DPI
using var image = pdfDoc.Render(page, 300, 300, true);
using var ms = new MemoryStream();
image.Save(ms, ImageFormat.Png);
byte[] imageBytes = ms.ToArray();
// Now pass rendered image bytes to Dynamsoft
TextResult[] barcodes = reader.DecodeFileInMemory(imageBytes, "");
foreach (var b in barcodes)
results.Add(b.BarcodeText);
}
}
return results;
}
// Dynamsoft PDF processing — requires PdfiumViewer (external dependency)
// dotnet add package PdfiumViewer
// dotnet add package PdfiumViewer.Native.x86_64.v8-xfa (platform-specific)
using PdfiumViewer;
using System.Drawing.Imaging;
using Dynamsoft.DBR;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var results = new List<string>();
using (var pdfDoc = PdfDocument.Load(pdfPath))
{
for (int page = 0; page < pdfDoc.PageCount; page++)
{
// Render each page at 300 DPI
using var image = pdfDoc.Render(page, 300, 300, true);
using var ms = new MemoryStream();
image.Save(ms, ImageFormat.Png);
byte[] imageBytes = ms.ToArray();
// Now pass rendered image bytes to Dynamsoft
TextResult[] barcodes = reader.DecodeFileInMemory(imageBytes, "");
foreach (var b in barcodes)
results.Add(b.BarcodeText);
}
}
return results;
}
Imports PdfiumViewer
Imports System.Drawing.Imaging
Imports Dynamsoft.DBR
Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
Dim results As New List(Of String)()
Using pdfDoc = PdfDocument.Load(pdfPath)
For page As Integer = 0 To pdfDoc.PageCount - 1
' Render each page at 300 DPI
Using image = pdfDoc.Render(page, 300, 300, True)
Using ms As New MemoryStream()
image.Save(ms, ImageFormat.Png)
Dim imageBytes As Byte() = ms.ToArray()
' Now pass rendered image bytes to Dynamsoft
Dim barcodes As TextResult() = reader.DecodeFileInMemory(imageBytes, "")
For Each b In barcodes
results.Add(b.BarcodeText)
Next
End Using
End Using
Next
End Using
Return results
End Function
它有三个依赖项(Dynamsoft、PdfiumViewer 和一个平台特定的本地二进制文件),一个逐页渲染循环,并且对于多页文档来说会产生大量的内存开销。
IronBarcode可以直接读取 PDF 文件:
// IronBarcode: PDF is native — no extra library, no render loop
// NuGet: dotnet add package IronBarcode
var results = BarcodeReader.Read("invoice.pdf");
foreach (var result in results)
{
Console.WriteLine($"{result.Format}: {result.Value}");
}
// IronBarcode: PDF is native — no extra library, no render loop
// NuGet: dotnet add package IronBarcode
var results = BarcodeReader.Read("invoice.pdf");
foreach (var result in results)
{
Console.WriteLine($"{result.Format}: {result.Value}");
}
' IronBarcode: PDF is native — no extra library, no render loop
' NuGet: dotnet add package IronBarcode
Dim results = BarcodeReader.Read("invoice.pdf")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
一个电话。 没有PDF渲染器。 无需逐页循环。无需针对特定平台的原生 PDF 支持二进制文件。
许可证复杂性
当服务器能够访问互联网时,在线许可证验证非常简单。 当网络策略没有明确规定出站主机的允许范围时,或者当网络策略要求明确列出出站主机的允许范围时,验证失败的面积就会增大:
// Dynamsoft: error code pattern required
int errorCode = BarcodeReader.InitLicense("YOUR-LICENSE-KEY", out string errorMsg);
if (errorCode != (int)EnumErrorCode.DBR_OK)
{
// Handle: network timeout, license server unreachable, invalid key,
// expired key, device count exceeded, etc.
throw new InvalidOperationException($"Dynamsoft license failed [{errorCode}]: {errorMsg}");
}
// Dynamsoft: error code pattern required
int errorCode = BarcodeReader.InitLicense("YOUR-LICENSE-KEY", out string errorMsg);
if (errorCode != (int)EnumErrorCode.DBR_OK)
{
// Handle: network timeout, license server unreachable, invalid key,
// expired key, device count exceeded, etc.
throw new InvalidOperationException($"Dynamsoft license failed [{errorCode}]: {errorMsg}");
}
Imports System
' Dynamsoft: error code pattern required
Dim errorCode As Integer = BarcodeReader.InitLicense("YOUR-LICENSE-KEY", errorMsg:=Nothing)
If errorCode <> CType(EnumErrorCode.DBR_OK, Integer) Then
' Handle: network timeout, license server unreachable, invalid key,
' expired key, device count exceeded, etc.
Throw New InvalidOperationException($"Dynamsoft license failed [{errorCode}]: {errorMsg}")
End If
使用 Dynamsoft 的离线许可需要单独的工作流程。 您调用 BarcodeReader.OutputLicenseToString() 来检索设备 UUID,将该 UUID 发送给 Dynamsoft 支持以获取特定于设备的许可证文件,然后使用 InitLicenseFromLicenseContent 进行激活:
// Dynamsoft offline license — device UUID required
string uuid = BarcodeReader.OutputLicenseToString();
// Send uuid to Dynamsoft support → receive licenseContent string
int errorCode = BarcodeReader.InitLicenseFromLicenseContent("YOUR-LICENSE-KEY", licenseContent, uuid, out string errorMsg);
// Dynamsoft offline license — device UUID required
string uuid = BarcodeReader.OutputLicenseToString();
// Send uuid to Dynamsoft support → receive licenseContent string
int errorCode = BarcodeReader.InitLicenseFromLicenseContent("YOUR-LICENSE-KEY", licenseContent, uuid, out string errorMsg);
' Dynamsoft offline license — device UUID required
Dim uuid As String = BarcodeReader.OutputLicenseToString()
' Send uuid to Dynamsoft support → receive licenseContent string
Dim errorCode As Integer = BarcodeReader.InitLicenseFromLicenseContent("YOUR-LICENSE-KEY", licenseContent, uuid, errorMsg)
在 Docker 环境中,容器是短暂的,每次部署时 UUID 都会改变,这会产生持续的运维工作。 每个容器启动都可能需要向 Dynamsoft 支持部门注册一个新的 UUID。
IronBarcode许可证激活是本地评估的单次分配:
// IronBarCode: local validation, no network required
IronBarCode.License.LicenseKey = "YOUR-KEY";
// IronBarCode: local validation, no network required
IronBarCode.License.LicenseKey = "YOUR-KEY";
' IronBarCode: local validation, no network required
IronBarCode.License.LicenseKey = "YOUR-KEY"
没有错误代码可供检查。 无需网络连接。 无需按设备注册。 同一行代码可以在开发机器、CI/CD 流水线、Docker 容器和物理隔离的服务器上运行。
相机与文件使用案例
客观来说,Dynamsoft 和IronBarcode针对不同的主要应用场景进行了优化。 下表对此进行了清晰的描述,而不是断言某个库在各方面都更胜一筹:
| 情景 | Dynamsoft 条码阅读器 | IronBarcode |
|---|---|---|
| 实时摄像头画面(30帧/秒) | 非常出色——针对实时性进行了优化 | 并非主要用例 |
| 移动 SDK(iOS/Android) | 完整版 SDK 可用 | 仅限.NET |
| 服务器端文件处理 | 可行,但需要一些变通方法。 | 主要用例 |
| PDF条形码读取 | 需要外部 PDF 渲染器 | 本地支持 |
| 气隙部署 | 需要设备 UUID 和 Dynamsoft 支持 | 开箱即用 |
| Docker/临时容器 | 每个容器的 UUID 管理 | 单个环境变量 |
| 离线许可证 | 来自 Dynamsoft 支持团队的设备特定文件 | 标准许可证密钥 |
| ASP.NET Core API | 作品(额外许可模板) | 运行流畅 |
| Azure 函数 | license.dynamsoft.com 需要网络策略 | 无需网络 |
| 条形码生成 | 不——仅供阅读 | 是的——一代人与阅读 |
| 二维码生成 | 否 | 是的——二维码写入器 |
了解IronBarcode
IronBarcode是一个用于生成和读取条形码的 .NET库。 该 API 是静态的——没有实例,没有释放调用,没有会话生命周期。 许可证激活在本地进行。 内置PDF支持:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
// License — local validation, no network call
IronBarCode.License.LicenseKey = "YOUR-KEY";
// Read from an image file
var results = BarcodeReader.Read("label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
// Read from a PDF — native, no extra library
var pdfResults = BarcodeReader.Read("manifest.pdf");
// Read with options for high-accuracy or high-throughput scenarios
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
最大并行线程数 = 4
};
var multiResults = BarcodeReader.Read("multi-barcode-sheet.png", options);
// NuGet: dotnet add package IronBarcode
using IronBarCode;
// License — local validation, no network call
IronBarCode.License.LicenseKey = "YOUR-KEY";
// Read from an image file
var results = BarcodeReader.Read("label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
// Read from a PDF — native, no extra library
var pdfResults = BarcodeReader.Read("manifest.pdf");
// Read with options for high-accuracy or high-throughput scenarios
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
最大并行线程数 = 4
};
var multiResults = BarcodeReader.Read("multi-barcode-sheet.png", options);
Imports IronBarCode
' License — local validation, no network call
IronBarCode.License.LicenseKey = "YOUR-KEY"
' Read from an image file
Dim results = BarcodeReader.Read("label.png")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
' Read from a PDF — native, no extra library
Dim pdfResults = BarcodeReader.Read("manifest.pdf")
' Read with options for high-accuracy or high-throughput scenarios
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.最大并行线程数 = 4
}
Dim multiResults = BarcodeReader.Read("multi-barcode-sheet.png", options)
生成过程同样简单明了:
// Generate Code 128
BarcodeWriter.CreateBarcode("SHIP-7734-X", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("shipping-label.png");
// Generate QR with error correction and embedded logo
QRCodeWriter.CreateQrCode("https://track.example.com/7734", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("company-logo.png")
.SaveAsPng("tracking-qr.png");
// Get bytes for HTTP response
byte[] bytes = BarcodeWriter.CreateBarcode("ITEM-001", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
// Generate Code 128
BarcodeWriter.CreateBarcode("SHIP-7734-X", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("shipping-label.png");
// Generate QR with error correction and embedded logo
QRCodeWriter.CreateQrCode("https://track.example.com/7734", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("company-logo.png")
.SaveAsPng("tracking-qr.png");
// Get bytes for HTTP response
byte[] bytes = BarcodeWriter.CreateBarcode("ITEM-001", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
Imports System
' Generate Code 128
BarcodeWriter.CreateBarcode("SHIP-7734-X", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("shipping-label.png")
' Generate QR with error correction and embedded logo
QRCodeWriter.CreateQrCode("https://track.example.com/7734", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo("company-logo.png") _
.SaveAsPng("tracking-qr.png")
' Get bytes for HTTP response
Dim bytes As Byte() = BarcodeWriter.CreateBarcode("ITEM-001", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.ToPngBinaryData()
功能对比
| 特征 | Dynamsoft 条码阅读器 | IronBarcode |
|---|---|---|
| 条形码读取 | 是的——针对相机进行了优化 | 是的——文件和文档优化 |
| 条形码生成 | 否 | 是 |
| 二维码生成 | 否 | 是的——二维码写入器 |
| 原生 PDF 支持 | 不——需要外部渲染器 | 是的——BarcodeReader.Read(pdf) |
| 许可证验证 | 在线(许可证服务器) | 当地的 |
| 物理隔离/离线 | 需要设备 UUID 和 Dynamsoft 支持 | 标准密钥,可离线使用 |
| Docker/容器 | 每个容器实例的 UUID 管理 | 单个环境变量 |
| Azure 函数 | 需要出站网络策略 | 无需网络 |
| AWS-Lambda(AWS Lambda | 需要出站网络策略 | 无需网络 |
| 移动 SDK | iOS 和 Android 版本均可用 | 仅限.NET |
| 实时摄像头(30fps) | 主要设计目标 | 并非为此而设计 |
| 代码 128 | 是 | 是 |
| 二维码 | 是的(阅读) | 是的(阅读和生成) |
| 数据矩阵 | 是 | 是 |
| PDF417 | 是 | 是 |
| 阿兹特克 | 是 | 是 |
| EAN/UPC | 是 | 是 |
| 实例管理 | 新建条形码读取器() + 释放() | 静态 — 无实例 |
| 多条形码读取 | 预期条形码数量 | ExpectMultipleBarcodes = true |
| 阅读速度控制 | 超时 + 去模糊级别 | 阅读速度枚举 |
| 平行阅读 | 手动穿线 | 最大并行线程数 |
| 定价模式 | 订阅 | 永久 749 美元起 |
| .NET支持 | .NET Standard、 .NET 5+ | .NET 4.6.2 至.NET 9 |
| 平台 | Windows、Linux、macOS | Windows、Linux、macOS、Docker、Azure、AWS Lambda |
API 映射参考
对于拥有 Dynamsoft 代码且需要了解概念如何转换的团队:
| Dynamsoft 条码阅读器 | IronBarcode |
|---|---|
BarcodeReader.InitLicense(key, out errorMsg) |
IronBarCode.License.LicenseKey = "key" |
errorCode != (int)EnumErrorCode.DBR_OK 检查 |
不需要 |
BarcodeReader.OutputLicenseToString() (UUID) |
不需要 |
BarcodeReader.InitLicenseFromLicenseContent(content, uuid) |
不需要 |
new BarcodeReader() |
静态 — 无实例 |
reader.Dispose() |
不需要 |
reader.DecodeFile(imagePath, "") |
BarcodeReader.Read(imagePath) |
reader.DecodeFileInMemory(bytes, "") |
BarcodeReader.Read(imageBytes) |
TextResult[].BarcodeText |
result.Value |
TextResult[].BarcodeFormat |
result.Format |
PublicRuntimeSettings 通过 GetRuntimeSettings() |
new BarcodeReaderOptions { ... } |
settings.Timeout = 100 |
Speed = ReadingSpeed.Balanced |
settings.ExpectedBarcodesCount = 1 |
ExpectMultipleBarcodes = false(默认) |
reader.UpdateRuntimeSettings(settings) |
传递给 Read() 的参数 |
| 外部 PDF 库 + 页面渲染循环 | BarcodeReader.Read("doc.pdf") |
当球队切换
服务器端文档处理,而非摄像头扫描。最常见的迁移场景是:团队基于 Dynamsoft 的声誉选择了它,集成后才发现其以摄像头为中心的 API 和 PDF 兼容性问题导致文档处理工作流程十分繁琐。 在 Web 应用程序中从上传的 PDF 读取条形码是一个核心用例,在 Dynamsoft 中需要变通方法,但在IronBarcode中只需一次调用即可完成。
网络环境采用物理隔离或受限模式。金融机构、医疗系统和政府机构通常会禁止应用服务器连接外部互联网。 在这些环境下,Dynamsoft 的在线许可证验证会失败。 离线设备 UUID 工作流程虽然功能齐全,但会增加支持依赖性的开销。 这些环境中的团队经常迁移到IronBarcode,正是因为其许可证验证功能没有网络组件。
Docker 和 Kubernetes 的临时容器。容器化部署中实例频繁的扩展和缩减使得基于设备的离线许可难以管理。 根据基础设施的不同,每个新容器都可以有不同的 UUID。IronBarcode的许可证密钥作为标准环境变量使用,无需针对每个实例进行注册。
既需要生成也需要读取。Dynamsoft是只读的。 需要生成条形码标签、打印产品二维码或创建带有嵌入式条形码的运输清单的应用程序需要第二个库。 在这种情况下,团队通常会合并到IronBarcode,以避免管理两个独立的条形码依赖项。
简化运维架构。从必须可访问的外部依赖项列表中移除 Dynamsoft 许可证服务器,移除 PDF 渲染库,并将实例管理替换为静态调用,从而减少了生产环境中可能出现的问题。
结论
Dynamsoft 条码阅读器是一个高质量的库,非常适合其预期的用途:基于摄像头的实时条码扫描,尤其是在移动应用程序中。 这些算法针对手持扫描的条件进行了很好的调整——光照变化、运动模糊、部分遮挡。 如果你的使用场景符合这个条件,Dynamsoft 是一款很有竞争力的产品。
对于服务器端文档处理——例如从 PDF 读取条形码、生成条形码标签、在隔离环境中运行或部署在临时 Docker 容器中——该库的架构在每个环节都造成了阻碍。在线许可证验证、缺少 PDF 支持、针对摄像头优化的超时设置以及设备 UUID 离线工作流程,都是为移动摄像头使用而设计的必然结果。 它们不是虫子; 这是针对不同背景而刻意做出的设计选择。
IronBarcode是为文档和服务器端环境而设计的。 本地许可证验证、原生 PDF 阅读、静态 API 和生成支持都是一流的功能,而不是权宜之计。 迁移决策最终取决于条形码实际存在于哪个环境中。
常见问题解答
Dynamsoft条码阅读器是什么?
Dynamsoft Barcode Reader 是一个 .NET 条形码库,用于在 C# 应用程序中生成和读取条形码。它是开发人员在为 .NET 项目选择条形码解决方案时评估的几个备选方案之一。
Dynamsoft条码阅读器和IronBarcode的主要区别是什么?
IronBarcode 使用静态、无状态的 API,无需实例管理,而 Dynamsoft 条码阅读器通常需要先创建实例并进行配置才能使用。IronBarcode 还提供原生 PDF 支持、自动格式检测以及跨所有环境的单密钥许可。
IronBarcode 的授权是否比 Dynamsoft 条码阅读器更容易?
IronBarcode 使用单一许可证密钥,同时涵盖开发和生产部署。与将 SDK 密钥与运行时密钥分开的许可系统相比,这简化了 CI/CD 流水线和 Docker 配置。
IronBarcode是否支持Dynamsoft条码阅读器支持的所有条码格式?
IronBarcode 支持超过 30 种条码符号体系,包括 QR 码、Code 128、Code 39、DataMatrix、PDF417、Aztec、EAN-13、UPC-A、GS1 等等。格式自动检测功能意味着无需显式枚举格式。
IronBarcode是否支持原生PDF条码读取?
是的。IronBarcode 可以直接从 PDF 文件中读取条形码,使用 `BarcodeReader.Read("document.pdf")` 方法,无需单独的 PDF 渲染库。每页的读取结果包括页码、条形码格式、数值和置信度评分。
与 Dynamsoft 条码阅读器相比,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 安装程序或运行时文件。
与 Dynamsoft 不同,我可以在购买前评估 IronBarcode 吗?
是的。IronBarcode 的试用模式会返回完整的解码条形码值——只有生成的输出图像才会带有水印。您可以在购买前,用自己的文档测试读取准确率。
Dynamsoft条码阅读器和IronBarcode的价格有什么区别?
IronBarcode 的永久单开发者许可证起价为 749 美元,涵盖开发和生产环境。定价详情和批量许可选项请访问 IronBarcode 许可页面。无需单独的运行时许可证。
从 Dynamsoft 条码阅读器迁移到 IronBarcode 是否简单?
从 Dynamsoft 条码阅读器迁移到 IronBarcode 主要涉及将基于实例的 API 调用替换为 IronBarcode 的静态方法、移除许可相关的样板代码以及更新结果属性名称。大多数迁移都是减少代码,而不是增加代码。
IronBarcode 能生成带有 logo 的二维码吗?
是的。`QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")` 可以将品牌图片原生嵌入二维码中,并支持配置纠错功能。此外,它还支持通过 `ChangeBarCodeColor()` 函数创建彩色二维码。

