Scandit SDK vs IronBarcode: Porównanie bibliotek kodów kreskowych C#
Aby rozpocząć odczytywanie barcode'ów za pomocą Scandit, należy skonfigurować DataCaptureContext, utworzyć BarcodeCaptureSettings, wyraźnie włączyć symbole, podłączyć kamerę, ustawić ją jako źródło klatek, przełączyć kamerę w stan włączony i włączyć przechwytywanie. Cena nadal nie jest podana na stronie internetowej.
To połączenie — obowiązkowy potok kamer i nieprzejrzyste ceny dla Enterprise — dokładnie określa, kiedy Scandit jest niewłaściwym narzędziem dla projektu .NET. Jeśli tworzysz proces przetwarzania dokumentów po stronie serwera, interfejs API ASP.NET Core odczytujący kody kreskowe z przesłanych plików lub funkcję Azure Function przetwarzającą pliki PDF dotyczące wysyłek, architektura Scandit utrudnia Ci pracę na każdym etapie. W niniejszym porównaniu analizujemy, skąd pochodzi ta architektura, gdzie zamiast niej sprawdza się IronBarcode oraz ile kosztuje sprawdzenie obu opcji.
Zrozumienie Scandit SDK
Scandit SDK to komercyjna platforma do skanowania BarCode przeznaczona dla środowisk mobilnych i edge computing. Biblioteka została zaprojektowana do obsługi skanowania kamerą w czasie rzeczywistym na urządzeniach z systemami iOS, Android i MAUI, a specjalistyczne linie produktów obejmują nakładki rzeczywistości rozszerzonej, jednoczesne wykrywanie wielu kodów BarCode oraz skanowanie dokumentów tożsamości. Głównym kontekstem wdrożenia Scandit są mobilni pracownicy terenowi, operacje magazynowe oraz scenariusze punktów interakcji w handlu detalicznym, w których jednocześnie występują fizyczna kamera, aktywny użytkownik oraz czas reakcji poniżej 100 ms.
Architektura biblioteki opiera się na potoku DataCaptureContext, który koordynuje sesję kamery, ustawienia analizy klatek i konfigurację przechwytywania BarCode jako ujednolicony system stanowy. Ponieważ każda linia produktów na platformie Scandit — SparkScan, MatrixScan, ID Scanning, AR Overlays i Parser — jest licencjonowana i wyceniana osobno w ramach modelu sprzedaży bezpośredniej, całkowity koszt integracji z platformą Scandit można ustalić dopiero po rozmowie z przedstawicielem handlowym.
Kluczowe cechy architektury Scandit SDK obejmują:
- Projekt z priorytetem kamery: SDK zakłada obecność fizycznej kamery i działającego źródła klatek. Wszystkie operacje odczytu kodów kreskowych są wykonywane na klatkach wideo na żywo, a nie na statycznych plikach lub strumieniach.
- Obowiązkowa inicjalizacja DataCaptureContext: Każda integracja rozpoczyna się od utworzenia obiektu
DataCaptureContexti podłączenia go do instancji kamery, zanim będzie można rozpocząć pracę z BarCode. - Wyraźna deklaracja symboliki: Formaty BARCODE muszą być włączane indywidualnie za pomocą
EnableSymbologiesprzed rozpoczęciem sesji przechwytywania. Automatyczne wykrywanie nie jest dostępne. - Dostarczanie wyników sterowane zdarzeniami: Wyniki skanowania BarCode są dostarczane asynchronicznie poprzez wywołania zwrotne zdarzeń (
BarcodeScanned), a nie zwracane synchronicznie w wyniku wywołania metody. - Modułowa architektura produktu: SparkScan, MatrixScan, skanowanie identyfikatorów, nakładki AR i parser to funkcje wyceniane oddzielnie, które wymagają indywidualnych pozycji w umowie.
- Kontakt – Dział sprzedaży Ceny: Ceny nie są publikowane. Każda integracja wymaga zapytania ofertowego, zanim będzie znany koszt licencji.
- Platforma zorientowana na urządzenia mobilne: Główne wsparcie dotyczy systemów iOS i Android. Wdrożenia po stronie serwera, w Dockerze i bezserwerowe wykraczają poza zakres projektu SDK.
Pipeline DataCaptureContext
Każda integracja Scandit rozpoczyna się od sekwencji inicjalizacji kamery, zanim będzie można odczytać choćby jeden BARCODE:
// Scandit SDK: full camera pipeline setup
// NuGet: Scandit.BarcodePicker
var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");
var settings = BarcodeCaptureSettings.Create();
settings.EnableSymbologies(new HashSet<Symbology>
{
Symbology.Ean13Upca,
Symbology.Ean8,
Symbology.Code128,
Symbology.QrCode
});
var barcodeCapture = BarcodeCapture.Create(dataCaptureContext, settings);
var camera = Camera.GetDefaultCamera();
await dataCaptureContext.SetFrameSourceAsync(camera);
await camera.SwitchToDesiredStateAsync(FrameSourceState.On);
barcodeCapture.IsEnabled = true;
// Scandit SDK: full camera pipeline setup
// NuGet: Scandit.BarcodePicker
var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");
var settings = BarcodeCaptureSettings.Create();
settings.EnableSymbologies(new HashSet<Symbology>
{
Symbology.Ean13Upca,
Symbology.Ean8,
Symbology.Code128,
Symbology.QrCode
});
var barcodeCapture = BarcodeCapture.Create(dataCaptureContext, settings);
var camera = Camera.GetDefaultCamera();
await dataCaptureContext.SetFrameSourceAsync(camera);
await camera.SwitchToDesiredStateAsync(FrameSourceState.On);
barcodeCapture.IsEnabled = true;
Imports Scandit.DataCapture.Core
Imports Scandit.DataCapture.Barcode
Imports Scandit.DataCapture.Barcode.Capture
Imports Scandit.DataCapture.Core.Source
Imports System.Collections.Generic
' Scandit SDK: full camera pipeline setup
' NuGet: Scandit.BarcodePicker
Dim dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE")
Dim settings = BarcodeCaptureSettings.Create()
settings.EnableSymbologies(New HashSet(Of Symbology) From {
Symbology.Ean13Upca,
Symbology.Ean8,
Symbology.Code128,
Symbology.QrCode
})
Dim barcodeCapture = BarcodeCapture.Create(dataCaptureContext, settings)
Dim camera = Camera.GetDefaultCamera()
Await dataCaptureContext.SetFrameSourceAsync(camera)
Await camera.SwitchToDesiredStateAsync(FrameSourceState.On)
barcodeCapture.IsEnabled = True
Każda linia w tym bloku to infrastruktura kamer. Nie ma argumentu ścieżki do pliku. Nie ma pliku PDF. Nie ma strumienia. Biblioteka zakłada, że kamera jest uruchomiona, zanim będzie można rozpocząć pracę z BARCODE-ami.
Zrozumienie IronBarcode
IronBarcode to komercyjna biblioteka .NET do odczytu i generowania kodów kreskowych. Biblioteka jest przeznaczona dla środowisk serwerowych, desktopowych i chmurowych, w których dane BarCode są dostarczane w postaci plików, strumieni, tablic bajtów lub treści osadzonych w dokumentach PDF. Jego API jest bezstanowe — nie ma obiektu sesji, nie ma potoku kamery do zainicjowania ani trwałego kontekstu do zarządzania między odczytami. Pojedyncze statyczne wywołanie BarcodeReader.Read przyjmuje ścieżkę do pliku, strumień, tablicę bajtów lub plik PDF i zwraca zbiór wyników.
IronBarcode jest dostarczany jako pojedynczy pakiet NuGet zawierający wszystkie funkcje odczytu i generowania ponad 30 formatów kodów kreskowych 1D i 2D. Biblioteka obsługuje automatyczne wykrywanie formatów, co oznacza, że wywołujący nie musi określać, jakich symboli ma szukać. Ceny są podane na stronie produktu i nie wymagają rozmowy sprzedażowej.
Najważniejsze cechy IronBarcode to:
- Bezstanowe API oparte na plikach: Odczyt rozpoczyna się od pojedynczego wywołania metody, która przyjmuje ścieżkę do pliku, strumień, tablicę bajtów lub dokument PDF.
- Automatyczne wykrywanie formatu: Wszystkie obsługiwane formaty BarCode są wykrywane automatycznie. Wyraźna konfiguracja symboliki jest opcjonalną optymalizacją wydajności, a nie warunkiem koniecznym.
- Natywna obsługa plików PDF: wielostronicowe dokumenty PDF są odczytywane bezpośrednio, a wyniki indeksowane według numerów stron. Nie jest wymagańa żadna zewnętrzna biblioteka do renderowania plików PDF.
- Gotowość do pracy na serwerach i w chmurze: Obsługuje ASP.NET Core, Azure Functions, Docker na systemie Linux oraz wdrożenia kontenerowe bez konieczności stosowania architektonicznych obejść.
- Przetwarzanie współbieżne: Bezstanowe API jest z natury bezpieczne dla wątków, umożliwiając stosowanie wzorców
Parallel.ForEachi asynchronicznych w scenariuszach przetwarzania wsadowego o dużej przepustowości. - Generowanie kodów kreskowych: Tworzy kody kreskowe w formacie obrazu i PDF we wszystkich obsługiwanych systemach symbolicznych. Tworzenie i odczyt są zawarte w tym samym pakiecie.
- Licencje wieczyste: Ceny są podane publicznie jako jednorazowe zakupy wieczyste bez opłat za skanowanie lub za urządzenie.
Porównanie funkcji
Poniższa tabela przedstawia podstawowe różnice między Scandit SDK a IronBarcode:
| Funkcja | Scandit SDK | IronBarcode |
|---|---|---|
| Główny przypadek użycia | Skanowanie kamerą w czasie rzeczywistym na urządzeniach mobilnych | Odczytywanie plików, strumieni i BarCode'ów PDF na serwerze |
| Wymagana kamera | Tak | Nie |
| Ekstrakcja BarCodes z plików PDF | Nieobsługiwane | Wsparcie native |
| Model cenowy | Skontaktuj się z działem sprzedaży, w zależności od produktu | Opublikowane poziomy wieczyste |
| Przetwarzanie po stronie serwera | Nieprzeznaczone dla | Główny cel wdrożenia |
| Konfiguracja symboli | Wymagane przed skanowaniem | Opcjonalnie; auto-detection is default |
| Generowanie kodów kreskowych | Nieobsługiwane | Zawarte w jednym pakiecie |
Szczegółowe porównanie funkcji
| Funkcja | Scandit SDK | IronBarcode |
|---|---|---|
| Czytanie | ||
| Odczytywanie plików graficznych | Nieprzeznaczone dla | Główny cel |
| Pobieranie kodów kreskowych z plików PDF | Nieobsługiwane | Natywny wielostronicowy |
| Wejście strumieniowe / tablica bajtów | Nieobsługiwane | Tak |
| Automatyczne wykrywanie formatu | Nie (należy określić) | Tak |
| Formaty 1D (Code 128, EAN, UPC itp.) | 30+ | 30+ |
| Formaty 2D (QR, DataMatrix, Aztec, PDF417) | Tak | Tak |
| Wykrywanie wielu BarCodes w jednym dokumencie | MatrixScan (oddzielny produkt) | Tak (pojedynczy pakiet) |
| Odzyskiwanie uszkodzonych kodów kreskowych | Ograniczone | Tak (oparte na ML) |
| Generacja | ||
| Generowanie BarCode'ów | Nieobsługiwane | Tak |
| Wyprowadź do pliku graficznego | Nieobsługiwane | Tak |
| Wyprowadź do pliku PDF | Nieobsługiwane | Tak |
| Architektura | ||
| Model inicjalizacji | Pipeline kamery z zachowaniem stanu | Wywołanie metody bezstanowej |
| Dostarczenie wyników | Wywołanie zwrotne zdarzenia (asynchroniczne) | Synchroniczna wartość zwracana |
| Zależność od kamery | Wymagane | Nie dotyczy |
| Wstępna deklaracja symboli | Wymagane | Opcjonalnie |
| Platforma | ||
| iOS / Android (MAUI) | Główna grupa docelowa | Wykorzystanie programowe |
| ASP.NET Core | Nieprzeznaczone dla | Pełne wsparcie |
| Azure Functions / bezserwerowe | Niepraktyczne | Pełne wsparcie |
| Docker / serwer Linux | Nieobsługiwane | Pełne wsparcie |
| Konsola / usługa działająca w tle | Nieprzeznaczone dla | Pełne wsparcie |
| Licencjonowanie | ||
| Przejrzystość cen | Wymagany kontakt z działem sprzedaży | Opublikowano na stronie internetowej |
| Rodzaj licencji | Roczna (na produkt) | Wieczyste jednorazowe |
| Opłaty za skan lub za urządzenie | Tak | Nie |
| Dostęp do wszystkich funkcji w jednym pakiecie | Nie (produkty modułowe) | Tak |
Architektura odczytu BarCode
Najważniejszą różnicą strukturalną między tymi dwiema bibliotekami jest sposób modelowania relacji między danymi wejściowymi a wyjściowymi.
Podejście Scandit SDK
Scandit przetwarza klatki z kamery w czasie rzeczywistym. DataCaptureContext utrzymuje aktywną sesję kamery, a BarcodeCapture nasłuchuje BARCODE-ów w każdej przychodzącej klatce. Wyniki skanowania BarCode są dostarczane asynchronicznie poprzez zdarzenie BarcodeScanned. Odczytanie statycznego pliku obrazu za pomocą Scandit wymaga dostosowania potoku kamery tak, aby traktował plik jako źródło klatek — jest to proces, który nie jest obsługiwany natywnie i wymaga nakładu pracy inżynieryjnej w celu jego przybliżenia.
// Scandit SDK: event-callback result delivery
barcodeCapture.BarcodeScanned += (sender, args) =>
{
foreach (var barcode in args.Session.NewlyRecognizedBarcodes)
{
string value = barcode.Data;
string symbology = barcode.Symbology.ToString();
ProcessBarcode(value, symbology);
}
};
// Scandit SDK: event-callback result delivery
barcodeCapture.BarcodeScanned += (sender, args) =>
{
foreach (var barcode in args.Session.NewlyRecognizedBarcodes)
{
string value = barcode.Data;
string symbology = barcode.Symbology.ToString();
ProcessBarcode(value, symbology);
}
};
Imports System
' Scandit SDK: event-callback result delivery
AddHandler barcodeCapture.BarcodeScanned, Sub(sender, args)
For Each barcode In args.Session.NewlyRecognizedBarcodes
Dim value As String = barcode.Data
Dim symbology As String = barcode.Symbology.ToString()
ProcessBarcode(value, symbology)
Next
End Sub
Model sterowany zdarzeniami jest odpowiedni do ciągłego skanowania na żywo, gdzie BARCODES pojawiają się w strumieniu wideo w sposób nieprzewidywalny. W przypadku przetwarzania opartego na plikach model wprowadza niepotrzebną złożoność: dane wejściowe mają znaną granicę zakończenia, sesja kamery nigdy nie kończy się w sposób naturalny, a asynchroniczny wzorzec wywołania zwrotnego nie współgra dobrze z architekturami serwerowymi typu żądanie-odpowiedź.
Podejście IronBarcode
IronBarcode traktuje każde wprowadzone dane jako odrębny dokument o deterministycznym wyniku. Metoda BarcodeReader.Read przyjmuje ścieżkę do pliku, strumień lub tablicę bajtów, wykonuje wszystkie operacje wykrywania synchronicznie i zwraca zbiór wyników. Nie ma sesji do otwarcia, źródła ramki do skonfigurowania ani zdarzenia, na które można się zapisać.
// IronBarcode: direct file reading
// NuGet: dotnet add package IronBarcode
IronBarCode.License.LicenseKey = "YOUR-KEY";
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
Console.WriteLine($"{result.Value} ({result.Format})");
// IronBarcode: direct file reading
// NuGet: dotnet add package IronBarcode
IronBarCode.License.LicenseKey = "YOUR-KEY";
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
Console.WriteLine($"{result.Value} ({result.Format})");
' IronBarcode: direct file reading
' NuGet: dotnet add package IronBarcode
IronBarCode.License.LicenseKey = "YOUR-KEY"
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
Console.WriteLine($"{result.Value} ({result.Format})")
Next
W przypadku odczytu BarCodes z obrazów bezstanowe API nie wymaga żadnej inicjalizacji poza kluczem licencyjnym. Wykrywanie formatu odbywa się automatycznie. Powyższy kompletny program odczytuje dowolny obsługiwany format BARCODE z pliku obrazu za pomocą trzech wierszy kodu operacyjnego.
Wsparcie w zakresie platform i wdrażania
Kontekst wdrożenia biblioteki BarCode decyduje o tym, czy może ona w ogóle działać w środowisku docelowym, niezależnie od dostępnych funkcji.
Podejście Scandit SDK
Architektura Scandit wymaga sprzętu kamerowego oraz platformy mobilnej, która może udostępniać go za pośrednictwem natywnego interfejsu API kamery. Głównymi obsługiwanymi platformami są iOS i Android. Komputery stacjonarne z systemem Windows stanowią drugorzędną grupę docelową. ASP.NET Core, Azure Functions, kontenery Docker i serwery Linux nie wchodzą w zakres projektu biblioteki. DataCaptureContext zakłada uruchomioną sesję kamery, która nie ma odpowiednika w środowiskach obliczeniowych bezserwerowych, wdrożeniach kontenerowych ani usługach przetwarzania w tle.
| Platforma | Scandit SDK |
|---|---|
| iOS / Android (MAUI) | Główna grupa docelowa |
| Pulpit Windows | Wsparcie dodatkowe |
| ASP.NET Core | Nieprzeznaczone dla |
| Azure Functions | Niepraktyczne |
| Docker / serwer Linux | Nieobsługiwane |
| Konsola / usługa działająca w tle | Nieprzeznaczone dla |
Podejście IronBarcode
IronBarcode został stworzony z myślą o środowiskach serwerowych, chmurowych i kontenerowych. Bezstanowe API nie ma żadnych zależności sprzętowych ani wymagań dotyczących inicjalizacji specyficznych dla platformy. Wdrożenie w Azure Functions w celu przetwarzania kodów kreskowych jest obsługiwanym i udokumentówanym rozwiązaniem. Docker na systemie Linux jest standardowym celem wdrożenia. Punkty końcowe .NET Core odczytujące BARCODES z przesłanych plików stanowią podstawowy obsługiwany scenariusz, który nie wymaga żadnych architektonicznych obejść.
| Platforma | IronBarcode |
|---|---|
| iOS / Android (MAUI) | Programowe przetwarzanie plików |
| ASP.NET Core | Pełne wsparcie |
| Azure Functions / Lambda | Pełne wsparcie |
| Docker / serwer Linux | Pełne wsparcie |
| Konsola / usługa działająca w tle | Pełne wsparcie |
| Blazor Server | Pełne wsparcie |
Równoległe przetwarzanie wsadowe
Przetwarzanie dużych ilości dokumentów opatrzonych kodami BarCode jest powszechnym wymaganiem po stronie serwera, do którego obie biblioteki podchodzą z zasadniczo różnych perspektyw.
Podejście Scandit SDK
Pipeline kamery Scandit został zaprojektowany z myślą o pojedynczej sesji kamery obsługującej jednego użytkownika lub urządzenie. Model FrameSourceState zakłada trwałą, ciągłą sesję kamery — a nie kolejkę dokumentów przetwarzanych z określoną przepustowością. Dostosowanie biblioteki do przetwarzania partii plików wymaga symulacji sesji kamery dla każdego dokumentu lub serializacji przetwarzania dokumentów za pośrednictwem wspólnego potoku, z których żadne nie stanowi obsługiwanego ani wydajnego wzorca.
Podejście IronBarcode
Ponieważ metoda BarcodeReader.Read biblioteki IronBarcode jest bezstanowa, wywoływanie jej jednocześnie z wielu wątków jest z natury bezpieczne. Równoległe przetwarzanie wsadowe nie wymaga żadnej specjalnej konfiguracji poza zdefiniowaniem BarcodeReaderOptions:
// IronBarcode: concurrent batch processing
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var files = Directory.GetFiles("./incoming/", "*.pdf");
var allResults = new ConcurrentBag<BarcodeResult>();
Parallel.ForEach(files, file =>
{
var results = BarcodeReader.Read(file, options);
foreach (var r in results)
allResults.Add(r);
});
// IronBarcode: concurrent batch processing
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var files = Directory.GetFiles("./incoming/", "*.pdf");
var allResults = new ConcurrentBag<BarcodeResult>();
Parallel.ForEach(files, file =>
{
var results = BarcodeReader.Read(file, options);
foreach (var r in results)
allResults.Add(r);
});
Imports System.IO
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
' IronBarcode: concurrent batch processing
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim files = Directory.GetFiles("./incoming/", "*.pdf")
Dim allResults As New ConcurrentBag(Of BarcodeResult)()
Parallel.ForEach(files, Sub(file)
Dim results = BarcodeReader.Read(file, options)
For Each r In results
allResults.Add(r)
Next
End Sub)
Szczegółowe wzorce dotyczące asynchronicznego i wielowątkowego odczytu kodów kreskowych można znaleźć w dokumentacji IronBarcode, która obejmuje wzorce bezpieczne dla wątków oraz opcje optymalizacji przepustowości.
Przetwarzanie dokumentów PDF
Wyodrębnianie BARCODE-ów z plików PDF jest funkcją odrębną od odczytu opartego na obrazach i stanowi istotną różnicę między tymi dwiema bibliotekami.
Podejście Scandit SDK
Scandit nie obsługuje natywnie formatu PDF. Wyodrębnianie kodów kreskowych z pliku PDF za pomocą Scandit wymaga renderowania każdej strony PDF do obrazu rastrowego przy użyciu oddzielnej biblioteki renderującej PDF, a następnie przekazania tych obrazów przez potok symulacji kamery. Takie podejście wprowadza dodatkową zależność, dodatkowe koszty licencji i znaczny nakład pracy inżynieryjnej dla zadania, które jest rutynowe w procesach przetwarzania dokumentów. Dokumenty wielostronicowe wymagają iteracji stron, zarządzania pamięcią dla renderowanych obrazów oraz ręcznej koordynacji wyników między stronami.
Podejście IronBarcode
IronBarcode natywnie odczytuje kody kreskowe z dokumentów PDF. Ścieżka do pliku PDF jest prawidłowym argumentem dla BarcodeReader.Read, a wyniki zawierają właściwość PageNumber wskazującą, na której stronie dokumentu znaleziono każdy BARCODE:
// IronBarcode: extract barcodes from every page of a PDF
var results = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value} ({barcode.Format})");
}
// IronBarcode: extract barcodes from every page of a PDF
var results = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value} ({barcode.Format})");
}
Imports IronBarcode
' IronBarcode: extract barcodes from every page of a PDF
Dim results = BarcodeReader.Read("shipping-manifest.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value} ({barcode.Format})")
Next
Pełne wytyczne dotyczące odczytu kodów kreskowych z plików PDF, w tym opcje wyboru zakresu stron i wyodrębniania wielu kodów kreskowych, można znaleźć w dokumentacji IronBarcode, która obejmuje pełen zakres scenariuszy przetwarzania plików PDF.
Ceny i licencje
Struktura licencji wpływa nie tylko na koszt biblioteki, ale także na czas potrzebny do jej oceny i wdrożenia.
Podejście firmy Scandit
Scandit nie publikuje cennika. Strona produktu zawiera listę funkcji i nazw produktów — SparkScan, MatrixScan, ID Scanning, AR Overlays, Parser — oraz przekierowuje wszystkie zapytania do rozmowy sprzedażowej. Proces wyceny obejmuje wyjaśnienie przypadku użycia, oszacowanie objętości skanowania, określenie urządzeń, omówienie poziomów wsparcia oraz negocjację długości umowy przed podaniem kwoty kosztów. Recenzje na platformach takich jak G2 i DiscoverSDK konsekwentnie zwracają uwagę na nieprzewidywalne koszty dla małych i średnich przedsiębiorstw oraz wyzwania związane z prognozowaniem budżetu. Każda linia produktów Scandit ma odrębną cenę i jest przedmiotem odrębnej umowy, co oznacza, że rozszerzony dostęp do funkcji wymaga dodatkowych cykli sprzedaży.
Podejście IronBarcode
IronBarcode publikuje informacje o poziomach licencji na stronie produktu bez konieczności wypełniania formularza lub wysyłania zapytania handlowego:
| Licencja | Cena | Programiści | Projekty |
|---|---|---|---|
| Lite | 749 USD jednorazowo | 1 | 1 |
| Professional | 1499 USD jednorazowo | 10 | 10 |
| Nieograniczona | 2999 USD jednorazowo | Nieograniczona | Nieograniczona |
Licencje są bezterminowe. Nie ma opłat za skanowanie, opłat za urządzenie ani progów ilościowych, które powodowałyby zmiany poziomu taryfowego. Roczne odnowienie jest opcjonalne i kosztuje połowę pierwotnej ceny, ale zakupiona licencja pozostaje ważna bez konieczności odnawiania. Wszystkie funkcje zawarte w pakiecie IronBarcode — odczyt, generowanie, obsługa plików PDF, wykrywanie wielu kodów kreskowych — są dostępne na każdym poziomie.
Przewodnik po mapowaniu API
Poniższa tabela przedstawia powiązania między pojęciami z pakietu Scandit SDK a ich odpowiednikami w IronBarcode dla zespołów oceniających koszt tłumaczenia związany z migracją:
| Scandit SDK | IronBarcode | Uwagi |
|---|---|---|
DataCaptureContext.ForLicenseKey("key") |
IronBarCode.License.LicenseKey = "key" |
Jedno zlecenie; no context object required |
BarcodeCaptureSettings.Create() |
new BarcodeReaderOptions() |
Opcjonalnie w IronBarcode |
settings.EnableSymbologies(Symbology.Code128, ...) |
(not needed) | Automatyczne wykrywanie jest ustawieniem domyślnym |
Camera.GetDefaultCamera() |
(not applicable) | Brak koncepcji kamery w przetwarzaniu plików |
dataCaptureContext.SetFrameSourceAsync(camera) |
(not applicable) | Brak źródła ramki w IronBarcode |
camera.SwitchToDesiredStateAsync(FrameSourceState.On) |
(not applicable) | Brak maszyny stanów kamery |
barcodeCapture.IsEnabled = true |
BarcodeReader.Read(path) |
Pojedyncze wywołanie inicjuje odczyt |
BarcodeScanned += procedurę obsługi zdarzeń |
Iteracja nad wartością zwracaną przez BarcodeReader.Read() |
Zbiórka synchroniczna; no event system |
args.Session.NewlyRecognizedBarcodes |
Wartość zwracana przez BarcodeReader.Read() |
Bezpośredni dostęp do kolekcji |
barcode.Data |
result.Value |
Ta sama treść semantyczna |
barcode.Symbology |
result.Format |
Wymiennik formatów |
| SparkScan, MatrixScan, ID Scanning (oddzielne produkty) | Pojedynczy pakiet IronBarcode |
Brak oddzielnych dodatków |
Kiedy zespoły rozważają przejście z Scandit SDK na IronBarcode
Wymagania dotyczące przetwarzania po stronie serwera
Zespoły tworzące interfejsy API .NET Core, usługi przetwarzania w tle lub Azure Functions napotykają na architekturę Scandit jako fundamentalną niezgodność już od pierwszego etapu integracji. DataCaptureContext i potok kamer zakładają istnienie sprzętu, który nie występuje w środowisku serwerowym. Gdy wymagania projektu dotyczące kodów kreskowych dotyczą wyłącznie strony serwerowej — odczytu z przesłanych plików, przetwarzania kolejek dokumentów, wyodrębniania danych kodów kreskowych z przychodzących plików PDF — proces przetwarzania obrazu z kamery zwiększa złożoność inicjalizacji, obciążenie związane z asynchroniczną maszyną stanów oraz ograniczenia platformy, które nie wnoszą nic do rzeczywistych wymagań biznesowych.
Przetwarzanie dokumentów w trybie wsadowym
Organizacje przetwarzające duże ilości dokumentów z BarCode — listy przewozowe, faktury, ewidencje magazynowe, formularze medyczne — stwierdzają, że model frame-source firmy Scandit nie współgra z kolejkami dokumentów. Biblioteka została zaprojektowana z myślą o ciągłych sesjach kamery, a nie o pojedynczych dokumentach z deterministycznymi punktami początkowymi i końcowymi. Gdy ilość dokumentów rośnie i konieczne staje się przetwarzanie równoległe, stanowość potoku kamer staje się przeszkodą inżynieryjną, a nie funkcją.
Przejrzystość cen
Zespoły programistów pracujące nad propozycjami budżetowymi, porównaniami dostawców lub analizami kosztów i korzyści dla nowych projektów nie mogą wykonać tej pracy z wykorzystaniem Scandit bez uprzedniego wejścia w cykl sprzedaży. Gdy projekt ma określony budżet i harmonogram, brak możliwości ustalenia kosztu licencji bez rozmowy handlowej powoduje opóźnienia i niepewność, które mają dalsze skutki dla planowania projektu. Zespoły oceniające jednocześnie wiele opcji bibliotek stwierdzają, że brak opublikowanych cen utrudnia uwzględnienie Scandit w ustrukturyzowanym porównaniu.
Zmniejszenie złożoności potoku
Nawet jeśli Scandit jest już wdrożony do skanowania za pomocą kamery mobilnej, niektóre zespoły odkrywają, że wymagania dotyczące BarCode po stronie serwera w tej samej aplikacji wymagają innego narzędzia. Pipeline kamery, który jest odpowiedni do skanowania mobilnego w czasie rzeczywistym, wprowadza niepotrzebną złożoność, gdy jest stosowany do przetwarzania dokumentów statycznych. Zespoły, które doszły do tego etapu, często wdrażają IronBarcode do przetwarzania po stronie serwera obok istniejącej implementacji Scandit, zamiast próbować rozszerzać potok przetwarzania obrazu z kamery na przypadki użycia, do których nie został on zaprojektowany.
Typowe kwestie związane z migracją
Pipeline kamery nie ma odpowiednika w postaci pliku
Cały blok inicjalizacyjny DataCaptureContext — tworzenie kontekstu, konfiguracja ustawień, włączanie symboli, pozyskiwanie obrazu z kamery, przypisywanie źródła klatek i przejście między stanami — nie ma odpowiednika w interfejsie API opartym na plikach IronBarcode. Podczas migracji kodu integracji po stronie serwera ten blok jest usuwany w całości. Nie jest przetłumaczone; zostaje usunięte. Zastąpienie IronBarcode polega na przypisaniu klucza licencyjnego, a następnie wywołaniu BarcodeReader.Read.
Wywołanie zwrotne zdarzenia do bezpośredniego powrotu
Scandit dostarcza wyniki skanowania BARCODE poprzez zdarzenie BarcodeScanned, ponieważ skanowanie na żywo za pomocą kamery ma z natury charakter asynchroniczny. IronBarcode zwraca wyniki synchronicznie jako kolekcję typowaną, ponieważ odczyt oparty na plikach ma znaną granicę zakończenia. Migracja polega na przekształceniu logiki obsługi zdarzeń na standardową iterację:
// Scandit callback pattern (removed during migration)
barcodeCapture.BarcodeScanned += (sender, args) =>
{
foreach (var barcode in args.Session.NewlyRecognizedBarcodes)
ProcessBarcode(barcode.Data, barcode.Symbology.ToString());
};
// IronBarcode direct return (replacement)
foreach (var result in BarcodeReader.Read("document.png"))
ProcessBarcode(result.Value, result.Format.ToString());
// Scandit callback pattern (removed during migration)
barcodeCapture.BarcodeScanned += (sender, args) =>
{
foreach (var barcode in args.Session.NewlyRecognizedBarcodes)
ProcessBarcode(barcode.Data, barcode.Symbology.ToString());
};
// IronBarcode direct return (replacement)
foreach (var result in BarcodeReader.Read("document.png"))
ProcessBarcode(result.Value, result.Format.ToString());
Imports System
' Scandit callback pattern (removed during migration)
AddHandler barcodeCapture.BarcodeScanned, Sub(sender, args)
For Each barcode In args.Session.NewlyRecognizedBarcodes
ProcessBarcode(barcode.Data, barcode.Symbology.ToString())
Next
End Sub
' IronBarcode direct return (replacement)
For Each result In BarcodeReader.Read("document.png")
ProcessBarcode(result.Value, result.Format.ToString())
Next
Usunięcie deklaracji symbologii
Scandit wymaga wyraźnych wywołań EnableSymbologies przed rozpoczęciem skanowania. IronBarcode nie wymaga wstępnego deklarowania symboli — wszystkie formaty są wykrywane automatycznie. Podczas migracji wszystkie wywołania settings.EnableSymbologies(...) są usuwane. Jeśli oryginalny kod Scandit ograniczał symbole ze względu na wydajność, w IronBarcode dostępna jest równoważna optymalizacja poprzez BarcodeReaderOptions.ExpectBarcodeTypes, ale nie jest ona wymagańa do rozpoczęcia pracy.
Dodatkowe możliwości IronBarcode
Oprócz obszarów omówionych w powyższym porównaniu, IronBarcode oferuje funkcje, które rozszerzają jego zastosowanie w scenariuszach przetwarzania dokumentów i danych:
- Generowanie kodów kreskowych: Generuj kody kreskowe jako pliki graficzne lub osadzaj je w plikach PDF we wszystkich obsługiwanych symbolikach, w tym kodach QR, Code 128, Data Matrix i PDF417.
- GS1 i parsowanie danych strukturalnych: Dekoduj formaty danych strukturalnych BarCode, w tym identyfikatory aplikacji GS1-128, bezpośrednio z wyników skanowania BarCode.
- Korekcja i wstępne przetwarzanie obrazów: Automatyczna korekcja obrazów w przypadku przekrzywionych, o niskim kontraście lub uszkodzonych BARCODE'ów poprawia wskaźniki odczytu skanowanych dokumentów bez konieczności ręcznego przetwarzania wstępnego.
- Wykrywanie wielu BarCodes: Pojedyncze wywołanie
BarcodeReader.Readwykrywa wszystkie BarCodes obecne w dokumencie, w tym mieszane formaty na tej samej stronie, przy użyciu opcjiExpectMultipleBarcodes. - Odczytywanie BarCode'ów w MAUI: W aplikacjach MAUI wykorzystujących model przechwytywania i przetwarzania, IronBarcode obsługuje etap przetwarzania po zrobieniu zdjęcia za pomocą
MediaPicker. - Wejście strumieniowe i tablica bajtów: Oprócz ścieżek do plików,
BarcodeReader.Readakceptuje dane wejścioweStreamibyte[], umożliwiając integrację z procedurami obsługi przesyłania, buforami pamięci i strumieniami sieciowymi bez tworzenia plików tymczasowych.
Zgodność z platformą .NET i gotowość na przyszłość
IronBarcode obsługuje .NET Framework 4.6.2 i nowsze wersje, .NET Standard 2.0 oraz wszystkie nowoczesne wersje .NET, w tym .NET 6, .NET 7, .NET 8 i .NET 9. Biblioteka jest regularnie aktualizowana w celu zachowania zgodności z obecnymi i przyszłymi wersjami .NET, w tym z .NET 10, którego premiera przewidziana jest na koniec 2026 roku. Jej bezstanowa konstrukcja API jest zgodna z modelem programowania async-first wprowadzonym w nowoczesnym .NET, a obsługa systemu Linux i wdrożeń kontenerowych sprawia, że nadaje się ona do obciążeń natywnych dla chmury, gdzie popularność .NET wciąż rośnie. Ponieważ biblioteka jest dostarczana jako pojedynczy pakiet NuGet bez zależności uruchomieniowych specyficznych dla platformy, poza samym środowiskiem uruchomieniowym .NET, aktualizacja wersji .NET nie wymaga oddzielnych aktualizacji biblioteki ani dodatkowej konfiguracji.
Wnioski
Scandit SDK i IronBarcode reprezentują zasadniczo różne podejścia do przetwarzania kodów kreskowych, które odzwierciedlają różne konteksty wdrożeniowe. Scandit został stworzony do skanowania w czasie rzeczywistym za pomocą kamery na urządzeniach mobilnych, z architekturą koordynującą sesję na żywo z kamery, ustawienia analizy poszczególnych klatek oraz dostarczanie wyników w oparciu o zdarzenia. IronBarcode został stworzony do przetwarzania opartego na plikach i dokumentach na serwerach, komputerach stacjonarnych i w infrastrukturze chmurowej, z bezstanowym API, które akceptuje pliki, strumienie i pliki PDF oraz zwraca wyniki synchroniczne. Nie są to konkurencyjne implementacje tego samego pomysłu — są to różne pomysły służące różnym przypadkom użycia.
Scandit SDK to odpowiedni wybór dla aplikacji mobilnych, w których użytkownik kieruje aparat urządzenia na fizyczny BARCODE i potrzebuje wizualnej informacji zwrotnej w czasie poniżej 100 ms. Funkcje nakładania AR, jednoczesne wykrywanie wielu kodów kreskowych za pomocą MatrixScan oraz skanowanie dokumentów tożsamości za pomocą ID Scanning to specjalnie zaprojektowane funkcje, których nie oferuje żadna biblioteka BarCode oparta na plikach. Organizacje zatrudniające na dużą skalę pracowników terenowych korzystających z urządzeń mobilnych, oferujące usługi skanowania dla konsumentów lub wymagające umów SLA Enterprise dotyczących skanowania mobilnego stanowią grupę docelową, dla której firma Scandit została stworzona.
IronBarcode to właściwy wybór, gdy dane kodów kreskowych są dostarczane w postaci plików — obrazów, plików PDF, tablic bajtów lub strumieni przesyłania — a przetwarzanie odbywa się bez kamery, bez udziału użytkownika i bez interfejsu użytkownika. Przetwarzanie dokumentów po stronie serwera, punkty końcowe API ASP.NET Core, Azure Functions, zaplanowane zadania wsadowe i mikrousługi w kontenerach to środowiska, w których działa IronBarcode. Opublikowane ceny, dostęp do funkcji w ramach jednego pakietu oraz API do bezpośredniego odczytu plików eliminują problemy architektoniczne i niepewność budżetową, które model potoku kamerowego i model sprzedaży kontaktowej firmy Scandit wprowadzają w tych scenariuszach.
Szczera ocena jest taka, że wybór zależy w dużej mierze od kontekstu wdrożenia, a nie od preferencji. Projekt wymagający skanowania na żywo za pomocą kamery w telefonie ma jasną odpowiedź. Projekt wymagający ekstrakcji BARCODE-ów z plików PDF po stronie serwera ma równie jasną odpowiedź. Te dwie biblioteki są czasami mylone w obszarze pośrednim — aplikacjach MAUI, architekturach hybrydowych oraz organizacjach, które mają wymagania zarówno w zakresie skanowania mobilnego, jak i przetwarzania dokumentów. W takich przypadkach obie biblioteki mogą współistnieć: Scandit zajmuje się zadaniami związanymi z kamerą, a biblioteka IronBarcode przetwarzaniem dokumentów, przy czym żadna z bibliotek nie jest zmuszana do pełnienia roli, do której nie została zaprojektowana.
Często Zadawane Pytania
Czym jest Scandit SDK?
Scandit SDK to biblioteka kodów kreskowych .NET służąca do generowania i odczytywania 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 Scandit SDK a IronBarcode?
IronBarcode wykorzystuje statyczne, bezstanowe API, które nie wymaga zarządzania instancjami, podczas gdy Scandit SDK 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 Scandit SDK?
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 Scandit SDK?
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 Scandit SDK?
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 Scandit?
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 Scandit SDK 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 Scandit SDK do IronBarcode jest prosta?
Migracja z Scandit SDK 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().

