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)
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
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
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" />
Zainstaluj IronBarcode:
dotnet add package IronBarcode
dotnet add package IronBarcode
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
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"
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
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
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
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
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.
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
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.
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
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
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>
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
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
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" .
- 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.xmliInfo.plist - Przejrzyj
.csprojdla jakichkolwiek warunkowych odniesień do pakietów związanych ze Scanbot
Zadania związane z aktualizacją kodu
- Usuń pakiet NuGet
ScanbotSDK.MAUI - Usuń wszelkie warunkowe wpisy
<PackageReference>dla Scanbot z.csproj - Zainstaluj pakiet NuGet
IronBarcode - Zamień
using ScanbotSDK.MAUI;nausing IronBarCode;we wszystkich plikach - Zamień
ScanbotSDK.Initialize(...)naIronBarCode.License.LicenseKey = "key"przy uruchamianiu aplikacji - Zamień
ScanbotSDKMain.Barcode.StartScannerAsync(configuration)naMediaPicker.CapturePhotoAsync(), a następnie skopiuj strumień iBarcodeReader.Read(bytes)w przepływach pracy kamery MAUI - Zamień
ScanbotSDKMain.Barcode.StartScannerAsync(configuration)naBarcodeReader.Read(filePath)lubBarcodeReader.Read(stream)w kontekstach przetwarzania po stronie serwera i plików - Zamień kontrole
result.Status == OperationResult.Oknaresults.Any()lubresults.FirstOrDefault() != null - Zamień odniesienia kolekcji
result.Barcodesna wartość zwracaną przezBarcodeReader.Read() - Zamień dostęp do właściwości
barcode.Textnaresult.Value - Zamień wartości wyliczeń
BarcodeFormat.*na odpowiednikiBarcodeEncoding.* - Zamień
new BarcodeScannerScreenConfiguration()nanew 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.
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ń.

