Passer au contenu du pied de page
VIDéOS

Comment lire des codes-barres à partir d'images Gif et Tiff multi-pages en C#

Passer de Kit de développement logiciel Scanbot à IronBarcode

Ce guide est destiné aux équipes de développement .NET qui migrent le traitement des codes-barres du SDK Scanbot vers Code-barres IronBarcode pour des scénarios côté serveur, de bureau ou basés sur des fichiers étendus. Il ne s'agit pas d'un remplacement à l'identique : le SDK Scanbot est un composant de numérisation par caméra mobile, et Code-barres IronBarcode est une bibliothèque de traitement de fichiers et de documents. Cette migration correspond à un changement de périmètre motivé par des exigences que le modèle basé uniquement sur la caméra ne peut satisfaire. Les équipes qui remplacent une interface utilisateur de numérisation en direct par caméra mobile sans ajouter d'autres exigences doivent évaluer si la migration est appropriée avant de procéder.

Pour les équipes qui ont commencé avec Scanbot pour une application mobile MAUI et qui ont maintenant besoin du traitement des codes-barres dans ASP.NET Core, une version de bureau ou un pipeline de documents, la migration mécanique est simple. Le changement principal consiste à remplacer ScanbotSDKMain.Barcode.StartScannerAsync(configuration) par BarcodeReader.Read(source), où source est un chemin de fichier, un flux, un tableau d'octets ou un PDF.

Pourquoi migrer depuis le SDK Scanbot ?

Configuration requise pour le traitement côté serveur : le SDK Scanbot ne se compile pas dans ASP.NET Core, les applications console, Azure Functions ou tout projet non-MAUI. Lorsque l'application mobile nécessite un serveur associé qui traite également les codes-barres (en les extrayant des PDF téléchargés ou en validant les valeurs des codes-barres dans les documents entrants), Scanbot ne peut pas franchir cette limite. Code-barres IronBarcode fonctionne dans tous ces contextes avec la même API BarcodeReader.Read().

Support MAUI Desktop : Le package de Scanbot cible net10.0-android et net10.0-ios. Un projet MAUI qui ajoute net10.0-windows ou net10.0-maccatalyst à son TargetFrameworks échouera à construire les cibles de bureau car le package Scanbot ne fournit pas d'assemblages pour ces plateformes. Code-barres IronBarcode prend en charge Windows et macOS MAUI ainsi qu'iOS et Android, ce qui signifie que le même package fonctionne dans un projet MAUI multi-cible sans exclusions spécifiques à la plateforme ni références conditionnelles.

Flux de travail des documents PDF : Il n'y a pas de BarcodeScanner.Read(filePath) dans Scanbot. Lorsque le flux de travail évolue pour inclure la lecture de codes-barres provenant de documents téléchargés, d'archives d'images numérisées ou de factures PDF, l'architecture de Scanbot ne peut pas le prendre en charge. Code-barres IronBarcode lit directement les fichiers PDF et les images, chaque résultat indiquant le numéro de page sur lequel le code-barres a été trouvé.

Prévisibilité du modèle de tarification : Scanbot utilise un forfait annuel. Pour certaines organisations, le renouvellement annuel est le déclencheur pour évaluer des alternatives — en particulier lorsque le périmètre du projet s'est élargi pour inclure des cibles côté serveur ou de bureau qui ne sont pas couvertes par Scanbot. Code-barres IronBarcode est un achat perpétuel unique, éliminant ainsi l'obligation de renouvellement annuel.

Le problème fondamental

Le kit de développement logiciel Scanbot nécessite un flux vidéo en direct. Lorsque les exigences s'étendent au-delà du mobile, il n'existe pas de chemin équivalent à travers la dépendance existante :

// 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 accepte les mêmes types de sources (fichier, flux, tableau d'octets ou PDF) dans n'importe quel contexte de projet :

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

Comparaison des fonctionnalités Code-barres IronBarcode et de Scanbot SDK

