ZXingでのバーコードスキャン方法 (C#開発者向け)
Accusoft BarcodeXpress対 IronBarcode: ライセンス、スループット、API のトレードオフ
バーコードライブラリを試用版で評価する場合、購入を決定する前に、実際に自分の画像で正しく動作するかどうかを確認することを期待するでしょう。 Accusoft BarcodeXpressにはそのオプションはありません。 評価モードでは、デコードされたバーコード値は文字列" UNLICENSED accusoft.com "でスタンプされ、生成された2Dバーコードも同じスタンプを持ちます。ライブラリがバーコードを見つけることは確認できますが、正しく読み取れるかは確認できません。 それは検証前にコミットしてしまう状況であり、価格設定を検討する前からすでに大きな摩擦点となっている。
Accusoft BarcodeXpressについて理解する
Accusoftは、数十年にわたりEnterprise環境向けのドキュメントイメージングソフトウェアを開発してきました。 BarcodeXpressは、PrizmDoc、ImageGear、Accusoft Imagingを含む、より広範な製品ファミリーの一部です。 既にこれらの製品を使用しているチームは、使い慣れたAPIインターフェースを利用でき、既存のAccusoftアカウントとの関係を活用できます。しかし、スタンドアロンのバーコード利用においては、こうした状況はあまり役に立ちません。
コアSDKは、 .NET Core用のNuGetパッケージとして提供されています。 APIはインスタンスベースです。writerを使用して実際の操作を行います。 デュアルキーライセンスシステムは、BarcodeXpressを他の多くの競合製品と差別化する特徴です。
BarcodeXpressの主なアーキテクチャ特性:
- インスタンスベースAPI: すべての操作には
BarcodeXpressインスタンスが必要です; 静的な便利メソッドは設計の一部ではありません - 二層ライセンス: SDKライセンス(
SetSolutionName+SetOEMLicenseKey)は別々のシステムで、別々の購入が必要です - 評価モードのスタンプ: 評価モードでは、デコードされた値は
" UNLICENSED accusoft.com "でスタンプされ(生成された2Dバーコードも同じ文字列でスタンプされ)、購入前の精度テストが不可能です - 手動形式指定: リーダーは明示的な
BarcodeTypes設定を要求し、どのシンボルを検索するかを列挙します; 未指定のフォーマットは検出されません - 標準版の処理速度上限:40 PPM 標準版では処理速度が毎分 40 ページに制限されます。この制限は、導入前ではなく導入後にほとんどのチームが直面するものです。 -ネイティブのPDFサポートなし:リーダーがPDFファイルを処理するには、別のライブラリを使用してPDFファイルを画像に事前にレンダリングする必要があります。 -最低5つのランタイムライセンス:シングルサーバー展開の場合でも、最低5つのランタイムライセンスを購入する必要があります。
2キーシステムの説明
BarcodeXpressは、ライセンスを概念的に分離した2つのレイヤーに分けています。
// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;
// Constructor takes the path to the runtime files (e.g. ".").
var barcodeXpress = new BarcodeXpress(".");
// Step 1: SDK license (for development).
// SetSolutionName and SetSolutionKey are methods, not properties.
// SetSolutionKey takes four 32-bit integers (not a parsed long).
barcodeXpress.Licensing.SetSolutionName("YourCompanyName");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// Step 2: OEM/runtime license (for production — minimum 5 purchased).
try
{
barcodeXpress.Licensing.SetOEMLicenseKey("YourOEMLicenseString");
}
catch (Exception ex)
{
// Without a valid OEM license, the SDK runs in stamped evaluation mode.
Console.WriteLine($"OEM license activation failed: {ex.Message}");
}
// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;
// Constructor takes the path to the runtime files (e.g. ".").
var barcodeXpress = new BarcodeXpress(".");
// Step 1: SDK license (for development).
// SetSolutionName and SetSolutionKey are methods, not properties.
// SetSolutionKey takes four 32-bit integers (not a parsed long).
barcodeXpress.Licensing.SetSolutionName("YourCompanyName");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// Step 2: OEM/runtime license (for production — minimum 5 purchased).
try
{
barcodeXpress.Licensing.SetOEMLicenseKey("YourOEMLicenseString");
}
catch (Exception ex)
{
// Without a valid OEM license, the SDK runs in stamped evaluation mode.
Console.WriteLine($"OEM license activation failed: {ex.Message}");
}
Imports Accusoft.BarcodeXpressSdk
' BarcodeXpress: two separate license keys required
' Constructor takes the path to the runtime files (e.g. ".").
Dim barcodeXpress As New BarcodeXpress(".")
' Step 1: SDK license (for development).
' SetSolutionName and SetSolutionKey are methods, not properties.
' SetSolutionKey takes four 32-bit integers (not a parsed long).
barcodeXpress.Licensing.SetSolutionName("YourCompanyName")
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
' Step 2: OEM/runtime license (for production — minimum 5 purchased).
Try
barcodeXpress.Licensing.SetOEMLicenseKey("YourOEMLicenseString")
Catch ex As Exception
' Without a valid OEM license, the SDK runs in stamped evaluation mode.
Console.WriteLine($"OEM license activation failed: {ex.Message}")
End Try
SetSolutionKeyペアはSDK自体を有効化します。 SetOEMLicenseKey呼び出しは本番展開能力を有効化します。 本番展開がバーコード値を" UNLICENSED accusoft.com "スタンプなしで返すには、両方が存在し、かつ有効でなければなりません。
コードレビューでは、このパターンは予測可能な質問を生みます:"なぜ2つの別々のライセンスアクティベーションがあるのか?" 答えは、Accusoft がSDK ライセンスとデプロイメントライセンスを別々の製品として取り扱っており、別々に請求されるということで、これは必ずしもAPI自体から明らかではありません。 初期設定から6か月後にこのコードを保守しているチームは、どのキーがどれに対応しているかを理解するために、ドキュメントまで遡って調べる必要がある場合が多い。
有効なOEMライセンスがないときは、SetOEMLicenseKeyがスローされ、SDKは評価モードに戻ります。 チームは通常、try/catchでアクティベーションをラップし、失敗した場合は明確にログに記録し、プロダクションでスタンプされたバーコード値を静かに生成することを防ぎます:
try
{
barcodeXpress.Licensing.SetOEMLicenseKey(oemKey);
}
catch (Exception ex)
{
// In evaluation mode, barcode values are stamped with
// " UNLICENSED accusoft.com " in the output.
throw new InvalidOperationException(
"OEM license activation failed — barcode values will be stamped", ex);
}
try
{
barcodeXpress.Licensing.SetOEMLicenseKey(oemKey);
}
catch (Exception ex)
{
// In evaluation mode, barcode values are stamped with
// " UNLICENSED accusoft.com " in the output.
throw new InvalidOperationException(
"OEM license activation failed — barcode values will be stamped", ex);
}
Try
barcodeXpress.Licensing.SetOEMLicenseKey(oemKey)
Catch ex As Exception
' In evaluation mode, barcode values are stamped with
' " UNLICENSED accusoft.com " in the output.
Throw New InvalidOperationException("OEM license activation failed — barcode values will be stamped", ex)
End Try
このガードは、評価モードの出力がデコード中に例外を投げず、スタンプ付きの結果を静かに返すことに気付いたときにチームが追加するパターンです。
IronBarcodeを理解する
IronBarcodeは、 NuGetパッケージ以外に外部依存関係を持たない、スタンドアロン for .NETバーコードライブラリです。 静的ファクトリメソッドによって生成と読み取りの両方を処理するため、インスタンスのライフサイクルを管理する必要がなく、アプリケーションコード全体にコンストラクタ呼び出しが散在することもありません。
シングルキーライセンスモデルとは、トライアルモードでテストした内容がそのまま本番環境でも実行されることを意味します。唯一の違いは、トライアル期間中に生成されるバーコード画像にウォーターマークが入る点です。 デコードされた値は常に完全なので、購入を決定する前に、実際の文書で読み取り精度をベンチマークすることができます。
IronBarcodeの主な特徴:
- 静的APIデザイン:
BarcodeWriter.CreateBarcode()はステートレスな静的メソッドです。インスタンス管理は必要ありません。 -シングルライセンスキー: 1つのキーで開発環境と本番環境の両方の展開に対応します。 個別のランタイムライセンスレイヤーはありません -完全な試行値:試行モードでは、デコードされた完全な値が返されます。 透かしは生成された出力画像にのみ適用され、読み取り結果には適用されません。 -自動フォーマット検出: IronBarcodeは、サポートされているすべてのフォーマットのシンボルを自動的に検出します。BarcodeTypes列挙は不要です - ネイティブPDFサポート:
BarcodeReader.Read("document.pdf")は別のレンダリングステップなしでPDFファイルを直接処理します -スループットの上限なし:処理速度はハードウェアとネットワーク容量によってのみ制限され、ソフトウェアによる上限はありません。 -スレッドセーフ設計:ステートレスな静的メソッドは、インスタンス分離なしで任意の数のスレッドから同時に呼び出すことができます
機能比較
| フィーチャー | Accusoft BarcodeXpress | IronBarcode |
|---|---|---|
| ライセンスモデル | SDKライセンス+別途ランタイムライセンス | 永久鍵1本 |
| 評価モードの動作 | バーコード値は"UNLICENSED accusoft.com"でスタンプされています | 完全な値が返され、生成された出力にのみ透かしが入ります。 |
| スループット制限(標準) | 毎分40ページ | スループット制限なし |
| PDFサポート | 画像抽出には外部PDFライブラリが必要です | ネイティブ — BarcodeReader.Read("doc.pdf") |
| APIスタイル。 | インスタンスベースの詳細な設定 | 静的ファクトリメソッド、流暢なAPI |
| スレッドセーフ。 | スレッドごとにインスタンスが必要です | ステートレスな静的メソッド - スレッドセーフ |
| 価格設定のエントリーポイント | 1,960ドル+SDK + 2,500ドル+ランタイム(最低5) | 749ドル(永久ライセンス、 Lite、開発者1名) |
詳細な機能比較
| フィーチャー | Accusoft BarcodeXpress | IronBarcode |
|---|---|---|
| ライセンスについて | ||
| ライセンスモデル | SDKキー+ランタイムキー | 永久鍵1本 |
| 最小ランタイムライセンス | 5(サーバー1台の場合も) | ランタイムライセンスの概念なし |
| 評価モード | 値は"UNLICENSED accusoft.com"でスタンプされています | 完全な値、出力画像にのみ透かしが入ります |
| 永久ライセンス | 標準仕様ではありません - 営業担当者にお問い合わせください | はい、全ティア |
| 年間更新 | サポートに必要 | オプション |
| 読む | ||
| フォーマット自動検出 | マニュアル — バーコードの種類を指定する必要があります | サポートされているすべてのフォーマットで自動的に |
| PDFを読む | 外部PDFライブラリが必要です | ネイティブ |
| 画像ごとに複数のバーコード | はい、BarcodeTypes設定で |
はい、ExpectMultipleBarcodesオプションで |
| 結果プロパティ | BarcodeValue, BarcodeType |
Value, Format, Confidence, PageNumber |
| スループット制限 | 40 PPM(標準版) | どの階層でも制限なし |
| 世代 | ||
| コード128生成 | はい、writer.BarcodeTypeを経由して |
はい、BarcodeWriter.CreateBarcode()を経由して |
| QRコード生成 | はい | はい、QRCodeWriter.CreateQrCode()を経由して |
| ロゴ入りQRコード | 手動での画像重ね合わせが必要です | AddBrandLogo("logo.png")ビルトイン |
| 出力形式 | ファイル保存 | PNG、JPG、PDF、バイナリデータ、ストリーム |
| プラットフォームと展開 | ||
| .NET Framework | 別個のレガシーSDK | .NET Framework4.6.2以降 |
| .NET Core / .NET 5 以上 | はい(.NET Core SDK) | .NET Core 3.1以降、 .NET 5/6/7/8/9 |
| Linux/Docker | はい | はい — Windows x64/x86、Linux x64、macOS x64/ARM |
| Dockerライセンス設定 | ライセンスファイルまたはライセンスサーバー | 環境変数 |
| CI/CD統合 | SDKキーとランタイムキーの両方が必要です | 一つの秘密 |
| バッチ処理。 | ||
| スレッドセーフティ | スレッドごとにインスタンスが必要です | ステートレス — Parallel.ForEach が安全 |
| 並列バッチ | スレッドごとのインスタンス管理が必要 | 直接並列ForEachをサポート |
ライセンスアーキテクチャ
BarcodeXpressとIronBarcodeのライセンス体系の複雑さの違いは、本番環境で実行される初期化コードを作成する際に最も顕著に現れます。
BarcodeXpressのアプローチ
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
_barcodeXpress = new BarcodeXpress(".");
// Layer 1: SDK license
_barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// Layer 2: OEM/runtime license — separate purchase, minimum 5
try
{
_barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");
}
catch (Exception ex)
{
throw new InvalidOperationException(
"OEM license activation failed — barcode values will be stamped", ex);
}
}
}
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
_barcodeXpress = new BarcodeXpress(".");
// Layer 1: SDK license
_barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// Layer 2: OEM/runtime license — separate purchase, minimum 5
try
{
_barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");
}
catch (Exception ex)
{
throw new InvalidOperationException(
"OEM license activation failed — barcode values will be stamped", ex);
}
}
}
Imports Accusoft.BarcodeXpressSdk
Public Class BarcodeService
Private ReadOnly _barcodeXpress As BarcodeXpress
Public Sub New()
_barcodeXpress = New BarcodeXpress(".")
' Layer 1: SDK license
_barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
' Layer 2: OEM/runtime license — separate purchase, minimum 5
Try
_barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString")
Catch ex As Exception
Throw New InvalidOperationException("OEM license activation failed — barcode values will be stamped", ex)
End Try
End Sub
End Class
このコンストラクターは、バーコード操作が実行される前に2つの別々のライセンスアクティベーションを管理するためのものです。 SetOEMLicenseKey周りのtry/catchはオプションではありません。これがないと、OEMキーが欠落しているか誤設定されている環境でサービスはスタンプ値をサイレントに返します。
IronBarcodeのアプローチ
using IronBarCode;
// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
using IronBarCode;
// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
' In Program.vb or startup configuration
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
これが完全なライセンス設定です。別個のランタイム解除はなく、ソリューション名もなく、二引数のUnlockRuntime呼び出しもありません。 Dockerでは、これは起動時に読み込まれる環境変数になります。CI/CDパイプラインでは、これは1つのシークレットです。 コンテナオーケストレーターでは、これはポッドに注入される環境変数の1つです。
バーコードの読み取り
バーコード読み取りは、2つのライブラリの設定方法の違いを明らかにします。BarcodeXpressは明示的なフォーマット列挙とプロパティベースのセットアップAPIを必要とするのに対し、 IronBarcodeは単一のメソッド呼び出しですべてを自動的に検出します。
BarcodeXpressのアプローチ
BarcodeXpressでの読み取りは、画像をAnalyze(bitmap)を呼び出すことを必要とします。 SDK は直接PDFを読み取りません — 文書化された入力形式はTIFF、JPEG、PNG、およびBMPです:
using Accusoft.BarcodeXpressSdk;
using System.Drawing;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var barcodeXpress = new BarcodeXpress(".");
barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");
using var bitmap = new Bitmap(imagePath);
// BarcodeTypes is a System.Array of BarcodeType values (not a [Flags]
// enum). Pass Enum.GetValues to scan for everything, or assign a
// narrower array to restrict the search space.
barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
};
Result[] results = barcodeXpress.reader.Analyze(bitmap);
return results.Select(r => r.BarcodeValue);
}
using Accusoft.BarcodeXpressSdk;
using System.Drawing;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var barcodeXpress = new BarcodeXpress(".");
barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");
using var bitmap = new Bitmap(imagePath);
// BarcodeTypes is a System.Array of BarcodeType values (not a [Flags]
// enum). Pass Enum.GetValues to scan for everything, or assign a
// narrower array to restrict the search space.
barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
};
Result[] results = barcodeXpress.reader.Analyze(bitmap);
return results.Select(r => r.BarcodeValue);
}
Imports Accusoft.BarcodeXpressSdk
Imports System.Drawing
Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
Dim barcodeXpress = New BarcodeXpress(".")
barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString")
Using bitmap As New Bitmap(imagePath)
' BarcodeTypes is a System.Array of BarcodeType values (not a [Flags]
' enum). Pass Enum.GetValues to scan for everything, or assign a
' narrower array to restrict the search space.
barcodeXpress.Reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
}
Dim results As Result() = barcodeXpress.Reader.Analyze(bitmap)
Return results.Select(Function(r) r.BarcodeValue)
End Using
End Function
Result[]を返します。 ドキュメントがBarcodeTypes配列に存在しない形式を含む場合、見つかりません。 文書のソースが変更されると、これはメンテナンス上の負担となる。 PDFはAnalyzeに入れる前に別のライブラリで画像に前もってレンダリングする必要があります。
IronBarcodeのアプローチ
using IronBarCode;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value);
}
using IronBarCode;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value);
}
Imports IronBarCode
Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
Dim results = BarcodeReader.Read(imagePath)
Return results.Select(Function(r) r.Value)
End Function
IronBarcodeは、サポートされているすべてのシンボル体系においてフォーマットを自動的に検出します。 画像にCode 128、QRコード、およびDataMatrixが含まれている場合、設定変更なしで、これら3つすべてが結果コレクションに返されます。 読み取り動作をより詳細に制御するために、 BarcodeReaderOptionsクラスでは、速度、スレッド数、およびマルチバーコードの設定が公開されています。
ネイティブPDFの閲覧も同じ方法で可能です。
using IronBarCode;
//ネイティブPDF support — no separate library needed
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}");
}
using IronBarCode;
//ネイティブPDF support — no separate library needed
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}");
}
Imports IronBarCode
'ネイティブPDF support — no separate library needed
Dim results = BarcodeReader.Read("invoice-batch.pdf")
For Each result In results
Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}")
Next
BarcodeXpressはPDFをネイティブに読み込む機能を持っていません。 まず、別のライブラリを使用して各ページを画像としてレンダリングし、次にそれらの画像をBarcodeXpressリーダーに渡す必要があります。 これにより、依存関係が増え、変換手順が増え、選択したPDFライブラリによってはライセンス費用も追加されます。
バッチ処理とねじの安全性
大量のバーコード処理を行うと、BarcodeXpressのステートフルなインスタンスモデルとIronBarcodeのステートレスな静的APIとのアーキテクチャ上の違いが明らかになる。
BarcodeXpressのアプローチ
BarcodeXpressはインスタンスベースで、そのreaderオブジェクトはステートフルです。 並列処理では、スレッドごとに1つのインスタンスが必要となり、各スレッドコンテキストで完全な2層ライセンス初期化が繰り返されます。
using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;
using System.Drawing;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
using var bitmap = new Bitmap(path);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
};
var barcodes = _barcodeXpress.reader.Analyze(bitmap);
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;
using System.Drawing;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
using var bitmap = new Bitmap(path);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
};
var barcodes = _barcodeXpress.reader.Analyze(bitmap);
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
Imports Accusoft.BarcodeXpressSdk
Imports System.Collections.Generic
Imports System.Drawing
Public Function ProcessBatch(imagePaths As IEnumerable(Of String)) As Dictionary(Of String, String)
Dim results As New Dictionary(Of String, String)()
For Each path In imagePaths
Using bitmap As New Bitmap(path)
_barcodeXpress.reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
}
Dim barcodes = _barcodeXpress.reader.Analyze(bitmap)
If barcodes.Length > 0 Then
results(path) = barcodes(0).BarcodeValue
End If
End Using
Next
Return results
End Function
スタンダード版では、1分間に40ページという表示速度の上限も設けられています。 10万件の文書を毎分40件の速度で処理する場合、完了までにおよそ41時間かかります。 Professional版ではこの制限は撤廃されますが、既に購入済みのランタイムライセンスに加えて、開発者一人当たりのコストが高くなります。
IronBarcodeのアプローチ
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;
// IronBarcode — parallel batch with thread-safe static API
var files = Directory.GetFiles("/incoming/scans", "*.png");
var allResults = new ConcurrentBag<string>();
Parallel.ForEach(files, file =>
{
var r = BarcodeReader.Read(file);
foreach (var barcode in r)
allResults.Add($"{file}: {barcode.Value}");
});
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;
// IronBarcode — parallel batch with thread-safe static API
var files = Directory.GetFiles("/incoming/scans", "*.png");
var allResults = new ConcurrentBag<string>();
Parallel.ForEach(files, file =>
{
var r = BarcodeReader.Read(file);
foreach (var barcode in r)
allResults.Add($"{file}: {barcode.Value}");
});
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
' IronBarcode — parallel batch with thread-safe static API
Dim files = Directory.GetFiles("/incoming/scans", "*.png")
Dim allResults = New ConcurrentBag(Of String)()
Parallel.ForEach(files, Sub(file)
Dim r = BarcodeReader.Read(file)
For Each barcode In r
allResults.Add($"{file}: {barcode.Value}")
Next
End Sub)
IronBarcodeの静的メソッドはステートレスなので、その上でのParallel.ForEachはインスタンス分離が不要で安全です。 IronBarcodeは、どの料金プランにおいてもスループットの上限を設けていません。 読み取り性能の調整のために、BarcodeReaderOptionsクラスはMaxParallelThreads設定を提供します:
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read("warehouse-scan.png", options);
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read("warehouse-scan.png", options);
Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim results = BarcodeReader.Read("warehouse-scan.png", options)
ReadingSpeed.Balancedがデフォルトです。 バーコードがきれいな高スループットパイプラインの場合はReadingSpeed.Detailedを使用します。
APIマッピングリファレンス
| Accusoft BarcodeXpress | IronBarcode |
|---|---|
new BarcodeXpress(".") |
静的メソッド - インスタンスは不要 |
Licensing.SetSolutionName("...") |
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY" |
Licensing.SetSolutionKey(int, int, int, int) |
(removed — not needed) |
Licensing.SetOEMLicenseKey(string) |
(removed — no separate runtime license concept) |
| OEMのアクティベーションをtry/catchで囲む | (removed — license is always either valid or not) |
reader.Analyze(bitmap) (まずSystem.Drawing.Bitmapをロード) |
BarcodeReader.Read(path) |
reader.BarcodeTypes = new[] { BarcodeType.Code128Barcode, ... } |
(removed — auto-detection handles all formats) |
result.BarcodeValue |
result.Value |
result.BarcodeType |
result.Format |
writer.BarcodeType = BarcodeType.Code128 |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
writer.BarcodeValue = "data" |
(first argument to CreateBarcode) |
writer.SaveToFile(path) |
.SaveAsPng(path) |
| 40 PPM 標準制限値 | どの階層でもスループット制限はありません |
| 評価: 値は"UNLICENSED accusoft.com"でスタンプされています | トライアル:フルバリュー、出力画像にのみ透かし入り |
チームがAccusoft BarcodeXpressからIronBarcodeへの移行を検討する場合
40 PPMの壁を超えてスケールアップする
標準版の1分あたり40ページという制限は、一見寛大に思えるが、ビジネスチームが1年分のアーカイブされた請求書に対して、1日の終わりに一括処理を実行することを決定した場合、その制限は無視できないものとなる。 そのペースで10万件の文書を処理するには、およそ41時間かかります。 Professional版に移行すると上限はなくなりますが、既に購入済みのランタイムライセンスに加えて、開発者1人あたりのライセンス費用が高くなります。 発注書に署名した後にスループットの上限に気づいたチームは、その上限を解消するための総コストが当初の見積もりを大幅に上回ることが多いことに気づく。
CI/CDパイプラインのライセンスの複雑さ
一般的なCI/CDのセットアップでは、一時的なコンテナ内でビルドが実行されます。 BarcodeXpressでは、すべてのビルド環境において、SDKキーペアとランタイムアンロックキーの両方が必要となり、これらは別々のシークレットとして管理されます。 ランタイムキーが欠落しているか、設定が間違っている場合、ビルドは成功するかもしれませんが、統合テストでは隠蔽された値が返されます。これは、テストアサーションを実際のバーコードの内容に対して慎重に記述しないと、テストパイプラインで見落としやすいサイレントな失敗モードです。
エアギャップとセキュリティを確保した展開要件
医療記録を処理する医療システム、政府文書のワークフロー、金融機関のバックオフィス処理など、一部の環境では、発信ネットワーク通話を行う際にライセンス認証を行うことはできません。 BarcodeXpressのランタイムライセンスシステムはAccusoftのライセンスインフラストラクチャを使用しているため、ネットワーク送信制限が厳しい環境ではコンプライアンス上の懸念が生じる可能性があります。 そうした環境で活動するチームは、ライセンス認証が完全にローカルで行われるライブラリを選択することが多い。
Dockerとコンテナのデプロイ
Docker 上で BarcodeXpress を使用するには、通常、ライセンスファイルを既知のパスにコンテナ内にマウントするか、ライセンスサーバーを設定してコンテナからそのサーバーを参照するようにする必要があります。 どちらの方法も導入の複雑さを増す。ライセンスファイルを配布して同期を維持する必要があり、ライセンスサーバーは維持管理すべき追加のインフラストラクチャとなる。 マイクロサービスアーキテクチャやサーバーレスデプロイメントパターンに移行するチームは、設定ファイル方式が不変のコンテナイメージにうまく移行できないことに気づきます。
評価精度の要件
購入を決定する前に、自社の文書で読み取り精度を検証する必要があるチームにとって、BarcodeXpressの評価モードは根本的に制約が多い。 実際の文書スキャンデータを用いたテスト(ライブラリが低コントラストのバーコード、歪んだ画像、または複数のバーコードを含むページを処理できるかどうかを確認する)には、完全なデコード値が必要です。 一部が隠れた出力からは、図書館がバーコードを検出したことはわかるが、正しく読み取ったかどうかはわからない。
一般的な移行の考慮事項
インスタンス管理から静的呼び出しへ
BarcodeXpressは、いかなる操作の前にもBarcodeXpressインスタンスを作成しライセンスすることを要求します。 IronBarcodeの静的メソッドはインスタンスを必要としません。 通常移行するチームは、そのコンストラクタが主にライセンスボイラープレートであるBarcodeServiceクラスを持っており、移行後はそのコンストラクタを完全に削除するか、単一のライセンスキー割り当てに減らすことができます。
バーコードタイプの列挙削除
すべてのBarcodeXpress読み取り操作は、検索するシンボルを列挙するためにBarcodeTypes配列の割り当てを必要とします。 IronBarcodeは、デフォルトでサポートされているすべてのフォーマットを自動的に検出します。 移行中、すべてのreader.BarcodeTypes = ...の割り当ては、置き換えなしで削除することができます。 パフォーマンス上の理由で検索空間を制限する必要がある場合、BarcodeReaderOptionsは、必須のデフォルトではなく明示的なオプトインとしてフォーマットフィルタリングをサポートします。
結果プロパティ名の変更
二つのプロパティの名前変更は、すべての結果処理コードに影響を与えます: result.Formatになります。 ソリューション全体を対象とした検索置換機能を使えば、両方とも処理できます。 IronBarcode結果はまた、BarcodeXpressには相当するものがないresult.PageNumberも公開しており、既存の結果処理へのコード変更なしに追加フィルタリングに使用できます。
Dockerライセンス構成
BarcodeXpressのDockerデプロイメントでは通常、マウントされたライセンス設定ファイルを使用します。IronBarcodeは環境変数を使用します。 移行には、構成ファイルのCOPY命令を削除し、単一の環境変数割り当てを追加することが含まれます。 Kubernetesでは、ライセンスキーはマウントされたボリュームではなく、Pod仕様内の秘密参照として扱われます。
IronBarcodeの追加機能
本比較で取り上げた主要機能以外にも、 IronBarcodeはBarcodeXpressにはない機能を提供しています。
- ロゴ付きQRコード:
QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")はQRコードにブランド画像をネイティブに埋め込み、スキャンの信頼性を維持するために誤り訂正レベルを設定可能にします。 - PDFへのバーコード印字:別途PDFライブラリを用意することなく、既存のPDF文書に直接バーコードを書き込みます。 -バッチエクスポート: PDFドキュメント全体を1回の呼び出しで処理し、ページ番号、フォーマット、値、信頼度スコアを含むページごとの結果を取得します。
.NETの互換性と将来の準備
IronBarcodeは、.NET Framework4.6.2以降、 .NET Core 3.1、および.NET 5、6、7、8、9をサポートしています。対応プラットフォームは、Windows x64およびx86、Linux x64、macOS x64およびARMです。 BarcodeXpress for .NET Coreは、従来 for .NET Framework版とは別のSDKです。アプリケーションの対象フレームワークをアップグレードするチームは、この点を考慮する必要があります。 IronBarcodeの単一パッケージは、サポートされているすべてのランタイムを網羅しています。 定期更新で公開された新しい.NETのリリースを追跡します。
結論
BarcodeXpressとIronBarcodeは、商用.NETバーコードライブラリにおける2つの異なる設計思想を体現している。 BarcodeXpressは、SDKへのアクセスと本番環境への展開を、それぞれ独立したライセンス製品として扱い、請求、キーシステム、最低購入金額も別々に設定しています。 IronBarcodeは、ライブラリを開発環境から本番環境まであらゆる環境をカバーする単一のキーを持つ単一の製品として扱います。
BarcodeXpressは、既にAccusoft製品エコシステムに組み込まれているチームにとって妥当な選択肢です。PrizmDocやImageGearを使用している組織は、BarcodeXpressのAPIが馴染みやすく、Accusoftアカウントとの連携によってサポートを統合できるため、便利だと感じるでしょう。 これらのチームにとって、2つのキーによるライセンスシステムは、新たな摩擦ではなく、確立された運用パターンである。 SDKは、ドキュメントソースがよく管理され、形式要件が安定している環境にも適しており、手動のBarcodeTypes指定があらかじめ設定可能な一度の構成として受け入れられるため、継続的なメンテナンスは不要です。
IronBarcodeは、ライセンス管理の複雑さが運用コストに直接影響する、コンテナ、CI/CDパイプライン、クラウド環境へのデプロイを行うチームに最適です。 自動検出モデル、静的API、およびネイティブPDFサポートにより、統合コードの範囲が縮小され、シングルキーライセンスモデルにより、開発、テスト、および本番環境全体でのシークレット管理が簡素化されます。 購入前に読み取り精度を評価する必要があるチームにとって、完全なトライアル出力(読み取り結果ではなく、生成された画像に透かしが入る)は、購入前の真のベンチマークを可能にします。
価格差はどの価格帯においても顕著である。 個人開発者レベルでは、BarcodeXpress SDKと最低限のランタイムライセンスとIronBarcodeのLiteティアとの間には大きな差がある。 コスト差よりもAccusoftエコシステムとの統合を重視するチームにとって、BarcodeXpressは依然として有力な選択肢です。一方、バーコードライブラリを個々のメリットに基づいて評価するチームにとっては、評価モードの制限、2キーライセンス、スループットの上限といった点を考慮すると、 IronBarcodeの方がより分かりやすい選択肢となります。
よくある質問
Accusoft BarcodeXpressとは何ですか?
Accusoft BarCodeXpressは、C#アプリケーションでバーコードを生成して読み取るため for .NETバーコードライブラリです。これは、開発者が.NETプロジェクト用のバーコードソリューションを選択する際に評価するいくつかの選択肢の1つです。
Accusoft BarcodeXpressとIronBarcodeの主な違いは何ですか?
IronBarcodeはインスタンス管理を必要としない静的なステートレスAPIを使用していますが、Accusoft BarcodeXpressは通常、使用前にインスタンスの作成と設定が必要です。IronBarcodeはまた、ネイティブPDFサポート、自動フォーマット検出、およびすべての環境でのシングルキーライセンスを提供します。
IronBarcodeはAccusoft BarcodeXpressよりライセンスが簡単ですか?
IronBarcodeは単一のライセンスキーで開発環境と本番環境の両方をカバーします。これは、SDKキーとランタイムキーを分離するライセンスシステムと比較して、CI/CDパイプラインとDocker構成を簡素化します。
IronBarcode はAccusoft BarcodeXpressがサポートしているすべてのバーコードフォーマットをサポートしていますか?
IronBarcodeはQRコード、Code 128、Code 39、DataMatrix、PDF417、Aztec、EAN-13、UPC-A、GS1など30以上のバーコードシンボロジーをサポートしています。フォーマットの自動検出は、明示的なフォーマットの列挙が不要であることを意味します。
IronBarcodeはネイティブPDFバーコード読み取りをサポートしていますか?
IronBarcodeは、別のPDFレンダリングライブラリを必要とせず、BarCodeReader.Read("document.pdf")を使用してPDFファイルから直接バーコードを読み取ります。ページごとの結果には、ページ番号、バーコードフォーマット、値、信頼度スコアが含まれます。
IronBarcode は Accusoft BarcodeXpress と比較してバッチ処理をどのように処理しますか?
IronBarcodeの静的メソッドはステートレスで当然スレッドセーフであり、スレッドごとのインスタンス管理なしにParallel.ForEachを直接使用できます。どの価格帯でもスループットの上限はありません。
IronBarcode はど for .NETバージョンをサポートしていますか?
IronBarcodeは.NET Framework 4.6.2+、.NET Core 3.1、.NET 5、6、7、8、9を単一のNuGetパッケージでサポートしています。プラットフォーム・ターゲットには、Windows x64/x86、Linux x64、macOS x64/ARMが含まれます。
.NETプロジェクトにIronBarcodeをインストールするには?
NuGet経由でIronBarcodeをインストールする:パッケージマネージャーコンソールで'Install-Package IronBarCode'を実行するか、CLIで'dotnet add package IronBarCode'を実行する。追加のSDKインストーラーやランタイムファイルは必要ありません。
Accusoft BarcodeXpressとは異なり、購入前にIronBarcodeを評価することはできますか?
IronBarcodeのトライアルモードでは、完全なデコードされたバーコード値を返します。購入を決定する前に、ご自身のドキュメントで読み取り精度をベンチマークすることができます。
Accusoft BarcodeXpressとIronBarcodeの価格の違いは何ですか?
IronBarcodeは、開発および量産をカバーする永続的なシングルデベロッパーライセンスで749ドルからご利用いただけます。価格の詳細とボリュームオプションはIronBarcodeのライセンスページでご覧いただけます。別途ランタイムライセンスは必要ありません。
Accusoft BarcodeXpressからIronBarcodeへの移行は簡単ですか?
Accusoft BarcodeXpressからIronBarcodeへの移行は、主にインスタンスベースのAPIコールをIronBarcodeの静的メソッドに置き換え、ライセンスの定型文を削除し、結果のプロパティ名を更新します。ほとんどの移行はコードを追加するのではなく、コードを削減します。
IronBarcodeはロゴ入りQRコードを生成できますか?
はい。QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")は、設定可能なエラー修正機能付きで、ブランド画像をネイティブにQRコードに埋め込みます。カラーQRコードもChangeBarCodeColor()でサポートされています。

