IRONSOFTWAREHOME
与其他组件比较

Scandit SDK与IronBarcode: 摄像头管线扫描与基于文件的文档处理

Curtis Chau
Curtis Chau
Updated: 2026年4月26日

要开始使用Scandit读取条形码,您需配置BarcodeCaptureSettings,显式启用符号系统功能,获取一个摄像头,将其设置为框架源,将摄像头切换到打开状态,并启用捕获。 定价仅限联系销售,未公布价目表。

这种组合——摄像头优先管线和联系人销售定价模型——决定了Scandit适合和不适合的.NET场景。 对于服务器端文档处理、读取上传文件的ASP.NET Core API或处理运输PDF的Azure功能,摄像头管线的假设成为了摩擦而非能力。 此对比探讨了Scandit的架构来源、IronBarcode的适用位置以及这两个库在实践中的差异。

了解 Scandit SDK

Scandit SDK 是一个专为移动和边缘计算环境构建的商业Enterprise条码扫描平台。 该库旨在支持iOS、Android和MAUI设备上的实时摄像头扫描,并具有专门的产品线覆盖增强现实叠加、多个条形码同时检测和身份文件扫描。 Scandit的主要部署上下文是移动现场工作人员、仓库操作和零售交互点场景,在这些情况下,物理摄像头和实时用户都在场。

该库的架构围绕DataCaptureContext流水线组织,该流水线协调摄像头会话、帧分析设置和条形码捕获配置,作为统一的状态系统。 由于 Scandit 平台中的每个产品线(SparkScan、MatrixScan、ID 扫描、AR 叠加层和解析器)都是单独授权并通过联系销售模式定价的,因此任何 Scandit 集成的总成本在销售洽谈之前都无法确定。

Scandit SDK 的主要架构特点包括:

  • 相机优先设计: SDK 假定有一个物理相机和一个运行中的帧源。 所有条形码读取均在实时视频帧上进行,而不是在静态文件或视频流上进行。
  • 强制性DataCaptureContext初始化: 每次集成都以构建DataCaptureContext并将其连接到摄像头实例开始,然后才可以进行任何条形码工作。
  • 符号系统的显式声明: 在捕获会话开始之前,必须使用EnableSymbologies单独启用条形码格式。 自动检测功能不可用。
  • 事件驱动的结果交付: 条形码结果通过事件回调(BarcodeScanned)异步交付,而不是通过方法调用同步返回。
  • 模块化产品架构: SparkScan、MatrixScan、ID 扫描、AR 叠加层和解析器是单独定价的功能,需要单独的合同项目。
  • **基于报价的定价:**根据Scandit的定价页面,付费版根据版本、设备、扫描量和合同长度进行报价; 提供免费试用和社区版。
  • 移动优先平台目标: 主要支持 iOS 和 Android。 服务器端、Docker 和无服务器部署不在 SDK 的设计范围内。

数据捕获上下文管道

所有 Scandit 集成都从以下相机初始化序列开始,然后才能读取单个条形码:

// Scandit SDK: full camera pipeline setup
// NuGet: Scandit.DataCapture.Core.Maui, Scandit.DataCapture.Barcode.Maui

var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");

var settings = BarcodeCaptureSettings.Create();
settings.EnableSymbologies(new HashSet<Symbology>
{
    Symbology.Ean13Upca,
    Symbology.Ean8,
    Symbology.Code128,
    Symbology.QrCode
});

var barcodeCapture = BarcodeCapture.Create(dataCaptureContext, settings);
var camera = Camera.GetDefaultCamera();
await dataCaptureContext.SetFrameSourceAsync(camera);
await camera.SwitchToDesiredStateAsync(FrameSourceState.On);
barcodeCapture.IsEnabled = true;

此块中的每一行都配置摄像头基础设施。 API在此入口点不公开文件路径、PDF或流参数——它假定在开始条码工作之前,摄像头正在运行。

了解IronBarcode

IronBarcode是一个用于条形码读取和生成的商业.NET库。 该库专为服务器端、桌面端和云环境而设计,其中条形码数据以文件、流、字节数组或 PDF 文档中的嵌入内容的形式到达。 它的 API 是无状态的——没有会话对象,没有需要初始化的相机管道,也没有需要在读取之间管理的持久上下文。 对BarcodeReader.Read的单个静态调用接受文件路径、流、字节数组或PDF,并返回结果集合。

IronBarcode作为单个NuGet包发布,包含超过50种1D和2D条形码格式的所有读取和生成能力。 该库支持自动格式检测,这意味着调用者无需指定要查找的符号体系。 产品价格已在产品页面上公布,无需销售洽谈。

IronBarcode的主要特点包括:

  • 无状态的基于文件的 API: 读取操作从接受文件路径、流、字节数组或 PDF 文档的单个方法调用开始。
  • 自动格式检测: 所有支持的条形码格式均可自动检测。 显式符号配置是一种可选的性能优化,而不是必要条件。
  • 原生 PDF 支持: 直接读取多页 PDF 文档,结果按页码索引。 无需外部PDF渲染库。
  • 服务器和云就绪: 支持ASP.NET Core、Azure Functions、Linux 上的 Docker 和容器化部署,无需架构上的变通方法。
  • 并发处理: 无状态API本质上是线程安全的,启用Parallel.ForEach和异步模式来满足高吞吐量的批处理场景。
  • 条形码生成: 生成图像和 PDF 格式的条形码,支持所有条形码符号体系。 生成和阅读包含在同一个软件包中。
  • 已公布的永久授权: 价格以一次性永久购买的形式公开列出,不收取每次扫描或每台设备的费用。

功能对比

下表列出了Scandit SDK和IronBarcode之间的根本区别:

特征Scandit SDKIronBarcode
主要用例移动设备上的实时摄像头扫描服务器端文件、流和 PDF 条形码读取
需要摄像头
PDF条形码提取不支持本地支持
定价模式联系销售人员,按产品咨询已发布的永久层级
服务器端处理没有文件处理功能文档主要部署目标
符号配置扫描前必须完成选修的; auto-detection is default
条形码生成不支持包含在单个包装内

详细功能对比

特征Scandit SDKIronBarcode
阅读
图像文件读取没有文件处理功能文档主要关注点
PDF条形码提取不支持原生多页
流/字节数组输入不支持
自动格式检测否(必须注明)
一维条码格式(Code 128、EAN、UPC 等)全面的(根据Scandit符号学文档)50岁以上
二维格式(QR码、DataMatrix码、Aztec码、PDF417码)
每个文档可检测多个条形码MatrixScan(独立产品)是的(单件装)
条形码损坏恢复没有文件处理功能文档是的(基于机器学习)
一代
条形码生成不支持
输出到图像文件不支持
输出为 PDF不支持
架构
初始化模型有状态相机管道无状态方法调用
结果交付事件回调(异步)同步返回值
相机依赖性要求不适用
符号学预声明要求可选项
平台
iOS/Android (MAUI)主要目标程序化使用
ASP.NET Core没有文件处理功能文档全面支持
Azure Functions/ 无服务器不切实际全面支持
Docker/Linux服务器不支持全面支持
控制台/后台服务没有文件处理功能文档全面支持
许可
定价透明度联系销售人员发布于网站
许可证类型年均(按产品计)永久一次性
按扫描次数或按设备收费可能的(列为定价变量)
单一软件包即可访问所有功能否(模块化产品)

条形码读取架构

这两个库之间最显著的结构性区别在于它们如何对输入和输出之间的关系进行建模。

Scandit SDK方法

Scandit实时处理摄像头帧。BarcodeCapture监听每个传入帧中的条形码。 条形码结果通过BarcodeScanned事件异步交付。 使用 Scandit 读取静态图像文件需要调整相机管道,将文件视为帧源——这种工作流程目前尚未得到原生支持,需要工程努力才能近似实现。

// Scandit SDK: event-callback result delivery
barcodeCapture.BarcodeScanned += (sender, args) =>
{
    foreach (var barcode in args.Session.NewlyRecognizedBarcodes)
    {
        string value = barcode.Data;
        string symbology = barcode.Symbology.ToString();
        ProcessBarcode(value, symbology);
    }
};

事件驱动模型适用于连续实时扫描,其中条形码在视频流中出现的时间是不可预测的。 对于基于文件的处理,该模型引入了不必要的复杂性:输入具有已知的完成边界,相机会话永远不会自然终止,异步回调模式与请求-响应服务器架构不兼容。

IronBarcode方法

IronBarcode将每个输入视为一个离散文档,并给出确定性的结果。 BarcodeReader.Read方法接受文件路径、流或字节数组,进行所有同步检测,并返回结果集合。 没有会话要打开,没有帧源要配置,也没有事件要订阅。

// IronBarcode: direct file reading
// NuGet: dotnet add package IronBarcode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
    Console.WriteLine($"{result.Value} ({result.Format})");

对于从图像中读取条形码,无状态 API 除了许可证密钥之外不需要任何初始化。 格式检测是自动的。 上述完整程序只需三行操作代码即可从图像文件中读取任何受支持的条形码格式。

平台和部署支持

条形码库的部署环境决定了它是否能在目标环境中运行,而与功能无关。

Scandit SDK方法

Scandit 的架构需要摄像头硬件和一个可以通过原生摄像头 API 将其暴露出来的移动平台。 iOS 和 Android 是主要支持的目标平台。 Windows桌面系统是次要目标。 ASP.NET Core、Azure Functions、Docker 容器和 Linux 服务器不在该库的设计范围内。 DataCaptureContext假设有一个正在运行的摄像头会话,这在无服务器计算环境、容器化部署或后台处理服务中没有等价物。

平台Scandit SDK
iOS/Android (MAUI)主要目标
Windows 桌面次要支持
ASP.NET Core没有文件处理功能文档
Azure Functions不切实际
Docker/Linux服务器不支持
控制台/后台服务没有文件处理功能文档

IronBarcode方法

IronBarcode专为服务器、云和容器化环境而设计。 无状态 API 没有硬件依赖性,也没有平台特定的初始化要求。 将条形码处理部署到 Azure Functions是一个受支持且有文档记录的途径。 Linux 上的 Docker 是一个标准的部署目标。 ASP.NET Core端点从上传的文件中读取条形码代表了一个核心支持的场景,无需任何架构上的变通方法。

平台IronBarcode
iOS/Android (MAUI)程序化文件处理
ASP.NET Core全面支持
Azure Functions / Lambda全面支持
Docker/Linux服务器全面支持
控制台/后台服务全面支持
Blazor服务器全面支持

并发批处理

处理大量带有条形码的文档是服务器端常见的需求,而这两个库从根本上不同的角度来处理这个问题。

Scandit SDK方法

Scandit的摄像头管道被设计为单用户或设备服务的单摄像头会话模型。FrameSourceState模型假设是一个持续、连续的摄像头会话——而非一个正在处理的文档队列。 要使库能够处理批量文件,需要为每个文档模拟一次相机会话,或者通过共享管道对文档处理进行序列化,但这两种方法都不是受支持的或高效的模式。

IronBarcode方法

由于IronBarcode的BarcodeReader.Read方法是无状态的,所以从多个线程同时调用它本质上是安全的。 并发批处理不需要任何特殊配置,只需定义BarcodeReaderOptions即可:

// IronBarcode: concurrent batch processing
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var files = Directory.GetFiles("./incoming/", "*.pdf");
var allResults = new ConcurrentBag<BarcodeResult>();

Parallel.ForEach(files, file =>
{
    var results = BarcodeReader.Read(file, options);
    foreach (var r in results)
        allResults.Add(r);
});

有关异步和多线程条形码读取的详细模式,请参阅IronBarcode文档,其中涵盖了线程安全模式和吞吐量调整选项。

PDF文档处理

PDF 条形码提取与基于图像的读取是截然不同的功能,代表了这两个库之间的显著差异。

Scandit SDK方法

Scandit 没有原生 PDF 支持。 使用 Scandit 从 PDF 中提取条形码需要使用单独的 PDF 渲染库将每个 PDF 页面渲染成光栅图像,然后将这些图像输入到相机模拟流程中。这种方法引入了额外的依赖项、额外的许可成本以及大量的工程工作,而这项任务在文档处理工作流程中却是常规操作。 多页文档需要遍历页面、管理渲染图像的内存,并手动协调各页面的结果。

IronBarcode方法

IronBarcode可以直接读取 PDF 文档中的条形码。 PDF的文件路径是PageNumber属性,指示每个条形码在哪个文档页上找到:

// IronBarcode: extract barcodes from every page of a PDF
var results = BarcodeReader.Read("shipping-manifest.pdf");

foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value} ({barcode.Format})");
}

有关从 PDF 中读取条形码的完整指南,包括页面范围选择和多条形码提取选项, IronBarcode文档涵盖了 PDF 处理场景的全部内容。

定价和许可

许可结构不仅影响图书馆的成本,还影响评估和采用图书馆所需的时间。

斯堪迪特方法

Scandit不公布定价表。 产品页面列出了功能和产品名称——SparkScan、MatrixScan、ID Scanning、AR Overlays、Parser——并通过与销售的对话进行定价查询。 报价过程通常涉及描述使用案例、估算扫描量、指定设备、讨论支持等级,并选择合同期限,然后再提供成本数字。 每条Scandit产品线都是单独定价和单独合同的,因此扩展功能访问可能需要额外的销售周期。

