Przejdź do treści stopki
FILMY

Jak odczytywać kody kreskowe z obrazów Gif i Tiff z wieloma stronami w C#

Migracja zeScanbot SDKdo IronBarcode

Niniejszy przewodnik jest przeznaczony dla zespołów programistów .NET, które przenoszą przetwarzanie kodów kreskowych zScanbot SDKdo IronBarcode for .NET w scenariuszach po stronie serwera, na komputerach stacjonarnych lub w rozszerzonych scenariuszach opartych na plikach. Nie jest to zamiana "jeden do jednego":Scanbot SDKto komponent do skanowania za pomocą aparatu w telefonie, a biblioteka IronBarcode to biblioteka do przetwarzania plików i dokumentów. Migracja jest zmianą zakresu spowodowaną wymaganiami, których model oparty wyłącznie na kamerze nie jest w stanie spełnić. Zespoły, które chcą zastąpić działający interfejs użytkownika do skanowania za pomocą kamery w telefonie komórkowym bez dodawania innych wymagań, powinny przed przystąpieniem do działania ocenić, czy migracja jest właściwym rozwiązaniem.

Dla zespołów, które rozpoczęły pracę z Scanbotem w aplikacji mobilnej MAUI, a obecnie potrzebują przetwarzania BarCode w .NET Core, wersji desktopowej lub potoku dokumentów, migracja jest prosta. Główna zmiana polega na zastąpieniu ScanbotSDKMain.Barcode.StartScannerAsync(configuration) przez BarcodeReader.Read(source), gdzie source jest ścieżką pliku, strumieniem, tablicą bajtów lub PDF-em.

Dlaczego warto przejść z Scanbot SDK

Wymagania dotyczące przetwarzania po stronie serwera:Scanbot SDKnie kompiluje się w .NET Core, aplikacjach konsolowych, Azure Functions ani żadnym projekcie innym niż MAUI. Gdy aplikacja mobilna wymaga serwerowego uzupełnienia, które również przetwarza kody kreskowe — wyodrębniając je z przesłanych plików PDF lub weryfikując wartości kodów kreskowych w przychodzących dokumentach — Scanbot nie może przekroczyć tej granicy.IronBarcode działa we wszystkich tych kontekstach z tym samym BarcodeReader.Read() API.

Obsługa Desktop MAUI: Pakiet Scanbota jest przeznaczony dla net10.0-android i net10.0-ios. Projekt MAUI, który dodaje net10.0-windows lub net10.0-maccatalyst do swojego TargetFrameworks, nie zbuduje celów desktopowych, ponieważ pakiet Scanbota nie dostarcza zestawów dla tych platform.IronBarcodeobsługuje systemy Windows i macOS MAUI, a także iOS i Android, co oznacza, że ten sam pakiet działa w projekcie MAUI z wieloma celami bez wykluczeń specyficznych dla platformy lub odniesień warunkowych.

Przepływy pracy z dokumentami PDF: W Scanbocie nie ma BarcodeScanner.Read(filePath). Gdy proces pracy ewoluuje i obejmuje odczytywanie kodów kreskowych z przesłanych dokumentów, archiwów zeskanowanych obrazów lub faktur w formacie PDF, architektura Scanbota nie jest w stanie tego obsłużyć.IronBarcode odczytuje pliki PDF i obrazy bezpośrednio, a każdy wynik zawiera numer strony, na której znaleziono BarCode.

Przewidywalność modelu cenowego: Scanbot stosuje roczną opłatę ryczałtową. Dla niektórych organizacji coroczna odnowienie jest sygnałem do oceny alternatyw — szczególnie gdy zakres projektu rozrósł się do uwzględnienia celów serwerowych lub desktopowych, które wykraczają poza zasięg Scanbot.IronBarcode to jednorazowy zakup na czas nieokreślony, co eliminuje obowiązek corocznego odnawiania.

Podstawowy problem

Scanbot SDK wymaga podglądu na żywo z kamery. Gdy wymagania wykraczają poza urządzenia mobilne, nie ma odpowiednika w istniejących zależnościach:

// Scanbot SDK: camera-only — no file or server equivalent exists
var configuration = new BarcodeScannerScreenConfiguration
{
    BarcodeFormats = new[] { BarcodeFormat.Code128, BarcodeFormat.QrCode }
};

// This call requires iOS or Android hardware and a MAUI camera UI
// It cannot be redirected to a file path, stream, or server context
var result = await ScanbotSDKMain.Barcode.StartScannerAsync(configuration);
// Scanbot SDK: camera-only — no file or server equivalent exists
var configuration = new BarcodeScannerScreenConfiguration
{
    BarcodeFormats = new[] { BarcodeFormat.Code128, BarcodeFormat.QrCode }
};

// This call requires iOS or Android hardware and a MAUI camera UI
// It cannot be redirected to a file path, stream, or server context
var result = await ScanbotSDKMain.Barcode.StartScannerAsync(configuration);
Imports System.Threading.Tasks

