Barkoder SDK vs IronBarcode: Porównanie bibliotek kodów kreskowych C#
Dynamsoft BarCode Reader naprawdę doskonale spełnia swoje zadanie: odczytuje kody kreskowe z obrazu na żywo z kamery z prędkością 30 klatek na sekundę. Algorytmy są szybkie, obsługa symboli jest szeroka, a mobilny zestaw SDK, który je obsługuje na iOS i Androidzie, jest jednym z lepszych wyborów w tej dziedzinie. Jeśli Państwa produkt to aplikacja do skanowania w magazynie, w której pracownik kieruje telefon na etykietę palety i oczekuje rozpoznania w czasie poniżej 100 ms, Dynamsoft jest wiarygodną opcją.
Jeśli twoje kody kreskowe znajdują się na serwerze w plikach PDF, do których nie ma dostępu do internetu, biblioteka jest niedopasowana do przypadku użycia — a aktywacja licencji przypomni ci przy pierwszej próbie wdrożenia. LicenseManager.InitLicense wykonuje online handshake z serwerem licencyjnym Dynamsoft przy pierwszej aktywacji i okresowo ponownie ją weryfikuje. W odizolowanym centrum danych, odizolowanym VPC lub każdym środowisku, gdzie dostęp do internetu na zewnątrz jest ograniczony, ta pierwsza aktywacja wymaga alternatywy. Ścieżka offline — uzyskanie blobu zawartości licencyjnej od Dynamsoft i odtworzenie go za pomocą InitLicenseFromLicenseContent — działa, ale dodaje obciążenie operacyjne, na które większość przepływów pracy przetwarzania dokumentów nie przewidziała budżetu.
To porównanie dotyczy dopasowania do konkretnych zastosowań, a nie jakości bibliotek. Firma Dynamsoft stworzyła bibliotekę zorientowaną na kamerę i zrobiła to dobrze. Pytanie brzmi, czy założenia oparte na kamerze przekładają się na proces przetwarzania dokumentów po stronie serwera.
Zrozumienie czytnika BarCode Dynamsoft
Architektura Dynamsoft odzwierciedla jego pochodzenie z branży fotograficznej. Sekwencja uruchomienia wymaga aktywacji licencji online, model ustawień zawiera wartości timeout odpowiednie dla przetwarzania klatek w czasie rzeczywistym, a API ujawnia ustawienia dostosowane do zmiennego ogniskowania i rozmycia ruchu kamery do ręki.
// Dynamsoft: license activation required at startup
using Dynamsoft.CVR;
using Dynamsoft.DBR;
using Dynamsoft.License;
using Dynamsoft.Core;
// LicenseManager.InitLicense performs an online activation on first run
int errorCode = LicenseManager.InitLicense("YOUR-DYNAMSOFT-LICENSE-KEY", out string errorMsg);
if (errorCode != (int)EnumErrorCode.EC_OK)
throw new InvalidOperationException($"License activation failed: {errorMsg}");
using var router = new CaptureVisionRouter();
// Settings tuned for camera frame processing
SimplifiedCaptureVisionSettings settings = router.GetSimplifiedSettings(
PresetTemplate.PT_READ_BARCODES);
settings.BarcodeSettings.ExpectedBarcodesCount = 1; // single barcode per frame
settings.Timeout = 100; // 100ms suits a 30fps pipeline
router.UpdateSettings(PresetTemplate.PT_READ_BARCODES, settings);
// Dynamsoft: license activation required at startup
using Dynamsoft.CVR;
using Dynamsoft.DBR;
using Dynamsoft.License;
using Dynamsoft.Core;
// LicenseManager.InitLicense performs an online activation on first run
int errorCode = LicenseManager.InitLicense("YOUR-DYNAMSOFT-LICENSE-KEY", out string errorMsg);
if (errorCode != (int)EnumErrorCode.EC_OK)
throw new InvalidOperationException($"License activation failed: {errorMsg}");
using var router = new CaptureVisionRouter();
// Settings tuned for camera frame processing
SimplifiedCaptureVisionSettings settings = router.GetSimplifiedSettings(
PresetTemplate.PT_READ_BARCODES);
settings.BarcodeSettings.ExpectedBarcodesCount = 1; // single barcode per frame
settings.Timeout = 100; // 100ms suits a 30fps pipeline
router.UpdateSettings(PresetTemplate.PT_READ_BARCODES, settings);
Imports Dynamsoft.CVR
Imports Dynamsoft.DBR
Imports Dynamsoft.License
Imports Dynamsoft.Core
' Dynamsoft: license activation required at startup
' LicenseManager.InitLicense performs an online activation on first run
Dim errorCode As Integer = LicenseManager.InitLicense("YOUR-DYNAMSOFT-LICENSE-KEY", errorMsg:=Nothing)
If errorCode <> CType(EnumErrorCode.EC_OK, Integer) Then
Throw New InvalidOperationException($"License activation failed: {errorMsg}")
End If
Using router As New CaptureVisionRouter()
' Settings tuned for camera frame processing
Dim settings As SimplifiedCaptureVisionSettings = router.GetSimplifiedSettings(PresetTemplate.PT_READ_BARCODES)
settings.BarcodeSettings.ExpectedBarcodesCount = 1 ' single barcode per frame
settings.Timeout = 100 ' 100ms suits a 30fps pipeline
router.UpdateSettings(PresetTemplate.PT_READ_BARCODES, settings)
End Using
Jest to dobrze zaprojektowany interfejs API, dostosowany do swoich celów. Ustawienie Timeout = 100 ma sens, gdy przetwarzane jest 30 klatek na sekundę z kamery i nie można sobie pozwolić na spędzenie 500ms na jednej klatce. Dla serwera przetwarzającego przesłany PDF, 100 ms timeout nie ma sensu i może powodować niepowodzenie odczytu na gęstszych kodach kreskowych.
Projekt router-and-session — new CaptureVisionRouter(), router.Dispose() — naśladuje semantykę sesji kamery: otwierasz router, przetwarzasz klatki, usuwasz. W przypadku przetwarzania plików ten cykl życia dodaje szablonowy kod bez żadnych korzyści.
Problem z plikami PDF
Dynamsoft Barcode Reader może akceptować niektóre wejścia PDF bezpośrednio na kompilacjach Windows, ale dla wdrożeń międzyplatformowych wiele zespołów nadal wstępnie renderuje każdą stronę PDF do obrazu, zanim przekaże ją do CaptureVisionRouter.Capture. To zwykle wciąga osobną bibliotekę renderującą PDF — często używany jest PdfiumViewer — co dodaje zależność NuGet, zależność natywną (pdfium.dll na Windows lub libpdfium na Linuksie) i pętlę renderującą wokół każdej operacji PDF:
// Dynamsoft PDF processing — typical cross-platform pattern with PdfiumViewer
// dotnet add package PdfiumViewer
using PdfiumViewer;
using System.Drawing.Imaging;
using Dynamsoft.CVR;
using Dynamsoft.DBR;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var results = new List<string>();
using (var pdfDoc = PdfDocument.Load(pdfPath))
using (var router = new CaptureVisionRouter())
{
for (int page = 0; page < pdfDoc.PageCount; page++)
{
// Render each page at 300 DPI
using var image = pdfDoc.Render(page, 300, 300, true);
using var ms = new MemoryStream();
image.Save(ms, ImageFormat.Png);
byte[] imageBytes = ms.ToArray();
// Now pass rendered image bytes to the Capture Vision Router
CapturedResult result = router.Capture(imageBytes,
PresetTemplate.PT_READ_BARCODES);
foreach (var item in result.GetDecodedBarcodesResult().GetItems())
results.Add(item.GetText());
}
}
return results;
}
// Dynamsoft PDF processing — typical cross-platform pattern with PdfiumViewer
// dotnet add package PdfiumViewer
using PdfiumViewer;
using System.Drawing.Imaging;
using Dynamsoft.CVR;
using Dynamsoft.DBR;
public List<string> ReadBarcodesFromPdf(string pdfPath)
{
var results = new List<string>();
using (var pdfDoc = PdfDocument.Load(pdfPath))
using (var router = new CaptureVisionRouter())
{
for (int page = 0; page < pdfDoc.PageCount; page++)
{
// Render each page at 300 DPI
using var image = pdfDoc.Render(page, 300, 300, true);
using var ms = new MemoryStream();
image.Save(ms, ImageFormat.Png);
byte[] imageBytes = ms.ToArray();
// Now pass rendered image bytes to the Capture Vision Router
CapturedResult result = router.Capture(imageBytes,
PresetTemplate.PT_READ_BARCODES);
foreach (var item in result.GetDecodedBarcodesResult().GetItems())
results.Add(item.GetText());
}
}
return results;
}
Imports PdfiumViewer
Imports System.Drawing.Imaging
Imports Dynamsoft.CVR
Imports Dynamsoft.DBR
Imports System.IO
Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
Dim results As New List(Of String)()
Using pdfDoc = PdfDocument.Load(pdfPath)
Using router = New CaptureVisionRouter()
For page As Integer = 0 To pdfDoc.PageCount - 1
' Render each page at 300 DPI
Using image = pdfDoc.Render(page, 300, 300, True)
Using ms As New MemoryStream()
image.Save(ms, ImageFormat.Png)
Dim imageBytes As Byte() = ms.ToArray()
' Now pass rendered image bytes to the Capture Vision Router
Dim result As CapturedResult = router.Capture(imageBytes, PresetTemplate.PT_READ_BARCODES)
For Each item In result.GetDecodedBarcodesResult().GetItems()
results.Add(item.GetText())
Next
End Using
End Using
Next
End Using
End Using
Return results
End Function
To są trzy zależności (Dynamsoft, PdfiumViewer i natywne binaria specyficzne dla platformy), pętla renderowania na stronę i nadmiar pamięci, który skalują się wraz z liczbą stron.
IronBarcode odczytuje dane bezpośrednio z pliku PDF:
// IronBarcode: PDF is native — no extra library, no render loop
// NuGet: dotnet add package BarCode
var results = BarcodeReader.Read("invoice.pdf");
foreach (var result in results)
{
Console.WriteLine($"{result.Format}: {result.Value}");
}
// IronBarcode: PDF is native — no extra library, no render loop
// NuGet: dotnet add package BarCode
var results = BarcodeReader.Read("invoice.pdf");
foreach (var result in results)
{
Console.WriteLine($"{result.Format}: {result.Value}");
}
Imports IronBarCode
' IronBarcode: PDF is native — no extra library, no render loop
' NuGet: dotnet add package BarCode
Dim results = BarcodeReader.Read("invoice.pdf")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
Jedno połączenie. Brak renderera PDF. Brak pętli na stronę. Brak natywnego pliku binarnego specyficznego dla platformy do obsługi plików PDF.
Złożoność licencji
Aktywacja licencji online jest prosta, gdy serwer ma dostęp do internetu. Gdy tak nie jest — lub gdy zasady sieciowe wymagają wyraźnego umieszczenia hostów wychodzących na liście dozwolonych — obszar niepowodzeń walidacji wzrasta:
// Dynamsoft: error code pattern required
int errorCode = LicenseManager.InitLicense("YOUR-DYNAMSOFT-LICENSE-KEY", out string errorMsg);
if (errorCode != (int)EnumErrorCode.EC_OK)
{
// Possible causes: network timeout, license server unreachable,
// invalid key, expired key, activation quota exceeded, etc.
throw new InvalidOperationException($"Dynamsoft license failed [{errorCode}]: {errorMsg}");
}
// Dynamsoft: error code pattern required
int errorCode = LicenseManager.InitLicense("YOUR-DYNAMSOFT-LICENSE-KEY", out string errorMsg);
if (errorCode != (int)EnumErrorCode.EC_OK)
{
// Possible causes: network timeout, license server unreachable,
// invalid key, expired key, activation quota exceeded, etc.
throw new InvalidOperationException($"Dynamsoft license failed [{errorCode}]: {errorMsg}");
}
Imports System
' Dynamsoft: error code pattern required
Dim errorCode As Integer = LicenseManager.InitLicense("YOUR-DYNAMSOFT-LICENSE-KEY", errorMsg)
Dim errorMsg As String
If errorCode <> CType(EnumErrorCode.EC_OK, Integer) Then
' Possible causes: network timeout, license server unreachable,
' invalid key, expired key, activation quota exceeded, etc.
Throw New InvalidOperationException($"Dynamsoft license failed [{errorCode}]: {errorMsg}")
End If
Licencjonowanie offline z Dynamsoft jest odrębnym przepływem pracy. Na podłączonym urządzeniu wykonujesz początkową aktywację online, aby pobrać pakiet licencji, zapisać go, a następnie aktywować urządzenie offline przez odtworzenie tego pakietu za pomocą InitLicenseFromLicenseContent:
// Dynamsoft offline license — replay a pre-fetched license bundle
int errorCode = LicenseManager.InitLicenseFromLicenseContent(
licenseContent, out string errorMsg);
if (errorCode != (int)EnumErrorCode.EC_OK)
throw new InvalidOperationException($"Offline activation failed: {errorMsg}");
// Dynamsoft offline license — replay a pre-fetched license bundle
int errorCode = LicenseManager.InitLicenseFromLicenseContent(
licenseContent, out string errorMsg);
if (errorCode != (int)EnumErrorCode.EC_OK)
throw new InvalidOperationException($"Offline activation failed: {errorMsg}");
Imports System
' Dynamsoft offline license — replay a pre-fetched license bundle
Dim errorCode As Integer = LicenseManager.InitLicenseFromLicenseContent(licenseContent, errorMsg)
Dim errorMsg As String = Nothing
If errorCode <> CType(EnumErrorCode.EC_OK, Integer) Then
Throw New InvalidOperationException($"Offline activation failed: {errorMsg}")
End If
Pakiety licencji uzyskane w ten sposób mają okno wygaśnięcia (zwykle od kilku dni do roku) i muszą być odświeżane przed ich wygaśnięciem, co oznacza, że maszyna podłączona do internetu musi regularnie uczestniczyć w tym przepływie pracy.
Aktywacja licencji IronBarcode to pojedyncze zadanie oceniane lokalnie:
// IronBarCode: local validation, no network required
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// IronBarCode: local validation, no network required
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' IronBarCode: local validation, no network required
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Brak kodów błędów do sprawdzenia. Brak zależności od sieci. Brak cyklu odświeżania pakietu licencji. Ta sama linia działa na maszynie deweloperskiej, w pipeline CI/CD, w kontenerze Docker i na serwerze bez dostępu do internetu.
Przykłady zastosowań: aparat vs plik
Dynamsoft i IronBarcodesą zoptymalizowane do różnych podstawowych scenariuszy. Tablica poniżej opisuje to, zamiast deklarować, że jedna z bibliotek jest uniwersalnie lepsza:
| Scenariusz | Czytnik BarCode Dynamsoft | IronBarcode |
|---|---|---|
| Transmisja na żywo z kamery (30 klatek na sekundę) | Zoptymalizowane pod kątem czasu rzeczywistego | Nie jest to główny przypadek użycia |
| Mobilny zestaw SDK (iOS/Android) | Dostępny jest pełny zestaw SDK | Tylko .NET |
| Przetwarzanie plików po stronie serwera | Obsługiwane przez CaptureVisionRouter | Główny przypadek użycia |
| Odczytywanie BarCodes z plików PDF | Bezpośrednio na Windows; render loop common cross-platform | Wsparcie native |
| Wdrożenie w środowisku izolowanym | Wymaga przepływu pracy offline z pakietem licencji | Działa od razu po uruchomieniu |
| Docker / kontenery efemeryczne | Odświeżenie pakietu licencji na środowisko | Pojedyncza zmienna środowiskowa |
| Licencja offline | Blob zawartości licencji z uprzedniej aktywacji online | Standardowy klucz licencyjny |
| API .NET Core | Obsługiwane (dodatkowy wzór licencyjny) | Obsługiwane |
| Azure Functions | Sieć wychodząca na pierwszą aktywację | Brak wymagań sieciowych |
| Generowanie BarCode | Odczyt tylko w pakiecie Barcode Reader | Tak — generowanie i odczyt |
| Generowanie kodów QR | Nie w pakiecie Barcode Reader | Tak — QRCodeWriter |
Zrozumienie IronBarcode
Biblioteka IronBarcode for .NET służąca zarówno do generowania, jak i odczytywania kodów kreskowych. API jest statyczne — bez instancji, bez wywołań dispose, bez cyklu życia sesji. Aktywacja licencji odbywa się lokalnie. Wbudowana obsługa plików PDF:
// NuGet: dotnet add package BarCode
using IronBarCode;
// License — local validation, no network call
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Read from an image file
var results = BarcodeReader.Read("label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
// Read from a PDF — native, no extra library
var pdfResults = BarcodeReader.Read("manifest.pdf");
// Read with options for high-accuracy or high-throughput scenarios
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads= 4
};
var multiResults = BarcodeReader.Read("multi-barcode-sheet.png", options);
// NuGet: dotnet add package BarCode
using IronBarCode;
// License — local validation, no network call
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Read from an image file
var results = BarcodeReader.Read("label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
// Read from a PDF — native, no extra library
var pdfResults = BarcodeReader.Read("manifest.pdf");
// Read with options for high-accuracy or high-throughput scenarios
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads= 4
};
var multiResults = BarcodeReader.Read("multi-barcode-sheet.png", options);
Imports IronBarCode
' License — local validation, no network call
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
' Read from an image file
Dim results = BarcodeReader.Read("label.png")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
' Read from a PDF — native, no extra library
Dim pdfResults = BarcodeReader.Read("manifest.pdf")
' Read with options for high-accuracy or high-throughput scenarios
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim multiResults = BarcodeReader.Read("multi-barcode-sheet.png", options)
Generowanie jest równie proste:
// Generate Code 128
BarcodeWriter.CreateBarcode("SHIP-7734-X", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("shipping-label.png");
// Generate QR with error correction and embedded logo
QRCodeWriter.CreateQrCode("https://track.example.com/7734", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("company-logo.png")
.SaveAsPng("tracking-qr.png");
// Get bytes for HTTP response
byte[] bytes = BarcodeWriter.CreateBarcode("ITEM-001", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
// Generate Code 128
BarcodeWriter.CreateBarcode("SHIP-7734-X", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("shipping-label.png");
// Generate QR with error correction and embedded logo
QRCodeWriter.CreateQrCode("https://track.example.com/7734", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("company-logo.png")
.SaveAsPng("tracking-qr.png");
// Get bytes for HTTP response
byte[] bytes = BarcodeWriter.CreateBarcode("ITEM-001", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
Imports System
' Generate Code 128
BarcodeWriter.CreateBarcode("SHIP-7734-X", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("shipping-label.png")
' Generate QR with error correction and embedded logo
QRCodeWriter.CreateQrCode("https://track.example.com/7734", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo("company-logo.png") _
.SaveAsPng("tracking-qr.png")
' Get bytes for HTTP response
Dim bytes As Byte() = BarcodeWriter.CreateBarcode("ITEM-001", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.ToPngBinaryData()
Porównanie funkcji
| Funkcja | Czytnik BarCode Dynamsoft | IronBarcode |
|---|---|---|
| Odczytywanie BarCode | Tak — zoptymalizowane pod kątem aparatu | Tak — zoptymalizowane pod kątem plików i dokumentów |
| Generowanie BarCode | Nie | Tak |
| Generowanie kodów QR | Nie | Tak — QRCodeWriter |
| Natywna obsługa plików PDF | Bezpośrednio na Windows; render loop common cross-platform | Tak — BarcodeReader.Read(PDF) |
| Weryfikacja licencji | Aktywacja online + okresowe ponowne sprawdzenie | Lokalny |
| Odizolowany / offline | Przepływ pracy z blobem zawartości licencji | Standardowy klucz, działa w trybie offline |
| Docker / kontener | Przepływ pracy z pakietem licencji na środowisko | Pojedyncza zmienna środowiskowa |
| Azure Functions | Sieć wychodząca na pierwszą aktywację | Brak wymagań sieciowych |
| AWS Lambda | Sieć wychodząca na pierwszą aktywację | Brak wymagań sieciowych |
| Mobilny zestaw SDK | Dostępne na iOS i Android | Tylko .NET |
| Kamera działająca w czasie rzeczywistym (30 klatek na sekundę) | Główny cel projektu | Nieprzeznaczone do tego |
| Kod 128 | Tak | Tak |
| Kod QR | Tak (czytanie) | Tak (czytanie i generowanie) |
| Data Matrix | Tak | Tak |
| PDF417 | Tak | Tak |
| Aztec | Tak | Tak |
| EAN / UPC | Tak | Tak |
| Zarządzanie instancjami | new CaptureVisionRouter() + Dispose() | Statyczne — brak instancji |
| Odczyt wielu BarCodes | ExpectedBarcodesCount on BarcodeSettings | ExpectMultipleBarcodes = true |
| Kontrola prędkości czytania | Dopasowanie czasu do template | Wyliczenie ReadingSpeed |
| Czytanie równoległe | Ręczne wątkowanie | MaxParallelThreads |
| Model cenowy | Roczna subskrypcja / negocjowana na zawsze | Licencja wieczysta od 749 USD |
| Obsługa .NET | .NET 6.0+ and .NET Framework 3.5+ | Od .NET 4.6.2 do .NET 9 |
| Platformy | Windows (x86/x64), Linux (x64) | Windows, Linux, macOS, Docker, Azure, AWS Lambda |
Przewodnik po mapowaniu API
Dla zespołów, które mają kod Dynamsoft i muszą zrozumieć, jak tłumaczyć pojęcia:
| Czytnik BarCode Dynamsoft | IronBarcode |
|---|---|
LicenseManager.InitLicense(key, out errorMsg) |
IronBarCode.License.LicenseKey = "key" |
errorCode != (int)EnumErrorCode.EC_OK check |
Nie jest potrzebne |
LicenseManager.InitLicenseFromLicenseContent(content, out msg) |
Nie jest potrzebne |
new CaptureVisionRouter() |
Statyczne — brak instancji |
router.Dispose() |
Nie jest potrzebne |
router.Capture(imagePath, PresetTemplate.PT_READ_BARCODES) |
BarcodeReader.Read(imagePath) |
router.Capture(imageBytes, PresetTemplate.PT_READ_BARCODES) |
BarcodeReader.Read(imageBytes) |
BarcodeResultItem.GetText() |
result.Value |
BarcodeResultItem.GetFormatString() |
result.Format |
SimplifiedCaptureVisionSettings via GetSimplifiedSettings() |
new BarcodeReaderOptions { ... } |
settings.Timeout = 100 |
Speed = ReadingSpeed.Balanced |
settings.BarcodeSettings.ExpectedBarcodesCount = 1 |
ExpectMultipleBarcodes = false (domyślnie) |
router.UpdateSettings(template, settings) |
Przekazane jako parametr do Read() |
| Zewnętrzna biblioteka PDF + pętla renderowania stron | BarcodeReader.Read("doc.pdf") |
Kiedy zespoły się zmieniają
Przetwarzanie dokumentów po stronie serwera, a nie skanowanie kamerą. Najczęstszym scenariuszem migracyjnym jest zespół, który wybrał Dynamsoft ze względu na renomę, zintegrował go, a następnie odkrył, że kamera-centryczne API i krok renderowania PDF powodowały, że przepływy przetwarzania dokumentów były niezręczne. Odczyt kodów kreskowych z przesłanych PDF-ów w aplikacji webowej to kluczowy przypadek użycia, który wymaga dodatkowego przygotowania w Dynamsoft, ale jest pojedynczym wywołaniem w IronBarcode.
Środowiska odizolowane lub o ograniczonym dostępie. Instytucje finansowe, systemy opieki zdrowotnej i wdrożenia rządowe często zabraniają wychodzących połączeń internetowych z serwerów aplikacji. Aktywacja online Dynamsoft nie działa w tych środowiskach bez przepływu pracy offline z pakietem licencji, co dodaje kroki operacyjne. Zespoły pracujące w tych środowiskach często przechodzą na IronBarcode właśnie dlatego, że weryfikacja licencji nie wymaga połączenia z siecią.
Docker i kontenery efemeryczne Kubernetes. Wdrożenia kontenerowe, gdzie instancje skalują się często w górę i w dół, sprawiają, że cykle odświeżania pakietu licencji są trudne do zarządzania. Klucz licencyjny IronBarcode działa jako standardowa zmienna środowiskowa bez konieczności rejestracji dla poszczególnych instancji.
Potrzeba generacji oraz odczytu. Pakiet Czytnik BarCode Dynamsoft jest tylko do odczytu. Aplikacje, które muszą generować etykiety z kodami BarCode, drukować kody QR dla produktów lub tworzyć listy przewozowe z wbudowanymi kodami BarCode, potrzebują drugiej biblioteki. Zespoły w takiej sytuacji często przechodzą na IronBarcode, aby uniknąć zarządzania dwiema oddzielnymi zależnościami dotyczącymi kodów kreskowych.
Uproszczony ślad operacyjny. Usunięcie serwera licencji Dynamsoft z listy zewnętrznych zależności, które muszą być osiągalne, usunięcie biblioteki renderującej PDF i zastąpienie zarządzania cyklem życia routera statycznymi wywołaniami, zmniejsza liczbę rzeczy, które mogą pójść źle w produkcji.
Wnioski
Dynamsoft Barcode Reader to wysokiej jakości biblioteka, która dobrze pasuje do zamierzonego użytku: skanowanie kodów kreskowych na podstawie kamer w czasie rzeczywistym, zwłaszcza w aplikacjach mobilnych. Algorytmy są dobrze dostosowane do warunków skanowania ręcznego — zmiennego oświetlenia, rozmycia ruchowego, częściowego zasłonięcia. Jeśli to jest Twój przypadek użycia, Dynamsoft dobrze sobie radzi.
Do przetwarzania dokumentów po stronie serwera — odczytywanie kodów kreskowych z PDF-ów, generacja etykiet kodów kreskowych, działanie w środowiskach odizolowanych lub wdrażanie w efemerycznych kontenerach Docker — architektura biblioteki wymaga więcej ustawień na każdym kroku. Aktywacja licencji online, wzorzec renderowania PDF cross-platformowy, ustawienia timeout optymalizowane dla kamer i przepływ pracy offline z pakietem licencji są konsekwencjami budowania pod kątem kamer mobilnych. To nie są błędy; są to świadome wybory projektowe dostosowane do innego kontekstu.
IronBarcode jest przeznaczony do pracy w kontekście dokumentów i po stronie serwera. Lokalna weryfikacja licencji, natywny odczyt plików PDF, statyczne API i obsługa generowania to funkcje najwyższej klasy, a nie tylko rozwiązania zastępcze. Decyzja zależy od tego, w jakim środowisku faktycznie znajdują się twoje kody kreskowe.
Często Zadawane Pytania
Czym jest Dynamsoft Barcode Reader?
Dynamsoft Barcode Reader to biblioteka .NET do generowania i odczytywania kodow kreskowych w aplikacjach C#. Jest to jedno z kilku rozwiazan, ktore programisci rozpatruja przy wyborze rozwiązania kodow kreskowych do projektow .NET.
Jakie sa glówne róznice pomiedzy Dynamsoft Barcode Reader a IronBarcode?
IronBarcode używa statycznego, bezstanowego API, które nie wymaga zarządzania instancjami, podczas gdy Dynamsoft Barcode Reader zazwyczaj wymaga utworzenia instancji i konfiguracji przed użyciem. IronBarcode oferuje równiez natywna obsługę PDF, automatyczne wykrywanie formatu i licencjonowanie jednokluczowe we wszystkich środowiskach.
Czy łatwiej jest uzyskać licencje na IronBarcode niz na Dynamsoft Barcode Reader?
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 kodow kreskowych, które obsługuje Dynamsoft Barcode Reader?
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.
Jak IronBarcode radzi sobie z przetwarzaniem wsadowym w porównaniu do Dynamsoft Barcode Reader?
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ę ocenic IronBarcode przed zakupem, w przeciwienstwie do Dynamsoft?
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óznica cenowa pomiedzy Dynamsoft Barcode Reader 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 łatwo jest przejsc z Dynamsoft Barcode Reader na IronBarcode?
Migracja z Dynamsoft Barcode Reader do IronBarcode glównie polega na zastapieniu wywolan API opartych na instancjach metodami statycznymi IronBarcode, usunieciu szablonów licencji i aktualizacji nazw właściwości wyników. Wiekszosc migracji polega na redukcji kodu zamiast jego dodawania.
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().