Fonction Kit de développement logiciel Scanbot Code-barres IronBarcode
Entrée à partir du chemin du fichier Non Oui
Entrée du flux Non Oui
Entrée à partir d'un tableau d'octets Non Oui
extraction de codes-barres PDF Non Oui
viseur de caméra en direct Oui Non (utilisez MediaPicker)
génération de codes-barres Non Oui
iOS MAUI Oui Oui
Android MAUI Oui Oui
Windows MAUI Non Oui
macOS MAUI Non Oui
ASP.NET Core Non Oui
Console / Serveur Non Oui
Azure / Lambda / Docker Non Oui
<.NET Framework 4.6.2+ Non Oui
Correction d'erreur ML Non Oui
Récupération de codes-barres endommagés Non Oui
Détection automatique du format Oui Oui
Formats 1D 20+ 30+
Formats 2D QR, DataMatrix, PDF417, Aztec QR, DataMatrix, PDF417, Aztec, MaxiCode
Modèle de licence Frais fixes annuels perpétuel unique
Prix ​​publiés Contacter le service des ventes Oui ($999–$5 999)

Démarrage rapide : Migration du SDK Scanbot vers IronBarcode

Étape 1 : Remplacer le package NuGet

Supprimez le package Scanbot :

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

Si le projet utilise des références de package conditionnelles dans le fichier .csproj, supprimez également ces entrées :


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

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

Installer IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

IronBarcode est disponible sur NuGet et prend en charge .NET 6, 7, 8, 9 et .NET Framework 4.6.2+. Pour un projet multi-cible MAUI, un seul dotnet add package fonctionne pour toutes les cibles — aucune référence de package conditionnelle à la plateforme n'est nécessaire.

Étape 2 : Mise à jour des espaces de noms

Remplacez les espaces de noms Scanbot par l'espace de noms IronBarcode :

// Remove
using ScanbotSDK.MAUI;

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

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

Étape 3 : initialisation de la licence

Supprimez le bloc d'initialisation du Scanbot et remplacez-le par la clé de licence Code-barres IronBarcode . Ajoutez l'initialisation de la licence au démarrage de l'application dans MauiProgram.cs, App.xaml.cs, ou Program.cs en fonction du type de projet :

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

Exemples de migration de code

Capture de photos MAUI

L'appel de numérisation de Scanbot ouvre une interface utilisateur de caméra en plein écran et revient à la normale lorsque l'utilisateur scanne un code-barres ou annule. Code-barres IronBarcode ne fournit pas d'interface utilisateur pour la caméra ; le remplacement utilise MediaPicker de MAUI pour invoquer la caméra du système, capturer une photo et passer les octets de l'image à BarcodeReader.Read().

Approche du kit de développement logiciel Scanbot :

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

Approche IronBarcode :

// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

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

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

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

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

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

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

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

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

La modification de l'expérience utilisateur consiste à afficher l'écran de la caméra système plutôt que le viseur intégré du Scanbot avec une zone de numérisation superposée. Pour les applications professionnelles (inventaire, logistique, flux de documents), la caméra du système est adéquate. Le tutoriel sur le lecteur de codes-barres .NET MAUI couvre le modèle d'intégration complet pour les cibles iOS et Android, y compris la gestion des autorisations.

Options et configuration de numérisation

Le BarcodeScannerScreenConfiguration de Scanbot contrôle quels formats le scanner accepte et comment l'interface utilisateur de la caméra se présente. Le BarcodeReaderOptions d'IronBarcode contrôle comment l'image est analysée — vitesse de traitement, détection de plusieurs codes-barres et paramètres similaires. Les concepts de configuration correspondent à des problématiques différentes car les opérations sous-jacentes sont différentes.

Approche du kit de développement logiciel Scanbot :

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

Approche IronBarcode :

using IronBarCode;

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

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

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

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

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

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

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

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

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

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

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

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

