Wie man Barcodes aus mehrseitigen Gif- und Tiff-Bildern in C# liest
Migrieren von Scanbot SDKzu IronBarcode
Dieser Leitfaden richtet sich an .NET -Entwicklungsteams, die die Barcode-Verarbeitung vom Scanbot SDKauf IronBarcode umstellen, und zwar für serverseitige, Desktop- oder erweiterte dateibasierte Szenarien. Dies ist kein direkter Ersatz: Scanbot SDKist eine Komponente zum Scannen mit einer mobilen Kamera, IronBarcode hingegen ist eine Bibliothek zur Verarbeitung von Dateien und Dokumenten. Die Migration ist eine Änderung des Anwendungsbereichs, die durch Anforderungen bedingt ist, die das reine Kameramodell nicht erfüllen kann. Teams, die eine Live-Mobilkamera-Scan-Benutzeroberfläche ersetzen, ohne weitere Anforderungen hinzuzufügen, sollten vor dem Fortfahren prüfen, ob eine Migration angemessen ist.
Für Teams, die mit Scanbot für eine MAUI-Mobil-App begonnen haben und nun die Barcode-Verarbeitung in ASP.NET Core, einer Desktop-Anwendung oder einer Dokumentenpipeline benötigen, ist die mechanische Migration unkompliziert. Die Kernänderung besteht darin, ScanbotSDKMain.Barcode.StartScannerAsync(configuration) durch BarcodeReader.Read(source) zu ersetzen, wobei source ein Dateipfad, ein Stream, ein Byte-Array oder ein PDF ist.
Warum von Scanbot SDKmigrieren?
Anforderungen an die serverseitige Verarbeitung: Das Scanbot SDKlässt sich nicht in ASP.NET Core, Konsolenanwendungen, Azure Functions oder anderen Nicht-MAUI-Projekten kompilieren. Wenn die mobile Anwendung eine serverseitige Komponente benötigt, die auch Barcodes verarbeitet – diese aus hochgeladenen PDFs extrahiert oder Barcodewerte in eingehenden Dokumenten validiert –, kann Scanbot diese Grenze nicht überschreiten. IronBarcode läuft in all diesen Kontexten mit derselben BarcodeReader.Read()-API.
Desktop MAUI Unterstützung: Scanbots Paket zielt auf net10.0-android und net10.0-ios ab. Ein MAUI-Projekt, das net10.0-windows oder net10.0-maccatalyst zu seinem TargetFrameworks hinzufügt, wird die Desktop-Ziele nicht erstellen können, da das Scanbot-Paket keine Assemblies für diese Plattformen bereitstellt. IronBarcode unterstützt neben iOS und Android auch Windows und macOS MAUI , was bedeutet, dass dasselbe Paket in einem Multi-Target-MAUI-Projekt ohne plattformspezifische Ausschlüsse oder bedingte Verweise funktioniert.
PDF-Dokumenten-Workflows: Es gibt kein BarcodeScanner.Read(filePath) in Scanbot. Wenn ein Workflow sich dahingehend weiterentwickelt, dass er das Lesen von Barcodes aus hochgeladenen Dokumenten, gescannten Bildarchiven oder PDF-Rechnungen umfasst, kann die Architektur von Scanbot dies nicht leisten. IronBarcode liest PDFs und Bilder direkt, wobei jedes Ergebnis die Seitenzahl enthält, auf der der Barcode gefunden wurde.
Vorhersagbarkeit des Preismodells: Scanbot verwendet eine jährliche Pauschalgebühr. Für einige Organisationen ist die jährliche Erneuerung der Auslöser für die Evaluierung von Alternativen — insbesondere wenn der Projektumfang gewachsen ist, um Server-Seiten- oder Desktop-Ziele einzuschließen, die außerhalb der Scanbot-Abdeckung liegen. IronBarcode ist ein einmaliger, dauerhafter Kauf, wodurch die jährliche Verlängerungspflicht entfällt.
Das grundsätzliche Problem
Das Scanbot SDKbenötigt einen Live-Kamerastream. Wenn die Anforderungen über mobile Endgeräte hinausgehen, gibt es keinen gleichwertigen Weg über die bestehende Abhängigkeit:
// 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 akzeptiert in jedem Projektkontext die gleichen Quelltypen – Datei, Datenstrom, Byte-Array oder PDF:
// 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 vs. Scanbot SDK: Funktionsvergleich
| Feature | Scanbot SDK | IronBarcode |
|---|---|---|
| Eingabe aus Dateipfad | Nein | Ja |
| Eingabe aus dem Stream | Nein | Ja |
| Eingabe aus Byte-Array | Nein | Ja |
| PDF-Barcode-Extraktion | Nein | Ja |
| Live-Kamera-Sucher | Ja | Nein (verwenden Sie MediaPicker). |
| Barcode-Generierung | Nein | Ja |
| iOS MAUI | Ja | Ja |
| Android MAUI | Ja | Ja |
| Windows MAUI | Nein | Ja |
| macOS MAUI | Nein | Ja |
| ASP.NET Core | Nein | Ja |
| Konsole / Server | Nein | Ja |
| Azure / Lambda / Docker | Nein | Ja |
| .NET Framework 4.6.2+ | Nein | Ja |
| ML-Fehlerkorrektur | Nein | Ja |
| Wiederherstellung beschädigter Barcodes | Nein | Ja |
| Automatische Formaterkennung | Ja | Ja |
| 1D-Formate | 20+ | 30+ |
| 2D-Formate | QR, DataMatrix, PDF417, Aztec | QR, DataMatrix, PDF417, Aztec, MaxiCode |
| Lizenzmodell | Jährliche Pauschalgebühr | Einmalig, ewig |
| Veröffentlichte Preise | Kontakt zum Vertrieb | Ja ($999–5.999 $) |
Schnellstart: Scanbot SDKzu IronBarcode Migration
Schritt 1: Ersetzen des NuGet-Pakets
Entfernen Sie das Scanbot-Paket:
dotnet remove package ScanbotBarcodeSDK.MAUI
dotnet remove package ScanbotBarcodeSDK.MAUI
Wenn das Projekt bedingte Paketreferenzen in der .csproj-Datei verwendet, entfernen Sie auch diese Einträge:
<PackageReference Include="ScanbotBarcodeSDK.MAUI" Version="8.0.0" />
<PackageReference Include="ScanbotBarcodeSDK.MAUI" Version="8.0.0" />
IronBarcode installieren:
dotnet add package IronBarcode
dotnet add package IronBarcode
IronBarcode ist über NuGet verfügbar und unterstützt .NET 6, 7, 8, 9 und .NET Framework 4.6.2+. Für ein MAUI-Multi-Target-Projekt arbeitet ein einziger dotnet add package über alle Ziele hinweg — keine plattformbedingten Paketreferenzen sind erforderlich.
Schritt 2: Namespaces aktualisieren
Ersetzen Sie die Scanbot-Namensräume durch den IronBarcode -Namensraum:
// Remove
using ScanbotSDK.MAUI;
// Add
using IronBarCode;
// Remove
using ScanbotSDK.MAUI;
// Add
using IronBarCode;
Imports IronBarCode
Schritt 3: Lizenz initialisieren
Entfernen Sie den Scanbot-Initialisierungsblock und ersetzen Sie ihn durch den IronBarcode -Lizenzschlüssel. Fügen Sie die Lizenzinitialisierung beim Anwendungsstart in MauiProgram.cs, App.xaml.cs oder Program.cs je nach Projekttyp hinzu:
// 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"
Beispiele für die Code-Migration
MAUI-Fotoaufnahmen
Der Scanvorgang von Scanbot öffnet eine Vollbild-Kameraoberfläche und kehrt zurück, sobald der Benutzer einen Barcode scannt oder den Vorgang abbricht. IronBarcode bietet keine Kamera-Benutzeroberfläche; der Ersatz verwendet MAUIs MediaPicker, um die Systemkamera aufzurufen, ein Foto zu machen und die Bildbytes an BarcodeReader.Read() zu übergeben.
Scanbot SDK-Ansatz:
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
IronBarcode -Ansatz:
// 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
Die Änderung in der Benutzerführung besteht darin, dass der Benutzer den Bildschirm der Systemkamera anstelle des in Scanbot integrierten Suchers mit einer Scanbereichsüberlagerung sieht. Für Geschäftsanwendungen – Inventur, Logistik, Dokumentenworkflows – ist die Systemkamera ausreichend. Das .NET MAUI Barcode-Scanner-Tutorial behandelt das vollständige Integrationsmuster sowohl für iOS- als auch für Android-Ziele, einschließlich der Berechtigungsverwaltung.
Scanoptionen und Konfiguration
Scanbots BarcodeScannerScreenConfiguration steuert, welche Formate der Scanner akzeptiert und wie die Kamera-UI aussieht. IronBarcode's BarcodeReaderOptions steuert, wie das Bild analysiert wird — Verarbeitungsgeschwindigkeit, Multi-Barcode-Erkennung und ähnliche Parameter. Die Konfigurationskonzepte beziehen sich auf unterschiedliche Belange, da die zugrunde liegenden Operationen unterschiedlich sind.
Scanbot SDK-Ansatz:
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
IronBarcode -Ansatz:
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
Eine Formatangabe ist nicht erforderlich – IronBarcode erkennt alle unterstützten Formate automatisch. Die direktesten Entsprechungen von Scanbot-Konfiguration sind Speed (steuert die Verarbeitungsgenauigkeit im Vergleich zur Leistung) und ExpectMultipleBarcodes (setzt das Scannen nach dem ersten Treffer fort).
Serverseitige PDF-Verarbeitung
Dieses Szenario hat kein Scanbot-Äquivalent. Mit IronBarcode kann dasselbe Paket, das für die MAUI-Mobil-App installiert ist, Barcodes aus PDFs in einem serverseitigen ASP.NET Core Endpunkt extrahieren. Dadurch erhalten die Teams eine einzige Barcode-Abhängigkeit, die in beiden Bereitstellungskontexten funktioniert.
Scanbot SDK-Ansatz:
// 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.
IronBarcode -Ansatz:
// 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 verarbeitet mehrseitige PDFs nativ — jedes Ergebnis hat eine PageNumber-Eigenschaft, die angibt, auf welcher Seite der Barcode gefunden wurde. Der Leitfaden zur Extraktion von PDF-Barcodes deckt das gesamte Spektrum der PDF-Leseoptionen ab, einschließlich der Auswahl von Seitenbereichen und der Leistungsoptimierung für große Dokumentenstapel.
ASP.NET Core Hintergrundverarbeitung
Für Batch-Workflows wie Azure Functions oder Worker Services, die archivierte PDF-Dokumente verarbeiten, bietet IronBarcode die gleiche API, die auch in der MAUI-App und im ASP.NET Core -Controller verwendet wird.
Scanbot SDK-Ansatz:
// 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.
IronBarcode -Ansatz:
// 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
Scanbot SDKAPI zu IronBarcode Mapping-Referenz
| 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() oder results.FirstOrDefault() != null |
result.Barcodes |
Rückgabewert von 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 |
Kein Äquivalent – Bildrahmen wird von MediaPicker übernommen. |
BarcodeScannerScreenConfiguration.FlashEnabled |
Keine Entsprechung – verwenden Sie die MediaPicker-Optionen. |
| Kameraeingabe erforderlich | Dateipfad, Datenstrom, Byte-Array oder PDF |
| Nur für iOS und Android MAUI | Alle .NET -Plattformen und Projekttypen |
Gängige Migrationsprobleme und Lösungen
Problem 1: Kein gleichwertiger Live-Sucher
Scanbot SDK: Bietet einen in das Scan-Erlebnis integrierten Echtzeit-Kamera-Sucher mit Scanbereich-Overlay, haptischem Feedback und kontinuierlicher Barcode-Erkennung im Live-Videofeed.
Lösung: Verwenden Sie MAUIs MediaPicker.CapturePhotoAsync(), um die Systemkamera zu öffnen und ein Standbild zur Verarbeitung aufzunehmen:
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
Für geschäftliche Anwendungen ist die Systemkamera ausreichend. Bei Verbraucher-Apps, bei denen das Live-Overlay ein zentraler Bestandteil des Benutzererlebnisses ist, sollte vor der endgültigen Umstellung geprüft werden, ob diese Änderung der Benutzererfahrung akzeptabel ist.
Problem 2: Unterschiede bei den Kameraberechtigungen
Scanbot SDK: Das Scanbot-Paket verarbeitete Kameraberechtigungsanfragen im Rahmen seines UI-Ablaufs, sodass die Kameraberechtigungen implizit durch die SDK-Initialisierung und den Start des Scanners verwaltet wurden.
Lösung: Mit MediaPicker regelt MAUI Berechtigungen über den Standardmechanismus. Vergewissern Sie sich, dass AndroidManifest.xml die Kameraberechtigungserklärung enthält und dass Info.plist den NSCameraUsageDescription-Schlüssel enthält. Diese Einträge sind typischerweise in vordefinierten MAUI-Projektvorlagen vorhanden. Falls die App zuvor ausschließlich Scanbot für den Kamerazugriff verwendet hat, überprüfen Sie vor dem Testen, ob diese Manifesteinträge vorhanden sind:
<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: Windows-Build-Fehler behoben
Scanbot SDK: Das ScanbotBarcodeSDK.MAUI-Paket zielt nur auf net10.0-android und net10.0-ios ab und führt zu Buildfehlern, wenn net10.0-windows in TargetFrameworks vorhanden ist.
Lösung: Durch Entfernen des Scanbot-Paketverweises wird der Build-Fehler unter Windows behoben. IronBarcode wird auf allen MAUI-Zielen ohne plattformspezifische Konfiguration korrekt aufgelöst:
# 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: Änderung des Enum-Namensraums
Scanbot SDK: Verwendet BarcodeFormat-Enum-Werte wie BarcodeFormat.Code128 aus dem ScanbotBarcodeSDK.MAUI-Namespace.
Lösung: IronBarcode verwendet das BarcodeEncoding-Enum im IronBarCode-Namespace. Aktualisieren Sie alle Formatverweise und jeglichen Code, der Format-Enum-Werte speichert, vergleicht oder auf sie umschaltet:
// 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
Beachten Sie, dass IronBarcode standardmäßig alle unterstützten Formate automatisch erkennt — eine explizite Formatfilterung mit BarcodeReaderOptions ist nur zur Leistungsoptimierung erforderlich, wenn das erwartete Format im Voraus bekannt ist.
Scanbot SDKMigrations-Checkliste
Vor der Migration anfallende Aufgaben
Überprüfen Sie den Quellcode, um alle Scanbot SDK-Nutzungen zu identifizieren:
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" .
- Dokumentieren Sie alle Stellen, an denen Scanvorgänge aufgerufen werden, und vermerken Sie, ob sie sich in gemeinsam genutztem Code, plattformspezifischem Code oder UI-Ereignisbehandlern befinden.
- Ermitteln, ob Seiten oder Abläufe auf den Echtzeit-Sucher von Scanbot als primäre Benutzerinteraktion angewiesen sind.
- Bestätigen Sie, dass in
AndroidManifest.xmlundInfo.plistEinträge für Kameraberechtigungen vorhanden sind. - Überprüfen Sie die
.csprojauf bedingte Paketreferenzen im Zusammenhang mit Scanbot.
Aufgaben der Code-Aktualisierung
- Entfernen Sie das
ScanbotSDK.MAUINuGet-Paket - Entfernen Sie alle bedingten
<PackageReference>-Einträge für Scanbot aus dem.csproj - Installieren Sie das
IronBarcodeNuGet-Paket - Ersetzen Sie
using ScanbotSDK.MAUI;durchusing IronBarCode;in allen Dateien - Ersetzen Sie
ScanbotSDK.Initialize(...)beim Anwendungsstart durchIronBarCode.License.LicenseKey = "key" - Ersetzen Sie
ScanbotSDKMain.Barcode.StartScannerAsync(configuration)durchMediaPicker.CapturePhotoAsync()gefolgt von Stream-Kopie undBarcodeReader.Read(bytes)in MAUI-Kamera-Workflows - Ersetzen Sie
ScanbotSDKMain.Barcode.StartScannerAsync(configuration)durchBarcodeReader.Read(filePath)oderBarcodeReader.Read(stream)in serverseitigen und Dateiverarbeitungskontexten - Ersetzen Sie
result.Status == OperationResult.Ok-Überprüfungen durchresults.Any()oderresults.FirstOrDefault() != null - Ersetzen Sie
result.Barcodes-Sammlungsreferenzen durch den Rückgabewert vonBarcodeReader.Read() - Ersetzen Sie
barcode.Text-Eigenschaftszugriff durchresult.Value - Ersetzen Sie
BarcodeFormat.*-Enum-Werte durchBarcodeEncoding.*-Äquivalente - Ersetzen Sie
new BarcodeScannerScreenConfiguration()durchnew BarcodeReaderOptions(), wo Verarbeitungsoptionen benötigt werden
Post-Migrationstests
- Überprüfen Sie, ob der Build auf allen MAUI-Zielplattformen erfolgreich ist, einschließlich Windows und macOS, falls vorhanden.
- Testen Sie den
MediaPicker.CapturePhotoAsync()-Ablauf auf einem physischen iOS-Gerät und einem physischen Android-Gerät - Bestätigen Sie, dass die von IronBarcode dekodierten Barcode-Werte mit den Werten übereinstimmen, die zuvor von Scanbot für dieselben physischen Barcodes dekodiert wurden.
- Testen Sie die Extraktion mehrseitiger PDFs, falls das Projekt Dokumentenverarbeitungs-Workflows umfasst.
- Verifizieren Sie, dass die Formatdetektion alle Barcodetypen abdeckt, die zuvor in
BarcodeScannerScreenConfiguration.BarcodeFormatskonfiguriert wurden. - Stellen Sie sicher, dass serverseitige Endpunkte oder Hintergrundprozesse bei denselben Dokumentbeispielen korrekte Ergebnisse liefern.
- Überprüfen, ob die Kameraberechtigungsabfragen beim ersten Start unter iOS und Android korrekt angezeigt werden.
Wichtigste Vorteile der Migration zu IronBarcode
Einheitliches Paket für alle Bereitstellungsziele: IronBarcode wird einmal installiert und läuft auf MAUI Mobile, MAUI Desktop, ASP.NET Core, Azure Functions, Konsolenanwendungen und Windows-Desktopanwendungen. Teams benötigen keine separaten Barcode-Abhängigkeiten mehr für verschiedene Teile desselben Systems.
PDF- und Dokumentenverarbeitung: IronBarcode liest Barcodes nativ aus PDF-Dateien, wobei jedes Ergebnis die Seitenzahl enthält, auf der der Barcode gefunden wurde. Dokumenten-Workflows, die im Scanbot-Modell zuvor nicht möglich waren, werden mit BarcodeReader.Read("document.pdf") zu einfachen Operationen.
MAUI-Unterstützung für Windows- und macOS-Desktop-Anwendungen: Multi-Target-MAUI-Projekte, die Windows oder macOS einschließen, können nach dem Entfernen von Scanbot fehlerfrei erstellt werden. IronBarcode bietet auf allen vier MAUI-Zielplattformen die gleiche Barcode-Lese-API und eliminiert damit die plattformabhängige Abhängigkeitsverwaltung, die Scanbot benötigte.
Dauerhafter Lizenzerwerb: Das Modell des einmaligen Kaufs beseitigt die Verpflichtung zur jährlichen Verlängerung. Nach der Lizenzierung kann IronBarcode auf unbestimmte Zeit in der erworbenen Stufe ohne wiederkehrende Gebühren genutzt werden. Teams, deren Projektumfang über die mobile Abdeckung von Scanbot hinausging, stellten fest, dass das Dauerlizenzmodell besser mit der langfristigen Kostenplanung vereinbar ist.
Barcode-Generierung: IronBarcode kann Barcodes in allen unterstützten Formaten als Bilddateien, Datenströme oder eingebettete Inhalte erzeugen. Projekte, die sowohl Lese- als auch Generierungsfunktionen benötigen, benötigen neben Scanbot keine zweite Bibliothek mehr.
Maschinelles Lernen beim Lesen: IronBarcode wendet maschinelles Lernen zur Fehlerkorrektur und Wiederherstellung beschädigter Barcodes für schwierige Bilder aus der realen Welt an – geringer Kontrast, Teilschäden, schlechte Druckqualität –, die von Standarderkennungsalgorithmen nicht dekodiert werden können. Diese Funktion ist besonders relevant für Dokumentenverarbeitungs-Workflows, bei denen die Bildqualität variabel ist.
Häufig gestellte Fragen
Warum sollte ich von Scanbot SDK auf IronBarcode umsteigen?
Zu den häufigsten Gründen gehören die Vereinfachung der Lizenzierung (Beseitigung der Komplexität von SDK und Laufzeitschlüsseln), die Beseitigung von Durchsatzbeschränkungen, die Verbesserung der nativen PDF-Unterstützung, die Verbesserung der Docker/CI/CD-Bereitstellung und die Verringerung von API-Boilerplate im Produktionscode.
Wie kann ich Scanbot-API-Aufrufe durch IronBarcode ersetzen?
Ersetzen Sie Instanzerstellung und Lizenzierung durch IronBarCode.License.LicenseKey = "key". Ersetzen Sie die Leseaufrufe durch BarcodeReader.Read(path) und die Schreibaufrufe durch BarcodeWriter.CreateBarcode(data, encoding). Statische Methoden erfordern keine Instanzverwaltung.
Wie viel Code ändert sich bei der Migration von Scanbot SDK zu IronBarcode?
Die meisten Migrationen führen zu weniger Codezeilen. Lizenzierungs-Boilerplate, Instanzkonstruktoren und explizite Formatkonfiguration werden entfernt. Zentrale Lese-/Schreibvorgänge werden auf kürzere IronBarcode-Äquivalente mit saubereren Ergebnisobjekten abgebildet.
Muss ich während der Migration sowohl Scanbot SDK als auch IronBarcode installiert lassen?
Nein. Die meisten Migrationen sind direkte Ersetzungen und keine Paralleloperationen. Migrieren Sie eine Serviceklasse nach der anderen, ersetzen Sie die NuGet-Referenz und aktualisieren Sie die Instanzierungs- und API-Aufrufmuster, bevor Sie zur nächsten Klasse übergehen.
Wie lautet der NuGet-Paketname für IronBarcode?
Das Paket ist 'IronBarCode' (mit großem B und C). Installieren Sie es mit 'Install-Package IronBarCode' oder 'dotnet add package IronBarCode'. Die using-Anweisung im Code lautet 'using IronBarCode;'.
Wie vereinfacht IronBarcode die Docker-Bereitstellung im Vergleich zum Scanbot SDK?
IronBarcode ist ein NuGet-Paket, für das keine externen SDK-Dateien oder Lizenzkonfigurationen erforderlich sind. In Docker setzen Sie die Umgebungsvariable IRONBARCODE_LICENSE_KEY und das Paket übernimmt die Lizenzvalidierung beim Start.
Erkennt IronBarcode nach der Migration von Scanbot alle Barcodeformate automatisch?
Ja, IronBarcode erkennt automatisch die Symbologie aller unterstützten Formate. Eine explizite Aufzählung von BarcodeTypes ist nicht erforderlich. Wenn das Format bereits bekannt ist und die Leistung eine Rolle spielt, ermöglicht BarcodeReaderOptions die Einschränkung des Suchraums als eine Optimierung.
Kann IronBarcode Barcodes aus PDFs ohne eine separate Bibliothek lesen?
Ja, BarcodeReader.Read("document.pdf") verarbeitet PDF-Dateien nativ. Die Ergebnisse enthalten PageNumber, Format, Value und Confidence für jeden gefundenen Barcode. Es ist kein externer PDF-Rendering-Schritt erforderlich.
Wie handhabt IronBarcode die parallele Verarbeitung von Barcodes?
Die statischen Methoden von IronBarcode sind zustandslos und thread-sicher. Verwenden Sie Parallel.ForEach direkt über Dateilisten ohne Instanzmanagement pro Thread. BarcodeReaderOptions.MaxParallelThreads steuert das interne Thread-Budget.
Welche Ergebniseigenschaften ändern sich bei der Migration von Scanbot SDK zu IronBarcode?
Übliche Umbenennungen: BarcodeValue wird zu Value, BarcodeType wird zu Format. IronBarcode-Ergebnisse fügen auch Confidence und PageNumber hinzu. Eine lösungsweite Such- und Ersetzungsfunktion übernimmt die Umbenennungen im bestehenden Ergebnisverarbeitungscode.
Wie kann ich die IronBarcode-Lizenzierung in einer CI/CD-Pipeline einrichten?
Speichern Sie IRONBARCODE_LICENSE_KEY als Pipeline-Geheimnis und weisen Sie IronBarCode.License.LicenseKey im Startup-Code der Anwendung zu. Ein Geheimnis deckt alle Umgebungen ab, einschließlich Entwicklung, Test, Staging und Produktion.
Unterstützt IronBarcode die Generierung von QR-Codes mit benutzerdefiniertem Styling?
Ja. QRCodeWriter.CreateQrCode() unterstützt benutzerdefinierte Farben über ChangeBarCodeColor(), das Einbetten von Logos über AddBrandLogo(), konfigurierbare Fehlerkorrekturstufen und mehrere Ausgabeformate einschließlich PNG, JPG, PDF und Stream.