' Scanbot SDK: camera-only — no file or server equivalent exists
Dim configuration As New BarcodeScannerScreenConfiguration With {
    .BarcodeFormats = {BarcodeFormat.Code128, BarcodeFormat.QrCode}
}

' This call requires iOS or Android hardware and a MAUI camera UI
' It cannot be redirected to a file path, stream, or server context
Dim result = Await ScanbotSDKMain.Barcode.StartScannerAsync(configuration)
$vbLabelText   $csharpLabel

IronBarcode akceptuje te same typy źródeł — plik, strumień, tablicę bajtów lub PDF — w dowolnym kontekście projektu:

// IronBarcode: the same call works in MAUI, ASP.NET Core, console, WPF, Azure Functions
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

// From a file — works on any platform
var results = BarcodeReader.Read("invoice.pdf");
foreach (var result in results)
    Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.BarcodeType})");
// IronBarcode: the same call works in MAUI, ASP.NET Core, console, WPF, Azure Functions
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

// From a file — works on any platform
var results = BarcodeReader.Read("invoice.pdf");
foreach (var result in results)
    Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.BarcodeType})");
Imports IronBarCode

' IronBarcode: the same call works in MAUI, ASP.NET Core, console, WPF, Azure Functions
License.LicenseKey = "YOUR-LICENSE-KEY"

' From a file — works on any platform
Dim results = BarcodeReader.Read("invoice.pdf")
For Each result In results
    Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.BarcodeType})")
Next
$vbLabelText   $csharpLabel

IronBarcode a Scanbot SDK: porównanie funkcji

Funkcja Scanbot SDK IronBarcode
Dane wejściowe ze ścieżki pliku Nie Tak
Dane wejściowe ze strumienia Nie Tak
Dane wejściowe z tablicy bajtów Nie Tak
Pobieranie kodów kreskowych z plików PDF Nie Tak
Podgląd na żywo z kamery Tak Nie (użyj MediaPicker)
Generowanie BarCode Nie Tak
iOS MAUI Tak Tak
Android MAUI Tak Tak
Windows MAUI Nie Tak
macOS MAUI Nie Tak
ASP.NET Core Nie Tak
Konsola / Serwer Nie Tak
Azure / Lambda / Docker Nie Tak
.NET Framework 4.6.2+ Nie Tak
Korekta błędów ML Nie Tak
Odzyskiwanie uszkodzonych kodów kreskowych Nie Tak
Automatyczne wykrywanie formatowania Tak Tak
Formaty 1D 20+ 30+
Formaty 2D QR, DataMatrix, PDF417, Aztec QR, DataMatrix, PDF417, Aztec, MaxiCode
Model licencji Roczna opłata ryczałtowa Jednorazowa, wieczysta
Opublikowane ceny Skontaktuj się z działem sprzedaży Tak ($999–5 999 $)

Szybki start: Migracja zScanbot SDKdo IronBarcode

Krok 1: Zastąp pakiet NuGet

Usuń pakiet Scanbot:

dotnet remove package ScanbotBarcodeSDK.MAUI
dotnet remove package ScanbotBarcodeSDK.MAUI
SHELL

Jeśli projekt używa warunkowych odniesień do pakietów w pliku .csproj, usuń te wpisy również:


<PackageReference Include="ScanbotBarcodeSDK.MAUI" Version="8.0.0" />

<PackageReference Include="ScanbotBarcodeSDK.MAUI" Version="8.0.0" />
XML

Zainstaluj IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

IronBarcode jest dostępny w serwisie NuGet i obsługuje platformy .NET 6, 7, 8, 9 oraz .NET Framework 4.6.2+. Dla wielocelowego projektu MAUI, jeden dotnet add package działa na wszystkich celach — nie są potrzebne odniesienia do pakietów warunkowe dla platformy.

Krok 2: Aktualizacja przestrzeni nazw

Zastąp przestrzenie nazw Scanbot przestrzenią nazw IronBarcode:

// Remove
using ScanbotSDK.MAUI;

// Add
using IronBarCode;
// Remove
using ScanbotSDK.MAUI;

// Add
using IronBarCode;
Imports IronBarCode
$vbLabelText   $csharpLabel

Krok 3: Inicjalizacja licencji

Usuń blok inicjalizacji Scanbot i zastąp go kluczem licencyjnym IronBarcode. Dodaj inicjalizację licencji przy uruchamianiu aplikacji w MauiProgram.cs, App.xaml.cs lub Program.cs w zależności od typu projektu:

// Remove this
ScanbotSDKMain.Initialize(new SdkConfiguration
{
    LicenseKey = "YOUR-SCANBOT-LICENSE-KEY",
    LoggingEnabled = false
});

// Add this — one line, placed once at startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Remove this
ScanbotSDKMain.Initialize(new SdkConfiguration
{
    LicenseKey = "YOUR-SCANBOT-LICENSE-KEY",
    LoggingEnabled = false
});

// Add this — one line, placed once at startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Remove this
ScanbotSDKMain.Initialize(New SdkConfiguration With {
    .LicenseKey = "YOUR-SCANBOT-LICENSE-KEY",
    .LoggingEnabled = False
})

' Add this — one line, placed once at startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Przykłady migracji kodu

Zarejestruj zdjęcie MAUI

Wywołanie funkcji skanowania w aplikacji Scanbot otwiera interfejs aparatu na pełnym ekranie i kończy działanie, gdy użytkownik zeskanuje BARCODE lub anuluje operację.IronBarcode nie udostępnia interfejsu użytkownika kamery; zamiana używa MediaPicker MAUI do wywołania aparatu systemowego, zrobienia zdjęcia i przekazania bajtów obrazu do BarcodeReader.Read().

Podejście Scanbot SDK:

using ScanbotSDK.MAUI;

private async void ScanButton_Clicked(object sender, EventArgs e)
{
    var configuration = new BarcodeScannerScreenConfiguration
    {
        BarcodeFormats = new[]
        {
            BarcodeFormat.Code128,
            BarcodeFormat.QrCode,
            BarcodeFormat.Ean13
        },
        FinderAspectRatio = new AspectRatio(1, 1),
        TopBarBackgroundColor = Colors.DarkBlue
    };

    var result = await ScanbotSDKMain.Barcode.StartScannerAsync(configuration);

    if (result.Status == OperationResult.Ok)
    {
        foreach (var barcode in result.Barcodes)
            ResultLabel.Text = $"{barcode.Format}: {barcode.Text}";
    }
}
using ScanbotSDK.MAUI;

private async void ScanButton_Clicked(object sender, EventArgs e)
{
    var configuration = new BarcodeScannerScreenConfiguration
    {
        BarcodeFormats = new[]
        {
            BarcodeFormat.Code128,
            BarcodeFormat.QrCode,
            BarcodeFormat.Ean13
        },
        FinderAspectRatio = new AspectRatio(1, 1),
        TopBarBackgroundColor = Colors.DarkBlue
    };

    var result = await ScanbotSDKMain.Barcode.StartScannerAsync(configuration);

    if (result.Status == OperationResult.Ok)
    {
        foreach (var barcode in result.Barcodes)
            ResultLabel.Text = $"{barcode.Format}: {barcode.Text}";
    }
}
Imports ScanbotSDK.MAUI

Private Async Sub ScanButton_Clicked(sender As Object, e As EventArgs)
    Dim configuration = New BarcodeScannerScreenConfiguration With {
        .BarcodeFormats = New BarcodeFormat() {
            BarcodeFormat.Code128,
            BarcodeFormat.QrCode,
            BarcodeFormat.Ean13
        },
        .FinderAspectRatio = New AspectRatio(1, 1),
        .TopBarBackgroundColor = Colors.DarkBlue
    }

    Dim result = Await ScanbotSDKMain.Barcode.StartScannerAsync(configuration)

    If result.Status = OperationResult.Ok Then
        For Each barcode In result.Barcodes
            ResultLabel.Text = $"{barcode.Format}: {barcode.Text}"
        Next
    End If
End Sub
$vbLabelText   $csharpLabel

Podejście IronBarcode:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

private async void ScanButton_Clicked(object sender, EventArgs e)
{
    var photo = await MediaPicker.CapturePhotoAsync();
    if (photo == null) return;

    using var stream = await photo.OpenReadAsync();
    using var ms = new MemoryStream();
    await stream.CopyToAsync(ms);

    var results = BarcodeReader.Read(ms.ToArray());
    var first = results.FirstOrDefault();
    ResultLabel.Text = first != null
        ? $"{first.BarcodeType}: {first.Value}"
        : "No barcode found";
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

private async void ScanButton_Clicked(object sender, EventArgs e)
{
    var photo = await MediaPicker.CapturePhotoAsync();
    if (photo == null) return;

    using var stream = await photo.OpenReadAsync();
    using var ms = new MemoryStream();
    await stream.CopyToAsync(ms);

    var results = BarcodeReader.Read(ms.ToArray());
    var first = results.FirstOrDefault();
    ResultLabel.Text = first != null
        ? $"{first.BarcodeType}: {first.Value}"
        : "No barcode found";
}
Imports IronBarCode
Imports System.IO
Imports System.Linq
Imports System.Threading.Tasks

Private Async Sub ScanButton_Clicked(sender As Object, e As EventArgs)
    Dim photo = Await MediaPicker.CapturePhotoAsync()
    If photo Is Nothing Then Return

    Using stream = Await photo.OpenReadAsync()
        Using ms As New MemoryStream()
            Await stream.CopyToAsync(ms)

            Dim results = BarcodeReader.Read(ms.ToArray())
            Dim first = results.FirstOrDefault()
            ResultLabel.Text = If(first IsNot Nothing, $"{first.BarcodeType}: {first.Value}", "No barcode found")
        End Using
    End Using
End Sub
$vbLabelText   $csharpLabel

Zmiana w interfejsie użytkownika polega na tym, że użytkownik widzi ekran aparatu systemowego zamiast wbudowanego wizjera Scanbota z nakładką obszaru skanowania. W przypadku zastosowań biznesowych — zapasów, logistyki, obiegu dokumentów — wystarczy aparat systemowy. Samouczek dotyczący skanera BARCODE .NET MAUI obejmuje pełny wzorzec integracji zarówno dla platform iOS, jak i Android, w tym obsługę uprawnień.

Opcje skanowania i konfiguracja

BarcodeScannerScreenConfiguration Scanbota kontroluje, które formaty akceptuje skaner i jak wygląda interfejs kamery. BarcodeReaderOptionsIronBarcode kontroluje, jak obraz jest analizowany — szybkość przetwarzania, wykrywanie mnogich kodów kreskowych i podobne parametry. Koncepcje konfiguracji odnoszą się do różnych zagadnień, ponieważ podstawowe operacje są różne.

Podejście Scanbot SDK:

var configuration = new BarcodeScannerScreenConfiguration
{
    BarcodeFormats = new[] { BarcodeFormat.Code128, BarcodeFormat.QrCode },
    FinderAspectRatio = new AspectRatio(1, 1),
    FlashEnabled = false,
    OrientationLockMode = OrientationLockMode.Portrait
};

var result = await ScanbotSDKMain.Barcode.StartScannerAsync(configuration);

if (result.Status == OperationResult.Ok)
{
    foreach (var barcode in result.Barcodes)
        Console.WriteLine($"{barcode.Format}: {barcode.Text}");
}
var configuration = new BarcodeScannerScreenConfiguration
{
    BarcodeFormats = new[] { BarcodeFormat.Code128, BarcodeFormat.QrCode },
    FinderAspectRatio = new AspectRatio(1, 1),
    FlashEnabled = false,
    OrientationLockMode = OrientationLockMode.Portrait
};

var result = await ScanbotSDKMain.Barcode.StartScannerAsync(configuration);

if (result.Status == OperationResult.Ok)
{
    foreach (var barcode in result.Barcodes)
        Console.WriteLine($"{barcode.Format}: {barcode.Text}");
}
Imports System
Imports System.Threading.Tasks

Dim configuration As New BarcodeScannerScreenConfiguration With {
    .BarcodeFormats = {BarcodeFormat.Code128, BarcodeFormat.QrCode},
    .FinderAspectRatio = New AspectRatio(1, 1),
    .FlashEnabled = False,
    .OrientationLockMode = OrientationLockMode.Portrait
}

Dim result = Await ScanbotSDKMain.Barcode.StartScannerAsync(configuration)

If result.Status = OperationResult.Ok Then
    For Each barcode In result.Barcodes
        Console.WriteLine($"{barcode.Format}: {barcode.Text}")
    Next
End If
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

// Format detection is automatic — BarcodeReaderOptions controls processing behavior
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = false
};

// Combined with the MediaPicker capture pattern
var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;

using var photoStream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await photoStream.CopyToAsync(ms);

var results = BarcodeReader.Read(ms.ToArray(), options);
foreach (var result in results)
    Console.WriteLine($"{result.BarcodeType}: {result.Value}");
using IronBarCode;

// Format detection is automatic — BarcodeReaderOptions controls processing behavior
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = false
};

// Combined with the MediaPicker capture pattern
var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;

using var photoStream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await photoStream.CopyToAsync(ms);

var results = BarcodeReader.Read(ms.ToArray(), options);
foreach (var result in results)
    Console.WriteLine($"{result.BarcodeType}: {result.Value}");
Imports IronBarCode
Imports System.IO

' Format detection is automatic — BarcodeReaderOptions controls processing behavior
Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = False
}

' Combined with the MediaPicker capture pattern
Dim photo = Await MediaPicker.CapturePhotoAsync()
If photo Is Nothing Then Return

Using photoStream = Await photo.OpenReadAsync()
    Using ms As New MemoryStream()
        Await photoStream.CopyToAsync(ms)

        Dim results = BarcodeReader.Read(ms.ToArray(), options)
        For Each result In results
            Console.WriteLine($"{result.BarcodeType}: {result.Value}")
        Next
    End Using
End Using
$vbLabelText   $csharpLabel

Specyfikacja formatu nie jest wymagana —IronBarcode automatycznie wykrywa wszystkie obsługiwane formaty. Parametry BarcodeReaderOptions, które najbardziej bezpośrednio odpowiadają konfiguracji Scanbot, to Speed (kontroluje szczegółowość przetwarzania w stosunku do wydajności) i ExpectMultipleBarcodes (kontynuuje skanowanie po pierwszym dopasowaniu).

Przetwarzanie plików PDF po stronie serwera

Ten scenariusz nie ma odpowiednika w Scanbot. Dzięki IronBarcode ten sam pakiet zainstalowany dla aplikacji mobilnej MAUI może wyodrębniać kody kreskowe z plików PDF w punkcie końcowym ASP.NET Core po stronie serwera, zapewniając zespołom jedną zależność dotyczącą kodów kreskowych, która działa w obu kontekstach wdrożenia.

Podejście Scanbot SDK:

//Scanbot SDKcannot be used here — the package does not compile
// in ASP.NET Core, Azure Functions, console apps, or any non-MAUI project.
// There is no server-side Scanbot equivalent for this endpoint.
//Scanbot SDKcannot be used here — the package does not compile
// in ASP.NET Core, Azure Functions, console apps, or any non-MAUI project.
// There is no server-side Scanbot equivalent for this endpoint.
'Scanbot SDK cannot be used here — the package does not compile
' in ASP.NET Core, Azure Functions, console apps, or any non-MAUI project.
' There is no server-side Scanbot equivalent for this endpoint.
$vbLabelText   $csharpLabel

Podejście IronBarcode:

// NuGet: dotnet add package IronBarcode
// Works in ASP.NET Core, console apps, Azure Functions, Docker — the same package as MAUI
using IronBarCode;

[HttpPost("extract-barcodes")]
public async Task<IActionResult> ExtractBarcodes(IFormFile file)
{
    using var ms = new MemoryStream();
    await file.CopyToAsync(ms);

    // Reads all barcodes from all pages of the uploaded PDF
    var results = BarcodeReader.Read(ms.ToArray());
    var values = results.Select(r => new
    {
        r.Value,
        Format = r.Format.ToString(),
        r.PageNumber
    });

    return Ok(values);
}
// NuGet: dotnet add package IronBarcode
// Works in ASP.NET Core, console apps, Azure Functions, Docker — the same package as MAUI
using IronBarCode;

[HttpPost("extract-barcodes")]
public async Task<IActionResult> ExtractBarcodes(IFormFile file)
{
    using var ms = new MemoryStream();
    await file.CopyToAsync(ms);

    // Reads all barcodes from all pages of the uploaded PDF
    var results = BarcodeReader.Read(ms.ToArray());
    var values = results.Select(r => new
    {
        r.Value,
        Format = r.Format.ToString(),
        r.PageNumber
    });

    return Ok(values);
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc
Imports System.IO
Imports System.Threading.Tasks

<HttpPost("extract-barcodes")>
Public Async Function ExtractBarcodes(file As IFormFile) As Task(Of IActionResult)
    Using ms As New MemoryStream()
        Await file.CopyToAsync(ms)

        ' Reads all barcodes from all pages of the uploaded PDF
        Dim results = BarcodeReader.Read(ms.ToArray())
        Dim values = results.Select(Function(r) New With {
            .Value = r.Value,
            .Format = r.Format.ToString(),
            .PageNumber = r.PageNumber
        })

        Return Ok(values)
    End Using
End Function
$vbLabelText   $csharpLabel

IronBarcode natywnie obsługuje wielostronicowe PDF-y — każdy wynik posiada właściwość PageNumber wskazującą stronę, na której znaleziono kod kreskowy. Przewodnik po wyodrębnianiu BARCODE-ów z plików PDF obejmuje pełen zakres opcji odczytu plików PDF, w tym wybór zakresu stron i optymalizację wydajności w przypadku dużych partii dokumentów.

Przetwarzanie w tle w .NET Core

W przypadku przepływów pracy wsadowych, takich jak Azure Functions lub Worker Services przetwarzające zarchiwizowane dokumenty PDF,IronBarcode udostępnia ten sam interfejs API, który jest używany w aplikacji MAUI i kontrolerze ASP.NET Core.

Podejście Scanbot SDK:

//Scanbot SDKdoes not support this deployment context.
// The package will not compile in Azure Functions or Worker Services.
//Scanbot SDKdoes not support this deployment context.
// The package will not compile in Azure Functions or Worker Services.
'Scanbot SDK does not support this deployment context.
' The package will not compile in Azure Functions or Worker Services.
$vbLabelText   $csharpLabel

Podejście IronBarcode:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Azure Function or Worker Service batch processing
public void ProcessInvoiceBatch(IEnumerable<string> filePaths)
{
    foreach (var filePath in filePaths)
    {
        var results = BarcodeReader.Read(filePath);
        foreach (var result in results)
            Console.WriteLine($"File: {filePath} | Page {result.PageNumber}: {result.Value} ({result.BarcodeType})");
    }
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Azure Function or Worker Service batch processing
public void ProcessInvoiceBatch(IEnumerable<string> filePaths)
{
    foreach (var filePath in filePaths)
    {
        var results = BarcodeReader.Read(filePath);
        foreach (var result in results)
            Console.WriteLine($"File: {filePath} | Page {result.PageNumber}: {result.Value} ({result.BarcodeType})");
    }
}
Imports IronBarCode

Public Sub ProcessInvoiceBatch(filePaths As IEnumerable(Of String))
    For Each filePath In filePaths
        Dim results = BarcodeReader.Read(filePath)
        For Each result In results
            Console.WriteLine($"File: {filePath} | Page {result.PageNumber}: {result.Value} ({result.BarcodeType})")
        Next
    Next
End Sub
$vbLabelText   $csharpLabel

Dokumentacja APIScanbot SDKdo IronBarcode

Scanbot SDK IronBarcode
ScanbotSDKMain.Initialize(new SdkConfiguration { LicenseKey = "..." }) IronBarCode.License.LicenseKey = "key"
new BarcodeScannerScreenConfiguration() new BarcodeReaderOptions()
ScanbotSDKMain.Barcode.StartScannerAsync(configuration) BarcodeReader.Read(path / stream / bytes)
result.Status == OperationResult.Ok results.Any() lub results.FirstOrDefault() != null
result.Barcodes Wartość zwracana przez BarcodeReader.Read()
barcode.Format result.BarcodeType (IronBarCode.BarcodeEncoding)
barcode.Text result.Value
BarcodeFormat.Code128 BarcodeEncoding.Code128
BarcodeFormat.QrCode BarcodeEncoding.QRCode
BarcodeFormat.Ean13 BarcodeEncoding.EAN13
BarcodeScannerScreenConfiguration.FinderAspectRatio Brak odpowiednika — kadrowanie obrazu obsługiwane przez MediaPicker
BarcodeScannerScreenConfiguration.FlashEnabled Brak odpowiednika — użyj opcji MediaPicker
Wymagane wprowadzenie za pomocą kamery Ścieżka pliku, strumień, tablica bajtów lub plik PDF
Tylko iOS i Android MAUI Wszystkie platformy .NET i typy projektów

Typowe problemy związane z migracją i ich rozwiązania

Problem 1: Brak odpowiednika podglądu na żywo

Scanbot SDK: Zapewnia wbudowany w proces skanowania podgląd z kamery w czasie rzeczywistym, z nakładką obszaru skanowania, haptycznym sprzężeniem zwrotnym oraz ciągłym wykrywaniem BARCODE-ów w strumieniu wideo na żywo.

Rozwiązanie: Użyj MediaPicker.CapturePhotoAsync() MAUI, aby otworzyć aparat systemowy i zrobić zdjęcie statyczne do przetworzenia:

var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;

using var stream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);

var results = BarcodeReader.Read(ms.ToArray());
var photo = await MediaPicker.CapturePhotoAsync();
if (photo == null) return;

using var stream = await photo.OpenReadAsync();
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);