La spécification du format n'est pas requise — Code-barres IronBarcode détecte automatiquement tous les formats pris en charge. Les paramètres BarcodeReaderOptions qui correspondent le plus directement à la configuration de Scanbot sont Speed (contrôle la rigueur du traitement par rapport aux performances) et ExpectMultipleBarcodes (continue le balayage après la première correspondance).

Traitement PDF côté serveur

Ce scénario n'a pas d'équivalent chez Scanbot. Avec IronBarcode, le même package installé pour l'application mobile MAUI peut extraire les codes-barres des PDF dans un point de terminaison ASP.NET Core côté serveur, offrant ainsi aux équipes une seule dépendance de code-barres qui fonctionne dans les deux contextes de déploiement.

Approche du kit de développement logiciel Scanbot :

// Kit de développement logiciel Scanbot 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.
// Kit de développement logiciel Scanbot 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.
' Kit de développement logiciel Scanbot 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

Approche IronBarcode :

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

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

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

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

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

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

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

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

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

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

IronBarcode gère nativement les PDF multi-pages — chaque résultat a une propriété PageNumber indiquant sur quelle page le code-barres a été trouvé. Le guide d'extraction des codes-barres PDF couvre l'ensemble des options de lecture PDF, y compris la sélection de la plage de pages et l'optimisation des performances pour les lots de documents volumineux.

Traitement en arrière-plan ASP.NET Core

Pour les flux de travail par lots tels que les Azure Functions ou les services de travail traitant des documents PDF archivés, Code-barres IronBarcode fournit la même API que celle utilisée dans l'application MAUI et le contrôleur ASP.NET Core .

Approche du kit de développement logiciel Scanbot :

// Kit de développement logiciel Scanbot does not support this deployment context.
// The package will not compile in Azure Functions or Worker Services.
// Kit de développement logiciel Scanbot does not support this deployment context.
// The package will not compile in Azure Functions or Worker Services.
' Kit de développement logiciel Scanbot does not support this deployment context.
' The package will not compile in Azure Functions or Worker Services.
$vbLabelText   $csharpLabel

Approche IronBarcode :

// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

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

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

Référence de mappage de l'API du SDK Scanbot vers IronBarcode

Kit de développement logiciel Scanbot Code-barres 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() ou results.FirstOrDefault() != null
result.Barcodes Valeur de retour de 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 Aucun équivalent — le cadrage des images est géré par MediaPicker
BarcodeScannerScreenConfiguration.FlashEnabled Aucun équivalent — utilisez les options de MediaPicker
Entrée requise par caméra Chemin de fichier, flux, tableau d'octets ou PDF
iOS et Android MAUI uniquement Toutes les plateformes .NET et tous les types de projets

Problèmes de migration courants et solutions

Problème n° 1 : Absence d'équivalent en mode viseur électronique

Kit de développement logiciel Scanbot : Fournit un viseur de caméra en temps réel intégré à l'expérience de numérisation, avec une superposition de zone de numérisation, un retour haptique et une détection continue des codes-barres dans le flux vidéo en direct.

Solution : Utilisez MediaPicker.CapturePhotoAsync() de MAUI pour ouvrir la caméra du système et capturer une image fixe pour le traitement :

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

Pour les applications professionnelles, la caméra du système est adéquate. Pour les applications grand public où la superposition en direct est essentielle à l'expérience utilisateur, évaluez si ce changement d'expérience utilisateur est acceptable avant de vous engager dans la migration.

Problème n° 2 : Différences concernant les autorisations d'utilisation des appareils photo

Kit de développement logiciel Scanbot : Le package Scanbot gérait les demandes d'autorisation d'accès à la caméra dans le cadre de son flux d'interface utilisateur ; les autorisations d'accès à la caméra étaient donc gérées implicitement par l'initialisation du kit de développement logiciel et le lancement du scanner.

Solution : Avec MediaPicker, MAUI gère les permissions via le mécanisme standard. Vérifiez que AndroidManifest.xml inclut la déclaration de permission de la caméra et que Info.plist inclut la clé NSCameraUsageDescription. Ces entrées sont généralement présentes dans les modèles de projets MAUI pré-structurés. Si l'application utilisait auparavant uniquement Scanbot pour l'accès à la caméra, vérifiez que les entrées suivantes du manifeste sont bien présentes avant de procéder au test :


<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

Problème 3 : Correction des erreurs de compilation Windows

Scanbot SDK : Le package ScanbotBarcodeSDK.MAUI cible uniquement net10.0-android et net10.0-ios, causant des échecs de construction lorsque net10.0-windows est présent dans TargetFrameworks.

Solution : La suppression de la référence au package Scanbot résout l'échec de la compilation sous Windows. Code-barres IronBarcode fonctionne correctement sur toutes les cibles MAUI sans configuration spécifique à la plateforme :

# 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

Problème n° 4 : Modification de l'espace de noms des énumérations de format

Scanbot SDK : Utilise des valeurs d'énumération BarcodeFormat telles que BarcodeFormat.Code128 du namespace ScanbotBarcodeSDK.MAUI.

Solution : Code-barres IronBarcode utilise l'énumération BarcodeEncoding dans le namespace IronBarCode. Mettez à jour toutes les références de format et tout code qui stocke, compare ou active les valeurs d'énumération de format :

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

Notez qu'IronBarcode détecte automatiquement tous les formats pris en charge par défaut — le filtrage explicite des formats via BarcodeReaderOptions est uniquement nécessaire pour l'optimisation des performances lorsque le format attendu est connu à l'avance.

Liste de contrôle de migration du SDK Scanbot

Tâches préalables à la migration

Auditez le code source pour identifier toutes les utilisations du SDK Scanbot :

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
  • Documentez tous les points d'appel de numérisation et indiquez s'ils se trouvent dans du code partagé, du code spécifique à la plateforme ou des gestionnaires d'événements d'interface utilisateur.
  • Identifier si des pages ou des flux s'appuient sur le viseur en temps réel du Scanbot comme principale interaction utilisateur.
  • Confirmez que les entrées de permission de la caméra existent dans AndroidManifest.xml et Info.plist
  • Examinez .csproj pour toute référence de package conditionnelle liée à Scanbot

Tâches de mise à jour du code

  1. Supprimez le package NuGet ScanbotSDK.MAUI
  2. Supprimez toutes les entrées conditionnelles <PackageReference> pour Scanbot de .csproj
  3. Installez le package NuGet IronBarcode
  4. Remplacez using ScanbotSDK.MAUI; par using IronBarCode; dans tous les fichiers
  5. Remplacez ScanbotSDK.Initialize(...) par IronBarCode.License.LicenseKey = "key" au démarrage de l'application
  6. Remplacez ScanbotSDKMain.Barcode.StartScannerAsync(configuration) par MediaPicker.CapturePhotoAsync() suivi d'une copie de flux et BarcodeReader.Read(bytes) dans les flux de travail de la caméra MAUI
  7. Remplacez ScanbotSDKMain.Barcode.StartScannerAsync(configuration) par BarcodeReader.Read(filePath) ou BarcodeReader.Read(stream) dans les contextes côté serveur et traitement de fichiers
  8. Remplacez les vérifications result.Status == OperationResult.Ok par results.Any() ou results.FirstOrDefault() != null
  9. Remplacez les références de collection result.Barcodes par la valeur de retour de BarcodeReader.Read()
  10. Remplacez l'accès à la propriété barcode.Text par result.Value
  11. Remplacez les valeurs d'énumération BarcodeFormat.* par les équivalents BarcodeEncoding.*
  12. Remplacez new BarcodeScannerScreenConfiguration() par new BarcodeReaderOptions() là où des options de traitement sont nécessaires

Test de post-migration

  • Vérifiez que la compilation réussit sur toutes les plateformes cibles MAUI, y compris Windows et macOS si elles sont présentes.
  • Testez le flux MediaPicker.CapturePhotoAsync() sur un appareil iOS physique et un appareil Android physique
  • Vérifier que les valeurs des codes-barres décodées par Code-barres IronBarcode correspondent aux valeurs précédemment décodées par Scanbot pour les mêmes codes-barres physiques.
  • Tester l'extraction de PDF multipages si le projet inclut des flux de travail de traitement de documents.
  • Vérifiez que la détection de format couvre tous les types de codes-barres précédemment configurés dans BarcodeScannerScreenConfiguration.BarcodeFormats
  • Vérifiez que les points de terminaison côté serveur ou les tâches en arrière-plan produisent des résultats corrects sur les mêmes exemples de documents.
  • Vérifiez que les invites d'autorisation d'accès à la caméra s'affichent correctement lors du premier lancement sur iOS et Android.

Principaux avantages de la migration vers IronBarcode

Package unifié pour toutes les cibles de déploiement : Code-barres IronBarcode s'installe une seule fois et s'exécute sur MAUI mobile, MAUI desktop, ASP.NET Core, Azure Functions, applications console et applications de bureau Windows. Les équipes n'ont plus besoin de dépendances de codes-barres distinctes pour les différentes parties d'un même système.

Traitement des PDF et des documents : Code-barres IronBarcode lit nativement les codes-barres des fichiers PDF, chaque résultat indiquant le numéro de page sur lequel il a été trouvé. Les flux de travail de document qui étaient auparavant impossibles dans le modèle Scanbot deviennent des opérations simples avec BarcodeReader.Read("document.pdf").

Prise en charge de MAUI pour Windows et macOS : Les projets MAUI multi-cibles incluant Windows ou macOS se compilent sans erreur après la suppression de Scanbot. Code-barres IronBarcode fournit la même API de lecture de codes-barres sur les quatre cibles MAUI, éliminant ainsi la gestion des dépendances conditionnelles à la plateforme requise par Scanbot.

Propriété de la licence perpétuelle : le modèle d'achat unique élimine les obligations de renouvellement annuel. Une fois la licence acquise, Code-barres IronBarcode peut être utilisé indéfiniment au niveau acheté, sans frais récurrents. Les équipes dont le périmètre du projet s'est étendu au-delà de la couverture mobile de Scanbot constatent que le modèle perpétuel correspond mieux à la planification des coûts à long terme.

Génération de codes-barres : Code-barres IronBarcode peut produire des codes-barres dans tous les formats pris en charge, sous forme de fichiers image, de flux ou de contenu intégré. Les projets nécessitant à la fois lecture et génération n'ont plus besoin d'une seconde bibliothèque en plus de Scanbot.

Lecture assistée par apprentissage automatique : Code-barres IronBarcode applique une correction d'erreurs basée sur l'apprentissage automatique et une récupération des codes-barres endommagés pour les images difficiles du monde réel (faible contraste, dommages partiels, mauvaise qualité d'impression) que les algorithmes de détection standard ne parviennent pas à décoder. Cette fonctionnalité est particulièrement pertinente pour les flux de travail de traitement de documents où la qualité d'image est variable.

Veuillez noterScanbot SDK est une marque déposée de son propriétaire respectif. Ce site n'est pas affilié ni approuvé par Scanbot SDK. Tous les noms de produits, logos et marques sont la propriété de leurs propriétaires respectifs. Les comparaisons sont à titre informatif uniquement et reflètent les informations publiquement disponibles au moment de l'écriture.

Questions Fréquemment Posées

Pourquoi devrais-je migrer de Scanbot SDK vers IronBarcode ?

Les raisons les plus courantes sont la simplification des licences (suppression de la complexité du SDK + de la clé d'exécution), l'élimination des limites de débit, la prise en charge native des PDF, l'amélioration du déploiement Docker/CI/CD et la réduction de l'API boilerplate dans le code de production.

Comment remplacer les appels API de Scanbot par IronBarcode ?

Remplacer la création d'instance et le modèle de licence par IronBarCode.License.LicenseKey = "key". Remplacer les appels au lecteur par BarcodeReader.Read(path) et les appels à l'écrivain par BarcodeWriter.CreateBarcode(data, encoding). Les méthodes statiques ne nécessitent aucune gestion d'instance.

Quelle est la quantité de code modifiée lors de la migration de Scanbot SDK vers IronBarcode ?

La plupart des migrations permettent de réduire le nombre de lignes de code. Les modèles de licence, les constructeurs d'instances et la configuration explicite des formats sont supprimés. Les principales opérations de lecture/écriture sont converties en équivalents plus courts d'IronBarcode avec des objets de résultat plus propres.

Dois-je conserver les deux logiciels Scanbot SDK et IronBarcode installés pendant la migration ?

Non. La plupart des migrations sont des remplacements directs plutôt que des opérations parallèles. Migrez une classe de service à la fois, remplacez la référence NuGet et mettez à jour les modèles d'instanciation et d'appel d'API avant de passer à la classe suivante.

Quel est le nom du package NuGet pour IronBarcode ?

Le paquet est "IronBarcode" (avec un B et un C majuscules). Installez-le avec "Install-Package IronBarCode" ou "dotnet add package IronBarCode". La directive using dans le code est "using IronBarCode ;".

Comment IronBarcode simplifie-t-il le déploiement de Docker par rapport au kit de développement logiciel de Scanbot ?

IronBarcode est un package NuGet sans fichiers SDK externes ni configuration de licence montée. Dans Docker, définissez la variable d'environnement IRONBARCODE_LICENSE_KEY et le paquetage gère la validation de la licence au démarrage.

IronBarcode détecte-t-il automatiquement tous les formats de codes-barres après avoir migré depuis Scanbot ?

Oui. IronBarcode détecte automatiquement la symbologie dans tous les formats pris en charge. L'énumération explicite des BarcodeTypes n'est pas nécessaire. Si le format est déjà connu et que la performance est importante, BarcodeReaderOptions permet de restreindre l'espace de recherche en tant qu'optimisation.

IronBarcode peut-il lire des codes-barres à partir de PDF sans bibliothèque séparée ?

Oui, BarcodeReader.Read("document.pdf") traite les fichiers PDF de manière native. Les résultats incluent le numéro de page, le format, la valeur et la confiance pour chaque code-barres trouvé. Aucune étape de rendu PDF externe n'est requise.

Comment IronBarcode gère-t-il le traitement parallèle des codes-barres ?

Les méthodes statiques d'IronBarcode sont sans état et à l'abri des threads. Utilisez Parallel.ForEach directement sur les listes de fichiers sans gestion d'instance par thread. BarcodeReaderOptions.MaxParallelThreads contrôle le budget interne des threads.

Quelles sont les propriétés des résultats qui changent lors de la migration de Scanbot SDK vers IronBarcode ?

Renommages courants : BarcodeValue devient Value, BarcodeType devient Format. Les résultats d'IronBarcode ajoutent également Confidence et PageNumber. Une recherche et un remplacement à l'échelle de la solution gèrent les renommages dans le code existant de traitement des résultats.

Comment configurer l'octroi de licences IronBarcode dans un pipeline CI/CD ?

Stockez IRONBARCODE_LICENSE_KEY en tant que secret de pipeline et attribuez IronBarCode.License.LicenseKey dans le code de démarrage de l'application. Un seul secret couvre tous les environnements, y compris le développement, les tests, la mise en scène et la production.

IronBarcode prend-il en charge la génération de codes QR avec un style personnalisé ?

Oui. QRCodeWriter.CreateQrCode() prend en charge les couleurs personnalisées via ChangeBarCodeColor(), l'intégration de logos via AddBrandLogo(), les niveaux de correction d'erreur configurables et plusieurs formats de sortie, notamment PNG, JPG, PDF et stream.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite

Équipe de soutien Iron

Nous sommes en ligne 24 heures sur 24, 5 jours sur 7.
Chat
Email
Appelez-moi