Accusoft BarcodeXpress vs IronBarcode: Porównanie bibliotek kodów kreskowych C#
Oceniając bibliotekę kodów kreskowych na podstawie wersji próbnej, oczekujesz, że przed podjęciem decyzji o zakupie sprawdzisz, czy faktycznie działa ona na Twoich obrazach. Accusoft BarcodeXpress nie oferuje takiej opcji. W trybie oceny zdekodowane wartości BARCODE są częściowo zasłonięte — "1234567890" wyświetla się jako "1234...XXX". Można sprawdzić, czy biblioteka wykrywa BARCODE, ale nie można sprawdzić, czy odczytuje go poprawnie. Jest to sytuacja typu "najpierw zatwierdź, potem sprawdź" i stanowi to istotny punkt tarcia, zanim jeszcze przyjrzysz się cenom.
Zrozumienie Accusoft BarcodeXpress
Accusoft od dziesięcioleci tworzy oprogramowanie do przetwarzania obrazów dokumentów dla środowisk Enterprise. BarcodeXpress jest częścią szerszej rodziny produktów, która obejmuje PrizmDoc, ImageGear i Accusoft Imaging. Zespoły już korzystające z tych produktów mają do czynienia ze znanym interfejsem API i mogą polegać na istniejących relacjach z Accusoft. W przypadku samodzielnego wykorzystania kodów kreskowych kontekst ten ma mniejszą wartość.
Podstawowy zestaw SDK jest dostępny jako pakiet NuGet dla .NET Core. API jest oparte na instancjach — tworzysz obiekt BarcodeXpress, konfigurujesz właściwość Licensing, a następnie używasz obiektów potomnych reader i writer do rzeczywistych operacji. System licencji z podwójnym kluczem odróżnia BarcodeXpress od większości alternatywnych rozwiązań.
Kluczowe cechy architektury BarcodeXpress:
- API oparte na instancjach: Każda operacja wymaga instancji
BarcodeXpress; static convenience methods are not part of the design - Licencjonowanie dwupoziomowe: licencjonowanie SDK (
SolutionName+SolutionKey) oraz licencjonowanie środowiska uruchomieniowego (UnlockRuntime) to odrębne systemy wymagające oddzielnych zakupów - Ukrywanie w trybie oceny: W trybie oceny zdekodowane wartości są celowo zniekształcane — "1234567890" zwraca się jako "1234...XXX" — co uniemożliwia przeprowadzenie testów dokładności przed zakupem
- Ręczna specyfikacja formatu: czytnik wymaga wyraźnej konfiguracji
BarcodeTypesw celu wyliczenia symboli, których ma szukać; unspecified formats are not detected - Standardowy limit 40 stron na minutę: Wersja Standard ogranicza przetwarzanie do 40 stron na minutę, co jest limitem, z którym większość zespołów spotyka się raczej po wdrożeniu niż przed nim
- Brak natywnej obsługi plików PDF: pliki PDF muszą zostać wstępnie przekształcone na obrazy przy użyciu oddzielnej biblioteki, zanim czytnik będzie mógł je przetworzyć
- Co najmniej pięć licencji uruchomieniowych: Nawet wdrożenie na jednym serwerze wymaga zakupu co najmniej pięciu licencji uruchomieniowych
Wyjaśnienie systemu dwóch kluczy
BarcodeXpress dzieli licencjonowanie na dwie koncepcyjnie odrębne warstwy:
// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;
var barcodeXpress = new BarcodeXpress();
// Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"));
// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;
var barcodeXpress = new BarcodeXpress();
// Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"));
Imports Accusoft.BarcodeXpressSdk
Dim barcodeXpress As New BarcodeXpress()
' Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName"
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")
' Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"))
Para SolutionName i SolutionKey aktywuje sam pakiet SDK. Wywołanie UnlockRuntime, które przyjmuje własny klucz i klucz rozwiązania jako oddzielne argumenty, aktywuje funkcje wdrażania produkcyjnego. Oba muszą być obecne i prawidłowe, aby wdrożenie produkcyjne zwracało kompletne, niezasłonięte wartości BARCODE.
Podczas przeglądu kodu ten wzorzec wywołuje przewidywalne pytanie: "Dłączego wywołujemy UnlockRuntime z dwoma różnymi kluczami?". Odpowiedź — że Accusoft traktuje licencjonowanie SDK i licencjonowanie wdrożeniowe jako odrębne produkty z oddzielnym rozliczeniem — nie zawsze jest oczywista na podstawie samego API. Zespoły utrzymujące ten kod sześć miesięcy po początkowej konfiguracji często muszą sięgać do dokumentacji, aby zrozumieć, który klucz jest który.
Właściwość IsRuntimeUnlocked pozwala sprawdzić, czy warstwa uruchomieniowa jest aktywna:
if (!barcodeXpress.Licensing.IsRuntimeUnlocked)
{
// In this state, barcode values are partially obscured
// "1234567890" returns as "1234...XXX"
Console.WriteLine("Warning: runtime license not active");
}
if (!barcodeXpress.Licensing.IsRuntimeUnlocked)
{
// In this state, barcode values are partially obscured
// "1234567890" returns as "1234...XXX"
Console.WriteLine("Warning: runtime license not active");
}
If Not barcodeXpress.Licensing.IsRuntimeUnlocked Then
' In this state, barcode values are partially obscured
' "1234567890" returns as "1234...XXX"
Console.WriteLine("Warning: runtime license not active")
End If
Ta kontrola jest zabezpieczeniem dodawanym przez zespoły, gdy zdają sobie sprawę, że wynik w trybie oceny zwraca w tle częściowe dane, zamiast zgłaszać wyjątek lub wyraźnie zakończyć się niepowodzeniem.
Zrozumienie IronBarcode
IronBarcode to samodzielna biblioteka IronBarcode .NET, która nie ma żadnych zewnętrznych zależności poza pakietem NuGet. Obsługuje zarówno generowanie, jak i odczyt za pomocą statycznych metod fabrycznych, co oznacza, że nie ma cyklu życia instancji do zarządzania ani wywołań konstruktorów rozrzuconych po kodzie aplikacji.
Model licencji typu "single-key" oznacza, że to, co testujesz w trybie próbnym, działa również w środowisku produkcyjnym — jedyną różnicą jest znak wodny na generowanych obrazach BARCODE podczas okresu próbnego. Wartości zdekodowane są zawsze kompletne, co oznacza, że przed podjęciem decyzji o zakupie można sprawdzić dokładność odczytu na rzeczywistych dokumentach.
Kluczowe cechy IronBarcode:
- Projekt statycznego API:
BarcodeReader.Read()iBarcodeWriter.CreateBarcode()to statyczne metody bezstanowe — nie wymagają zarządzania instancjami - Pojedynczy klucz licencyjny: jeden klucz obejmuje zarówno fazę rozwoju, jak i wdrożenie produkcyjne; there is no separate runtime license layer
- Pełne wartości próbne: Tryb próbny zwraca kompletne, zdekodowane wartości; Znacznik wodny dotyczy wyłącznie wygenerowanych obrazów wyjściowych, a nie wyników odczytu.
- Automatyczne wykrywanie formatu: IronBarcode automatycznie wykrywa symbole we wszystkich obsługiwanych formatach; nie jest potrzebna enumeracja
BarcodeTypes - Natywna obsługa plików PDF:
BarcodeReader.Read("document.pdf")przetwarza pliki PDF bezpośrednio, bez konieczności oddzielnego renderowania - Brak ograniczeń przepustowości: Szybkość przetwarzania jest ograniczona jedynie możliwościami sprzętu i sieci, a nie ograniczeniami narzuconymi przez oprogramowanie
- Bezpieczne dla wątków z założenia: bezstanowe metody statyczne mogą być wywoływane jednocześnie z dowolnej liczby wątków bez izolacji instancji
Porównanie funkcji
| Funkcja | Accusoft BarcodeXpress | IronBarcode |
|---|---|---|
| Model licencji | Licencja SDK + oddzielna licencja na środowisko uruchomieniowe | Pojedynczy klucz wieczny |
| Zachowanie trybu oceny | Wartości BarCode częściowo zasłonięte ("1234...XXX") | Zwracane są pełne wartości, znak wodny pojawia się tylko na wygenerowanym wyniku |
| Limit przepustowości (Standard) | 40 stron na minutę | Brak ograniczeń przepustowości |
| Obsługa plików PDF | Wymaga zewnętrznej biblioteki PDF do wyodrębniania obrazów | Język ojczysty — BarcodeReader.Read("doc.pdf") |
| Styl API | Konfiguracja oparta na instancjach, rozbudowana | Statyczne metody fabryczne, płynny interfejs API |
| Bezpieczeństwo wątków | Wymagana liczba instancji na wątek | Metody statyczne bezstanowe — naturalnie bezpieczne dla wątków |
| Cena początkowa | 1960 USD + SDK + 2500 USD + środowisko uruchomieniowe (min. 5) | 749 USD na zawsze (wersja Lite, 1 programista) |
Szczegółowe porównanie funkcji
| Funkcja | Accusoft BarcodeXpress | IronBarcode |
|---|---|---|
| Licencjonowanie | ||
| Model licencji | Klucz SDK + klucz środowiska uruchomieniowego | Pojedynczy klucz wieczny |
| Minimalne licencje na środowisko uruchomieniowe | 5 (nawet dla 1 serwera) | Brak koncepcji licencji na czas działania |
| Tryb oceny | Wartości zamaskowane jako "1234...XXX" | Pełne wartości, znak wodny tylko na obrazach wyjściowych |
| Licencja wieczysta | Niestandardowe — skontaktuj się z działem sprzedaży | Tak, wszystkie poziomy |
| Roczne odnowienie | Wymagane do wsparcia | Opcjonalnie |
| Czytanie | ||
| Automatyczne wykrywanie formatu | Podręcznik — należy określić typy BARCODE | Automatyczne dla wszystkich obsługiwanych formatów |
| Odczytywanie plików PDF | Wymagana zewnętrzna biblioteka PDF | Język ojczysty |
| Wiele BarCode na jednym obrazie | Tak, z konfiguracją BarcodeTypes |
Tak, z opcją ExpectMultipleBarcodes |
| Właściwości wyniku | BarcodeValue, BarcodeType |
Value, Format, Confidence, PageNumber |
| Limit przepustowości | 40 PPM (wersja standardowa) | Brak limitów na żadnym poziomie |
| Generacja | ||
| Generowanie kodu 128 | Tak, poprzez writer.BarcodeType |
Tak, poprzez BarcodeWriter.CreateBarcode() |
| Generowanie kodów QR | Tak | Tak, poprzez QRCodeWriter.CreateQrCode() |
| Kod QR z logo | Wymagane ręczne nakładanie obrazów | AddBrandLogo("logo.png") wbudowany |
| Formaty wyjściowe | Zapis pliku | PNG, JPG, PDF, dane binarne, strumień |
| Platforma i wdrożenie | ||
| .NET Framework | Oddzielny starszy zestaw SDK | .NET Framework 4.6.2+ |
| .NET Core / .NET 5+ | Tak (.NET Core SDK) | .NET Core 3.1+, .NET 5/6/7/8/9 |
| Linux/Docker | Tak | Tak — Windows x64/x86, Linux x64, macOS x64/ARM |
| Konfiguracja licencji Docker | Plik licencji lub serwer licencji | Zmienna środowiskowa |
| Integracja CI/CD | Wymagane są zarówno klucze SDK, jak i klucze środowiska uruchomieniowego | Jeden sekret |
| Przetwarzanie wsadowe | ||
| Bezpieczeństwo wątków | Wymagana liczba instancji na wątek | Bezstanowe — bezpieczne dla Parallel.ForEach |
| Partia równoległa | Wymaga zarządzania instancjami na poziomie wątku | Bezpośrednia obsługa Parallel.ForEach |
Architektura licencji
Różnica w złożoności licencji między BarcodeXpress a IronBarcode jest najbardziej widoczna podczas pisania kodu inicjalizacyjnego, który będzie działał w środowisku produkcyjnym.
Podejście BarcodeXpress
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
_barcodeXpress = new BarcodeXpress();
// Layer 1: SDK license
_barcodeXpress.Licensing.SolutionName = "AcmeCorp";
_barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Layer 2: Runtime license — separate purchase, minimum 5
_barcodeXpress.Licensing.UnlockRuntime(
"RuntimeKey-XXXXXX",
Convert.ToInt64("98765432109876"));
// Guard against partial-value mode
if (!_barcodeXpress.Licensing.IsRuntimeUnlocked)
{
throw new InvalidOperationException(
"Runtime license not active — barcode values will be obscured");
}
}
}
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
_barcodeXpress = new BarcodeXpress();
// Layer 1: SDK license
_barcodeXpress.Licensing.SolutionName = "AcmeCorp";
_barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Layer 2: Runtime license — separate purchase, minimum 5
_barcodeXpress.Licensing.UnlockRuntime(
"RuntimeKey-XXXXXX",
Convert.ToInt64("98765432109876"));
// Guard against partial-value mode
if (!_barcodeXpress.Licensing.IsRuntimeUnlocked)
{
throw new InvalidOperationException(
"Runtime license not active — barcode values will be obscured");
}
}
}
Imports Accusoft.BarcodeXpressSdk
Public Class BarcodeService
Private ReadOnly _barcodeXpress As BarcodeXpress
Public Sub New()
_barcodeXpress = New BarcodeXpress()
' Layer 1: SDK license
_barcodeXpress.Licensing.SolutionName = "AcmeCorp"
_barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")
' Layer 2: Runtime license — separate purchase, minimum 5
_barcodeXpress.Licensing.UnlockRuntime("RuntimeKey-XXXXXX", Convert.ToInt64("98765432109876"))
' Guard against partial-value mode
If Not _barcodeXpress.Licensing.IsRuntimeUnlocked Then
Throw New InvalidOperationException("Runtime license not active — barcode values will be obscured")
End If
End Sub
End Class
Jest to 15-wierszowy konstruktor, który służy wyłącznie do zarządzania dwoma oddzielnymi systemami kluczy licencyjnych przed rozpoczęciem jakiejkolwiek operacji związanej z BarCode. Zabezpieczenie IsRuntimeUnlocked nie jest opcjonalne — bez niego usługa w sposób niewidoczny zwróci wartości o obniżonej jakości w każdym Årodowisku, w którym brakuje klucza środowiska uruchomieniowego lub jest on nieprawidłowo skonfigurowany.
Podejście IronBarcode
using IronBarCode;
// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-KEY";
using IronBarCode;
// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-KEY";
Imports IronBarCode
' In Program.vb or startup configuration
IronBarCode.License.LicenseKey = "YOUR-KEY"
To jest kompletna konfiguracja licencji. Bez oddzielnego odblokowywania środowiska uruchomieniowego, bez nazwy rozwiązania, bez wywołania UnlockRuntime z dwoma argumentami. W Dockerze staje się to zmienną środowiskową odczytywaną podczas uruchamiania. W potoku CI/CD jest to jeden sekret. W w orkiestratorze kontenerów jest to jedna zmienna środowiskowa wstrzyknięta do podu.
Odczytywanie BarCodes
Odczyt kodu kreskowego ujawnia różnicę między filozofiami konfiguracji obu bibliotek — BarcodeXpress wymaga jawnego wyliczenia formatów i API konfiguracji opartego na właściwościach, podczas gdy IronBarcode automatycznie wykrywa wszystko na podstawie jednego wywołania metody.
Podejście BarcodeXpress
Odczyt za pomocą BarcodeXpress wymaga skonfigurowania czytnika za pomocą SetPropertyValue, który przyjmuje stałą i wartość, a następnie wywołania Analyze() w celu pobrania wyników:
using Accusoft.BarcodeXpressSdk;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var barcodeXpress = new BarcodeXpress();
barcodeXpress.Licensing.SolutionName = "AcmeCorp";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"));
barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath);
barcodeXpress.reader.BarcodeTypes =
BarcodeType.LinearBarcode |
BarcodeType.DataMatrixBarcode |
BarcodeType.QRCodeBarcode;
var results = barcodeXpress.reader.Analyze();
return results.Select(r => r.BarcodeValue);
}
using Accusoft.BarcodeXpressSdk;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var barcodeXpress = new BarcodeXpress();
barcodeXpress.Licensing.SolutionName = "AcmeCorp";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"));
barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath);
barcodeXpress.reader.BarcodeTypes =
BarcodeType.LinearBarcode |
BarcodeType.DataMatrixBarcode |
BarcodeType.QRCodeBarcode;
var results = barcodeXpress.reader.Analyze();
return results.Select(r => r.BarcodeValue);
}
Imports Accusoft.BarcodeXpressSdk
Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
Dim barcodeXpress = New BarcodeXpress()
barcodeXpress.Licensing.SolutionName = "AcmeCorp"
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")
barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"))
barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath)
barcodeXpress.reader.BarcodeTypes = BarcodeType.LinearBarcode Or BarcodeType.DataMatrixBarcode Or BarcodeType.QRCodeBarcode
Dim results = barcodeXpress.reader.Analyze()
Return results.Select(Function(r) r.BarcodeValue)
End Function
Stała cycBxeSetFilename jest sposobem API na określenie pliku do przetworzenia. Ten wzorzec — przekazywanie stałego identyfikatora wraz z wartością do ogólnej metody SetPropertyValue — przypomina starsze interfejsy API oparte na COM. Jeśli dokument zawiera format niewymieniony w BarcodeTypes, nie zostanie on znaleziony. W przypadku zmiany dokumentów źródłowych powoduje to dodatkowe obciążenie związane z utrzymaniem.
Podejście 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 automatycznie wykrywa format we wszystkich obsługiwanych symbolikach. Jeśli obraz zawiera kod 128, kod QR i DataMatrix, wszystkie trzy pojawiają się w zbiorze wyników bez żadnych zmian w konfiguracji. Aby zapewnić większą kontrolę nad sposobem odczytu, klasa BarcodeReaderOptions udostępnia ustawienia prędkości, liczby wątków oraz obsługi wielu kodów kreskowych.
Natywne odczytywanie plików PDF jest również dostępne za pomocą tej samej metody:
using IronBarCode;
// Język ojczysty 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;
// Język ojczysty 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
' Język ojczysty 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 nie odczytuje plików PDF w sposób natywny. Najpierw należy renderować każdą stronę do obrazu, używając oddzielnej biblioteki, a następnie przekazać te obrazy do czytnika BarcodeXpress. Powoduje to dodanie zależności, etapu konwersji oraz dodatkowych kosztów licencji w zależności od wybranej biblioteki PDF.
Przetwarzanie wsadowe i bezpieczeństwo wątków
Przetwarzanie dużych ilości kodów kreskowych ujawnia różnicę architektoniczną między modelem instancji z zachowaniem stanu w BarcodeXpress a statycznym API bez zachowania stanu w IronBarcode.
Podejście BarcodeXpress
BarcodeXpress jest oparty na instancjach, a jego obiekt reader jest stanowy. Przetwarzanie równoległe wymaga jednej instancji na wątek, przy czym pełna dwuwarstwowa inicjalizacja licencji jest powtarzana w kontekście każdego wątku:
using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
_barcodeXpress.reader.SetPropertyValue(
BarcodeXpress.cycBxeSetFilename, path);
_barcodeXpress.reader.BarcodeTypes =
BarcodeType.LinearBarcode | BarcodeType.QRCodeBarcode;
var barcodes = _barcodeXpress.reader.Analyze();
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
_barcodeXpress.reader.SetPropertyValue(
BarcodeXpress.cycBxeSetFilename, path);
_barcodeXpress.reader.BarcodeTypes =
BarcodeType.LinearBarcode | BarcodeType.QRCodeBarcode;
var barcodes = _barcodeXpress.reader.Analyze();
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
Imports Accusoft.BarcodeXpressSdk
Imports System.Collections.Generic
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
_barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, path)
_barcodeXpress.reader.BarcodeTypes = BarcodeType.LinearBarcode Or BarcodeType.QRCodeBarcode
Dim barcodes = _barcodeXpress.reader.Analyze()
If barcodes.Length > 0 Then
results(path) = barcodes(0).BarcodeValue
End If
Next
Return results
End Function
Wersja Standard Edition nakłada również ograniczenie do 40 stron na minutę. Przetworzenie partii 100 000 dokumentów przy prędkości 40 stron na minutę zajmuje około 41 godzin. Wersja Professional Edition znosi ten limit, ale wiąże się to z wyższym kosztem na programistę — oprócz już zakupionych licencji na środowisko uruchomieniowe.
Podejście 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)
Ponieważ metody statyczne IronBarcode są bezstanowe, Parallel.ForEach nad nimi jest bezpieczne i nie wymaga izolacji instancji. IronBarcode nie nakłada żadnych ograniczeń przepustowości w żadnym przedziale cenowym. W celu dostosowania wydajności odczytu klasa BarcodeReaderOptions udostępnia ustawienia ReadingSpeed i 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 jest wartością domyślną. Użyj ReadingSpeed.Faster dla potoków o dużej przepustowości, gdzie BARCODE jest wyraźny, lub ReadingSpeed.Detailed dla obrazów uszkodzonych lub o niskim kontraście.
Przewodnik po mapowaniu API
| Accusoft BarcodeXpress | IronBarcode |
|---|---|
new BarcodeXpress() |
Metody statyczne — nie wymagają instancji |
Licensing.SolutionName = "..." |
IronBarCode.License.LicenseKey = "key" |
Licensing.SolutionKey = longValue |
(removed — not needed) |
Licensing.UnlockRuntime(key, solutionKey) |
(removed — no runtime license concept) |
Licensing.IsRuntimeUnlocked |
(removed — license is always either valid or not) |
reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, path) |
BarcodeReader.Read(path) |
reader.BarcodeTypes = BarcodeType.LinearBarcode \| ... |
(removed — auto-detection handles all formats) |
reader.Analyze() |
(part of BarcodeReader.Read) |
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) |
| Standardowy limit 40 stron na minutę | Brak ograniczeń przepustowości na żadnym poziomie |
| Ocena: wartości zamaskowane jako "1234...XXX" | Wersja próbna: pełne wartości, znak wodny tylko na obrazach wyjściowych |
Kiedy zespoły rozważają przejście z Accusoft BarcodeXpress na IronBarcode
Przekraczanie bariery 40 stron na minutę
Limit 40 stron na minutę w wersji Standard Edition wydaje się hojny, dopóki zespół biznesowy nie zdecyduje się na przetwarzanie wsadowe na koniec dnia archiwalnych faktur z całego roku. Przetworzenie partii 100 000 dokumentów przy tej szybkości zajmuje około 41 godzin. Przejście na wersję Professional Edition znosi limit, ale wiąże się z wyższym kosztem licencji na stanowisko programisty — oprócz już zakupionych licencji na środowisko uruchomieniowe. Zespoły, które po podpisaniu zamówienia odkrywają ograniczenia przepustowości, często stwierdzają, że całkowity koszt ich usunięcia znacznie przekracza początkowe szacunki.
Złożoność licencji w procesie CI/CD
Typowa konfiguracja CI/CD uruchamia kompilacje w kontenerach efemerycznych. W przypadku BarcodeXpress każde środowisko kompilacji wymaga zarówno pary kluczy SDK, jak i kluczy odblokowujących środowisko uruchomieniowe, zarządzanych jako oddzielne sekrety. Jeśli klucz środowiska uruchomieniowego jest nieobecny lub nieprawidłowo skonfigurowany, kompilacja może zakończyć się powodzeniem, ale testy integracyjne zwrócą niejasne wartości — jest to cichy tryb awarii, który łatwo przeoczyć w potoku testowym, jeśli asercje testowe nie są starannie napisane w odniesieniu do rzeczywistej zawartości kodu kreskowego.
Wymagania dotyczące wdrożenia w środowisku izolowanym i bezpiecznym
Niektóre środowiska — systemy opieki zdrowotnej przetwarzające dokumentację pacjentów, przepływy dokumentów rządowych, przetwarzanie back-office w instytucjach finansowych — nie mogą zezwalać na sprawdzanie licencji poprzez wychodzące połączenia sieciowe. System licencji uruchomieniowych BarcodeXpress wykorzystuje infrastrukturę licencyjną Accusoft, co może stanowić problem zgodności w Årodowiskach o ścisłych ograniczeniach ruchu wychodzącego z sieci. Zespoły działające w tych środowiskach często wybierają biblioteki, których weryfikacja licencji odbywa się całkowicie lokalnie.
Docker i wdrażanie kontenerów
BarcodeXpress w Dockerze zazwyczaj wymaga zamontowania pliku licencji w kontenerze w znanej ścieżce lub skonfigurowania serwera licencji i skierowania kontenera na niego. Oba podejścia zwiększają złożoność wdrożenia — pliki licencji muszą być dystrybuowane i synchronizowane, a serwer licencji stanowi dodatkowy element infrastruktury, który należy utrzymywać. Zespoły przechodzące na architekturę mikrousług lub wzorce wdrażania bezserwerowego zauważają, że podejście oparte na plikach konfiguracyjnych nie przekłada się w sposób przejrzysty na niezmienne obrazy kontenerów.
Wymagania dotyczące dokładności oceny
Zespoły, które przed podjęciem decyzji o zakupie muszą sprawdzić dokładność odczytu na własnych dokumentach, uważają tryb ewaluacyjny BarcodeXpress za zasadniczo ograniczony. Testowanie na rzeczywistych skanach dokumentów — sprawdzanie, czy biblioteka radzi sobie z kodami kreskowymi o niskim kontraście, przekrzywionymi obrazami lub stronami zawierającymi wiele kodów kreskowych — wymaga kompletnych, zdekodowanych wartości. Częściowo zasłonięty wynik pokazuje jedynie, że biblioteka znalazła BARCODE, a nie to, czy odczytała go poprawnie.
Typowe kwestie związane z migracją
Zarządzanie instancjami do wywołań statycznych
BarcodeXpress wymaga utworzenia i licencjonowania instancji BarcodeXpress przed rozpoczęciem jakiejkolwiek operacji. Metody statyczne IronBarcode nie wymagają instancji. Zespoły przeprowadzające migrację zazwyczaj mają klasę BarcodeService, której konstruktor w dużej mierze składa się ze standardowego kodu licencyjnego — po migracji konstruktor ten można całkowicie usunąć lub zredukować do przypisania pojedynczego klucza licencyjnego.
Usunięcie wyliczenia BarcodeTypes
Każda operacja odczytu w BarcodeXpress wymaga przypisania flagi BarcodeTypes w celu określenia symboli, których należy szukać. IronBarcode domyślnie automatycznie wykrywa wszystkie obsługiwane formaty. Podczas migracji wszystkie przypisania reader.BarcodeTypes = ... można usunąć bez zastępowania. Jeśli ze względu na wydajność konieczne jest ograniczenie przestrzeni wyszukiwania, BarcodeReaderOptions obsługuje filtrowanie formatów jako opcję wyraźnie wybraną, a nie domyślną.
Zmiany nazw właściwości wynikowych
Dwie zmiany nazw właściwości mają wpływ na cały kod przetwarzania wyników: result.BarcodeValue staje się result.Value, a result.BarcodeType staje się result.Format. Funkcja wyszukiwania i zamiany w całym rozwiązaniu pozwala zająć się obiema kwestiami. Wyniki IronBarcode ujawniają również result.Confidence i result.PageNumber, które nie mają odpowiednika w BarcodeXpress i mogą być wykorzystane do dodatkowego filtrowania bez konieczności wprowadzania zmian w kodzie istniejącej obsługi wyników.
Konfiguracja licencji Docker
Wdrożenia BarcodeXpress w Dockerze zazwyczaj wykorzystują zamontowany plik konfiguracyjny licencji. IronBarcode używa zmiennej środowiskowej. Migracja polega na usunięciu instrukcji COPY z pliku konfiguracyjnego i dodaniu pojedynczego przypisania zmiennej środowiskowej. W Kubernetes klucz licencyjny staje się sekretnym odniesieniem w specyfikacji podu, a nie zamontowanym woluminem.
Dodatkowe możliwości IronBarcode
Oprócz podstawowych funkcji omówionych w tym porównaniu, IronBarcode oferuje możliwości, których nie ma w ofercie BarcodeXpress:
- Kod QR z logo:
QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")natywnie osadza obraz marki w kodzie QR, z konfigurowalnym poziomem korekcji błędów w celu zachowania niezawodności skanowania - Dodawanie kodów kreskowych do plików PDF: Umieszczaj kody kreskowe bezpośrednio w istniejących dokumentach PDF bez konieczności korzystania z oddzielnej biblioteki PDF
- Eksport wsadowy: przetwarzaj całe dokumenty PDF w jednym wywołaniu i otrzymuj wyniki dla poszczególnych stron wraz z numerem strony, formatem, wartością i wskaźnikiem pewności
Zgodność z platformą .NET i gotowość na przyszłość
IronBarcode obsługuje .NET Framework 4.6.2 i nowsze wersje, .NET Core 3.1 oraz .NET 5, 6, 7, 8 i 9. Obsługiwane platformy to Windows x64 i x86, Linux x64 oraz macOS x64 i ARM. BarcodeXpress dla .NET Core to oddzielny zestaw SDK od starszej wersji .NET Framework — zespoły aktualizujące framework docelowy swojej aplikacji muszą to uwzględnić. Pojedynczy pakiet IronBarcode obejmuje wszystkie obsługiwane środowiska uruchomieniowe. Regularne aktualizacje zapewniają zgodność z platformą .NET 10, której premiera przewidziana jest na koniec 2026 r., oraz z przyszłymi wersjami platformy .NET w miarę ich publikacji.
Wnioski
BarcodeXpress i IronBarcode reprezentują dwie różne filozofie projektowania komercyjnych bibliotek kodów kreskowych dla platformy .NET. BarcodeXpress traktuje dostęp do SDK i wdrożenie produkcyjne jako odrębne produkty licencyjne z oddzielnym rozliczeniem, oddzielnymi systemami kluczy i oddzielnymi minimalnymi wymaganiami zakupowymi. IronBarcode traktuje bibliotekę jako pojedynczy produkt z jednym kluczem, który obejmuje każde środowisko, od rozwoju po produkcję.
BarcodeXpress to rozsądny wybór dla zespołów już działających w ekosystemie produktów Accusoft — organizacje korzystające z PrizmDoc lub ImageGear uznają API BarcodeXpress za znajome, a swoje konto Accusoft za przydatne do uzyskania skonsolidowanego wsparcia. Dla tych zespołów system licencji oparty na dwóch kluczach jest raczej ugruntowanym wzorcem operacyjnym niż nowym utrudnieniem. SDK nadaje się również do środowisk, w których źródła dokumentów są dobrze kontrolowane, a wymagania dotyczące formatu są stabilne, dzięki czemu ręczna specyfikacja BarcodeTypes jest akceptowalną konfiguracją jednorazową, a nie ciągłą konserwacją.
IronBarcode lepiej nadaje się dla zespołów wdrażających rozwiązania w kontenerach, potokach CI/CD oraz środowiskach chmurowych, gdzie złożoność zarządzania licencjami bezpośrednio wpływa na koszty operacyjne. Model automatycznego wykrywania, statyczny interfejs API oraz natywna obsługa plików PDF zmniejszają powierzchnię kodu integracyjnego, a model licencjonowania oparty na jednym kluczu upraszcza zarządzanie danymi poufnymi w Årodowiskach programistycznych, testowych i produkcyjnych. Dla zespołów, które przed zakupem muszą ocenić dokładność odczytu, pełna wersja próbna — z znakiem wodnym na wygenerowanych obrazach, a nie na wynikach odczytu — umożliwia prawdziwe porównanie przed zakupem.
Różnica w cenach jest znaczna na każdym poziomie. Na poziomie pojedynczego programisty różnica między pakietem BarcodeXpress SDK Plus wraz z minimalnymi licencjami uruchomieniowymi a poziomem Lite firmy IronBarcode jest znaczna. Dla zespołów, dla których różnica w kosztach ma drugorzędne znaczenie w porównaniu z integracją z ekosystemem Accusoft, BarcodeXpress pozostaje spójnym wyborem. Dla zespołów oceniających biblioteki kodów kreskowych na podstawie ich własnych zalet, połączenie ograniczeń trybu oceny, licencji dwukluczyowej i limitów przepustowości sprawia, że IronBarcode jest bardziej bezpośrednią opcją.
Często Zadawane Pytania
Czym jest Accusoft BarcodeXpress?
Accusoft BarcodeXpress to biblioteka kodów kreskowych .NET służąca do generowania i odczytu kodów kreskowych w aplikacjach C#. Jest to jedna z kilku alternatyw rozważanych przez programistów przy wyborze rozwiązania do obsługi kodów kreskowych w projektach .NET.
Jakie są główne różnice między Accusoft BarcodeXpress a IronBarcode?
IronBarcode wykorzystuje statyczne, bezstanowe API, które nie wymaga zarządzania instancjami, podczas gdy Accusoft BarcodeXpress zazwyczaj wymaga utworzenia i konfiguracji instancji przed użyciem. IronBarcode zapewnia również natywną obsługę plików PDF, automatyczne wykrywanie formatów oraz licencjonowanie za pomocą jednego klucza we wszystkich środowiskach.
Czy licencja na IronBarcode jest łatwiejsza do uzyskania niż na Accusoft BarcodeXpress?
IronBarcode wykorzystuje pojedynczy klucz licencyjny obejmujący zarówno wdrożenia deweloperskie, jak i produkcyjne. Upraszcza to procesy CI/CD oraz konfiguracje Docker w porównaniu z systemami licencyjnymi, które oddzielają klucze SDK od kluczy środowiska uruchomieniowego.
Czy IronBarcode obsługuje wszystkie formaty kodów kreskowych obsługiwane przez Accusoft BarcodeXpress?
IronBarcode obsługuje ponad 30 symboli kodów kreskowych, w tym QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 i wiele innych. Automatyczne wykrywanie formatu oznacza, że nie jest wymagane jawne wyliczanie formatów.
Czy IronBarcode obsługuje natywne odczytywanie kodów kreskowych z plików PDF?
Tak. IronBarcode odczytuje kody kreskowe bezpośrednio z plików PDF za pomocą BarcodeReader.Read("document.pdf") bez konieczności korzystania z oddzielnej biblioteki do renderowania plików PDF. Wyniki dla każdej strony obejmują numer strony, format kodu kreskowego, wartość oraz wskaźnik pewności.
W jaki sposób IronBarcode radzi sobie z przetwarzaniem wsadowym w porównaniu z Accusoft BarcodeXpress?
Metody statyczne IronBarcode są bezstanowe i z natury bezpieczne dla wątków, co umożliwia bezpośrednie użycie Parallel.ForEach bez zarządzania instancjami dla poszczególnych wątków. Nie ma ograniczeń przepustowości w żadnym przedziale cenowym.
Jakie wersje .NET obsługuje IronBarcode?
IronBarcode obsługuje .NET Framework 4.6.2+, .NET Core 3.1 oraz .NET 5, 6, 7, 8 i 9 w jednym pakiecie NuGet. Obsługiwane platformy to Windows x64/x86, Linux x64 oraz macOS x64/ARM.
Jak zainstalować IronBarcode w projekcie .NET?
Zainstaluj IronBarcode za pomocą NuGet: uruchom polecenie „Install-Package IronBarCode” w konsoli menedżera pakietów lub „dotnet add package IronBarCode” w interfejsie CLI. Nie są wymagane żadne dodatkowe instalatory SDK ani pliki uruchomieniowe.
Czy mogę przetestować IronBarcode przed zakupem, w przeciwieństwie do Accusoft BarcodeXpress?
Tak. Tryb próbny IronBarcode zwraca pełne, zdekodowane wartości BarCode — tylko wygenerowane obrazy wyjściowe są opatrzone znakiem wodnym. Przed podjęciem decyzji o zakupie można sprawdzić dokładność odczytu na własnych dokumentach.
Jaka jest różnica w cenie między Accusoft BarcodeXpress a IronBarcode?
Cena IronBarcode zaczyna się od 749 USD za Licencję wieczystą dla jednego programisty, obejmującą etapy rozwoju i produkcji. Szczegóły dotyczące cen i opcji zakupu hurtowego są dostępne na stronie licencyjnej IronBarcode. Nie ma wymogu posiadania oddzielnej licencji na środowisko uruchomieniowe.
Czy migracja z Accusoft BarcodeXpress do IronBarcode jest prosta?
Migracja z Accusoft BarcodeXpress do IronBarcode polega przede wszystkim na zastąpieniu wywołań API opartych na instancjach statycznymi metodami IronBarcode, usunięciu standardowych fragmentów kodu dotyczących licencji oraz aktualizacji nazw właściwości wyników. Większość migracji wiąże się raczej z redukcją kodu niż z jego dodawaniem.
Czy IronBarcode generuje kody QR z logo?
Tak. Funkcja QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") osadza obraz marki w kodzie QR w sposób natywny z konfigurowalną korekcją błędów. Kolorowe kody QR są również obsługiwane za pomocą funkcji ChangeBarCodeColor().

