Porównanie biblioteki IronBarcode i ZXing Net
Migracja ze Scandit SDK do IronBarcode
Scandit SDK to platforma skanowania kamerowego stworzona do wykrywania BarCodes w czasie rzeczywistym na urządzeniach mobilnych.IronBarcode to biblioteka do przetwarzania kodów kreskowych po stronie serwera i oparta na plikach dla platformy .NET. Te dwie biblioteki służą do różnych głównych zastosowań, a migracja z jednej do drugiej ma sens tylko w określonych okolicznościach.
Niniejszy przewodnik opisuje ścieżkę migracji dla zespołów korzystających z pakietów .NET firmy Scandit do przetwarzania plików, dokumentów PDF lub strumieni dokumentów po stronie serwera — scenariuszy, w których architektura potoku kamerowego Scandit powoduje utrudnienia zamiast wnosić wartość dodaną. Jeśli Twoim głównym wymaganiem jest skierowanie aparatu w telefonie na obiekty fizyczne i otrzymywanie informacji zwrotnej w czasie rzeczywistym z nakładkami rzeczywistości rozszerzonej, Scandit pozostaje odpowiednim narzędziem, a niniejszy przewodnik nie ma zastosowania. Jeśli potrzebujesz odczytywać kody kreskowe z przesłanych obrazów, wyodrębniać dane kodów kreskowych z dokumentów PDF lub uruchamiać wykrywanie kodów kreskowych w ASP.NET Core, Azure Functions, kontenerach Docker lub usługach przetwarzania w tle, ten przewodnik zawiera kompletną ścieżkę migracji.
Dlaczego warto przejść z Scandit SDK
Nadmiar wydajności potoku kamery: Każda integracja Scandit rozpoczyna się od tej samej sekwencji inicjalizacji, niezależnie od tego, czy kamera jest obecna w środowisku wdrożeniowym: skonstruuj DataCaptureContext, skonfiguruj BarcodeCaptureSettings, enumeruj symbologie do włączenia, zdobądź instancję Camera, przypisz ją jako źródło klatek, przełącz kamerę do stanu aktywnego i włącz przechwytywanie kodów kreskowych. Ta inicjalizacja istnieje, ponieważ Scandit przetwarza klatki wideo na żywo. W przypadku przetwarzania plików po stronie serwera sekwencja ta nie zapewnia żadnych korzyści i wprowadza złożoność stanową, która nie ma odpowiednika w środowisku docelowym — w kontenerze Docker nie ma kamery, a w funkcji Azure nie ma źródła klatek.
Brak publicznych cen: Scandit nie publikuje cen. SparkScan, MatrixScan, ID Scanning, AR Overlays i Parser to produkty wyceniane indywidualnie, które wymagają osobnego zapytania ofertowego. Propozycja budżetu, porównanie dostawców lub analiza kosztów i korzyści nie może zostać zakończona bez przystąpienia do cyklu sprzedaży.IronBarcodepodaje swoje ceny publicznie — 749, 1499 lub 2999 dolarów za jednorazowy zakup na czas nieograniczony — więc kwota ta jest widoczna na stronie jeszcze przed napisaniem pierwszej linii kodu.
Obowiązkowa deklaracja symboli: Scandit wymaga wyraźnego włączenia każdego formatu BARCODE przed rozpoczęciem sesji skanowania. W przypadku skanowania kamerą w czasie rzeczywistym jest to optymalizacja wydajności — ograniczenie symboli zmniejsza obciążenie związane z przetwarzaniem każdej klatki. W przetwarzaniu dokumentów opartym na plikach, gdzie przychodzące dokumenty mogą zawierać dowolny format BARCODE od dowolnego dostawcy lub partnera, obowiązkowa deklaracja formatu staje się ograniczeniem. Wymienianie wszystkich możliwych symboli eliminuje korzyści związane z wydajnością; pisanie logiki odgadywania formatu na bazie biblioteki zwiększa nakłady inżynieryjne.
Brak wsparcia dla PDF: Nie ma bezpośredniego odpowiednika BarcodeReader.Read("invoice.pdf") w API Scandit. Wyodrębnianie kodów kreskowych z dokumentu PDF wymaga renderowania każdej strony do obrazu rastrowego przy użyciu oddzielnej biblioteki, a następnie przepuszczenia tych renderowanych obrazów przez potok symulujący działanie kamery. Takie podejście wiąże się z dodatkowymi zależnościami, dodatkowymi licencjami i znacznym nakładem pracy inżynieryjnej w przypadku zadania, które jest rutynowe w procesach przetwarzania dokumentów.
Podstawowy problem
Scandit wymaga uruchomionej kamery, zanim będzie można rozpocząć pracę z kodami barcode.IronBarcode wymaga jedynie ścieżki do pliku:
// Scandit SDK: mandatory camera pipeline before first barcode read
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;
// Results arrive later via BarcodeScanned event callback
// Scandit SDK: mandatory camera pipeline before first barcode read
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;
// Results arrive later via BarcodeScanned event callback
Imports Scandit.DataCapture.Core
Imports Scandit.DataCapture.Barcode
Imports System.Collections.Generic
' Scandit SDK: mandatory camera pipeline before first barcode read
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
' Results arrive later via BarcodeScanned event callback
// IronBarcode: direct file reading
// NuGet: dotnet add package IronBarcode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-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-LICENSE-KEY";
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
Console.WriteLine($"{result.Value} ({result.Format})");
Imports IronBarCode
' IronBarcode: direct file reading
' NuGet: dotnet add package IronBarcode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
Console.WriteLine($"{result.Value} ({result.Format})")
Next
Cały blok potoku kamery — tworzenie kontekstu, ustawienia, włączanie symboliki, pozyskiwanie obrazu z kamery, przypisywanie źródła klatek, przejście między stanami — zostaje zastąpiony przez przypisanie klucza licencyjnego i pojedyncze wywołanie metody.
IronBarcode a Scandit SDK: porównanie funkcji
| Funkcja | Scandit SDK | IronBarcode |
|---|---|---|
| Główne wdrożenie | Skanowanie za pomocą aparatu w telefonie komórkowym | Serwer, chmura, przetwarzanie plików na komputerze stacjonarnym |
| Wymagana kamera | Tak | Nie |
| Odczytywanie plików graficznych | Nieprzeznaczone dla | Główny typ danych wejściowych |
| Pobieranie kodów kreskowych z plików PDF | Nieobsługiwane | Wbudowana obsługa wielu stron |
| Wejście strumieniowe / tablica bajtów | Nieobsługiwane | Tak |
| Automatyczne wykrywanie formatu | Nie (należy określić) | Tak (domyślne zachowanie) |
| Wyniki oparte na zdarzeniach | Tak (wywołanie zwrotne BarcodeScanned) | Nie (powrót synchroniczny) |
| ASP.NET Core / strona serwera | Nieprzeznaczone dla | W pełni obsługiwane |
| Azure Functions / bezserwerowe | Niepraktyczne | W pełni obsługiwane |
| Docker / Linux | Nieobsługiwane | W pełni obsługiwane |
| Generowanie BarCode | Nieobsługiwane | Zawartość pakietu |
| Wykrywanie wielu kodów BarCode | MatrixScan (oddzielny produkt) | Zawartość pakietu |
| Model cenowy | Skontaktuj się z działem sprzedaży (dla poszczególnych produktów) | Opublikowane poziomy wieczyste |
| Opłaty za skanowanie / za urządzenie | Tak | Nie |
Szybki start
Krok 1: Zastąp pakiet NuGet
Usuń pakiety Scandit:
dotnet remove package Scandit.BarcodePicker
dotnet remove package Scandit.DataCapture.Core
dotnet remove package Scandit.DataCapture.Barcode
dotnet remove package Scandit.BarcodePicker
dotnet remove package Scandit.DataCapture.Core
dotnet remove package Scandit.DataCapture.Barcode
Zainstaluj IronBarcode:
dotnet add package IronBarcode
dotnet add package IronBarcode
Krok 2: Aktualizacja przestrzeni nazw
Zastąp importy nazw przestrzeni Scandit importami nazw przestrzeni IronBarcode:
// Before (Scandit SDK)
using Scandit.DataCapture.Core;
using Scandit.DataCapture.Barcode;
using Scandit.DataCapture.Barcode.Data;
// After (IronBarcode)
using IronBarCode;
// Before (Scandit SDK)
using Scandit.DataCapture.Core;
using Scandit.DataCapture.Barcode;
using Scandit.DataCapture.Barcode.Data;
// After (IronBarcode)
using IronBarCode;
' Before (Scandit SDK)
Imports Scandit.DataCapture.Core
Imports Scandit.DataCapture.Barcode
Imports Scandit.DataCapture.Barcode.Data
' After (IronBarcode)
Imports IronBarCode
Krok 3: Inicjalizacja licencji
Dodaj inicjalizację licencji przy starcie aplikacji, zastępując wywołanie DataCaptureContext.ForLicenseKey:
// Before (Scandit SDK)
var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");
// After (IronBarcode)
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Before (Scandit SDK)
var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");
// After (IronBarcode)
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Before (Scandit SDK)
Dim dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE")
' After (IronBarcode)
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Przykłady migracji kodu
Odczytywanie BarCodes z pliku graficznego
Przetwarzanie statycznego pliku graficznego jest podstawowym scenariuszem obsługiwanym przez IronBarcode, a w Scandit jest to proces nieobsługiwany. Pakiet SDK firmy Scandit przetwarza klatki z kamery na żywo; Odczytanie pliku wymaga dostosowania potoku przechwytywania tak, aby traktował mapę bitową jako źródło klatek, co nie ma natywnej implementacji.
Podejście Scandit SDK:
// Scandit SDK has no direct file-read API.
// Reading a static image requires constructing a bitmap frame source
// and routing it through the capture pipeline — an unsupported workaround.
// The standard Scandit integration assumes a running camera at all times.
// Scandit SDK has no direct file-read API.
// Reading a static image requires constructing a bitmap frame source
// and routing it through the capture pipeline — an unsupported workaround.
// The standard Scandit integration assumes a running camera at all times.
' Scandit SDK has no direct file-read API.
' Reading a static image requires constructing a bitmap frame source
' and routing it through the capture pipeline — an unsupported workaround.
' The standard Scandit integration assumes a running camera at all times.
Podejście IronBarcode:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("product-label.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Confidence: {result.Confidence}%");
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("product-label.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Confidence: {result.Confidence}%");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim results = BarcodeReader.Read("product-label.png")
For Each result In results
Console.WriteLine($"Value: {result.Value}")
Console.WriteLine($"Format: {result.Format}")
Console.WriteLine($"Confidence: {result.Confidence}%")
Next
Odczytywanie kodów kreskowych z obrazów za pomocąIronBarcode nie wymaga konfiguracji potoku. Zbiór wyników jest dostępny natychmiast po zwróceniu metody, bez konieczności subskrypcji zdarzeń.
Pobieranie BarCodes z dokumentu PDF
Wyodrębnianie kodów kreskowych z plików PDF to zupełnie nowy obszar podczas migracji z platformy Scandit, która nie obsługuje plików PDF.IronBarcode odczytuje dokumenty PDF bezpośrednio, zwracając wyniki indeksowane według numeru strony.
Podejście Scandit SDK:
// Scandit SDK: no PDF support.
// Implementing PDF barcode extraction with Scandit requires:
// 1. A separate PDF rendering library to convert pages to raster images
// 2. Routing each rendered image through the camera simulation pipeline
// 3. Correlating results back to page numbers manually
// This is not a supported workflow and requires significant custom engineering.
// Scandit SDK: no PDF support.
// Implementing PDF barcode extraction with Scandit requires:
// 1. A separate PDF rendering library to convert pages to raster images
// 2. Routing each rendered image through the camera simulation pipeline
// 3. Correlating results back to page numbers manually
// This is not a supported workflow and requires significant custom engineering.
' Scandit SDK: no PDF support.
' Implementing PDF barcode extraction with Scandit requires:
' 1. A separate PDF rendering library to convert pages to raster images
' 2. Routing each rendered image through the camera simulation pipeline
' 3. Correlating results back to page numbers manually
' This is not a supported workflow and requires significant custom engineering.
Podejście IronBarcode:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})");
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim results = BarcodeReader.Read("shipping-manifest.pdf")
For Each result In results
Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})")
Next
Pełne wytyczne dotyczące odczytu kodów kreskowych z dokumentów PDF, w tym wyboru zakresu stron i obsługi wielu kodów kreskowych, można znaleźć w dokumentacji IronBarcode, która obejmuje pełen zakres scenariuszy przetwarzania plików PDF. Nie są wymagane żadne dodatkowe biblioteki PDF.
Konwersja wywołań zwrotnych zdarzeń na bezpośrednie wartości zwracane
Scandit dostarcza wyniki skanowania przez zdarzenie BarcodeScanned, ponieważ skanowanie z kamery na żywo jest z natury asynchroniczne — wyniki pojawiają się, gdy kamera wykryje kod kreskowy w bieżącej klatce.IronBarcode zwraca wyniki jako kolekcję typowaną, ponieważ odczyt oparty na plikach ma znaną granicę zakończenia. Jest to jedna z najbardziej znaczących zmian strukturalnych w ramach migracji.
Podejście Scandit SDK:
// Scandit SDK: event-driven result delivery
barcodeCapture.BarcodeScanned += (sender, args) =>
{
foreach (var barcode in args.Session.NewlyRecognizedBarcodes)
{
string value = barcode.Data;
string symbology = barcode.Symbology.ToString();
// Processing logic embedded inside event handler
LogBarcodeResult(value, symbology);
UpdateInventory(value);
}
};
// Scan continues indefinitely until camera session is terminated
// Scandit SDK: event-driven result delivery
barcodeCapture.BarcodeScanned += (sender, args) =>
{
foreach (var barcode in args.Session.NewlyRecognizedBarcodes)
{
string value = barcode.Data;
string symbology = barcode.Symbology.ToString();
// Processing logic embedded inside event handler
LogBarcodeResult(value, symbology);
UpdateInventory(value);
}
};
// Scan continues indefinitely until camera session is terminated
Imports System
' Scandit SDK: event-driven 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()
' Processing logic embedded inside event handler
LogBarcodeResult(value, symbology)
UpdateInventory(value)
Next
End Sub
' Scan continues indefinitely until camera session is terminated
Podejście IronBarcode:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("document.png");
foreach (var result in results)
{
// Same processing logic, now in standard control flow
LogBarcodeResult(result.Value, result.Format.ToString());
UpdateInventory(result.Value);
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("document.png");
foreach (var result in results)
{
// Same processing logic, now in standard control flow
LogBarcodeResult(result.Value, result.Format.ToString());
UpdateInventory(result.Value);
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim results = BarcodeReader.Read("document.png")
For Each result In results
' Same processing logic, now in standard control flow
LogBarcodeResult(result.Value, result.Format.ToString())
UpdateInventory(result.Value)
Next
Cała logika przetwarzania, która była osadzona w wywołaniach zwrotnych obsługi zdarzeń, zostaje przeniesiona do standardowego kodu sekwencyjnego. Obsługa błędów, rejestrowanie i operacje następcze mogą być zorganizowane przy użyciu zwykłego przepływu sterowania, a nie wzorców obsługi zdarzeń.
Punkt końcowy ASP.NET Core do przesyłania plików
Bezstanowy punkt końcowy serwera odczytujący kody kreskowe z przesłanego pliku stanowi główny przykład zastosowania IronBarcode po stronie serwera. Ten wzorzec nie jest obsługiwany przez architekturę potoku kamer Scandit.
Podejście Scandit SDK:
// Scandit SDK: not applicable to ASP.NET Core file upload scenarios.
// The DataCaptureContext requires a camera hardware session.
// There is no mechanism to process an IFormFile through the Scandit pipeline
// without substantial custom camera-simulation infrastructure.
// Scandit SDK: not applicable to ASP.NET Core file upload scenarios.
// The DataCaptureContext requires a camera hardware session.
// There is no mechanism to process an IFormFile through the Scandit pipeline
// without substantial custom camera-simulation infrastructure.
' Scandit SDK: not applicable to ASP.NET Core file upload scenarios.
' The DataCaptureContext requires a camera hardware session.
' There is no mechanism to process an IFormFile through the Scandit pipeline
' without substantial custom camera-simulation infrastructure.
Podejście IronBarcode:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
[ApiController]
[Route("api/[controller]")]
public class BarcodeController : ControllerBase
{
[HttpPost("scan")]
public IActionResult ScanUploadedDocument(IFormFile file)
{
if (file == null || file.Length == 0)
return BadRequest("No file provided");
using var stream = file.OpenReadStream();
var results = BarcodeReader.Read(stream);
if (!results.Any())
return NotFound("No barcodes detected");
return Ok(results.Select(r => new
{
r.Value,
Format = r.Format.ToString(),
r.PageNumber
}));
}
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
[ApiController]
[Route("api/[controller]")]
public class BarcodeController : ControllerBase
{
[HttpPost("scan")]
public IActionResult ScanUploadedDocument(IFormFile file)
{
if (file == null || file.Length == 0)
return BadRequest("No file provided");
using var stream = file.OpenReadStream();
var results = BarcodeReader.Read(stream);
if (!results.Any())
return NotFound("No barcodes detected");
return Ok(results.Select(r => new
{
r.Value,
Format = r.Format.ToString(),
r.PageNumber
}));
}
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("api/[controller]")>
Public Class BarcodeController
Inherits ControllerBase
<HttpPost("scan")>
Public Function ScanUploadedDocument(file As IFormFile) As IActionResult
If file Is Nothing OrElse file.Length = 0 Then
Return BadRequest("No file provided")
End If
Using stream = file.OpenReadStream()
Dim results = BarcodeReader.Read(stream)
If Not results.Any() Then
Return NotFound("No barcodes detected")
End If
Return Ok(results.Select(Function(r) New With {
.Value = r.Value,
.Format = r.Format.ToString(),
.PageNumber = r.PageNumber
}))
End Using
End Function
End Class
Metoda BarcodeReader.Read akceptuje Stream bezpośrednio z IFormFile.OpenReadStream(), nie wymaga tworzenia tymczasowego pliku. Wyniki są zwracane synchronicznie w ramach cyklu żądanie-odpowiedź bez asynchronicznego zarządzania kamerą.
Równoległe przetwarzanie wsadowe wielu dokumentów
Duże kolejki dokumentów wymagają przetwarzania równoległego w wielu wątkach. Ponieważ API IronBarcode jest bezstanowe, jest z natury bezpieczne dla wątków i komponuje się bezpośrednio z Parallel.ForEach oraz asynchronicznymi wzorcami zadań.
Podejście Scandit SDK:
// Scandit SDK: no supported batch file processing pattern.
// The FrameSourceState model assumes a continuous camera session,
// not a queue of discrete documents. Batch processing would require
// one camera simulation pipeline per document or serialized processing
// through a shared pipeline — neither is a supported workflow.
// Scandit SDK: no supported batch file processing pattern.
// The FrameSourceState model assumes a continuous camera session,
// not a queue of discrete documents. Batch processing would require
// one camera simulation pipeline per document or serialized processing
// through a shared pipeline — neither is a supported workflow.
' Scandit SDK: no supported batch file processing pattern.
' The FrameSourceState model assumes a continuous camera session,
' not a queue of discrete documents. Batch processing would require
' one camera simulation pipeline per document or serialized processing
' through a shared pipeline — neither is a supported workflow.
Podejście IronBarcode:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
using System.Collections.Concurrent;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var files = Directory.GetFiles("./documents/", "*.pdf");
var allResults = new ConcurrentBag<(string File, BarcodeResult Result)>();
Parallel.ForEach(files, file =>
{
var results = BarcodeReader.Read(file, options);
foreach (var result in results)
allResults.Add((file, result));
});
foreach (var (file, result) in allResults)
Console.WriteLine($"{Path.GetFileName(file)}: {result.Value} ({result.Format})");
// NuGet: dotnet add package IronBarcode
using IronBarCode;
using System.Collections.Concurrent;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var files = Directory.GetFiles("./documents/", "*.pdf");
var allResults = new ConcurrentBag<(string File, BarcodeResult Result)>();
Parallel.ForEach(files, file =>
{
var results = BarcodeReader.Read(file, options);
foreach (var result in results)
allResults.Add((file, result));
});
foreach (var (file, result) in allResults)
Console.WriteLine($"{Path.GetFileName(file)}: {result.Value} ({result.Format})");
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.IO
Imports System.Threading.Tasks
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim files = Directory.GetFiles("./documents/", "*.pdf")
Dim allResults As New ConcurrentBag(Of (File As String, Result As BarcodeResult))()
Parallel.ForEach(files, Sub(file)
Dim results = BarcodeReader.Read(file, options)
For Each result In results
allResults.Add((file, result))
Next
End Sub)
For Each item In allResults
Console.WriteLine($"{Path.GetFileName(item.File)}: {item.Result.Value} ({item.Result.Format})")
Next
W przypadku zaawansowanych wzorców obejmujących asynchroniczne i wielowątkowe odczytywanie kodów kreskowych, w tym dostrajanie przepustowości i konfigurację liczby wątków, dokumentacja IronBarcode zawiera szczegółowe wskazówki.
Dokumentacja API Scandit SDK do IronBarcode
| Scandit SDK | IronBarcode | Uwagi |
|---|---|---|
DataCaptureContext.ForLicenseKey("key") |
IronBarCode.License.LicenseKey = "key" |
Jedno zlecenie; brak obiektu kontekstu |
BarcodeCaptureSettings.Create() |
new BarcodeReaderOptions() |
Opcjonalnie; nie jest wymagane do podstawowego odczytu |
settings.EnableSymbologies(Symbology.Code128, ...) |
(not needed) | IronBarcode automatycznie wykrywa wszystkie formaty |
Camera.GetDefaultCamera() |
(not applicable) | Brak koncepcji aparatu fotograficznego |
dataCaptureContext.SetFrameSourceAsync(camera) |
(not applicable) | Brak źródła ramki |
camera.SwitchToDesiredStateAsync(FrameSourceState.On) |
(not applicable) | Brak maszyny stanów kamery |
barcodeCapture.IsEnabled = true |
BarcodeReader.Read(path) |
Pojedyncze wywołanie inicjuje odczyt |
BarcodeScanned += obsługa zdarzenia |
Standardowy foreach nad wartością zwracaną |
Nie jest wymagany system zdarzeń |
args.Session.NewlyRecognizedBarcodes |
Zwracana wartość BarcodeReader.Read() |
Bezpośredni zbiór |
barcode.Data |
result.Value |
Ta sama treść semantyczna |
barcode.Symbology |
result.Format |
Wymiennik formatów |
using Scandit.DataCapture.Core |
using IronBarCode |
Pojedyncza przestrzeń nazw |
using Scandit.DataCapture.Barcode |
using IronBarCode |
Zawarte w tej samej przestrzeni nazw |
| Produkt SparkScan | BarcodeReader.Read(path) |
Nie jest wymagany żaden oddzielny produkt |
| Produkt MatrixScan | BarcodeReaderOptions { ExpectMultipleBarcodes = true } |
Zawarte w pakiecie podstawowym |
Typowe problemy związane z migracją i ich rozwiązania
Problem 1: Kod potoku kamery nie ma bezpośredniego tłumaczenia
Scandit SDK: Blok ustawień DataCaptureContext, BarcodeCaptureSettings, Camera i BarcodeCapture obejmuje 7–10 linii kodu inicjalizacyjnego z asynchronicznymi przejściami stanu.
Rozwiązanie: Ten blok został całkowicie usunięty. Nie ma odpowiednika IronBarcode, ponieważ oparte na plikach API IronBarcode nie wymaga inicjalizacji sesji. Zastąp cały blok następującym tekstem:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Problem 2: Logika obsługi zdarzeń BarcodeScanned
Scandit SDK: Logika przetwarzania jest osadzona wewnątrz lambd bądź metod obsługi zdarzeń BarcodeScanned +=. Ten wzorzec nie istnieje w IronBarcode.
Rozwiązanie: Przenieś ciało obsługi do standardowego kodu po wywołaniu BarcodeReader.Read:
// Before: event handler
barcodeCapture.BarcodeScanned += (s, args) =>
{
foreach (var b in args.Session.NewlyRecognizedBarcodes)
Console.WriteLine(b.Data);
};
// After: direct iteration
foreach (var result in BarcodeReader.Read("document.png"))
Console.WriteLine(result.Value);
// Before: event handler
barcodeCapture.BarcodeScanned += (s, args) =>
{
foreach (var b in args.Session.NewlyRecognizedBarcodes)
Console.WriteLine(b.Data);
};
// After: direct iteration
foreach (var result in BarcodeReader.Read("document.png"))
Console.WriteLine(result.Value);
Imports System
' Before: event handler
AddHandler barcodeCapture.BarcodeScanned, Sub(s, args)
For Each b In args.Session.NewlyRecognizedBarcodes
Console.WriteLine(b.Data)
Next
End Sub
' After: direct iteration
For Each result In BarcodeReader.Read("document.png")
Console.WriteLine(result.Value)
Next
Problem 3: Wywołania EnableSymbologies rozproszone w kodzie źródłowym
Scandit SDK: W wielu miejscach w kodzie można wywołać settings.EnableSymbologies(...) z różnymi zestawami symbologii dla różnych kontekstów skanowania.
Rozwiązanie: Usuń wszystkie wywołania EnableSymbologies.IronBarcode domyślnie automatycznie wykrywa wszystkie obsługiwane formaty. Jeśli ograniczenie formatu jest potrzebne dla wydajności w określonych scenariuszach, użyj BarcodeReaderOptions.ExpectBarcodeTypes:
var options = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("document.png", options);
var options = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("document.png", options);
Imports System
Dim options As New BarcodeReaderOptions With {
.ExpectBarcodeTypes = BarcodeEncoding.Code128 Or BarcodeEncoding.QRCode
}
Dim results = BarcodeReader.Read("document.png", options)
Problem 4: Brak możliwości odczytu plików PDF w istniejącym kodzie źródłowym
Scandit SDK: Jeśli istniejąca baza kodu konwertuje strony PDF na obrazy przed przekazaniem ich do potoku Scandit, ta niestandardowa infrastruktura renderowania nie jest już potrzebna.
Rozwiązanie: Całkowicie usunąć etap renderowania pliku PDF na obraz. Przekaż ścieżkę do pliku PDF bezpośrednio do IronBarcode:
// Before: render PDF pages to images, then pass each image to Scandit pipeline
// (multiple steps, external PDF library dependency)
// After: pass PDF directly to IronBarcode
var results = BarcodeReader.Read("document.pdf");
// Results include PageNumber property for each detected barcode
// Before: render PDF pages to images, then pass each image to Scandit pipeline
// (multiple steps, external PDF library dependency)
// After: pass PDF directly to IronBarcode
var results = BarcodeReader.Read("document.pdf");
// Results include PageNumber property for each detected barcode
' Before: render PDF pages to images, then pass each image to Scandit pipeline
' (multiple steps, external PDF library dependency)
' After: pass PDF directly to IronBarcode
Dim results = BarcodeReader.Read("document.pdf")
' Results include PageNumber property for each detected barcode
Zagadnienie 5: Wzorce asynchronicznej inicjalizacji kamery
Scandit SDK: Inicjalizacja kamery używa await dla SetFrameSourceAsync oraz SwitchToDesiredStateAsync. Jeśli kod wywołujący jest zbudowany wokół tych operacji asynchronicznych, ich usunięcie upraszcza łańcuch asynchroniczny.
Rozwiązanie: Całkowicie usuń asynchroniczną inicjalizację kamery. BarcodeReader.Read jest synchroniczny. Jeśli potrzebne jest asynchroniczne wykonanie dla responsywności w interfejsie użytkownika lub kontekście serwera, otocz go Task.Run:
// Async wrapper for non-blocking execution
var results = await Task.Run(() => BarcodeReader.Read("document.png"));
// Async wrapper for non-blocking execution
var results = await Task.Run(() => BarcodeReader.Read("document.png"));
Imports System.Threading.Tasks
' Async wrapper for non-blocking execution
Dim results = Await Task.Run(Function() BarcodeReader.Read("document.png"))
Lista kontrolna migracji Scandit SDK
Zadania przed migracją
Sprawdź wszystkie punkty integracji Scandit w kodzie źródłowym:
grep -r "DataCaptureContext\|BarcodeCaptureSettings\|BarcodeCapture" --include="*.cs" .
grep -r "EnableSymbologies\|BarcodeScanned\|NewlyRecognizedBarcodes" --include="*.cs" .
grep -r "using Scandit" --include="*.cs" .
grep -r "barcode\.Data\|barcode\.Symbology\|FrameSourceState" --include="*.cs" .
grep -r "DataCaptureContext\|BarcodeCaptureSettings\|BarcodeCapture" --include="*.cs" .
grep -r "EnableSymbologies\|BarcodeScanned\|NewlyRecognizedBarcodes" --include="*.cs" .
grep -r "using Scandit" --include="*.cs" .
grep -r "barcode\.Data\|barcode\.Symbology\|FrameSourceState" --include="*.cs" .
Udokumentuj wszystkie konteksty skanowania — określ, które ścieżki kodu obsługują skanowanie z kamery w czasie rzeczywistym (pozostając w Scandit), a które przetwarzanie plików lub dokumentów (migrując do IronBarcode). Należy zwrócić uwagę na wszystkie miejsca, w których strony PDF są renderowane do obrazów przed przetworzeniem przez Scandit, ponieważ ten etap renderowania zostanie wyeliminowany.
Zadania związane z aktualizacją kodu
- Usuń pakiety NuGet Scandit (
Scandit.BarcodePicker,Scandit.DataCapture.Core,Scandit.DataCapture.Barcode) - Zainstaluj pakiet NuGet
IronBarcode - Zastąp importy
using Scandit.DataCapture.*using IronBarCode - Usuń blok inicjalizacyjny
DataCaptureContextw całości - Usuń wszystkie wywołania
Camera.GetDefaultCamera()iSetFrameSourceAsync - Usuń wszystkie wywołania
EnableSymbologies - Zastąp
barcodeCapture.IsEnabled = trueBarcodeReader.Read(filePath) - Przekształć obsługę zdarzeń
BarcodeScanned +=wforeachnad wynikamiBarcodeReader.Read() - Zastąp
barcode.Dataresult.Value - Zastąp
barcode.Symbologyresult.Format - Usunięcie potoków renderowania PDF na obraz, gdzie IronBarcode odczytuje teraz pliki PDF bezpośrednio
- Dodaj
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"przy starcie aplikacji
Testy po migracji
Po zakończeniu aktualizacji kodu sprawdź, czy:
- Sprawdź, czy wartości BarCode zwracane przez IronBarcodesą zgodne z wartościami zwracanymi wcześniej przez Scandit dla tych samych dokumentów wejściowych
- Zweryfikuj, że wszystkie obsługiwane formaty kodów kreskowych w zestawie dokumentów są wykrywane bez konfiguracji
ExpectBarcodeTypes - Przetestuj, czy ekstrakcja PDF zwraca poprawne wartości
PageNumberdla dokumentów wielostronicowych - Sprawdź, czy punkty końcowe .NET Core zwracają wyniki w akceptowalnym czasie odpowiedzi przy oczekiwanym obciążeniu
- Sprawdź, czy wdrożenia Docker lub kontenerowe pomyślnie odczytują BarCode bez sprzętu kamerowego
- Przetestuj, czy jednoczesne przetwarzanie wsadowe z
Parallel.ForEachzwraca poprawne wyniki bez warunków wyścigu - Sprawdź, czy aplikacja uruchamia się i inicjuje poprawnie z kluczem licencyjnym IronBarcode zamiast kontekstu Scandit
Kluczowe korzyści wynikające z migracji do IronBarcode
Eliminacja nadmiaru wydajności potoku kamery: Usunięcie sekwencji inicjalizacji DataCaptureContext eliminuje stanowe zarządzanie kamerą, asynchroniczne przejścia stanów oraz specyficzne dla platform api kamer z kodu serwerowego. Wynikowy kod jest prostszy, krótszy i nie ma ograniczeń platformowych, które uniemożliwiają wdrożenie w systemie Linux, w kontenerach Docker lub w środowiskach obliczeniowych bezserwerowych.
Bezpośrednie przetwarzanie plików PDF: Natywne wyodrębnianie BARCODE-ów z plików PDF eliminuje zależność od oddzielnej biblioteki renderującej pliki PDF, nakłady inżynieryjne związane z procesem przekształcania stron w obrazy oraz dodatkowe koszty licencji związane z tą zależnością. Wielostronicowe dokumenty PDF są przetwarzane za pomocą jednego wywołania metody, a wyniki indeksowane według stron są dostępne natychmiast.
Synchroniczne, bezstanowe API: Model bezpośredniej wartości zwracanej zastępuje wzorce wywołań zwrotnych sterowanych zdarzeniami standardowym kodem sekwencyjnym. Obsługa błędów, rejestrowanie i przetwarzanie końcowe w naturalny sposób integrują się z istniejącą architekturą aplikacji bez konieczności zarządzania subskrypcjami zdarzeń lub koordynacji asynchronicznych maszyn stanów.
Opublikowane przejrzyste ceny: Poziomy licencji wieczystych, podane publicznie jako 749 USD, 1499 USD i 2999 USD, umożliwiają przygotowywanie propozycji budżetowych, porównywanie dostawców i przeprowadzanie procesów zakupowych bez konieczności przechodzenia przez cykl sprzedaży. Koszt licencji można ustalić jeszcze przed napisaniem pierwszej linii kodu integracyjnego.
Pełna obsługa chmury i kontenerów: bezstanowe, niezależne od sprzętu API IronBarcode działa bez modyfikacji w Azure Functions, AWS Lambda, kontenerach Docker na systemie Linux oraz w każdym innym środowisku obliczeniowym, w którym dostępny jest środowisko uruchomieniowe .NET. Wdrożenie w tych środowiskach nie wymaga symulacji kamery, obejść zależności sprzętowych ani konfiguracji specyficznej dla platformy.
Automatyczne wykrywanie formatu: Usunięcie deklaracji EnableSymbologies oznacza, że przychodzące dokumenty z nieoczekiwanymi formatami kodów kreskowych są obsługiwane prawidłowo bez zmian w kodzie. Gdy zmienia się zestaw formatów występujących w przychodzących dokumentach — nowi dostawcy, nowe formaty etykiet, nowe typy dokumentów —IronBarcode automatycznie obsługuje nowe formaty.
Często Zadawane Pytania
Dlaczego warto przejść z Scandit SDK na IronBarcode?
Typowe powody to uproszczenie licencjonowania (eliminacja złożoności związanej z SDK i kluczem uruchomieniowym), zniesienie limitów przepustowości, uzyskanie natywnej obsługi plików PDF, usprawnienie wdrażania w środowisku Docker/CI/CD oraz ograniczenie powtarzalnego kodu API w kodzie produkcyjnym.
Jak zastąpić wywołania API Scandit za pomocą IronBarcode?
Zastąp standardowe fragmenty kodu dotyczące tworzenia instancji i licencjonowania wyrażeniem IronBarCode.License.LicenseKey = "key". Zastąp wywołania czytnika wyrażeniem BarcodeReader.Read(path), a wywołania zapisu wyrażeniem BarcodeWriter.CreateBarcode(data, encoding). Metody statyczne nie wymagają zarządzania instancjami.
Jak bardzo zmienia się kod podczas migracji z Scandit SDK do IronBarcode?
Większość migracji skutkuje zmniejszeniem liczby linii kodu. Usuwane są standardowe fragmenty dotyczące licencji, konstruktory instancji oraz jawna konfiguracja formatów. Podstawowe operacje odczytu/zapisu są mapowane na krótsze odpowiedniki w IronBarcode z bardziej przejrzystymi obiektami wynikowymi.
Czy podczas migracji muszę mieć zainstalowane zarówno Scandit SDK, jak i IronBarcode?
Nie. Większość migracji polega na bezpośredniej wymianie, a nie na równoległym działaniu. Należy migrować po jednej klasie usługowej na raz, zastąpić odwołanie do NuGet oraz zaktualizować wzorce instancjonowania i wywoływania API przed przejściem do kolejnej klasy.
Jaka jest nazwa pakietu NuGet dla IronBarcode?
Pakiet nosi nazwę „IronBarcode” (z wielkimi literami B i C). Zainstaluj go za pomocą polecenia „Install-Package IronBarcode” lub „dotnet add package IronBarcode”. Dyrektywa using w kodzie to „using IronBarcode;”.
W jaki sposób IronBarcode upraszcza wdrażanie Docker w porównaniu z Scandit SDK?
IronBarcode to pakiet NuGet bez zewnętrznych plików SDK ani konfiguracji licencji. W Dockerze należy ustawić zmienną środowiskową IRONBARCODE_LICENSE_KEY, a pakiet zajmie się weryfikacją licencji podczas uruchamiania.
Czy IronBarcode automatycznie wykrywa wszystkie formaty kodów kreskowych po migracji z Scandit?
Tak. IronBarcode automatycznie wykrywa symbole we wszystkich obsługiwanych formatach. Wyraźne wyliczenie typów kodów kreskowych nie jest wymagane. Jeśli format jest już znany, a wydajność ma znaczenie, BarcodeReaderOptions pozwala ograniczyć obszar wyszukiwania w celu optymalizacji.
Czy IronBarcode może odczytywać BarCodes z plików PDF bez oddzielnej biblioteki?
Tak. BarCodeReader.Read("document.pdf") przetwarza pliki PDF natywnie. Wyniki obejmują PageNumber, Format, Value i Confidence dla każdego znalezionego kodu kreskowego. Nie jest wymagany żaden zewnętrzny etap renderowania pliku PDF.
W jaki sposób IronBarcode obsługuje równoległe przetwarzanie kodów kreskowych?
Metody statyczne IronBarcode są bezstanowe i bezpieczne dla wątków. Użyj Parallel.ForEach bezpośrednio na listach plików bez zarządzania instancjami dla poszczególnych wątków. BarcodeReaderOptions.MaxParallelThreads kontroluje wewnętrzny limit wątków.
Jakie właściwości wyników ulegają zmianie podczas migracji z Scandit SDK do IronBarcode?
Typowe zmiany nazw: BarcodeValue staje się Value, BarcodeType staje się Format. Wyniki IronBarcode zawierają również Confidence i PageNumber. Funkcja wyszukiwania i zamiany w całym rozwiązaniu obsługuje zmiany nazw w istniejącym kodzie przetwarzania wyników.
Jak skonfigurować licencjonowanie IronBarcode w potoku CI/CD?
Zapisz IronBarcode_LICENSE_KEY jako sekret potoku i przypisz IronBarCode.License.LicenseKey w kodzie uruchamiającym aplikację. Jeden sekret obejmuje wszystkie środowiska, w tym środowisko programistyczne, testowe, przejściowe i produkcyjne.
Czy IronBarcode obsługuje generowanie kodów QR z niestandardowym stylem?
Tak. Funkcja QRCodeWriter.CreateQrCode() obsługuje niestandardowe kolory za pomocą ChangeBarCodeColor(), osadzanie logo za pomocą AddBrandLogo(), konfigurowalne poziomy korekcji błędów oraz wiele formatów wyjściowych, w tym PNG, JPG, PDF i strumień.

