Comment lire des codes-barres à partir d'images en C#
Passer de codeur à barres à IronBarcode
Ce guide décrit l'intégralité du processus de migration de codeur à barres vers Code-barres IronBarcode pour les développeurs .NET . La migration consolide deux packages en un, remplace le pipeline encodeur-rendu par un appel de méthode unique et regroupe tous les imports de namespaces spécifiques aux formats — using Barcoder.Code128, using Barcoder.Qr, using Barcoder.DataMatrix — en un seul using IronBarCode;. Le type IBarcode et les types ImageRenderer / ImageRendererOptions sont entièrement supprimés. Si la lecture était une capacité manquante qui vous a poussé à ajouter une deuxième bibliothèque à côté de Barcoder, Code-barres IronBarcode couvre la lecture en natif avec BarcodeReader.Read().
Pourquoi migrer depuis codeur à barres ?
Les équipes migrant depuis codeur à barres signalent les déclencheurs suivants :
Ajout d'une exigence de lecture : codeur à barres est une bibliothèque de génération uniquement, sans capacité de décodage. Lorsqu'une application a besoin de vérifier les codes-barres entrants, de traiter des documents numérisés ou de lire les codes-barres de fichiers PDF téléchargés, codeur à barres ne propose aucune solution. L'ajout d'une deuxième bibliothèque de lecture crée une base de code divisée avec deux dépendances NuGet , deux API à maintenir et deux historiques de versions à suivre. Code-barres IronBarcode gère à la fois la génération et la lecture grâce à un seul et même package.
Compatibilité avec .NET Framework rompue : Barcoder.Renderer.Image a abandonné le support for .NET Framework. Les équipes exécutant des services ou des applications de bureau sur .NET Framework 4.x qui mettent à jour le package de rendu d'images lors de la maintenance de routine des dépendances rencontrent un échec de compilation. Code-barres IronBarcode prend en charge .NET Framework 4.6.2 à .NET 9 sans packaging conditionnel pour différentes cibles.
Dérive de version de package : Barcoder et Barcoder.Renderer.Image sont des packages NuGet versionnés indépendamment. Mettre à jour l'un sans l'autre lors d'une actualisation des dépendances peut introduire des incompatibilités. Dans les dépôts comportant plusieurs projets, garantir des versions cohérentes de chaque moteur de rendu dans tous les projets représente une charge de coordination qui augmente avec la taille de l'équipe.
Ajout de plusieurs formats : Un projet qui commence avec Code128 et ajoute ensuite QR, puis DataMatrix, doit ajouter une nouvelle importation d'espace de noms et apprendre une classe d'encodeur différente avec des paramètres de méthode différents pour chaque format. Code-barres IronBarcode utilise une énumération BarcodeEncoding — ajouter un format est un changement en un mot à un appel existant. Pas de nouvel espace de noms, pas de nouvelle classe, pas de signature de méthode différente.
Exigences de déploiement MAUI et Cloud : codeur à barres ne documente pas la prise en charge des déploiements MAUI, Docker, AWS Lambda ou Azure. Les équipes qui développent des applications mobiles multiplateformes ou des pipelines de traitement de codes-barres sans serveur constatent que les cibles documentées de codeur à barres ne couvrent pas ces scénarios.
Le problème fondamental
Barcoder associe la sélection du format aux importations d'espaces de noms et impose un pipeline de rendu pour chaque opération de sortie. Changer de format ou de type de sortie nécessite des modifications structurelles du code :
// Barcoder: 3 namespaces, encoder-specific class, renderer pipeline, stream management
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2,
BarHeightFor1DBarcode = 50
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
// Barcoder: 3 namespaces, encoder-specific class, renderer pipeline, stream management
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2,
BarHeightFor1DBarcode = 50
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO
Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 2,
.BarHeightFor1DBarcode = 50
})
Using stream As FileStream = File.OpenWrite("barcode.png")
renderer.Render(barcode, stream)
End Using
IronBarcode exprime la même opération qu'un seul appel chaîné :
// IronBarcode: 1 namespace, 1 method, 1 output call
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
// IronBarcode: 1 namespace, 1 method, 1 output call
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
.SaveAsPng("barcode.png")
Comparaison des fonctionnalités Code-barres IronBarcode et de Barcoder
| Fonction | codeur à barres | Code-barres IronBarcode |
|---|---|---|
| Packages NuGet requis | 2 minimum (BarCode + Barcoder.Renderer.Image) | 1 (IronBarcode) |
| génération de codes-barres | Oui | Oui |
| Lecture et décodage de codes-barres | Non | Oui |
| Classes d'encodeurs par format | Oui — Code128Encoder, QrEncoder, DataMatrixEncoder, etc. |
Non — énumération BarcodeEncoding |
| Importations d'espaces de noms par format | Oui — Barcoder.Code128, Barcoder.Qr, Barcoder.DataMatrix |
Non — seulement using IronBarCode |
| Méthodes de sortie sur l'objet résultat | Non — IBarcode n'a pas de méthodes de sauvegarde |
Oui — GeneratedBarcode a SaveAsPng, ToPngBinaryData, ToStream |
| Lecture de PDF | Non | Oui — BarcodeReader.Read(path) |
| QR avec logo | Non | Oui — .AddBrandLogo(path) |
| Prise en charge du .NET Framework | Déposé dans le moteur de rendu d'images | .NET Framework 4.6.2+ |
| Prise en charge de .NET 9 | Activité peu claire / limitée | Oui |
| Assistance MAUI | Non | Oui — iOS, Android, Windows, macOS |
| Docker / Azure / AWS Lambda | Non documenté | Oui |
| Licence | MIT (logiciel libre) | Commercial — Lite $999, Plus $1,499, Professional $2,999, Unlimited $5,999 |
| Contrôle de la vitesse de lecture | Non | Oui — énumération ReadingSpeed |
| Détection de plusieurs codes-barres | Non | Oui — option ExpectMultipleBarcodes |
Démarrage rapide : Migration de codeur à barres vers IronBarcode
Étape 1 : Remplacer le package NuGet
Supprimez tous les packages codeur à barres de votre projet :
dotnet remove package Barcoder
dotnet remove package Barcoder.Renderer.Image
dotnet remove package Barcoder
dotnet remove package Barcoder.Renderer.Image
Si vous avez également ajouté le moteur de rendu SVG :
dotnet remove package Barcoder.Renderer.Svg
dotnet remove package Barcoder.Renderer.Svg
Installer IronBarcode:
dotnet add package IronBarcode
dotnet add package IronBarcode
Étape 2 : Mise à jour des espaces de noms
Supprimer toutes les déclarations using Barcoder.* de chaque fichier du projet :
// Remove all of these
using Barcoder;
using Barcoder.Code128;
using Barcoder.Qr;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
using Barcoder.Ean;
using Barcoder.Pdf417;
// ... and any other Barcoder.* namespaces in your project
// Remove all of these
using Barcoder;
using Barcoder.Code128;
using Barcoder.Qr;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
using Barcoder.Ean;
using Barcoder.Pdf417;
// ... and any other Barcoder.* namespaces in your project
Remplacez-les tous par une seule directive using :
using IronBarCode;
using IronBarCode;
Imports IronBarCode
Étape 3 : initialisation de la licence
Ajouter l'initialisation de la licence au démarrage de l'application — Program.cs, Startup.cs, ou MauiProgram.cs :
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Une clé d'essai gratuite est disponible sur ironsoftware.com .
Exemples de migration de code
Génération Code128
Approche par code-barres :
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2,
BarHeightFor1DBarcode = 50
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2,
BarHeightFor1DBarcode = 50
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO
Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 2,
.BarHeightFor1DBarcode = 50
})
Using stream As FileStream = File.OpenWrite("barcode.png")
renderer.Render(barcode, stream)
End Using
Approche IronBarcode :
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.SaveAsPng("barcode.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
.SaveAsPng("barcode.png")
Le Code128Encoder, ImageRenderer, ImageRendererOptions, et la gestion des flux sont entièrement supprimés. Le format est spécifié comme BarcodeEncoding.Code128 sur la classe unifiée BarcodeWriter. Les méthodes de sortie résident directement sur l'objet GeneratedBarcode retourné. La documentation Code-barres IronBarcode sur la génération de codes-barres couvre la personnalisation du style, des marges et des couleurs.
Génération de codes QR
Approche par code-barres :
using Barcoder;
using Barcoder.Qr;
using Barcoder.Renderers;
IBarcode barcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 4
});
using var stream = File.OpenWrite("qr.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.Qr;
using Barcoder.Renderers;
IBarcode barcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 4
});
using var stream = File.OpenWrite("qr.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Qr
Imports Barcoder.Renderers
Dim barcode As IBarcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M)
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 4
})
Using stream = File.OpenWrite("qr.png")
renderer.Render(barcode, stream)
End Using
Approche IronBarcode :
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
Imports IronBarCode
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.SaveAsPng("qr.png")
Le deuxième paramètre pour CreateQrCode est la dimension de sortie en pixels. Le niveau de correction d'erreur est défini par défaut sur une valeur raisonnable et peut être configuré si nécessaire. Code-barres IronBarcode prend également en charge une opération impossible dans Barcoder : l'intégration d'un logo de marque au centre du code QR :
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
Imports IronBarCode
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.AddBrandLogo("logo.png") _
.SaveAsPng("qr-branded.png")
Génération de DataMatrix
Approche par code-barres :
using Barcoder;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
IBarcode barcode = DataMatrixEncoder.Encode("ITEM-XYZ-001");
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 5
});
using var stream = File.OpenWrite("datamatrix.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
IBarcode barcode = DataMatrixEncoder.Encode("ITEM-XYZ-001");
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 5
});
using var stream = File.OpenWrite("datamatrix.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.DataMatrix
Imports Barcoder.Renderers
Imports System.IO
Dim barcode As IBarcode = DataMatrixEncoder.Encode("ITEM-XYZ-001")
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 5
})
Using stream As FileStream = File.OpenWrite("datamatrix.png")
renderer.Render(barcode, stream)
End Using
Approche IronBarcode :
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix)
.SaveAsPng("datamatrix.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix)
.SaveAsPng("datamatrix.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix) _
.SaveAsPng("datamatrix.png")
Le motif est identique à Code128 — seule la valeur BarcodeEncoding change. Aucun nouvel espace de noms importé, aucune classe différente, aucune signature de méthode différente.
Contrôler la taille de la sortie
Barcoder utilise PixelSize comme multiplicateur d'échelle sur la taille du module de code-barres et BarHeightFor1DBarcode pour la hauteur 1D — il n'y a pas d'API de largeur/hauteur directe.
Approche par code-barres :
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 3,
BarHeightFor1DBarcode = 80
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 3,
BarHeightFor1DBarcode = 80
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports System.IO
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 3,
.BarHeightFor1DBarcode = 80
})
Using stream As FileStream = File.OpenWrite("barcode.png")
renderer.Render(barcode, stream)
End Using
Approche IronBarcode :
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("barcode.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("barcode.png")
.ResizeTo(width, height) prend des dimensions de pixels explicites. Il se chaîne avec d'autres méthodes de sortie sur le même objet GeneratedBarcode.
Récupération de données binaires au lieu d'un fichier
Approche par code-barres :
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2
});
using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;
IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);
var renderer = new ImageRenderer(new ImageRendererOptions
{
ImageFormat = ImageFormat.Png,
PixelSize = 2
});
using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO
Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)
Dim renderer = New ImageRenderer(New ImageRendererOptions With {
.ImageFormat = ImageFormat.Png,
.PixelSize = 2
})
Using ms As New MemoryStream()
renderer.Render(barcode, ms)
Dim pngBytes As Byte() = ms.ToArray()
End Using
Approche IronBarcode :
using IronBarCode;
byte[] pngBytes = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ToPngBinaryData();
using IronBarCode;
byte[] pngBytes = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ToPngBinaryData();
Imports IronBarCode
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128).ToPngBinaryData()
Le modèle MemoryStream et ToArray() est remplacé par un appel de méthode unique enchaîné sur GeneratedBarcode.
Lecture des codes-barres (nouvelle fonctionnalité)
Barcoder ne possède pas d'API de lecture. Si vous avez précédemment ajouté une deuxième bibliothèque de lecture, celle-ci peut être supprimée. Code-barres IronBarcode lit les fichiers, les tableaux d'octets, les flux et les PDF avec le même package que celui utilisé pour la génération.
Approche IronBarcode :
using IronBarCode;
// Read from image file
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Format: {result.Format}");
}
// Read from PDF natively — no image extraction step, no extra dependency
var pdfResults = BarcodeReader.Read("invoice.pdf");
// Read multiple barcodes from one image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-sheet.png", options);
foreach (var result in multiResults)
Console.WriteLine(result.Value);
// Read from a stream directly
using var fileStream = File.OpenRead("barcode.png");
var streamResults = BarcodeReader.Read(fileStream);
using IronBarCode;
// Read from image file
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Format: {result.Format}");
}
// Read from PDF natively — no image extraction step, no extra dependency
var pdfResults = BarcodeReader.Read("invoice.pdf");
// Read multiple barcodes from one image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-sheet.png", options);
foreach (var result in multiResults)
Console.WriteLine(result.Value);
// Read from a stream directly
using var fileStream = File.OpenRead("barcode.png");
var streamResults = BarcodeReader.Read(fileStream);
Imports IronBarCode
' Read from image file
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
Console.WriteLine($"Value: {result.Value}")
Console.WriteLine($"Format: {result.Format}")
Next
' Read from PDF natively — no image extraction step, no extra dependency
Dim pdfResults = BarcodeReader.Read("invoice.pdf")
' Read multiple barcodes from one image
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim multiResults = BarcodeReader.Read("warehouse-sheet.png", options)
For Each result In multiResults
Console.WriteLine(result.Value)
Next
' Read from a stream directly
Using fileStream = File.OpenRead("barcode.png")
Dim streamResults = BarcodeReader.Read(fileStream)
End Using
La documentation relative à la lecture des codes-barres IronBarcode couvre les PDF multipages, la lecture de zones d'intérêt et les options d'optimisation des performances.
Sortie SVG
Approche par code-barres :
using Barcoder.Renderers;
var svgRenderer = new SvgRenderer();
using var stream = File.OpenWrite("barcode.svg");
svgRenderer.Render(barcode, stream);
using Barcoder.Renderers;
var svgRenderer = new SvgRenderer();
using var stream = File.OpenWrite("barcode.svg");
svgRenderer.Render(barcode, stream);
Imports Barcoder.Renderers
Dim svgRenderer = New SvgRenderer()
Using stream = File.OpenWrite("barcode.svg")
svgRenderer.Render(barcode, stream)
End Using
Approche IronBarcode :
using IronBarCode;
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
.SaveAsSvg("barcode.svg");
using IronBarCode;
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
.SaveAsSvg("barcode.svg");
Imports IronBarCode
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) _
.SaveAsSvg("barcode.svg")
Le package Barcoder.Renderer.Svg peut être supprimé une fois que tous les sites de rendu SVG ont été migrés.
Référence de correspondance entre l'API codeur à barres et IronBarcode
| codeur à barres | Code-barres IronBarcode |
|---|---|
Code128Encoder.Encode("data", false) |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
QrEncoder.Encode("data", ErrorCorrectionLevel.M) |
QRCodeWriter.CreateQrCode("data", 500) |
DataMatrixEncoder.Encode("data") |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix) |
new ImageRenderer(new ImageRendererOptions { ... }) |
Pas nécessaire |
renderer.Render(barcode, fileStream) |
.SaveAsPng(path) |
renderer.Render(barcode, memoryStream) + ms.ToArray() |
.ToPngBinaryData() |
IBarcode |
GeneratedBarcode |
PixelSize = 2, BarHeightFor1DBarcode = 50 |
.ResizeTo(width, height) |
SvgRenderer + renderer.Render(barcode, stream) |
.SaveAsSvg(path) |
| API de lecture indisponible | BarcodeReader.Read(path / stream / bytes / pdf) |
2 packages — Barcoder + Barcoder.Renderer.Image |
1 package — IronBarcode |
Namespace par format pour chaque encodeur (Barcoder.Code128, Barcoder.Qr, etc.) |
Énumération BarcodeEncoding, namespace unique |
Problèmes de migration courants et solutions
Problème 1 : IBarcode ne possède pas de méthodes d'enregistrement
Barcoder : Un code qui stocke une variable IBarcode et la passe à un moteur de rendu plus tard suit un motif de rendu différé. Toute méthode d'assistance qui accepte IBarcode et appelle renderer.Render() doit être refactorisée.
Solution : Changer les références de type IBarcode en GeneratedBarcode. L'objet GeneratedBarcode porte ses méthodes de sortie avec lui — passez-le à toute méthode qui nécessite de sauvegarder ou de sérialiser le résultat :
// Code-barres IronBarcode — GeneratedBarcode carries output methods
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128);
SaveBarcodeToFile(barcode, "output.png");
static void SaveBarcodeToFile(GeneratedBarcode barcode, string path)
{
barcode.SaveAsPng(path);
}
// Code-barres IronBarcode — GeneratedBarcode carries output methods
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128);
SaveBarcodeToFile(barcode, "output.png");
static void SaveBarcodeToFile(GeneratedBarcode barcode, string path)
{
barcode.SaveAsPng(path);
}
Imports IronBarCode
Dim barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
SaveBarcodeToFile(barcode, "output.png")
Private Sub SaveBarcodeToFile(barcode As GeneratedBarcode, path As String)
barcode.SaveAsPng(path)
End Sub
Une recherche pour renderer.Render( à travers la solution localisera tous les sites de rendu différé.
Problème n° 2 : PixelSize n'a pas d'équivalent direct
Barcoder : PixelSize est un multiplicateur d'échelle sur la taille naturelle du module du code-barres. Les dimensions de sortie dépendent de la longueur du contenu, du format et du multiplicateur combiné. BarHeightFor1DBarcode contrôle la hauteur 1D indépendamment. Il n'existe pas de spécifications directes concernant la largeur et la hauteur.
Solution : Mesurer la sortie en pixels réels que le code existant codeur à barres produit et passer ces valeurs à .ResizeTo(width, height) :
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
.ResizeTo(300, 80)
.SaveAsPng("barcode.png");
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
.ResizeTo(300, 80)
.SaveAsPng("barcode.png");
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) _
.ResizeTo(300, 80) _
.SaveAsPng("barcode.png")
Problème 3 : Accumulation des importations d'espace de noms de format
Barcoder : Chaque format de code-barres utilisé dans un projet ajoute une directive using Barcoder.[Format] à chaque fichier qui l'utilise. Un projet utilisant Code128, QR et DataMatrix a typiquement trois imports spécifiques au format par fichier plus using Barcoder et using Barcoder.Renderers.
Solution : Lancer une recherche pour toutes les déclarations using Barcoder et les remplacer toutes par using IronBarCode; :
grep -rn "using Barcoder" --include="*.cs" .
grep -rn "using Barcoder" --include="*.cs" .
Chaque résultat est une ligne à supprimer, remplacée par la seule directive using IronBarCode; une fois par fichier.
Problème 4 : Erreurs de synchronisation des versions de packages
Barcoder : Construire après avoir mis à jour seulement Barcoder ou Barcoder.Renderer.Image peut produire des erreurs de résolution de type parce que les deux packages peuvent ne pas être compatibles à différentes combinaisons de versions.
Solution : Après avoir supprimé les deux paquets codeur à barres et installé IronBarcode, il y a un seul package et une seule version. Les conflits de verrouillage de paquets de cette catégorie sont éliminés. Vérifiez que le fichier .csproj contient seulement la référence IronBarcode unique et aucune référence Barcoder.* restante avant de construire.
Liste de contrôle pour la migration des codes-barres
Tâches préalables à la migration
Avant d'apporter des modifications, effectuez un audit de votre code source afin d'identifier toutes les utilisations de Barcoder :
grep -rn "using Barcoder" --include="*.cs" .
grep -rn "Code128Encoder\.Encode" --include="*.cs" .
grep -rn "QrEncoder\.Encode" --include="*.cs" .
grep -rn "DataMatrixEncoder\.Encode" --include="*.cs" .
grep -rn "ImageRenderer\|ImageRendererOptions" --include="*.cs" .
grep -rn "SvgRenderer" --include="*.cs" .
grep -rn "renderer\.Render(" --include="*.cs" .
grep -rn "IBarcode" --include="*.cs" .
grep -rn "ErrorCorrectionLevel" --include="*.cs" .
grep -rn "using Barcoder" --include="*.cs" .
grep -rn "Code128Encoder\.Encode" --include="*.cs" .
grep -rn "QrEncoder\.Encode" --include="*.cs" .
grep -rn "DataMatrixEncoder\.Encode" --include="*.cs" .
grep -rn "ImageRenderer\|ImageRendererOptions" --include="*.cs" .
grep -rn "SvgRenderer" --include="*.cs" .
grep -rn "renderer\.Render(" --include="*.cs" .
grep -rn "IBarcode" --include="*.cs" .
grep -rn "ErrorCorrectionLevel" --include="*.cs" .
Documentez tous les emplacements où IBarcode est stocké comme type de variable ou passé comme paramètre de méthode — ce sont les sites de rendu différé qui nécessitent le plus d'attention. Notez toutes les valeurs PixelSize et BarHeightFor1DBarcode et mesurez les dimensions de sortie correspondantes.
Tâches de mise à jour du code
- Supprimez le paquet NuGet
Barcoderde tous les projets - Supprimez le paquet NuGet
Barcoder.Renderer.Imagede tous les projets - Supprimez le paquet NuGet
Barcoder.Renderer.Svgs'il est présent - Installez le paquet NuGet
IronBarcode - Ajoutez
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";au démarrage de l'application - Remplacez toutes les déclarations
using Barcoder.*parusing IronBarCode; - Remplacez
Code128Encoder.Encode(...)parBarcodeWriter.CreateBarcode(..., BarcodeEncoding.Code128) - Remplacez
QrEncoder.Encode(...)parQRCodeWriter.CreateQrCode(..., size) - Remplacez
DataMatrixEncoder.Encode(...)parBarcodeWriter.CreateBarcode(..., BarcodeEncoding.DataMatrix) - Supprimez toutes les constructions
new ImageRenderer(new ImageRendererOptions {...}) - Remplacez
renderer.Render(barcode, fileStream)par.SaveAsPng(path)surGeneratedBarcode - Remplacez
renderer.Render(barcode, memoryStream)+ms.ToArray()par.ToPngBinaryData() - Remplacez l'utilisation de
SvgRendererpar.SaveAsSvg(path) - Changez les références de type
IBarcodeenGeneratedBarcode - Remplacez les options
PixelSize/BarHeightFor1DBarcodepar.ResizeTo(width, height)
Test de post-migration
- Vérifiez que chaque format de code-barres généré est correctement scanné avec un scanner standard ou le lecteur IronBarcode.
- Comparez les dimensions de la sortie visuelle avec la sortie avant la migration — confirmez que les valeurs
.ResizeTo()produisent des tailles équivalentes - Tester le rendu du code QR avec un scanner de téléphone pour confirmer que le niveau de correction d'erreur est adéquat.
- Vérifiez que le rendu SVG s'affiche correctement dans le navigateur et à l'impression si votre projet utilise ce format.
- Si vous avez supprimé une deuxième bibliothèque de lecture, vérifiez que
BarcodeReader.Read()produit des valeurs décodées équivalentes pour les mêmes entrées - Testez la lecture des PDF si votre projet traite des documents PDF — assurez-vous que les PDF multipages lisent correctement toutes les pages.
- Effectuez une compilation sans référence restante à
Barcoder.*— les erreurs de compilation indiquent des sites de migration manqués
Principaux avantages de la migration vers IronBarcode
Dépendance unifiée des packages : un package NuGet en remplace deux (ou trois, si le moteur de rendu SVG a également été utilisé). Une seule version à suivre, un seul journal des modifications à surveiller et aucun problème de compatibilité entre les paquets lors des mises à jour des dépendances. La complexité .csproj et packages.lock.json diminue immédiatement.
Capacité de lecture native : les applications qui nécessitaient auparavant une deuxième bibliothèque pour la lecture des codes-barres peuvent désormais être regroupées sur IronBarcode. BarcodeReader.Read() accepte les fichiers image, les tableaux d'octets, les flux et les PDF via la même API, avec une détection multi-code-barres et un ajustement de la vitesse de lecture intégrés.
Sélection de format en tant que configuration : Ajouter un nouveau format de code-barres à un projet existant est un changement en un mot à la valeur de l'énum BarcodeEncoding dans un appel CreateBarcode existant. Aucun nouvel espace de noms importé, aucune nouvelle classe d'encodeur et aucun nouveau package. Cela permet une extension de format sans friction à mesure que les exigences du produit évoluent.
Dimensions de sortie explicites : .ResizeTo(width, height) remplace l'ancien système de multiplicateur PixelSize par une spécification de pixels explicite. La relation entre le code et la sortie est directe et prévisible, indépendamment de la longueur du contenu du code-barres ou du dimensionnement spécifique du module au format.
Couverture étendue des plateformes : Code-barres IronBarcode prend en charge .NET Framework 4.6.2 à .NET 9, les déploiements MAUI sur iOS, Android, Windows et macOS, ainsi que le déploiement documenté sur Docker, AWS Lambda et Azure Functions. Les équipes dont les exigences de plateforme s'étendent au-delà de .NET Core ne rencontreront pas le fossé de support de framework qui affecte Barcoder.Renderer.Image.
Maintenance active et compatibilité future : Code-barres IronBarcode publie des mises à jour régulières avec des échéanciers de compatibilité .NET documentés. La cadence de sortie active garde la bibliothèque alignée avec les versions .NET actuelles, ce qui n'est pas assuré à partir d'une bibliothèque avec une activité de sortie récente limitée.
Questions Fréquemment Posées
Pourquoi devrais-je migrer de Barcoder à 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 BarCode 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 quantité de code change lors de la migration de Barcoder à 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 BarCode 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 à Barcoder ?
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 Barcoder ?
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 propriétés de résultat changent lors de la migration de Barcoder à 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.