var results = BarcodeReader.Read(ms.ToArray());
Imports System.IO

Dim photo = Await MediaPicker.CapturePhotoAsync()
If photo Is Nothing Then Return

Using stream = Await photo.OpenReadAsync()
    Using ms As New MemoryStream()
        Await stream.CopyToAsync(ms)

        Dim results = BarcodeReader.Read(ms.ToArray())
    End Using
End Using
$vbLabelText   $csharpLabel

W przypadku zastosowań biznesowych wystarczająca jest kamera systemowa. W przypadku aplikacji konsumenckich, w których nakładka na żywo ma kluczowe znaczenie dla wrażeń użytkownika, przed podjęciem decyzji o migracji należy ocenić, czy ta zmiana w zakresie UX jest akceptowalna.

Problem 2: Różnice w uprawnieniach aparatu

Scanbot SDK: Pakiet Scanbot obsługiwał żądania uprawnień do kamery w ramach swojego interfejsu użytkownika, więc uprawnienia do kamery były zarządzane w sposób domyślny podczas inicjalizacji SDK i uruchamiania skanera.

Rozwiązanie: Z MediaPicker MAUI obsługuje uprawnienia za pomocą standardowego mechanizmu. Zweryfikuj, że AndroidManifest.xml zawiera deklarację uprawnień do aparatu i że Info.plist zawiera klucz NSCameraUsageDescription. Wpisy te zazwyczaj występują w gotowych szablonach projektów MAUI. Jeśli aplikacja korzystała wcześniej wyłącznie z Scanbot w celu uzyskania dostępu do aparatu, przed rozpoczęciem testów należy sprawdzić, czy w pliku manifestu znajdują się następujące wpisy:


<uses-permission android:name="android.permission.CAMERA" />

<key>NSCameraUsageDescription</key>
<string>This app uses the camera to scan barcodes.</string>

<uses-permission android:name="android.permission.CAMERA" />

<key>NSCameraUsageDescription</key>
<string>This app uses the camera to scan barcodes.</string>
XML

Problem 3: Usunięto błędy kompilacji w systemie Windows

Scanbot SDK: Pakiet ScanbotBarcodeSDK.MAUI jest przeznaczony tylko dla net10.0-android i net10.0-ios, co powoduje problemy z kompilacją, gdy net10.0-windows jest obecny w TargetFrameworks.

Rozwiązanie: Usunięcie odwołania do pakietu Scanbot rozwiązuje problem niepowodzenia kompilacji w systemie Windows.IronBarcode działa poprawnie na wszystkich platformach docelowych MAUI bez konieczności konfiguracji zależnej od platformy:

# Verify the build succeeds on all targets after removing Scanbot and adding IronBarcode
dotnet build -f net10.0-windows10.0.19041.0
dotnet build -f net10.0-ios
dotnet build -f net10.0-android
# Verify the build succeeds on all targets after removing Scanbot and adding IronBarcode
dotnet build -f net10.0-windows10.0.19041.0
dotnet build -f net10.0-ios
dotnet build -f net10.0-android
SHELL

Problem 4: Zmiana przestrzeni nazw Format Enum

Scanbot SDK: Używa wartości wyliczeniowych BarcodeFormat, takich jak BarcodeFormat.Code128 z przestrzeni nazw ScanbotBarcodeSDK.MAUI.

Rozwiązanie:IronBarcode używa wyliczenia BarcodeEncoding w przestrzeni nazw IronBarCode. Zaktualizuj wszystkie odniesienia do formatów oraz wszelki kod, który przechowuje, porównuje lub przełącza wartości wyliczeniowe formatów:

// Before (Scanbot)
BarcodeFormat.Code128
BarcodeFormat.QrCode
BarcodeFormat.Ean13

// After (IronBarcode)
BarcodeEncoding.Code128
BarcodeEncoding.QRCode
BarcodeEncoding.EAN13
// Before (Scanbot)
BarcodeFormat.Code128
BarcodeFormat.QrCode
BarcodeFormat.Ean13

// After (IronBarcode)
BarcodeEncoding.Code128
BarcodeEncoding.QRCode
BarcodeEncoding.EAN13
' Before (Scanbot)
BarcodeFormat.Code128
BarcodeFormat.QrCode
BarcodeFormat.Ean13

' After (IronBarcode)
BarcodeEncoding.Code128
BarcodeEncoding.QRCode
BarcodeEncoding.EAN13
$vbLabelText   $csharpLabel

Należy zauważyć, że IronBarcode automatycznie wykrywa wszystkie obsługiwane formaty domyślnie — jawne filtrowanie formatów za pomocą BarcodeReaderOptions jest potrzebne tylko do optymalizacji wydajności, gdy oczekiwany format jest znany z góry.

Lista kontrolna migracji Scanbot SDK

Zadania przed migracją

Przeprowadź audyt kodu źródłowego w celu zidentyfikowania wszystkich przypadków użycia Scanbot SDK:

grep -rn "ScanbotSDK.Initialize" --include="*.cs" .
grep -rn "BarcodeScannerScreenConfiguration" --include="*.cs" .
grep -rn "ScanbotSDKMain.Barcode.StartScannerAsync" --include="*.cs" .
grep -rn "result\.Barcodes" --include="*.cs" .
grep -rn "barcode\.Format" --include="*.cs" .
grep -rn "barcode\.Text" --include="*.cs" .
grep -rn "OperationResult\.Ok" --include="*.cs" .
grep -rn "using ScanbotBarcodeSDK" --include="*.cs" .
grep -rn "BarcodeFormat\." --include="*.cs" .
grep -rn "ScanbotSDK.Initialize" --include="*.cs" .
grep -rn "BarcodeScannerScreenConfiguration" --include="*.cs" .
grep -rn "ScanbotSDKMain.Barcode.StartScannerAsync" --include="*.cs" .
grep -rn "result\.Barcodes" --include="*.cs" .
grep -rn "barcode\.Format" --include="*.cs" .
grep -rn "barcode\.Text" --include="*.cs" .
grep -rn "OperationResult\.Ok" --include="*.cs" .
grep -rn "using ScanbotBarcodeSDK" --include="*.cs" .
grep -rn "BarcodeFormat\." --include="*.cs" .
SHELL
  • Udokumentuj wszystkie miejsca wywołań skanowania i zaznacz, czy znajdują się one w kodzie współdzielonym, kodzie specyficznym dla platformy, czy w procedurach obsługi zdarzeń interfejsu użytkownika
  • Sprawdź, czy któreś strony lub przepływy opierają się na podglądzie w czasie rzeczywistym Scanbota jako głównym elemencie interakcji z użytkownikiem
  • Potwierdź, że wpisy zezwolenia na aparat istnieją w AndroidManifest.xml i Info.plist
  • Przejrzyj .csproj dla jakichkolwiek warunkowych odniesień do pakietów związanych ze Scanbot

