Migrating from Accusoft BarcodeXpress to IronBarcode
Accusoft BarcodeXpressから IronBarcode への移行
今回の移行作業の大部分は削除作業です。 2つのキーライセンスシステム ― SetOEMLicenseKeyは完全に消えます。 実際のバーコード操作(画像の読み取り、ファイルへのバーコード書き込み)は、より短いIronBarcodeの同等の操作に置き換えられます。 コードベースにBarcodeXpressをラップするBarcodeServiceクラスがある場合、ライセンスコードはその大部分を占めることがよくあります。 移行後、そのクラスは縮小します。
Accusoft BarcodeXpressから移行する理由
BarcodeXpressから移行するチームは、以下の要因を報告しています。
評価モードが正確なベンチマークを妨げる: 有効なOEM/ランタイムキーがないと、BarcodeXpress はデコードされた結果にリテラル文字列" UNLICENSED accusoft.com "をスタンプし、生成された2Dバーコードにも同じスタンプを適用します。 実際の文書での事前購入精度テストは、この透かし入り出力を生成するため、ライブラリが実際のスキャンタイプを正しく読み取ることを購入前に確認することができません。
2つのキーライセンスが運用のオーバーヘッドを増加させます: BarcodeXpressはSDKライセンス(SetSolutionName + SetOEMLicenseKey)から分離します。 CI/CDパイプライン、Dockerコンテナ、コンテナオーケストレーターはそれぞれ、キーシステムを個別のシークレットとして管理する必要があります。 ランタイムキーが欠如しているか無効であると、エラーを引き起こす代わりに透かし入り出力にフォールバックし、アサーションが非NULLの結果のみをチェックする場合、自動テストに合格する可能性のある障害モードを作り出します。
本番環境への導入には最低5つのランタイムライセンスが必要です。単一サーバーの導入であっても、最低5つのランタイムライセンスを購入する必要があります。 本番サーバー1台とステージングサーバー1台を運用するチームは、実際の使用量に関わらず、最低10個のランタイムライセンスを購入する必要があります。
標準版の処理速度上限:標準版では、処理速度が毎分40ページに制限されます。 そのペースだと、10万件の文書を処理するのに約41時間かかる。 上限を解除するには、Professionalエディションへのアップグレードが必要となり、既に購入済みのランタイムライセンスに加えて、開発者1人あたりのライセンス料金が高くなります。
ネイティブPDFサポートなし: BarcodeXpressでPDFファイルを読み取るには、別途ライブラリを使用して画像にレンダリングする必要があります。 その外部依存関係は、2つ目のライセンス費用、変換手順、そしてレンダリングされたページ画像を保持することによるメモリ負荷の増加をもたらします。
スレッドセーフ性にはインスタンスの隔離が必要です: BarcodeXpressのreaderオブジェクトはステートフルで、同時アクセスには安全ではありません。 並列バッチ処理には、スレッドごとに完全に初期化されたBarcodeXpressインスタンスが必要で、スレッドコンテキストごとに完全な2層のライセンス初期化が繰り返されます。
基本的な問題
BarcodeXpressは、マルチステップの初期化、ビットマップのロード、およびBarcodeType[]設定を要求します。バーコードが読み取れる前に以下を実行する必要があります:
using var bitmap = new Bitmap(imagePath);
var barcodeXpress = new BarcodeXpress(".");
barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
barcodeXpress.Licensing.SetOEMLicenseKey("2.0.OEMLicenseStringFromAccusoft...");
barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
};
Result[] results = barcodeXpress.reader.Analyze(bitmap);
var value = results.FirstOrDefault()?.BarcodeValue;
using var bitmap = new Bitmap(imagePath);
var barcodeXpress = new BarcodeXpress(".");
barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
barcodeXpress.Licensing.SetOEMLicenseKey("2.0.OEMLicenseStringFromAccusoft...");
barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
};
Result[] results = barcodeXpress.reader.Analyze(bitmap);
var value = results.FirstOrDefault()?.BarcodeValue;
Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk
Using bitmap As New Bitmap(imagePath)
Dim barcodeXpress = New BarcodeXpress(".")
barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
barcodeXpress.Licensing.SetOEMLicenseKey("2.0.OEMLicenseStringFromAccusoft...")
barcodeXpress.Reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
}
Dim results As Result() = barcodeXpress.Reader.Analyze(bitmap)
Dim value = results.FirstOrDefault()?.BarcodeValue
End Using
IronBarcodeはこのブロック全体を単一の静的呼び出しに置き換えます。
var value = BarcodeReader.Read(imagePath).First().Value;
var value = BarcodeReader.Read(imagePath).First().Value;
Dim value = BarcodeReader.Read(imagePath).First().Value
IronBarcodeとAccusoft BarcodeXpress:機能比較
| フィーチャー | Accusoft BarcodeXpress | IronBarcode |
|---|---|---|
| ライセンスモデル | SDKキー + OEM/ランタイムキー(別途購入) | 永久鍵1本 |
| 最小ランタイムライセンス | 5(サーバー1台の場合も) | ランタイムライセンスの概念なし |
| 評価モード | デコードされた値と生成された2Dバーコードに" UNLICENSED accusoft.com "のスタンプ | 全ての値が返されます。 生成された出力にのみ透かしを入れる |
| スループット制限 | 40 PPM(標準版) | どの階層でも制限なし |
| フォーマット自動検出 | 手動 ― BarcodeTypesに割り当てる必要があります。 |
サポートされているすべてのフォーマットで自動的に |
| PDFサポート | ビットマップをレンダリングするために外部ライブラリが必要 | ネイティブ ― BarcodeReader.Read("doc.pdf") |
| APIスタイル。 | インスタンスベース ビットマップ入力 プロパティ/メソッド設定 | 静的ファクトリメソッド、流暢なAPI |
| スレッドセーフ。 | スレッドごとにインスタンスが必要です | ステートレスな静的メソッド—スレッドセーフ |
| Dockerライセンス設定 | ライセンスファイルのマウントまたはライセンスサーバー | 単一の環境変数 |
| CI/CD シークレットが必要です | SDKキーペア + OEM/ランタイムキー | 一つの秘密 |
| .NET Framework / .NET Core | 別々のパッケージ: Accusoft.BarcodeXpress.Net および Accusoft.BarcodeXpress.NetCore |
単一のIronBarcodeパッケージ (.NET Framework 4.6.2+、.NET Core 3.1+、.NET 5–8) |
| Linux/macOS。 | はい(.NetCore パッケージを介して) | はい — Windows x64/x86、Linux x64、macOS x64/ARM |
| ロゴ入りQRコード | 手動のGDI+オーバーレイが必要です | 組み込みのAddBrandLogo("logo.png") |
| 価格設定のエントリーポイント | $1,960+ SDK + 最低5ランタイムライセンス | 749ドル(永久ライセンス、 Lite、開発者1名) |
| 永久ライセンス | 標準仕様ではありません - 営業担当者にお問い合わせください | はい、全ティア |
クイックスタート:Accusoft BarcodeXpressからIronBarcodeへの移行
ステップ 1: NuGet パッケージを置き換える
dotnet remove package Accusoft.BarcodeXpress.NetCore
dotnet add package IronBarcode
dotnet remove package Accusoft.BarcodeXpress.NetCore
dotnet add package IronBarcode
ステップ 2: 名前空間の更新
// Remove
using Accusoft.BarcodeXpressSdk;
// Add
using IronBarCode;
// Remove
using Accusoft.BarcodeXpressSdk;
// Add
using IronBarCode;
Imports IronBarCode
ステップ 3: ライセンスの初期化
アプリケーションのスタートアップ時に、一度だけライセンス初期化をStartup.cs、または依存性注入の設定に追加します。
// Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
本番環境では、環境変数またはシークレットマネージャーからキーを読み取ってください。
IronBarCode.License.LicenseKey =
Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
?? throw new InvalidOperationException("IronBarcode license key not configured");
IronBarCode.License.LicenseKey =
Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
?? throw new InvalidOperationException("IronBarcode license key not configured");
Imports IronBarCode
Imports System
License.LicenseKey = If(Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE"), Throw New InvalidOperationException("IronBarcode license key not configured"))
サーバごとの実行時アクティベーションがないSetOEMLicenseKeyなし。 以上がライセンス設定の全てです。
コード移行の例
ライセンスの初期化
BarcodeXpressのアプローチ:
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
// Constructor takes the path containing the Barcode Xpress runtime files.
_barcodeXpress = new BarcodeXpress(".");
// SDK license
_barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// OEM/runtime license — separate purchase, minimum 5 licenses required.
// Without this call, decoded values and generated 2D barcodes are
// stamped with " UNLICENSED accusoft.com ".
_barcodeXpress.Licensing.SetOEMLicenseKey(
"2.0.OEMLicenseStringFromAccusoft...");
}
}
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
// Constructor takes the path containing the Barcode Xpress runtime files.
_barcodeXpress = new BarcodeXpress(".");
// SDK license
_barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// OEM/runtime license — separate purchase, minimum 5 licenses required.
// Without this call, decoded values and generated 2D barcodes are
// stamped with " UNLICENSED accusoft.com ".
_barcodeXpress.Licensing.SetOEMLicenseKey(
"2.0.OEMLicenseStringFromAccusoft...");
}
}
Imports Accusoft.BarcodeXpressSdk
Public Class BarcodeService
Private ReadOnly _barcodeXpress As BarcodeXpress
Public Sub New()
' Constructor takes the path containing the Barcode Xpress runtime files.
_barcodeXpress = New BarcodeXpress(".")
' SDK license
_barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
' OEM/runtime license — separate purchase, minimum 5 licenses required.
' Without this call, decoded values and generated 2D barcodes are
' stamped with " UNLICENSED accusoft.com ".
_barcodeXpress.Licensing.SetOEMLicenseKey("2.0.OEMLicenseStringFromAccusoft...")
End Sub
End Class
IronBarcodeのアプローチ:
using IronBarCode;
// In Program.cs
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
// BarcodeService no longer needs a constructor or any license management
public class BarcodeService
{
// Ready to use — no initialization needed
}
using IronBarCode;
// In Program.cs
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
// BarcodeService no longer needs a constructor or any license management
public class BarcodeService
{
// Ready to use — no initialization needed
}
Imports IronBarCode
' In Program.vb
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
' BarcodeService no longer needs a constructor or any license management
Public Class BarcodeService
' Ready to use — no initialization needed
End Class
BarcodeXpress のコンストラクターは、二つのライセンスキーシステムとランタイムパスを管理するためだけに存在します。 IronBarcodeがアプリケーションのスタートアップで1行で置き換えます。BarcodeServiceクラスにはコンストラクタがまったく不要です。
バーコード読み取り
BarcodeXpressのアプローチ:
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public string ReadFirstBarcode(string imagePath)
{
// Analyze takes a System.Drawing.Bitmap; the SDK does not read PDFs directly.
using var bitmap = new Bitmap(imagePath);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
};
Result[] results = _barcodeXpress.reader.Analyze(bitmap);
return results.FirstOrDefault()?.BarcodeValue;
}
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public string ReadFirstBarcode(string imagePath)
{
// Analyze takes a System.Drawing.Bitmap; the SDK does not read PDFs directly.
using var bitmap = new Bitmap(imagePath);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
};
Result[] results = _barcodeXpress.reader.Analyze(bitmap);
return results.FirstOrDefault()?.BarcodeValue;
}
Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk
Public Function ReadFirstBarcode(imagePath As String) As String
' Analyze takes a System.Drawing.Bitmap; the SDK does not read PDFs directly.
Using bitmap As New Bitmap(imagePath)
_barcodeXpress.reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
}
Dim results As Result() = _barcodeXpress.reader.Analyze(bitmap)
Return results.FirstOrDefault()?.BarcodeValue
End Using
End Function
IronBarcodeのアプローチ:
using IronBarCode;
public string ReadFirstBarcode(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.First().Value;
}
using IronBarCode;
public string ReadFirstBarcode(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.First().Value;
}
Imports IronBarCode
Public Function ReadFirstBarcode(imagePath As String) As String
Dim results = BarcodeReader.Read(imagePath)
Return results.First().Value
End Function
new Bitmap(...)ロードステップの両方が消えます。 IronBarcode は、すべてのサポートされているシンボロジーにわたってフォーマットを自動検出し、ファイルパスを直接受け入れます。 サプライヤーがコード128からデータマトリックスに切り替えた場合でも、 IronBarcodeはコードを変更することなく引き続き動作します。 結果のプロパティ名も変更されます: Formatになります。 ソリューション全体にわたる検索置換機能により、両方の名前変更が処理されます。
1枚の画像から複数のバーコードを読み取る
BarcodeXpressのアプローチ:
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public IReadOnlyList<string> ReadAllBarcodes(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
};
Result[] results = _barcodeXpress.reader.Analyze(bitmap);
return results.Select(r => r.BarcodeValue).ToList();
}
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public IReadOnlyList<string> ReadAllBarcodes(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
};
Result[] results = _barcodeXpress.reader.Analyze(bitmap);
return results.Select(r => r.BarcodeValue).ToList();
}
Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk
Public Function ReadAllBarcodes(imagePath As String) As IReadOnlyList(Of String)
Using bitmap As New Bitmap(imagePath)
_barcodeXpress.reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
}
Dim results As Result() = _barcodeXpress.reader.Analyze(bitmap)
Return results.Select(Function(r) r.BarcodeValue).ToList()
End Using
End Function
IronBarcodeのアプローチ:
using IronBarCode;
public IReadOnlyList<string> ReadAllBarcodes(string imagePath)
{
var options = new BarcodeReaderOptions { ExpectMultipleBarcodes = true };
var results = BarcodeReader.Read(imagePath, options);
return results.Select(r => r.Value).ToList();
}
using IronBarCode;
public IReadOnlyList<string> ReadAllBarcodes(string imagePath)
{
var options = new BarcodeReaderOptions { ExpectMultipleBarcodes = true };
var results = BarcodeReader.Read(imagePath, options);
return results.Select(r => r.Value).ToList();
}
Imports IronBarCode
Public Function ReadAllBarcodes(imagePath As String) As IReadOnlyList(Of String)
Dim options As New BarcodeReaderOptions With {.ExpectMultipleBarcodes = True}
Dim results = BarcodeReader.Read(imagePath, options)
Return results.Select(Function(r) r.Value).ToList()
End Function
ExpectMultipleBarcodesはIronBarcodeに対して最初の一致後もスキャンを続行するよう指示し、複数のコードが異なる領域にあるドキュメントに便利です。 読み取りオプションの詳細については、 IronBarcodeの読み取りに関するドキュメントを参照してください。
バッチ処理
BarcodeXpressはインスタンスベースでそのreaderオブジェクトはステートフルであるため、並列バッチ処理にはスレッドごとに1つのインスタンスが必要であり、スレッドごとに完全な2層ライセンス初期化が繰り返されます。 IronBarcodeの静的メソッドはステートレスであるため、Parallel.ForEachにはインスタンス管理が不要です。
BarcodeXpressのアプローチ:
using System.Collections.Generic;
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
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
};
Result[] barcodes = _barcodeXpress.reader.Analyze(bitmap);
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
using System.Collections.Generic;
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
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
};
Result[] barcodes = _barcodeXpress.reader.Analyze(bitmap);
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
Imports System.Collections.Generic
Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk
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 As Result() = _barcodeXpress.reader.Analyze(bitmap)
If barcodes.Length > 0 Then
results(path) = barcodes(0).BarcodeValue
End If
End Using
Next
Return results
End Function
IronBarcodeのアプローチ:
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;
public Dictionary<string, string> ProcessBatch(string[] imagePaths)
{
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, file =>
{
var r = BarcodeReader.Read(file);
var first = r.FirstOrDefault();
if (first != null)
results[file] = first.Value;
});
return new Dictionary<string, string>(results);
}
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;
public Dictionary<string, string> ProcessBatch(string[] imagePaths)
{
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, file =>
{
var r = BarcodeReader.Read(file);
var first = r.FirstOrDefault();
if (first != null)
results[file] = first.Value;
});
return new Dictionary<string, string>(results);
}
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
Public Function ProcessBatch(imagePaths As String()) As Dictionary(Of String, String)
Dim results = New ConcurrentDictionary(Of String, String)()
Parallel.ForEach(imagePaths, Sub(file)
Dim r = BarcodeReader.Read(file)
Dim first = r.FirstOrDefault()
If first IsNot Nothing Then
results(file) = first.Value
End If
End Sub)
Return New Dictionary(Of String, String)(results)
End Function
BarcodeXpress Standard Editionの40ページ/分という上限のために、40ページごとのグループ間にスリープ処理を入れたり、1分あたりのカウンターを追跡したり、遅延処理を追加したりするなど、レート制限処理コードを追加していた場合は、そのコードを完全に削除してください。 IronBarcodeには処理能力の上限がありません。
PDFサポートを追加
BarcodeXpressはPDFファイルから直接バーコードを読み取ることはできません。 一般的な回避策としては、別途PDFレンダリングライブラリを追加し、各ページをメモリ上の画像としてレンダリングし、それらの画像を1つずつバーコードリーダーに渡すという方法がある。
BarcodeXpressのアプローチ:
// Requires a separate PDF library (not shown — varies by team choice)
// Pattern: render each PDF page to a Bitmap, then pass it to Analyze.
foreach (Bitmap pageBitmap in pdfRenderer.RenderPages("document.pdf"))
{
using (pageBitmap)
{
_barcodeXpress.reader.BarcodeTypes = Enum.GetValues(typeof(BarcodeType));
Result[] barcodes = _barcodeXpress.reader.Analyze(pageBitmap);
// ... collect results
}
}
// Requires a separate PDF library (not shown — varies by team choice)
// Pattern: render each PDF page to a Bitmap, then pass it to Analyze.
foreach (Bitmap pageBitmap in pdfRenderer.RenderPages("document.pdf"))
{
using (pageBitmap)
{
_barcodeXpress.reader.BarcodeTypes = Enum.GetValues(typeof(BarcodeType));
Result[] barcodes = _barcodeXpress.reader.Analyze(pageBitmap);
// ... collect results
}
}
Imports System
Imports System.Drawing
' Requires a separate PDF library (not shown — varies by team choice)
' Pattern: render each PDF page to a Bitmap, then pass it to Analyze.
For Each pageBitmap As Bitmap In pdfRenderer.RenderPages("document.pdf")
Using pageBitmap
_barcodeXpress.reader.BarcodeTypes = [Enum].GetValues(GetType(BarcodeType))
Dim barcodes As Result() = _barcodeXpress.reader.Analyze(pageBitmap)
' ... collect results
End Using
Next
IronBarcodeのアプローチ:
using IronBarCode;
// One call — no rendering step, no external dependency
var results = BarcodeReader.Read("document.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
using IronBarCode;
// One call — no rendering step, no external dependency
var results = BarcodeReader.Read("document.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
Imports IronBarCode
' One call — no rendering step, no external dependency
Dim results = BarcodeReader.Read("document.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}")
Next
BarcodeXpressの読み込みワークフローをサポートする目的だけで追加されたなければ、itext7、またはその他のPDFライブラリを移行後に削除することができます。 IronBarcode PDF 読み取りガイド を参照し、ページ範囲の選択などのオプションを含む追加のオプションを確認してください。
バーコード生成
BarcodeXpressのアプローチ:
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public void GenerateBarcode(string data, string outputPath)
{
_barcodeXpress.writer.BarcodeType = BarcodeType.Code128Barcode;
_barcodeXpress.writer.BarcodeValue = data;
// CreateBitmap returns a System.Drawing.Bitmap; persist via Bitmap.Save.
using Bitmap bitmap = _barcodeXpress.writer.CreateBitmap();
bitmap.Save(outputPath);
}
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public void GenerateBarcode(string data, string outputPath)
{
_barcodeXpress.writer.BarcodeType = BarcodeType.Code128Barcode;
_barcodeXpress.writer.BarcodeValue = data;
// CreateBitmap returns a System.Drawing.Bitmap; persist via Bitmap.Save.
using Bitmap bitmap = _barcodeXpress.writer.CreateBitmap();
bitmap.Save(outputPath);
}
Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk
Public Sub GenerateBarcode(data As String, outputPath As String)
_barcodeXpress.writer.BarcodeType = BarcodeType.Code128Barcode
_barcodeXpress.writer.BarcodeValue = data
' CreateBitmap returns a System.Drawing.Bitmap; persist via Bitmap.Save.
Using bitmap As Bitmap = _barcodeXpress.writer.CreateBitmap()
bitmap.Save(outputPath)
End Using
End Sub
IronBarcodeのアプローチ:
using IronBarCode;
public void GenerateBarcode(string data, string outputPath)
{
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng(outputPath);
}
using IronBarCode;
public void GenerateBarcode(string data, string outputPath)
{
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng(outputPath);
}
Imports IronBarCode
Public Sub GenerateBarcode(data As String, outputPath As String)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng(outputPath)
End Sub
流暢なチェーンはプロパティの割り当て、Bitmap.Saveステップを置き換えます。データベースに格納するため、またはAPIから返すためにバイナリデータとしてバーコードを取得するには:
byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ToPngBinaryData();
byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ToPngBinaryData();
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128).ToPngBinaryData()
QRコード生成
BarcodeXpressのアプローチ:
_barcodeXpress.writer.BarcodeType = BarcodeType.QRCodeBarcode;
_barcodeXpress.writer.BarcodeValue = data;
using Bitmap bitmap = _barcodeXpress.writer.CreateBitmap();
bitmap.Save("qr.png");
// Logo overlay required manual GDI+ drawing on the returned Bitmap
_barcodeXpress.writer.BarcodeType = BarcodeType.QRCodeBarcode;
_barcodeXpress.writer.BarcodeValue = data;
using Bitmap bitmap = _barcodeXpress.writer.CreateBitmap();
bitmap.Save("qr.png");
// Logo overlay required manual GDI+ drawing on the returned Bitmap
Imports System.Drawing
_barcodeXpress.writer.BarcodeType = BarcodeType.QRCodeBarcode
_barcodeXpress.writer.BarcodeValue = data
Using bitmap As Bitmap = _barcodeXpress.writer.CreateBitmap()
bitmap.Save("qr.png")
' Logo overlay required manual GDI+ drawing on the returned Bitmap
End Using
IronBarcodeのアプローチ:
using IronBarCode;
using IronSoftware.Drawing;
// Simple QR
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
// With branded logo
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
// With high error correction (for logo overlays)
QRCodeWriter.CreateQrCode(
"https://example.com",
500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded-high-ecc.png");
// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
.ChangeBarCodeColor(Color.DarkBlue)
.SaveAsPng("qr-colored.png");
using IronBarCode;
using IronSoftware.Drawing;
// Simple QR
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
// With branded logo
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
// With high error correction (for logo overlays)
QRCodeWriter.CreateQrCode(
"https://example.com",
500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded-high-ecc.png");
// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
.ChangeBarCodeColor(Color.DarkBlue)
.SaveAsPng("qr-colored.png");
Imports IronBarCode
Imports IronSoftware.Drawing
' Simple QR
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.SaveAsPng("qr.png")
' With branded logo
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.AddBrandLogo("logo.png") _
.SaveAsPng("qr-branded.png")
' With high error correction (for logo overlays)
QRCodeWriter.CreateQrCode( _
"https://example.com", _
500, _
QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo("logo.png") _
.SaveAsPng("qr-branded-high-ecc.png")
' Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300) _
.ChangeBarCodeColor(Color.DarkBlue) _
.SaveAsPng("qr-colored.png")
ロゴの埋め込み、エラー訂正レベル、色のカスタマイズはすべて、流暢なAPIに組み込まれています。 BarcodeXpressでは、これらの機能を利用するには、最初のファイル書き込み後に手動でGDI+による描画を行う必要があります。 より多くのQRコードオプションについては、QRコード生成ガイドをご覧ください。
Accusoft BarcodeXpressAPI からIronBarcodeへのマッピングリファレンス
| Accusoft BarcodeXpress | IronBarcode |
|---|---|
new BarcodeXpress(".") |
静的メソッド - インスタンスは不要 |
Licensing.SetSolutionName("...") |
IronBarCode.License.LicenseKey = "key" |
Licensing.SetSolutionKey(a, b, c, d) |
(removed — not needed) |
Licensing.SetOEMLicenseKey(string) |
(removed — no OEM/runtime key concept) |
new Bitmap(path) + reader.Analyze(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.Code128Barcode |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
writer.BarcodeValue = "data" |
(first argument to CreateBarcode) |
writer.CreateBitmap() + bitmap.Save(path) |
.SaveAsPng(path) |
writer.BarcodeType = BarcodeType.QRCodeBarcode |
QRCodeWriter.CreateQrCode(data, size) |
| 40 PPM 標準制限値 | どの階層でもスループット制限はありません |
一般的な移行の問題と解決策
問題1:プロパティ名のコンパイルエラー
BarcodeXpress: 結果オブジェクトはIronBarcodeには存在しないBarcodeTypeを公開します。
解決策:ビルド前にソリューション全体で検索置換を実行します。
grep -r "\.BarcodeValue" --include="*.cs" .
grep -r "\.BarcodeType" --include="*.cs" .
grep -r "\.BarcodeValue" --include="*.cs" .
grep -r "\.BarcodeType" --include="*.cs" .
見つかったすべてのファイルでresult.Formatに置き換えます。
問題2: ライセンス構成の呼び出しが孤立
BarcodeXpress: SetOEMLicenseKey呼び出し ― プラス、デコードされた出力に"UNLICENSED accusoft.com"の透かしを検出するカスタム アサーションは、透かし付きの出力障害モードに対する防御として多くのコードベースに存在します。
ソリューション: すべてのこれらの呼び出しサイトを見つけて削除してください — IronBarcode には同等の状態がありません。 ライセンスキーは、有効であるかどうかのいずれかであり、有効でなければ、個々のデコード値を劣化させることなく一様にトライアル制限が適用されます。
grep -r "SetOEMLicenseKey" --include="*.cs" .
grep -r "SetSolutionName" --include="*.cs" .
grep -r "SetSolutionKey" --include="*.cs" .
grep -r "UNLICENSED accusoft" --include="*.cs" .
grep -r "SetOEMLicenseKey" --include="*.cs" .
grep -r "SetSolutionName" --include="*.cs" .
grep -r "SetSolutionKey" --include="*.cs" .
grep -r "UNLICENSED accusoft" --include="*.cs" .
これらの通話サイトはすべて削除できます。
問題3:Dockerライセンスファイルを環境変数にマウントする
BarcodeXpress: Dockerデプロイメントは通常、既知のパスでコンテナにBarcodeXpressライセンス構成ファイルをマウントするCOPYまたはボリューム マウント命令を使用します。
解決策:設定ファイルのコピーを削除し、環境変数に置き換えてください。
# Remove this
COPY accusoft-license.lic /app/license/
# Add this
ENV IRONBARCODE_LICENSE=YOUR-LICENSE-KEY
アプリケーションの起動時:
IronBarCode.License.LicenseKey =
Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
IronBarCode.License.LicenseKey =
Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
Imports System
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
Kubernetesでは、ライセンスキーはPod仕様内の秘密参照になります。
env:
- name: IRONBARCODE_LICENSE
valueFrom:
secretKeyRef:
name: ironbarcode-secrets
key: license-key
env:
- name: IRONBARCODE_LICENSE
valueFrom:
secretKeyRef:
name: ironbarcode-secrets
key: license-key
第4号:レート制限処理コード
BarcodeXpress:標準版の40PPMの上限内で大量のバッチを処理するチームは、制限内に収まるように、文書のグループ間にスリープモードを追加したり、分単位のカウンターを追跡したり、遅延を導入したりするコードを追加することがよくありました。
解決策:レート制限コードをすべて削除してください。 以下の方法で探してください:
grep -r "40\|PPM\|pagesPerMinute\|minuteStart" --include="*.cs" .
grep -r "40\|PPM\|pagesPerMinute\|minuteStart" --include="*.cs" .
IronBarcodeには処理能力の上限がありません。お使いのインフラストラクチャがサポートする速度で処理できます。
問題5:スレッドセーフティ - インスタンスプールの削除
BarcodeXpress: 並行処理をサポートするコードベースは、多くの場合、ThreadLocal<BarcodeXpress>パターンを使用して状態のあるリーダーをスレッドごとに分離します。
解決策:プーリングロジックを完全に削除する。 IronBarcodeのBarcodeWriter.CreateBarcodeはステートレスな静的メソッドです。 複数のスレッドからの同時呼び出しは、互いに干渉しません。
Accusoft BarcodeXpress移行チェックリスト
マイグレーション前のタスク
コードを変更する前に、コードベースを監査してBarcodeXpressの使用箇所をすべて特定してください。
grep -r "BarcodeXpress" --include="*.cs" .
grep -r "Accusoft" --include="*.cs" .
grep -r "SetSolutionName" --include="*.cs" .
grep -r "SetSolutionKey" --include="*.cs" .
grep -r "SetOEMLicenseKey" --include="*.cs" .
grep -r "reader\.Analyze" --include="*.cs" .
grep -r "writer\.CreateBitmap" --include="*.cs" .
grep -r "\.BarcodeValue" --include="*.cs" .
grep -r "\.BarcodeType" --include="*.cs" .
grep -r "BarcodeType\." --include="*.cs" .
grep -r "BarcodeXpress" --include="*.cs" .
grep -r "Accusoft" --include="*.cs" .
grep -r "SetSolutionName" --include="*.cs" .
grep -r "SetSolutionKey" --include="*.cs" .
grep -r "SetOEMLicenseKey" --include="*.cs" .
grep -r "reader\.Analyze" --include="*.cs" .
grep -r "writer\.CreateBitmap" --include="*.cs" .
grep -r "\.BarcodeValue" --include="*.cs" .
grep -r "\.BarcodeType" --include="*.cs" .
grep -r "BarcodeType\." --include="*.cs" .
BarcodeTypesの割り当てに明示的にリストされているバーコード形式に注意してください ― これらは全て、IronBarcodeで自動検出されます。 削除可能なレート制限処理コードを特定してください。- BarcodeXpressの読み取りをサポートするためだけに追加されたPDFレンダリングライブラリを特定し、これらも削除できます。 IronBarcodeのライセンスキーを取得し、シークレットマネージャーに追加してください。
コード更新タスク
- すべての
Accusoft.BarcodeXpress.NetCoreを削除します - バーコード機能を必要とするすべての
IronBarcodeを追加します - ファイル全体で
using IronBarCode;に置き換えます - アプリケーションの起動時に
IronBarCode.License.LicenseKey = ...を追加します - すべての
BarcodeXpressコンストラクタ呼び出しとインスタンス フィールドを削除します - すべての
SetOEMLicenseKeyの呼び出しを削除します 7.デコードされた出力をスキャンして" UNLICENSED accusoft.com "の透かしを検出するカスタムアサーションを削除する 8.new Bitmap(path)+reader.Analyze(bitmap)をBarcodeReader.Read(path)に置き換えます - すべての
reader.BarcodeTypes = ...の割り当てを削除します result.Valueに置き換えますresult.Formatに置き換えます 12.writer.CreateBitmap()+bitmap.Save(path)をBarcodeWriter.CreateBarcode(data, encoding).SaveAsPng(path)に置き換えます- レート制限スロットリングコードを削除する
- PDFレンダリング中間コードが存在する場合は削除する
- BarcodeXpressインスタンスのインスタンスプールまたは
ThreadLocalパターンを削除します - Dockerfileとdocker-composeファイルからライセンスファイルのマウントを削除します。
- Dockerおよびコンテナ構成に
IRONBARCODE_LICENSE環境変数を追加します - KubernetesのシークレットとPodの仕様を更新する
- CI/CDパイプラインのシークレットを更新します —
ACCUSOFT_RUNTIME_KEYを削除します;IRONBARCODE_LICENSEを追加
移行後のテスト
- ソリューションを構築する — 名前変更されたプロパティから発生する残りのコンパイルエラーを修正する
- すべてのバーコード読み取り操作に対して単体テストを実行する
- すべてのバーコード生成操作に対して単体テストを実行する
- 必要に応じてPDF入力でテストしてください バッチ処理テストを実行して、スループットのスロットリング動作がないことを確認します。 ステージング環境にデプロイし、環境変数からライセンスキーが正しく解決されることを確認します。
IronBarcodeへの移行の主なメリット
2つのキーライセンスの複雑さの排除: SetOEMLicenseKeyのセットアップが完全に消えます。 開発からプロダクションまでのすべての環境をカバーする単一のキーで、試用モードは各デコード値に" UNLICENSED accusoft.com "のスタンプを押さずに完全なデコード値を返すため、実際の文書での事前購入ベンチマークが可能です。
ランタイムライセンスの最小購入数はありません: BarcodeXpressは、本番環境での導入には最低5つのランタイムライセンスが必要です。 IronBarcodeにはランタイムライセンスという概念はありません。単一の永久ライセンスキーで、そのティア内の任意の数の本番環境へのデプロイメントをカバーできます。
スループットに上限なし:標準版の40PPMの上限、およびその上限内に収まるように記述されたレート制限コードは削除できます。 IronBarcodeは、基盤となるハードウェアとネットワークのサポートが許す限り、あらゆる速度で処理を実行し、どの価格帯においてもソフトウェアによる上限は設けられていません。
ネイティブPDFリーディング: BarcodeReader.Read("document.pdf") はPDFファイルを直接処理し、各ページの結果をページ番号、形式、値、および信頼スコアと共に返します。 BarcodeXpressをサポートするためだけに追加されたPDFレンダリングライブラリは削除できるため、依存関係とライセンスコストを削減できます。
ステートレスなスレッドセーフ性: BarcodeReader.Read と BarcodeWriter.CreateBarcode はステートレスな静的メソッドです。 インスタンスプール、ThreadLocalパターン、およびスレッドごとの初期化ブロックはすべて削除できます。 Parallel.ForEachを使用した並列処理には、スレッド対応の回避策を削除する以外に構造的な変更は必要ありません。
コンテナデプロイメントの簡素化: DockerおよびKubernetesのデプロイメントでは、ライセンス構成に単一の環境変数を使用します。 ライセンスファイルの配布、ライセンスサーバーのインフラストラクチャ、および設定ファイルのマウントはすべて不要になります。
よくある質問
なぜAccusoft BarcodeXpressからIronBarcodeに移行する必要があるのですか?
一般的な理由としては、ライセンスの簡素化(SDK + ランタイムキーの複雑さの排除)、スループット制限の排除、ネイティブPDFサポートの獲得、Docker/CI/CDデプロイの改善、プロダクションコード内のAPI定型文の削減などが挙げられます。
Accusoft BarcodeXpressのAPIコールをIronBarcodeに置き換えるには?
インスタンスの作成とライセンスの定型文をIronBarCode.License.LicenseKey = "key "に置き換えてください。リーダー・コールをBarcodeReader.Read(path)に、ライター・コールをBarcodeWriter.CreateBarcode(data, encoding)に置き換えてください。静的メソッドはインスタンス管理を必要としません。
Accusoft BarcodeXpressからIronBarcodeに移行する際、コードはどのくらい変更されますか?
ほとんどのマイグレーションでは、コード行数は少なくなります。ライセンスの定型文、インスタンス・コンストラクタ、明示的なフォーマット設定が削除されます。コアとなる読み取り/書き込み操作は、より短いIronBarcodeに対応し、よりきれいな結果オブジェクトが得られます。
移行中、Accusoft BarcodeXpressとIronBarcodeの両方をインストールしておく必要がありますか?
ほとんどのマイグレーションは、並列操作ではなく、直接置き換えです。一度に1つのサービスクラスを移行し、NuGet参照を置き換え、インスタンス化とAPI呼び出しパターンを更新してから次のクラスに移行します。
IronBarcodeのNuGetパッケージ名は何ですか?
パッケージは'IronBarcode'(大文字のBとC)です。Install-Package IronBarcode'または'dotnet add package IronBarcode'でインストールしてください。コード中のusingディレクティブは'using IronBarcode;'である。
IronBarcode は Accusoft BarcodeXpress と比較して、どのように Docker デプロイメントを簡素化しますか?
IronBarcodeは外部SDKファイルやマウントされたライセンス設定のないNuGetパッケージです。Dockerでは、IRONBARCODE_LICENSE_KEY環境変数を設定すると、パッケージが起動時にライセンス検証を処理します。
IronBarcode はAccusoft BarcodeXpressから移行した後、すべてのバーコードフォーマットを自動的に検出しますか?
IronBarcodeは、サポートされているすべてのフォーマットのシンボルを自動検出します。明示的なBarcodeTypesの列挙は必要ありません。フォーマットが既に知られていて、パフォーマンスが重要な場合、BarcodeReaderOptionsは最適化として検索空間を制限することができます。
IronBarcodeは別のライブラリなしでPDFからバーコードを読み取ることができますか?
BarcodeReader.Read("document.pdf")は、PDFファイルをネイティブに処理します。結果には、見つかった各バーコードの PageNumber、Format、Value、および Confidence が含まれます。外部のPDFレンダリングステップは必要ありません。
IronBarcodeはどのようにパラレルバーコード処理を行うのですか?
IronBarcodeの静的メソッドはステートレスでスレッドセーフです。Parallel.ForEachをスレッドごとのインスタンス管理なしにファイルリスト上で直接使用します。BarcodeReaderOptions.MaxParallelThreadsは内部のスレッドバジェットを制御します。
Accusoft BarcodeXpressからIronBarcodeに移行すると、どのような結果プロパティが変更されますか?
一般的なリネーム:BarcodeValueはValueに、BarcodeTypeはFormatに。IronBarcodeの結果にはConfidenceとPageNumberも追加されます。ソリューション全体の検索と置換は、既存の結果処理コードで名前の変更を処理します。
CI/CDパイプラインでIronBarcodeのライセンスを設定するには?
IRONBARCODE_LICENSE_KEYをパイプラインシークレットとして保存し、アプリケーションの起動コードにIronBarCode.License.LicenseKeyを割り当てます。1つのシークレットで、開発環境、テスト環境、ステージング環境、本番環境を含むすべての環境をカバーできます。
IronBarcodeはカスタムスタイルのQRコード生成に対応していますか?
はい。QRCodeWriter.CreateQrCode()は、ChangeBarCodeColor()によるカスタムカラー、AddBrandLogo()によるロゴ埋め込み、設定可能なエラー訂正レベル、PNG、JPG、PDF、ストリームなどの複数の出力形式をサポートしています。