IronBarcode方法

IronBarcode在产品页面上公布其许可级别,无需提交表单或进行销售咨询:

许可证价格开发者项目
一点一次性 749 美元11
Plus一次性支付 1,499 美元33
专业一次性支付 2,999 美元1010
无限制$5,999一次性无限制无限制

许可证永久有效。 没有按扫描次数收费,没有按设备收费,也没有触发等级变更的流量阈值。 年度续费是可选的,费用为原价的一半,但购买的许可证即使不续费仍然有效。 IronBarcode单个软件包的所有功能——读取、生成、PDF 支持、多条形码检测——在每个级别中都包含在内。

API 映射参考

下表将Scandit SDK概念与其对应的IronBarcode概念进行映射,供团队评估迁移的转换成本:

Scandit SDKIronBarcode备注
DataCaptureContext.ForLicenseKey("key")IronBarCode.License.LicenseKey = "key"一项任务; 不需要上下文对象
BarcodeCaptureSettings.Create()new BarcodeReaderOptions()IronBarcode中为可选
settings.EnableSymbologies(Symbology.Code128, ...)(not needed)自动检测是默认设置
Camera.GetDefaultCamera()(not applicable)文件处理中没有相机概念
dataCaptureContext.SetFrameSourceAsync(camera)(not applicable)IronBarcode中没有帧源
camera.SwitchToDesiredStateAsync(FrameSourceState.On)(not applicable)无摄像头状态机
barcodeCapture.IsEnabled = trueBarcodeReader.Read(path)单次调用即可启动读取
BarcodeScanned +=事件处理程序迭代BarcodeReader.Read()返回值同步收集; 无事件系统
args.Session.NewlyRecognizedBarcodes返回值BarcodeReader.Read()直接收集途径
barcode.Dataresult.Value相同的语义内容
barcode.Symbologyresult.Format等效格式枚举
SparkScan、MatrixScan、身份证扫描(均为独立产品)单个IronBarcode没有单独的插件

当团队考虑从Scandit SDK迁移到IronBarcode时

服务器端处理要求

团队在构建ASP.NET Core API、后台处理服务或Azure Functions时发现Scandit的架构基于一些在服务器环境中不成立的假设。 DataCaptureContext和摄像头流水线需要摄像头硬件和实时帧源。 当项目的条码需求完全在服务器端时——从上传文件中读取、处理文档队列、从传入的PDF中提取条码数据——摄像头管线增加了与工作负载无关的初始化步骤和平台限制。

批量文档处理

处理大量条码文档的组织——例如运输清单、发票、库存记录、医疗表格——察觉到Scandit的帧源模式更倾向于连续摄像头会话,而不是有确定开始和结束点的离散文档。 当文档量增加并且需要并行处理时,摄像头管线的有状态设计需要额外的工程来适应。

定价透明度

开发团队在为新项目编写预算建议书、供应商比较或成本效益分析时,需要与销售对话来确定Scandit许可费用。当一个项目有确定的预算和时间表时,需要销售对话来获得报价会增加评估和规划的步骤。 同时评估多个库选项的团队可能会发现没有公布的定价使结构化并行比较变得更难。

降低管道复杂性

即使Scandit已经用于移动摄像头扫描,同一应用程序中的服务器端条码需求可能需要不同的工具。 适用于实时移动扫描的摄像头管线在应用于静态文档处理时增加了复杂性。 达此阶段的团队通常倾向于在现有Scandit部署旁边采用IronBarcode进行服务器端处理,而不是扩展摄像头管线以涵盖文档工作流程。

常见迁移注意事项

相机管道没有等效文件

整个DataCaptureContext初始化块——上下文创建、设置配置、符号启用、摄像头获取、帧源分配和状态转换,在IronBarcode的基于文件的API中没有等价物。 迁移服务器端集成代码时,此代码块将被完全删除。 尚未翻译; 它被移除了。 IronBarcode的替代方案是分配许可证密钥,随后调用BarcodeReader.Read

事件回调直接返回

因为实时摄像头扫描本质上是异步的,Scandit通过BarcodeScanned事件传递条形码结果。 IronBarcode以类型化集合的形式同步返回结果,因为基于文件的读取具有已知的完成边界。 迁移过程包括将事件处理程序逻辑转换为标准迭代:

// Scandit callback pattern (removed during migration)
barcodeCapture.BarcodeScanned += (sender, args) =>
{
    foreach (var barcode in args.Session.NewlyRecognizedBarcodes)
        ProcessBarcode(barcode.Data, barcode.Symbology.ToString());
};