Zadania związane z aktualizacją kodu

  1. Usuń pakiet NuGet ScanbotSDK.MAUI
  2. Usuń wszelkie warunkowe wpisy <PackageReference> dla Scanbot z .csproj
  3. Zainstaluj pakiet NuGet IronBarcode
  4. Zamień using ScanbotSDK.MAUI; na using IronBarCode; we wszystkich plikach
  5. Zamień ScanbotSDK.Initialize(...) na IronBarCode.License.LicenseKey = "key" przy uruchamianiu aplikacji
  6. Zamień ScanbotSDKMain.Barcode.StartScannerAsync(configuration) na MediaPicker.CapturePhotoAsync(), a następnie skopiuj strumień i BarcodeReader.Read(bytes) w przepływach pracy kamery MAUI
  7. Zamień ScanbotSDKMain.Barcode.StartScannerAsync(configuration) na BarcodeReader.Read(filePath) lub BarcodeReader.Read(stream) w kontekstach przetwarzania po stronie serwera i plików
  8. Zamień kontrole result.Status == OperationResult.Ok na results.Any() lub results.FirstOrDefault() != null
  9. Zamień odniesienia kolekcji result.Barcodes na wartość zwracaną przez BarcodeReader.Read()
  10. Zamień dostęp do właściwości barcode.Text na result.Value
  11. Zamień wartości wyliczeń BarcodeFormat.* na odpowiedniki BarcodeEncoding.*
  12. Zamień new BarcodeScannerScreenConfiguration() na new BarcodeReaderOptions() tam, gdzie są potrzebne opcje przetwarzania

Testy po migracji

  • Sprawdź, czy kompilacja przebiega pomyślnie na wszystkich docelowych platformach MAUI, w tym na systemach Windows i macOS, jeśli są dostępne
  • Przetestuj przepływ MediaPicker.CapturePhotoAsync() na fizycznym urządzeniu iOS i fizycznym urządzeniu z Androidem
  • Sprawdź, czy wartości BarCodes zdekodowane przez IronBarcodesą zgodne z wartościami wcześniej zdekodowanymi przez Scanbot dla tych samych fizycznych BarCodes
  • Przetestuj ekstrakcję wielostronicowych plików PDF, jeśli projekt obejmuje procesy przetwarzania dokumentów
  • Zweryfikuj, czy wykrywanie formatu obejmuje wszystkie wcześniej skonfigurowane typy kodów kreskowych w BarcodeScannerScreenConfiguration.BarcodeFormats
  • Sprawdź, czy punkty końcowe po stronie serwera lub zadania w tle dają poprawne wyniki na tych samych przykładowych dokumentach
  • Sprawdź, czy monity o uprawnienia do kamery wyświetlają się poprawnie przy pierwszym uruchomieniu na iOS i Androidzie

Kluczowe korzyści wynikające z migracji do IronBarcode

Ujednolicony pakiet dla wszystkich środowisk docelowych:IronBarcode instaluje się jednokrotnie i działa w środowiskach MAUI mobile, MAUI desktop, ASP.NET Core, Azure Functions, aplikacjach konsolowych oraz aplikacjach desktopowych dla systemu Windows. Zespoły nie potrzebują już oddzielnych zależności od BarCodes dla różnych części tego samego systemu.

Przetwarzanie plików PDF i dokumentów:IronBarcode natywnie odczytuje kody kreskowe z plików PDF, a każdy wynik zawiera numer strony, na której został znaleziony. Przepływy pracy z dokumentami, które wcześniej były niemożliwe w modelu Scanbot, stają się prostymi operacjami z BarcodeReader.Read("document.pdf").

Obsługa MAUI na komputerach stacjonarnych z systemem Windows i macOS: Projekty MAUI z wieloma celami, które obejmują kompilację dla systemu Windows lub macOS, kompilują się bez błędów po usunięciu Scanbota.IronBarcode zapewnia ten sam interfejs API do odczytu kodów kreskowych na wszystkich czterech platformach docelowych MAUI, eliminując zarządzanie zależnościami warunkowymi od platformy, które było wymagane w przypadku Scanbota.

Licencja wieczysta: Model jednorazowego zakupu eliminuje obowiązek corocznego odnawiania. Po uzyskaniu licencji IronBarcode może być używany bezterminowo na zakupionym poziomie bez ponoszenia powtarzających się opłat. Zespoły, których zakres projektu wykracza poza zasięg mobilny Scanbota, uważają, że model wieczny lepiej wpisuje się w długoterminowe planowanie kosztów.

Generowanie BARCODE:IronBarcode może generować BARCODE we wszystkich obsługiwanych formatach jako pliki graficzne, strumienie lub treści osadzone. Projekty wymagające zarówno odczytu, jak i generowania danych nie wymagają już drugiej biblioteki obok Scanbot.

Odczyt wspomagany uczeniem maszynowym:IronBarcode stosuje opartą na uczeniu maszynowym korekcję błędów i odzyskiwanie uszkodzonych kodów kreskowych w przypadku trudnych obrazów z rzeczywistego świata — o niskim kontraście, częściowo uszkodzonych, o słabej jakości druku — których standardowe algorytmy wykrywania nie są w stanie odczytać. Ta funkcja jest szczególnie przydatna w procesach przetwarzania dokumentów, w których jakość obrazu jest zmienna.

Zwróć uwagęScanbot SDK jest zarejestrowanym znakiem towarowym odpowiedniego właściciela. Ta strona nie jest powiązana z, wspierana ani sponsorowana przez Scanbot SDK. 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 Scanbot 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 Scanbot 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 Scanbot 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 Scanbot 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 Scanbot 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 Scanbot?

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 Scanbot 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