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)
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
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
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" />
Installer IronBarcode:
dotnet add package IronBarcode
dotnet add package IronBarcode
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
É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"
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
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
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
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
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.
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
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.
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
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
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>
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
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
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" .
- 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.xmletInfo.plist - Examinez
.csprojpour toute référence de package conditionnelle liée à Scanbot
Tâches de mise à jour du code
- Supprimez le package NuGet
ScanbotSDK.MAUI - Supprimez toutes les entrées conditionnelles
<PackageReference>pour Scanbot de.csproj - Installez le package NuGet
IronBarcode - Remplacez
using ScanbotSDK.MAUI;parusing IronBarCode;dans tous les fichiers - Remplacez
ScanbotSDK.Initialize(...)parIronBarCode.License.LicenseKey = "key"au démarrage de l'application - Remplacez
ScanbotSDKMain.Barcode.StartScannerAsync(configuration)parMediaPicker.CapturePhotoAsync()suivi d'une copie de flux etBarcodeReader.Read(bytes)dans les flux de travail de la caméra MAUI - Remplacez
ScanbotSDKMain.Barcode.StartScannerAsync(configuration)parBarcodeReader.Read(filePath)ouBarcodeReader.Read(stream)dans les contextes côté serveur et traitement de fichiers - Remplacez les vérifications
result.Status == OperationResult.Okparresults.Any()ouresults.FirstOrDefault() != null - Remplacez les références de collection
result.Barcodespar la valeur de retour deBarcodeReader.Read() - Remplacez l'accès à la propriété
barcode.Textparresult.Value - Remplacez les valeurs d'énumération
BarcodeFormat.*par les équivalentsBarcodeEncoding.* - Remplacez
new BarcodeScannerScreenConfiguration()parnew 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.
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.

