Przejdź do treści stopki
FILMY

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
$vbLabelText   $csharpLabel
// 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
$vbLabelText   $csharpLabel

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
SHELL

Zainstaluj IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

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
$vbLabelText   $csharpLabel

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"
$vbLabelText   $csharpLabel

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.
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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.
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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.
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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.
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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"
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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"))
$vbLabelText   $csharpLabel

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" .
SHELL

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

  1. Usuń pakiety NuGet Scandit (Scandit.BarcodePicker, Scandit.DataCapture.Core, Scandit.DataCapture.Barcode)
  2. Zainstaluj pakiet NuGet IronBarcode
  3. Zastąp importy using Scandit.DataCapture.* using IronBarCode
  4. Usuń blok inicjalizacyjny DataCaptureContext w całości
  5. Usuń wszystkie wywołania Camera.GetDefaultCamera() i SetFrameSourceAsync
  6. Usuń wszystkie wywołania EnableSymbologies
  7. Zastąp barcodeCapture.IsEnabled = true BarcodeReader.Read(filePath)
  8. Przekształć obsługę zdarzeń BarcodeScanned += w foreach nad wynikami BarcodeReader.Read()
  9. Zastąp barcode.Data result.Value
  10. Zastąp barcode.Symbology result.Format
  11. Usunięcie potoków renderowania PDF na obraz, gdzie IronBarcode odczytuje teraz pliki PDF bezpośrednio
  12. 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 PageNumber dla 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.ForEach zwraca 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.

Zwróć uwagęScandit jest zarejestrowanym znakiem towarowym odpowiedniego właściciela. Ta strona nie jest powiązana z, wspierana ani sponsorowana przez Scandit. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.

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ń.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie