フッターコンテンツにスキップ
他のコンポーネントと比較する

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

このガードは、評価モードの出力がデコード中に例外を投げず、スタンプ付きの結果を静かに返すことに気付いたときにチームが追加するパターンです。

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
$vbLabelText   $csharpLabel

このコンストラクターは、バーコード操作が実行される前に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"
$vbLabelText   $csharpLabel

これが完全なライセンス設定です。別個のランタイム解除はなく、ソリューション名もなく、二引数の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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

スタンダード版では、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)
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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はその所有者の登録商標です。 このサイトはAccusoftと提携しておらず、承認、擁護、または支援されていません。 すべての製品名、ロゴ、およびブランドは各所有者の所有物です。 比較は情報提供のみを目的としており、執筆時点で公開されている情報を反映しています。

よくある質問

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()でサポートされています。

Curtis Chau
テクニカルライター

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

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね