Zum Fußzeileninhalt springen
VIDEOS

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

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

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
SHELL

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" />
XML

IronBarcode installieren:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

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

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

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

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

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

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

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

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

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

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

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

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

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
SHELL

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

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" .
SHELL
  • 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.xml und Info.plist Einträge für Kameraberechtigungen vorhanden sind.
  • Überprüfen Sie die .csproj auf bedingte Paketreferenzen im Zusammenhang mit Scanbot.

Aufgaben der Code-Aktualisierung

  1. Entfernen Sie das ScanbotSDK.MAUI NuGet-Paket
  2. Entfernen Sie alle bedingten <PackageReference>-Einträge für Scanbot aus dem .csproj
  3. Installieren Sie das IronBarcode NuGet-Paket
  4. Ersetzen Sie using ScanbotSDK.MAUI; durch using IronBarCode; in allen Dateien
  5. Ersetzen Sie ScanbotSDK.Initialize(...) beim Anwendungsstart durch IronBarCode.License.LicenseKey = "key"
  6. Ersetzen Sie ScanbotSDKMain.Barcode.StartScannerAsync(configuration) durch MediaPicker.CapturePhotoAsync() gefolgt von Stream-Kopie und BarcodeReader.Read(bytes) in MAUI-Kamera-Workflows
  7. Ersetzen Sie ScanbotSDKMain.Barcode.StartScannerAsync(configuration) durch BarcodeReader.Read(filePath) oder BarcodeReader.Read(stream) in serverseitigen und Dateiverarbeitungskontexten
  8. Ersetzen Sie result.Status == OperationResult.Ok-Überprüfungen durch results.Any() oder results.FirstOrDefault() != null
  9. Ersetzen Sie result.Barcodes-Sammlungsreferenzen durch den Rückgabewert von BarcodeReader.Read()
  10. Ersetzen Sie barcode.Text-Eigenschaftszugriff durch result.Value
  11. Ersetzen Sie BarcodeFormat.*-Enum-Werte durch BarcodeEncoding.*-Äquivalente
  12. Ersetzen Sie new BarcodeScannerScreenConfiguration() durch new 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.BarcodeFormats konfiguriert 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.

Hinweis:Scanbot SDK ist eine eingetragene Marke des jeweiligen Eigentümers. Diese Seite ist weder mit Scanbot SDKverbunden noch von Scanbot SDKunterstützt oder gesponsert. Alle Produktnamen, Logos und Marken sind Eigentum ihrer jeweiligen Eigentümer. Vergleiche dienen nur zu Informationszwecken und spiegeln öffentlich zugängliche Informationen zum Zeitpunkt des Schreibens wider.

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.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen

Iron-Support-Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an