Barkoder SDKとIronBarcodeの比較:C#バーコードライブラリの比較
Dynamsoft Barcode Readerは、その設計目的である、毎秒30フレームのライブカメラ映像からバーコードを読み取るという点において、実に優れた性能を発揮します。 アルゴリズムは高速で、シンボル体系のサポートも幅広く、iOSとAndroid向けにそれをラップするモバイルSDKは、この分野で最も優れた選択肢の一つです。 もしあなたの製品が、作業員がスマートフォンをパレットラベルにかざして100ミリ秒未満の認識速度を求める倉庫スキャンアプリであれば、Dynamsoftは信頼できる選択肢となるでしょう。
バーコードがインターネットに接続できないサーバー上のPDFファイル内にある場合、そのライブラリは使用方法に適していません — 初めてデプロイするときにライセンスアクティベーションが思い出させます。 LicenseManager.InitLicense は初回のアクティベーション時にDynamsoftのライセンスサーバーとオンラインハンドシェイクを行い、定期的に再検証を行います。 エアギャップされたデータセンター、隔離されたVPC、または外向きのインターネットアクセスが制限されている環境では、最初のアクティベーションに代替手段が必要です。オフラインパス、すなわちDynamsoftからライセンスコンテンツのブロブを取得し、InitLicenseFromLicenseContent を介して再現する方法は機能しますが、大多数のドキュメント処理ワークフローが予定していなかった運用上の負担が追加されます。
この比較は、ライブラリの品質ではなく、ユースケースへの適合性に関するものです。 Dynamsoftはカメラファーストのライブラリを開発し、それを非常にうまく作り上げた。 問題は、カメラ優先の前提がサーバー側の文書処理ワークフローにも適用できるかどうかである。
Dynamsoftバーコードリーダーについて
Dynamsoftのアーキテクチャは、そのカメラ事業の起源を反映している。 起動シーケンスはオンラインライセンスアクティベーションが必要で、設定モデルにはリアルタイムフレーム処理に適したタイムアウト値が含まれており、APIは手持ちのカメラの可変焦点と動きぼけ条件に合わせた設定を公開しています:
// Dynamsoft: license activation required at startup
using Dynamsoft.CVR;
using Dynamsoft.DBR;
using Dynamsoft.License;
using Dynamsoft.Core;
// LicenseManager.InitLicense performs an online activation on first run
int errorCode = LicenseManager.InitLicense("YOUR-DYNAMSOFT-LICENSE-KEY", out string errorMsg);
if (errorCode != (int)EnumErrorCode.EC_OK)
throw new InvalidOperationException($"License activation failed: {errorMsg}");
using var router = new CaptureVisionRouter();
// Settings tuned for camera frame processing
SimplifiedCaptureVisionSettings settings = router.GetSimplifiedSettings(
PresetTemplate.PT_READ_BARCODES);
settings.BarcodeSettings.ExpectedBarcodesCount = 1; // single barcode per frame
settings.Timeout = 100; // 100ms suits a 30fps pipeline
router.UpdateSettings(PresetTemplate.PT_READ_BARCODES, settings);Imports Dynamsoft.CVR
Imports Dynamsoft.DBR
Imports Dynamsoft.License
Imports Dynamsoft.Core
' Dynamsoft: license activation required at startup
' LicenseManager.InitLicense performs an online activation on first run
Dim errorCode As Integer = LicenseManager.InitLicense("YOUR-DYNAMSOFT-LICENSE-KEY", errorMsg:=Nothing)
If errorCode <> CType(EnumErrorCode.EC_OK, Integer) Then
Throw New InvalidOperationException($"License activation failed: {errorMsg}")
End If
Using router As New CaptureVisionRouter()
' Settings tuned for camera frame processing
Dim settings As SimplifiedCaptureVisionSettings = router.GetSimplifiedSettings(PresetTemplate.PT_READ_BARCODES)
settings.BarcodeSettings.ExpectedBarcodesCount = 1 ' single barcode per frame
settings.Timeout = 100 ' 100ms suits a 30fps pipeline
router.UpdateSettings(PresetTemplate.PT_READ_BARCODES, settings)
End Usingこれは、その目的に適した、よく設計されたAPIです。 カメラから1秒あたり30フレームを処理し、1フレームに500msを費やす余裕がない場合、Timeout = 100 設定は意味があります。 アップロードされたPDFを処理するサーバーに対して、100msのタイムアウトは何も役に立ちませんし、高密度のバーコードで読み取りを失敗させる可能性があります。
ルーターとセッションのデザイン — new CaptureVisionRouter(), router.Dispose() — はカメラセッションのセマンティクスに従い、ルーターを開き、フレームを処理し、廃棄します。 ファイル処理に関しては、このライフサイクルはメリットのない定型コードを追加するだけです。
PDFの問題
Dynamsoft Barcode Reader はWindowsビルドでいくつかのPDF入力を直接受け入れ可能ですが、クロスプラットフォーム展開のために多くのチームはPDFの各ページを画像にプリレンダーし、それをCaptureVisionRouter.Capture に渡す前に行います。 通常、これは別々のPDFレンダリングライブラリを引き込みます — よく使用されるのはPdfiumViewerです — これにより、NuGet依存関係、ネイティブバイナリ依存関係(Windows上ではpdfium.dllまたはLinux上ではlibpdfium)、およびすべてのPDF操作にレンダーループが追加されます。
// Dynamsoft PDF processing — typical cross-platform pattern with PdfiumViewer
// dotnet add package PdfiumViewer
using PdfiumViewer;
using System.Drawing.Imaging;
using Dynamsoft.CVR;
using Dynamsoft.DBR;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var results = new List<string>();
using (var pdfDoc = PdfDocument.Load(pdfPath))
using (var router = new CaptureVisionRouter())
{
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 the Capture Vision Router
CapturedResult result = router.Capture(imageBytes,
PresetTemplate.PT_READ_BARCODES);
foreach (var item in result.GetDecodedBarcodesResult().GetItems())
results.Add(item.GetText());
}
}
return results;
}Imports PdfiumViewer
Imports System.Drawing.Imaging
Imports Dynamsoft.CVR
Imports Dynamsoft.DBR
Imports System.IO
Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
Dim results As New List(Of String)()
Using pdfDoc = PdfDocument.Load(pdfPath)
Using router = New CaptureVisionRouter()
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 the Capture Vision Router
Dim result As CapturedResult = router.Capture(imageBytes, PresetTemplate.PT_READ_BARCODES)
For Each item In result.GetDecodedBarcodesResult().GetItems()
results.Add(item.GetText())
Next
End Using
End Using
Next
End Using
End Using
Return results
End Functionそれは、(Dynamsoft、PdfiumViewer、プラットフォーム特有のネイティブバイナリという)3つの依存関係、ページごとに行われるレンダーループ、ページ数に比例するメモリオーバーヘッドです。
IronBarcodeはPDFファイルから直接読み取ります。
// IronBarcode: PDF is native — no extra library, no render loop
// NuGet: dotnet add package BarCode
var results = BarcodeReader.Read("invoice.pdf");
foreach (var result in results)
{
Console.WriteLine($"{result.Format}: {result.Value}");
}Imports IronBarCode
' IronBarcode: PDF is native — no extra library, no render loop
' NuGet: dotnet add package BarCode
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 = LicenseManager.InitLicense("YOUR-DYNAMSOFT-LICENSE-KEY", out string errorMsg);
if (errorCode != (int)EnumErrorCode.EC_OK)
{
// Possible causes: network timeout, license server unreachable,
// invalid key, expired key, activation quota exceeded, etc.
throw new InvalidOperationException($"Dynamsoft license failed [{errorCode}]: {errorMsg}");
}Imports System
' Dynamsoft: error code pattern required
Dim errorCode As Integer = LicenseManager.InitLicense("YOUR-DYNAMSOFT-LICENSE-KEY", errorMsg)
Dim errorMsg As String
If errorCode <> CType(EnumErrorCode.EC_OK, Integer) Then
' Possible causes: network timeout, license server unreachable,
' invalid key, expired key, activation quota exceeded, etc.
Throw New InvalidOperationException($"Dynamsoft license failed [{errorCode}]: {errorMsg}")
End IfDynamsoftを使用したオフラインライセンスは別のワークフローです。 接続されたマシンで初回のオンラインアクティベーションを行い、ライセンスバンドルを取得して保持し、そのバンドルをInitLicenseFromLicenseContent を介して再現することでオフラインマシンをアクティブ化します。
// Dynamsoft offline license — replay a pre-fetched license bundle
int errorCode = LicenseManager.InitLicenseFromLicenseContent(
licenseContent, out string errorMsg);
if (errorCode != (int)EnumErrorCode.EC_OK)
throw new InvalidOperationException($"Offline activation failed: {errorMsg}");Imports System
' Dynamsoft offline license — replay a pre-fetched license bundle
Dim errorCode As Integer = LicenseManager.InitLicenseFromLicenseContent(licenseContent, errorMsg)
Dim errorMsg As String = Nothing
If errorCode <> CType(EnumErrorCode.EC_OK, Integer) Then
Throw New InvalidOperationException($"Offline activation failed: {errorMsg}")
End Ifこのようにして取得されたライセンスバンドルには有効期限のウィンドウがあります(通常は数日から1年)で、期限が切れる前に更新が必要です。これにより、接続された機械が定期的にワークフローに参加する必要があります。
IronBarcodeライセンスのアクティベーションは、ローカルで評価される単一の割り当てです。
// IronBarCode: local validation, no network required
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";' IronBarCode: local validation, no network required
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"確認すべきエラーコードはありません。 ネットワーク接続に依存しません。 ライセンスバンドルの更新サイクルはありません。 同じ行は、開発機、CI/CDパイプライン、Dockerコンテナ、エアギャップサーバーで動作します。
カメラとファイルのユースケース
DynamsoftとIronBarcodeは、異なる主要なシナリオに最適化されています。 以下の表はこれを説明しています。どのライブラリが一概に優れていると宣言するのではありません:
| シナリオ | Dynamsoft バーコードリーダー | IronBarcode |
|---|---|---|
| ライブカメラ映像(30fps) | リアルタイム用に最適化されている | 主な使用例ではない |
| モバイルSDK(iOS/Android) | フルSDKが利用可能です | .NETのみ |
| サーバー側ファイル処理 | CaptureVisionRouter経由でサポートされています | 主な使用例 |
| PDFバーコード読み取り | Windowsで直接; render loop common cross-platform | ネイティブサポート |
| エアギャップ展開 | オフラインライセンスバンドルワークフローが必要 | すぐに使える |
| Docker / エフェメラルコンテナ | 環境ごとのライセンスバンドル更新 | 単一環境変数 |
| オフラインライセンス | 以前のオンラインアクティベーションからライセンスコンテンツのブロブ | 標準ライセンスキー |
| .NETコアAPI。 | サポートされている(追加ライセンスボイラープレート) | サポート対象 |
| Azureファンクション | 初めてのアクティベーションのためのアウトバウンドネットワーク | ネットワーク接続は不要です。 |
| バーコード生成 | Barcode Readerバンドル内でのみ読み取り | はい、世代と読書 |
| QRコード生成 | Barcode Readerバンドルには含まれていません | はい — QRコードライター |
IronBarcodeを理解する
IronBarcodeは、バーコードの生成と読み取りの両方を行うため for .NETライブラリです。 APIは静的であり、インスタンスも、破棄呼び出しも、セッションライフサイクルもありません。 ライセンスの有効化はローカルで行われます。 PDFサポートは以下に組み込まれています。
// NuGet: dotnet add package BarCode
using IronBarCode;
// License — local validation, no network call
IronBarCode.License.LicenseKey = "YOUR-LICENSE-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);
生成も同様に簡単です。
// 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 |
|---|---|---|
| バーコード読み取り | はい、カメラ最適化済み | はい、ファイルとドキュメントが最適化されています |
| バーコード生成 | なし | はい |
| QRコード生成 | なし | はい — QRコードライター |
| ネイティブPDFサポート | Windowsで直接; render loop common cross-platform | はい — BarcodeReader.Read(pdf) |
| ライセンス認証 | オンラインアクティベーション + 定期的な再チェック | ローカル |
| エアギャップ/オフライン | ライセンスコンテンツのブロブワークフロー | 標準キー、オフラインでも動作します |
| Docker/コンテナ | 環境ごとのライセンスバンドルワークフロー | 単一の環境変数 |
| Azureファンクション | 初めてのアクティベーションのためのアウトバウンドネットワーク | ネットワーク接続は不要です。 |
| AWSラムダ | 初めてのアクティベーションのためのアウトバウンドネットワーク | ネットワーク接続は不要です。 |
| モバイルSDK | iOSとAndroidで利用可能 | .NETのみ |
| リアルタイムカメラ(30fps) | 主要設計目標 | この用途には設計されていません |
| コード128 | はい | はい |
| QRコード | はい(読書) | はい(読み取りと生成) |
| データマトリックス | はい | はい |
| PDF417 | はい | はい |
| アステカ | はい | はい |
| EAN / UPC | はい | はい |
| インスタンス管理 | new CaptureVisionRouter() + Dispose() | 静的 - インスタンスなし |
| 複数バーコード読み取り | BarcodeSettingsのExpectedBarcodesCount | ExpectMultipleBarcodes = true です。 |
| 読書速度制御 | タイムアウト + テンプレートの調整 | 読書速度列挙型 |
| 並行読解 | 手動糸通し | 最大並列スレッド数 |
| 価格設定モデル | 年間サブスクリプション / ネゴシエートされた永続ライセンス | 永久翻訳 $999より |
| .NETサポート | .NET 6.0+ および .NET Framework 3.5+ | .NET 4.6.2 から.NET 9 |
| プラットフォーム | Windows (x86/x64), Linux (x64) | Windows、Linux、macOS、Docker、Azure、AWS Lambda |
APIマッピングリファレンス
Dynamsoftのコードを使用しているチームで、その概念がどのように翻訳されるかを理解する必要がある場合:
| Dynamsoft バーコードリーダー | IronBarcode |
|---|---|
LicenseManager.InitLicense(key, out errorMsg) | IronBarCode.License.LicenseKey = "key" |
errorCode != (int)EnumErrorCode.EC_OK チェック | 不要 |
LicenseManager.InitLicenseFromLicenseContent(content, out msg) | 不要 |
new CaptureVisionRouter() | 静的 - インスタンスなし |
router.Dispose() | 不要 |
router.Capture(imagePath, PresetTemplate.PT_READ_BARCODES) | BarcodeReader.Read(imagePath) |
router.Capture(imageBytes, PresetTemplate.PT_READ_BARCODES) | BarcodeReader.Read(imageBytes) |
BarcodeResultItem.GetText() | result.Value |
BarcodeResultItem.GetFormatString() | result.Format |
SimplifiedCaptureVisionSettings を介して GetSimplifiedSettings() | new BarcodeReaderOptions { ... } |
settings.Timeout = 100 | Speed = ReadingSpeed.Balanced |
settings.BarcodeSettings.ExpectedBarcodesCount = 1 | ExpectMultipleBarcodes = false (デフォルト) |
router.UpdateSettings(template, settings) | パラメータとして Read() に渡されました |
| 外部PDFライブラリ+ページレンダリングループ | BarcodeReader.Read("doc.pdf") |
チームが切り替わるとき
サーバー側ドキュメント処理、カメラスキャンではありません。 最も一般的な移行シナリオは、評判に基づいてDynamsoftを選び、統合し、カメラ中心のAPIとPDFレンダーステップがドキュメント処理ワークフローを不便にすることを発見したチームです。 ウェブアプリケーションでアップロードされたPDFからバーコードを読み取ることは、Dynamsoftでは追加の手間が必要ですが、IronBarcodeでは単一の呼出しです。
**エアギャップまたは制限されたネットワーク環境。**金融機関、医療システム、政府機関などは、アプリケーションサーバーからのインターネットへの外部接続を禁止している場合が多い。 Dynamsoftのオンラインアクティベーションは、オフラインライセンスバンドルワークフローなしでそれらの環境では実行されません。これにより運用ステップが必要になります。 こうした環境にあるチームがIronBarcodeに移行する理由は、ライセンス認証にネットワーク要素が一切含まれていないためであることが多い。
DockerおよびKubernetesエフェメラルコンテナ。 インスタンスが頻繁にスケールアップおよびスケールダウンするコンテナ化されたデプロイメントでは、ライセンスバンドルの更新が頻繁に行われるため、管理が面倒です。 IronBarcodeのライセンスキーは、インスタンスごとの登録を必要とせず、標準的な環境変数として機能します。
読み取りだけでなく生成も必要。 Dynamsoft Barcode Readerバンドルは読み取り専用です。 バーコードラベルの生成、製品用QRコードの印刷、またはバーコードが埋め込まれた出荷明細書の作成が必要なアプリケーションには、別のライブラリが必要です。 このような状況にあるチームは、2つの異なるバーコード依存関係を管理することを避けるために、 IronBarcodeに統合することが多い。
運用の負荷を簡略化。 到達可能でなければならない外部依存関係としてDynamsoftライセンスサーバーをリストから削除し、PDFレンダリングライブラリを削除し、ルーターライフサイクル管理をスタティックコールに置き換えることで、本番環境で問題が発生する可能性のある事項を減少させます。
結論
Dynamsoft Barcode Readerはその意図した使用ケースに良く適合している高品質のライブラリです:モバイルアプリケーションでのリアルタイムのカメラベースのバーコードスキャンに特に適しています。 これらのアルゴリズムは、手持ちスキャン時の状況(照明の変化、モーションブラー、部分的な遮蔽など)に合わせて最適化されている。 もしそれがあなたのユースケースであれば、Dynamsoftは十分に競争力があります。
サーバーサイドドキュメント処理 — PDFからバーコードを読み取り、バーコードラベルを生成し、エアギャップ環境で実行し、エフェメラルなDockerコンテナにデプロイする — については、ライブラリのアーキテクチャは各ステップでの設定を求めています。オンラインライセンスアクティベーション、クロスプラットフォームPDFレンダーパターン、カメラ最適化タイムアウト設定、およびオフラインライセンスバンドルワークフローは、モバイルカメラ使用のために構築された結果です。 それらはバグではありません。 それらは、異なる状況を想定した意図的なデザイン選択である。
IronBarcodeは、ドキュメント側とサーバー側の両方のコンテキスト向けに構築されています。 ローカルライセンスの検証、ネイティブなPDF読み取り、静的API、および生成サポートは、いずれも回避策ではなく、第一級の機能です。 決定は、バーコードの実際の環境に基づきます。

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。