//IronBarcodedirect return (replacement)
foreach (var result in BarcodeReader.Read("document.png"))
    ProcessBarcode(result.Value, result.Format.ToString());

符号声明移除

Scandit在扫描开始前需要显式的EnableSymbologies调用。 IronBarcode不需要预先声明符号体系——所有格式都会自动检测。 迁移过程中,所有settings.EnableSymbologies(...)调用都被移除。 如果原始Scandit代码出于性能原因限制符号系统,可以通过BarcodeReaderOptions.ExpectBarcodeTypes在IronBarcode中实现相应优化,但这不需要作为起始条件。

IronBarcode的其他功能

除了上述比较中涵盖的领域之外, IronBarcode还提供了一些功能,可以扩展其在文档和数据处理场景中的应用:

  • 条形码生成 生成条形码作为图像文件或将其嵌入 PDF 中,支持所有条形码格式,包括二维码、Code 128、Data Matrix 和 PDF417。
  • **GS1 和结构化数据解析:**直接从条形码结果解码结构化条形码数据格式,包括 GS1-128 应用标识符。
  • 图像校正和预处理 自动图像校正倾斜、低对比度或损坏的条形码,无需手动预处理即可提高扫描文档的读取率。
  • **多条形码检测:**单个ExpectMultipleBarcodes选项。
  • **MAUI条形码读取:**在使用捕获和处理模型的MAUI应用程序中,IronBarcode在使用MediaPicker捕获照片后处理该步骤。
  • **流和字节数组输入:**除了文件路径之外,byte[]输入,实现与上传处理程序、内存缓冲区和网络流的集成,而无需创建临时文件。

.NET兼容性和未来准备情况

IronBarcode支持.NET Framework 4.6.2及以后版本、.NET Standard 2.0和现代.NET版本,包括.NET 6、.NET 8、.NET 9和.NET 10。该库定期更新以保持与当前.NET版本的兼容性。 其无状态API设计适合现代.NET使用的异步优先编程模型,其对Linux和容器化部署的支持适合云原生工作负载。 由于该库以单个NuGet包的形式提供,除了.NET运行时本身之外没有特定于平台的运行时依赖项,因此在.NET版本之间升级不需要单独的库更新或额外的配置。

结论

Scandit SDK 和IronBarcode代表了条形码处理方面截然不同的方法,反映了不同的预期部署环境。 Scandit 专为在移动硬件上进行实时相机扫描而构建,其架构可协调实时相机会话、逐帧分析设置和事件驱动的结果交付。 IronBarcode专为在服务器、桌面和云基础设施上进行基于文件和以文档为中心的处理而构建,它具有无状态 API,可以接受文件、流和 PDF,并返回同步结果。 这些并不是同一理念的不同实现方式——它们是服务于不同应用场景的不同理念。

Scandit SDK 是移动应用程序的合适选择,用户需要将设备摄像头对准物理条形码,并获得 100 毫秒以下的视觉反馈。 其 AR 叠加功能、通过 MatrixScan 实现的多条形码同时检测以及通过 ID Scanning 实现的身份文件扫描都是专门构建的功能,没有基于文件的条形码库可以复制这些功能。 那些大规模部署移动现场工作人员、运行面向消费者的扫描体验或需要Enterprise移动扫描 SLA 的组织,正是 Scandit 的目标用户群体。

当条形码数据以文件(图像、PDF、字节数组或上传流)的形式到达,并且处理过程无需摄像头、无需用户、无需用户界面时, IronBarcode是合适的选择。 服务器端文档处理、ASP.NET CoreAPI 端点、Azure Functions、计划批处理作业和容器化微服务代表了IronBarcode的运行环境。 其公布的定价、单一包功能访问和直接的文件读取API专为这些场景设计,而Scandit的摄像头管线模型和联系销售定价更适合不同的部署形态。

客观评价是,选择很大程度上取决于部署环境,而不是个人偏好。 需要进行实时移动摄像头扫描的项目,答案显而易见。 对于需要服务器端提取 PDF 条形码的项目,答案同样很明确。 这两个库有时会被混淆的地方在于中间部分——MAUI 应用程序、混合架构以及既有移动扫描又有文档处理需求的组织。 在这种情况下,这两个库可以共存:Scandit 处理面向摄像头的工作, IronBarcode处理文档处理工作,这两个库都不会被迫承担它原本设计之外的角色。

Curtis Chau
技术作家

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

...
阅读更多

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户