Comment personnaliser et ajouter des logos aux QR Codes en C# | IronBarcode
Migrer de Code-barres Syncfusion vers IronBarcode
Ce guide fournit un chemin de migration complet des contrôles de code-barres de Syncfusion — SfBarcode pour WinForms et WPF, SfBarcodeGenerator pour Blazor et MAUI — vers IronBarcode. Il aborde les raisons structurelles qui poussent les équipes à effectuer cette transition, un guide de démarrage rapide étape par étape pour le remplacement des packages NuGet et la configuration des licences, des exemples de code complets avant et après pour chaque scénario courant, et une liste de contrôle de migration pour l'audit d'une base de code existante. Si le projet utilise également d'autres composants Syncfusion (grilles, graphiques, planificateurs), ces packages et leurs enregistrements ne sont pas affectés ; seul le code spécifique au code-barres change.
Pourquoi migrer depuis Syncfusion Barcode
Lacune de lecture : SfBarcode et SfBarcodeGenerator sont des contrôles de génération sans capacité de lecture. Il n'y a pas de méthode .Read() ou .Scan() dans l'une ou l'autre classe. Lorsqu'un projet nécessite la lecture de codes-barres à partir d'images téléchargées, de documents numérisés ou de fichiers PDF, le contrôle des codes-barres Syncfusion n'offre aucune solution. La documentation de Syncfusion oriente les équipes vers Barcode Reader OPX comme solution, un produit commercial distinct qui doit être acheté, sous licence et maintenu indépendamment.
OPX comme surcouche payante d'un logiciel libre : le lecteur de codes-barres OPX utilise en interne ZXing .NET , une bibliothèque de lecture de codes-barres open source publiée sous la licence Apache 2.0. Apache 2.0 est une licence permissive ; Tout développeur .NET peut installer ZXing.Net directement avec dotnet add package ZXing.Net et l'utiliser dans des applications commerciales sans frais. Un flux de travail complet de lecture et de génération Syncfusion nécessite deux produits Syncfusion distincts, deux accords de licence et deux surfaces d'API — alors que la capacité de lecture pourrait avoir été obtenue directement à partir de la bibliothèque gratuite qu'OPX encapsule.
Conditions d'obtention de la licence communautaire : La licence communautaire de Syncfusion exige que quatre conditions soient remplies simultanément et sans interruption : un chiffre d'affaires annuel brut inférieur à 1 000 000 $, cinq développeurs ou moins, dix employés ou moins au total et un total de capitaux externes levés inférieur à 3 000 000 $. Les organismes gouvernementaux ne sont pas admissibles, quelle que soit leur taille. Le non-respect d'une seule de ces conditions entraîne l'obligation immédiate d'obtenir une licence commerciale. Un tour de table de série A permet généralement de lever plus de 3 000 000 $ de capitaux le jour de sa clôture, déclenchant ainsi des frais de licence indépendamment de la taille de l'équipe ou de ses revenus. La transition commerciale passe de 0 $ à un abonnement annuel Essential Studio par développeur — et cet abonnement couvre l'ensemble de la suite, pas seulement le composant de code-barres. Le chemin publié de Syncfusion est un devis personnalisé du service commercial.
Rotation des clés spécifique à la version : les clés de licence Syncfusion sont liées à des plages de versions spécifiques d'Essential Studio. La mise à niveau de la version 24.x à la version 25.x nécessite l'obtention d'une nouvelle clé à partir du portail de compte, la mise à jour de cette clé dans le magasin de secrets de chaque environnement de déploiement et le redéploiement pour empêcher l'apparition de filigranes d'essai dans les sorties de production. Pour les équipes ayant des cadences de publication fréquentes ou plusieurs cibles de déploiement, cette rotation devient une charge opérationnelle récurrente disproportionnée par rapport à l'exigence sous-jacente de génération d'une image de code-barres.
Le problème fondamental
L'architecture de contrôle de Syncfusion rend la génération de fichiers par programmation indirecte. Produire un fichier de code-barres avec SfBarcode nécessite de pré-allouer un Bitmap, d'appeler DrawToBitmap, puis de sauvegarder le bitmap — un motif de rendu WinForms qui entraîne la dépendance du runtime Windows Forms :
// Syncfusion SfBarcode: indirect file output through DrawToBitmap
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
var barcode = new SfBarcode();
barcode.Text = "SHIP-2024-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.Width = 400;
barcode.Height = 150;
using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("shipping-label.png", ImageFormat.Png);
// Reading: not possible — requires separate OPX purchase
// Syncfusion SfBarcode: indirect file output through DrawToBitmap
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
var barcode = new SfBarcode();
barcode.Text = "SHIP-2024-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.Width = 400;
barcode.Height = 150;
using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("shipping-label.png", ImageFormat.Png);
// Reading: not possible — requires separate OPX purchase
Imports Syncfusion.Licensing
Imports System.Drawing
Imports System.Drawing.Imaging
' Syncfusion SfBarcode: indirect file output through DrawToBitmap
SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY")
Dim barcode As New SfBarcode()
barcode.Text = "SHIP-2024-001"
barcode.Symbology = BarcodeSymbolType.Code128A
barcode.Width = 400
barcode.Height = 150
Using bitmap As New Bitmap(barcode.Width, barcode.Height)
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle)
bitmap.Save("shipping-label.png", ImageFormat.Png)
End Using
' Reading: not possible — requires separate OPX purchase
IronBarcode génère directement les fichiers et les lit avec le même package :
// IronBarcode: direct generation and reading in one package
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.SaveAsPng("shipping-label.png");
// Read — same package, no additional product required
var results = BarcodeReader.Read("shipping-label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
// IronBarcode: direct generation and reading in one package
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.SaveAsPng("shipping-label.png");
// Read — same package, no additional product required
var results = BarcodeReader.Read("shipping-label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
Imports IronBarCode
' IronBarcode: direct generation and reading in one package
License.LicenseKey = "YOUR-LICENSE-KEY"
' Generate
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128) _
.ResizeTo(400, 150) _
.SaveAsPng("shipping-label.png")
' Read — same package, no additional product required
Dim results = BarcodeReader.Read("shipping-label.png")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
Comparaison des fonctionnalités des codes-barres Code-barres IronBarcode et Syncfusion
| Fonction | Code-barres Syncfusion | Code-barres IronBarcode |
|---|---|---|
| génération de codes-barres | Oui — Contrôle d'interface utilisateur (WinForms, WPF, Blazor, MAUI) | Oui — API statique, tous environnements |
| Lecture de codes-barres | Non — lecteur de codes-barres OPX séparé requis | Oui, même forfait |
| OPX lit les encapsulations de produit ZXing .NET (Apache 2.0) | Oui | N/A |
| Sortie de code-barres PDF | Non — nécessite également Syncfusion.PDF | Oui — SaveAsPdf() intégré |
| lecture de codes-barres PDF | Non | Oui — natif |
| Génération côté serveur / sans interface graphique | Nécessite le runtime WinForms (DrawToBitmap) |
Natif — aucune dépendance à l'interface utilisateur |
| Déploiement Docker / Linux | Limité | Prise en charge complète |
| API minimale ASP.NET Core | Non directement pris en charge | Prise en charge complète |
| Code QR avec logo intégré | Non | Oui — .AddBrandLogo() |
| Détection automatique du format à la lecture | N/A | Oui |
| Communauté / niveau gratuit | Licence communautaire (quatre conditions simultanées) | Essai gratuit de 30 jours (filigrane uniquement) |
| modèle de licence commerciale | Abonnement annuel (Essential Studio) | Perpétuel (une seule fois, voir ironsoftware.com/csharp/barcode/licensing) |
| Étendue de la clé de licence | Spécifique à une version, change en fonction des mises à jour majeures de NuGet | Version stable au sein de la version majeure |
| Étapes d'inscription à la plateforme | 3 à 4 étapes (RegisterLicense + AddSyncfusionBlazor + ConfigureSyncfusionCore + importations Razor ) | Une seule ligne, toutes les plateformes |
| Gamme de formats 1D | Code 128, Code 39, EAN, UPC, Codabar et autres | Tous les formats Syncfusion, Plus PDF417, Aztec, MaxiCode, GS1, USPS IMb et plus de 50 autres. |
| Gamme de formats 2D | Code QR, DataMatrix | Code QR, DataMatrix, PDF417, Micro PDF417, Aztec, MaxiCode |
Démarrage rapide
Étape 1 : Remplacer les paquets NuGet
Supprimez le package de codes-barres Syncfusion pour la plateforme utilisée. Si le projet cible plusieurs plateformes, exécutez la suppression pour chacune d'elles :
# Blazor
dotnet remove package Syncfusion.Blazor.BarcodeGenerator
# WinForms
dotnet remove package Syncfusion.SfBarcode.Windows
# WPF
dotnet remove package Syncfusion.SfBarcode.WPF
# MAUI
dotnet remove package Syncfusion.Maui.Barcode
# Blazor
dotnet remove package Syncfusion.Blazor.BarcodeGenerator
# WinForms
dotnet remove package Syncfusion.SfBarcode.Windows
# WPF
dotnet remove package Syncfusion.SfBarcode.WPF
# MAUI
dotnet remove package Syncfusion.Maui.Barcode
S'il ne reste aucun autre package Syncfusion dans le projet après la suppression du package de code-barres, supprimez également le package de licence :
dotnet remove package Syncfusion.Licensing
dotnet remove package Syncfusion.Licensing
Installez Code-barres IronBarcode — un seul package pour toutes les plateformes :
dotnet add package IronBarcode
dotnet add package IronBarcode
Étape 2 : Mise à jour des espaces de noms
Supprimez les espaces de noms de codes-barres Syncfusion et ajoutez l'espace de noms IronBarcode :
// Remove these (barcode-specific; leave others if non-barcode Syncfusion controls remain)
using Syncfusion.Windows.Forms.Barcode;
using Syncfusion.Licensing;
// @using Syncfusion.Blazor.BarcodeGenerator (in _Imports.razor)
// Add this
using IronBarCode;
// Remove these (barcode-specific; leave others if non-barcode Syncfusion controls remain)
using Syncfusion.Windows.Forms.Barcode;
using Syncfusion.Licensing;
// @using Syncfusion.Blazor.BarcodeGenerator (in _Imports.razor)
// Add this
using IronBarCode;
Imports IronBarCode
Étape 3 : initialisation de la licence
Supprimez l'enregistrement de la licence Syncfusion et la configuration de la plateforme du démarrage de l'application. Ajoutez ensuite une seule ligne de licence Code-barres IronBarcode au même emplacement de démarrage :
// Remove from Program.cs / App.xaml.cs / MauiProgram.cs:
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
builder.Services.AddSyncfusionBlazor(); // Blazor only — remove if no other Syncfusion controls
builder.ConfigureSyncfusionCore(); // MAUI only — remove if no other Syncfusion controls
// Add at the same startup point:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Remove from Program.cs / App.xaml.cs / MauiProgram.cs:
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
builder.Services.AddSyncfusionBlazor(); // Blazor only — remove if no other Syncfusion controls
builder.ConfigureSyncfusionCore(); // MAUI only — remove if no other Syncfusion controls
// Add at the same startup point:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Remove from Program.vb / App.xaml.vb / MauiProgram.vb:
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY")
builder.Services.AddSyncfusionBlazor() ' Blazor only — remove if no other Syncfusion controls
builder.ConfigureSyncfusionCore() ' MAUI only — remove if no other Syncfusion controls
' Add at the same startup point:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Pour les pipelines CI/CD et les conteneurs Docker, stockez la clé dans une variable d'environnement :
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
Imports System
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
Exemples de migration de code
WinForms SfBarcode vers BarcodeWriter
La migration WinForms élimine l'indirection DrawToBitmap et la remplace par une chaîne de sortie de fichier directe. Le modèle Syncfusion nécessite la pré-allocation d'un Bitmap de dimensions connues ; Code-barres IronBarcode calcule les dimensions dans le cadre de l'appel de génération.
Approche de Syncfusion :
using Syncfusion.Windows.Forms.Barcode;
using System.Drawing;
using System.Drawing.Imaging;
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
var barcode = new SfBarcode();
barcode.Text = "ORD-20240315-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.BarHeight = 100;
barcode.NarrowBarWidth = 1;
barcode.ShowText = true;
barcode.Width = 400;
barcode.Height = 150;
using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("order-label.png", ImageFormat.Png);
using Syncfusion.Windows.Forms.Barcode;
using System.Drawing;
using System.Drawing.Imaging;
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
var barcode = new SfBarcode();
barcode.Text = "ORD-20240315-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.BarHeight = 100;
barcode.NarrowBarWidth = 1;
barcode.ShowText = true;
barcode.Width = 400;
barcode.Height = 150;
using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("order-label.png", ImageFormat.Png);
Imports Syncfusion.Windows.Forms.Barcode
Imports System.Drawing
Imports System.Drawing.Imaging
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY")
Dim barcode As New SfBarcode()
barcode.Text = "ORD-20240315-001"
barcode.Symbology = BarcodeSymbolType.Code128A
barcode.BarHeight = 100
barcode.NarrowBarWidth = 1
barcode.ShowText = True
barcode.Width = 400
barcode.Height = 150
Using bitmap As New Bitmap(barcode.Width, barcode.Height)
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle)
bitmap.Save("order-label.png", ImageFormat.Png)
End Using
Approche IronBarcode :
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
BarcodeWriter.CreateBarcode("ORD-20240315-001", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.AddBarcodeText()
.SaveAsPng("order-label.png");
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
BarcodeWriter.CreateBarcode("ORD-20240315-001", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.AddBarcodeText()
.SaveAsPng("order-label.png");
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
BarcodeWriter.CreateBarcode("ORD-20240315-001", BarcodeEncoding.Code128) _
.ResizeTo(400, 150) _
.AddBarcodeText() _
.SaveAsPng("order-label.png")
BarcodeSymbolType.Code128A se mappe sur BarcodeEncoding.Code128. La séquence DrawToBitmap + Bitmap.Save s'effondre dans .SaveAsPng(). Si le code-barres doit être affiché à l'intérieur d'un PictureBox WinForms plutôt que sauvegardé sur disque, utilisez .ToPngBinaryData() pour charger l'image dans le contrôle. La gamme complète des formats de codes-barres 1D dans Code-barres IronBarcode s'étend bien au-delà de la liste prise en charge par le contrôle Syncfusion .
Blazor SfBarcodeGenerator vers point de terminaison API minimal
La migration Blazor est un changement structurel plutôt qu'une substitution ligne par ligne. SfBarcodeGenerator est un composant Razor qui se rend dans le navigateur via la couche JavaScript de Syncfusion. Code-barres IronBarcode ne comporte aucun composant Razor ; Il s'agit d'une bibliothèque côté serveur. Le modèle de remplacement est un point de terminaison API minimal sur le serveur qui renvoie des octets de code-barres, référencé dans la page Razor comme source d'image.
Approche de Syncfusion :
@page "/fulfillment"
@using Syncfusion.Blazor.BarcodeGenerator
<SfBarcodeGenerator
Width="300px"
Height="150px"
Type="BarcodeType.Code128"
Value="@orderNumber">
<BarcodeGeneratorDisplayText Visibility="true"></BarcodeGeneratorDisplayText>
</SfBarcodeGenerator>
@code {
private string orderNumber = "ORD-20240315-001";
}
Approche IronBarcode :
Ajoutez un point de terminaison de génération dans Program.cs :
using IronBarCode;
app.MapGet("/barcode/{value}", (string value) =>
{
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(300, 150)
.AddBarcodeText()
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});
using IronBarCode;
app.MapGet("/barcode/{value}", (string value) =>
{
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(300, 150)
.AddBarcodeText()
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});
Imports IronBarCode
app.MapGet("/barcode/{value}", Function(value As String)
Dim bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) _
.ResizeTo(300, 150) _
.AddBarcodeText() _
.ToPngBinaryData()
Return Results.File(bytes, "image/png")
End Function)
Référencez le point de terminaison dans le composant Razor :
@page "/fulfillment"
<img src="/barcode/@orderNumber" alt="Order barcode: @orderNumber" />
@code {
private string orderNumber = "ORD-20240315-001";
}
Ce point de terminaison est testable indépendamment, réutilisable depuis n'importe quel client HTTP et compatible avec Blazor Server, Blazor WebAssembly avec un backend API hébergé et tout autre frontend web.
Génération de codes QR
Le composant QR de Syncfusion est également rendu côté navigateur, sans chemin de sortie côté serveur. Code-barres IronBarcode génère des codes QR côté serveur avec une sortie fichier directe.
Approche de Syncfusion :
@using Syncfusion.Blazor.BarcodeGenerator
<SfQRCodeGenerator
Width="300px"
Height="300px"
Value="https://example.com/product/ABC-123">
<QRCodeGeneratorDisplayText Visibility="false">
</QRCodeGeneratorDisplayText>
</SfQRCodeGenerator>
Approche IronBarcode :
using IronBarCode;
// Standard QR code
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 300,
QRCodeWriter.QrErrorCorrectionLevel.High)
.SaveAsPng("product-qr.png");
// QR code with embedded brand logo — not available in Syncfusion
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("company-logo.png")
.SaveAsPng("product-qr-branded.png");
using IronBarCode;
// Standard QR code
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 300,
QRCodeWriter.QrErrorCorrectionLevel.High)
.SaveAsPng("product-qr.png");
// QR code with embedded brand logo — not available in Syncfusion
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("company-logo.png")
.SaveAsPng("product-qr-branded.png");
Imports IronBarCode
' Standard QR code
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 300, QRCodeWriter.QrErrorCorrectionLevel.High) _
.SaveAsPng("product-qr.png")
' QR code with embedded brand logo — not available in Syncfusion
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo("company-logo.png") _
.SaveAsPng("product-qr-branded.png")
Remplacement de lecture OPX
Si le projet utilisait Barcode Reader OPX — ou reportait une exigence de lecture à un achat OPX ultérieur — Code-barres IronBarcode remplace cette dépendance par le package déjà installé. Pas de produit secondaire, pas de deuxième licence.
Approche Syncfusion (lecteur de codes-barres OPX) :
// Requires separate Code-barres Syncfusion Reader OPX purchase
// OPX wraps ZXing.Net internally (Apache 2.0 — free to use directly)
using Syncfusion.BarcodeReader;
var reader = new BarcodeReader();
var results = reader.ReadBarcodes("warehouse-scan.png");
foreach (var result in results)
Console.WriteLine($"Value: {result.Value}");
// Requires separate Code-barres Syncfusion Reader OPX purchase
// OPX wraps ZXing.Net internally (Apache 2.0 — free to use directly)
using Syncfusion.BarcodeReader;
var reader = new BarcodeReader();
var results = reader.ReadBarcodes("warehouse-scan.png");
foreach (var result in results)
Console.WriteLine($"Value: {result.Value}");
Imports Syncfusion.BarcodeReader
Dim reader As New BarcodeReader()
Dim results = reader.ReadBarcodes("warehouse-scan.png")
For Each result In results
Console.WriteLine($"Value: {result.Value}")
Next
Approche IronBarcode :
using IronBarCode;
// Included in the same NuGet package as generation — no second product required
var results = BarcodeReader.Read("warehouse-scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Confidence: {result.Confidence}%");
}
using IronBarCode;
// Included in the same NuGet package as generation — no second product required
var results = BarcodeReader.Read("warehouse-scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Confidence: {result.Confidence}%");
}
Imports IronBarCode
' Included in the same NuGet package as generation — no second product required
Dim results = BarcodeReader.Read("warehouse-scan.png")
For Each result In results
Console.WriteLine($"Format: {result.Format}")
Console.WriteLine($"Value: {result.Value}")
Console.WriteLine($"Confidence: {result.Confidence}%")
Next
La documentation sur la lecture des codes-barres couvre la lecture à partir de tableaux d'octets pour les gestionnaires de téléchargement, le réglage de la vitesse par rapport à la précision et la détection de plusieurs codes-barres.
Génération de codes-barres PDF
Les contrôles de codes-barres Syncfusion ne disposent pas de chemin de sortie PDF. Code-barres IronBarcode considère le format PDF comme un format de sortie de premier ordre.
Approche de Syncfusion :
// Non direct path — requires combining Syncfusion.Barcode.WinForms and Syncfusion.Pdf
// Step 1: Generate to Bitmap via DrawToBitmap
// Step 2: Load Syncfusion PDF document
// Step 3: Insert bitmap as image element
// Two packages, two APIs, two license obligations
// Non direct path — requires combining Syncfusion.Barcode.WinForms and Syncfusion.Pdf
// Step 1: Generate to Bitmap via DrawToBitmap
// Step 2: Load Syncfusion PDF document
// Step 3: Insert bitmap as image element
// Two packages, two APIs, two license obligations
' Non direct path — requires combining Syncfusion.Barcode.WinForms and Syncfusion.Pdf
' Step 1: Generate to Bitmap via DrawToBitmap
' Step 2: Load Syncfusion PDF document
' Step 3: Insert bitmap as image element
' Two packages, two APIs, two license obligations
Approche IronBarcode :
using IronBarCode;
// Generate directly to PDF — no secondary library required
BarcodeWriter.CreateBarcode("PALLET-2024-0891", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.SaveAsPdf("pallet-label.pdf");
// Read barcodes from an existing PDF
var pdfResults = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in pdfResults)
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
using IronBarCode;
// Generate directly to PDF — no secondary library required
BarcodeWriter.CreateBarcode("PALLET-2024-0891", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.SaveAsPdf("pallet-label.pdf");
// Read barcodes from an existing PDF
var pdfResults = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in pdfResults)
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
Imports IronBarCode
' Generate directly to PDF — no secondary library required
BarcodeWriter.CreateBarcode("PALLET-2024-0891", BarcodeEncoding.Code128) _
.ResizeTo(400, 150) _
.SaveAsPdf("pallet-label.pdf")
' Read barcodes from an existing PDF
Dim pdfResults = BarcodeReader.Read("shipping-manifest.pdf")
For Each result In pdfResults
Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
Le guide de génération de PDF avec codes-barres couvre les sorties PDF multipages et l'intégration de codes-barres au sein d'autres contenus de documents.
Référence de mappage de l'API de codes-barres Syncfusion vers IronBarcode
| Syncfusion | Code-barres IronBarcode |
|---|---|
SyncfusionLicenseProvider.RegisterLicense("KEY") |
IronBarCode.License.LicenseKey = "key" |
builder.Services.AddSyncfusionBlazor() |
Non requis |
builder.ConfigureSyncfusionCore() |
Non requis |
new SfBarcode() |
BarcodeWriter.CreateBarcode() (statique) |
barcode.Text = "value" |
Premier paramètre de CreateBarcode() |
barcode.Symbology = BarcodeSymbolType.Code128A |
BarcodeEncoding.Code128 |
barcode.Symbology = BarcodeSymbolType.QRBarcode |
QRCodeWriter.CreateQrCode() |
barcode.BarHeight = 100 |
.ResizeTo(width, 100) |
barcode.ShowText = true |
.AddBarcodeText() |
barcode.DrawToBitmap(bitmap, rect) |
.SaveAsPng(path) |
Manuel Bitmap → MemoryStream |
.ToPngBinaryData() |
<SfBarcodeGenerator Type="BarcodeType.Code128" Value="..."> |
BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) dans le point de terminaison de l'API |
<SfQRCodeGenerator Value="..."> |
QRCodeWriter.CreateQrCode(value, size) dans le point de terminaison de l'API |
BarcodeType.Code128 (énum Blazor) |
BarcodeEncoding.Code128 |
| Lecteur de codes-barres OPX (produit séparé, encapsule ZXing .NET) | BarcodeReader.Read(path) — natif, même paquet |
| Aucune API de lecture en contrôle | BarcodeReader.Read(path) |
| Aucune sortie PDF dans le contrôle | .SaveAsPdf(path) |
| Lecture de PDF impossible | BarcodeReader.Read("document.pdf") |
Problèmes de migration courants et solutions
Problème n° 1 : Filigranes d'essai après la mise à jour de NuGet
Syncfusion: La mise à niveau d'Essential Studio 24.x vers la version 25.x invalide la clé de licence existante. Toute sortie générée avant la mise à jour du magasin de secrets affichera un filigrane d'essai. Il s'agit d'une défaillance silencieuse : l'application continue de fonctionner, mais produit une sortie non conforme.
Solution : Après la mise à jour du package NuGet Code-barres IronBarcode , la clé de licence ne change pas au sein d'une même version majeure. Aucune mise à jour ou redéploiement de secrets n'est nécessaire pour les versions mineures ou les correctifs. Lors de la mise à niveau vers une nouvelle version majeure, mettez à jour la clé une seule fois au point d'entrée de l'application :
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Problème n° 2 : La fonction DrawToBitmap ne fonctionne pas dans les environnements sans interface graphique.
Syncfusion : SfBarcode.DrawToBitmap dépend du pipeline de rendu Windows Forms. Dans un processus ASP.NET Core, une fonction Azure ou un conteneur Docker Linux, appeler DrawToBitmap renverra InvalidOperationException ou produira un bitmap vide car aucune boucle de messages Windows Forms n'est présente.
Solution: Replace with BarcodeWriter.CreateBarcode(). Code-barres IronBarcode effectue la génération en code managé sans aucune dépendance à l'environnement d'exécution de l'interface utilisateur :
// Works in ASP.NET Core, Azure Functions, Docker on Linux, console apps
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.ToPngBinaryData();
// Works in ASP.NET Core, Azure Functions, Docker on Linux, console apps
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.ToPngBinaryData();
' Works in ASP.NET Core, Azure Functions, Docker on Linux, console apps
Dim bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) _
.ResizeTo(400, 150) _
.ToPngBinaryData()
Problème 3 : SfBarcodeGenerator ne génère aucune sortie côté serveur
Syncfusion : SfBarcodeGenerator est un composant Razor sans surface d'API côté serveur. Toute tentative d'utilisation dans une action de contrôleur ou un service en arrière-plan ne trouvera aucune méthode applicable pour générer des octets de code-barres.
Solution : Créer un point de terminaison API minimal qui génère le code-barres côté serveur et le renvoie sous forme de réponse HTTP. Référencez le point de terminaison depuis le composant Razor via un tag <img src="..."> :
app.MapGet("/barcode/{value}", (string value) =>
{
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(300, 150)
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});
app.MapGet("/barcode/{value}", (string value) =>
{
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(300, 150)
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
app.MapGet("/barcode/{value}", Function(value As String)
Dim bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) _
.ResizeTo(300, 150) _
.ToPngBinaryData()
Return Results.File(bytes, "image/png")
End Function)
Problème n° 4 : Capacité de lecture manquante (OPX non acheté)
Syncfusion: Les projets qui ont reporté la lecture des codes-barres parce qu'OPX n'avait pas encore été acheté n'ont pas de code de lecture à migrer. L'ajout d'une fonctionnalité de lecture à partir de zéro nécessite l'acquisition d'un produit OPX, son intégration et un nouvel accord de licence.
Solution : La lecture des Code-barres IronBarcode est incluse dans le même package. Aucune procédure d'acquisition ni deuxième licence n'est nécessaire. Ajoutez BarcodeReader.Read(path) partout où la lecture est requise :
var results = BarcodeReader.Read("incoming-scan.png");
var results = BarcodeReader.Read("incoming-scan.png");
Dim results = BarcodeReader.Read("incoming-scan.png")
Problème n° 5 : Expiration de la licence communautaire pendant la migration
Syncfusion: Une équipe utilisant la licence communautaire qui franchit un seuil d'éligibilité quelconque pendant la période de migration (y compris la clôture d'un cycle de financement) peut constater que les contrôles Syncfusion cessent de produire une sortie valide avant la fin de la migration.
Solution : L'essai gratuit de 30 jours d'IronBarcode permet une évaluation complète sans aucune condition de chiffre d'affaires, d'effectif ou de capital. Le filigrane d'essai apparaît sur le document généré ; L'activation d'une clé de licence achetée la supprime. Le modèle de licence Code-barres IronBarcode ne comporte aucun seuil de taille d'organisation.
Liste de contrôle de migration des codes-barres Syncfusion
Tâches préalables à la migration
Analysez le code source pour localiser tous les fichiers qui font référence au code-barres Syncfusion :
grep -r "SyncfusionLicenseProvider.RegisterLicense\|AddSyncfusionBlazor\|ConfigureSyncfusionCore" --include="*.cs" .
grep -r "new SfBarcode\(\)\|SfBarcodeGenerator\|SfQRCodeGenerator" --include="*.cs" --include="*.razor" .
grep -r "BarcodeSymbolType\.\|BarcodeType\." --include="*.cs" --include="*.razor" .
grep -r "DrawToBitmap\|barcode\.Text\s*=" --include="*.cs" .
grep -r "Syncfusion\.Barcode\|Syncfusion\.Blazor\.BarcodeGenerator" --include="*.csproj" .
grep -r "SyncfusionLicenseProvider.RegisterLicense\|AddSyncfusionBlazor\|ConfigureSyncfusionCore" --include="*.cs" .
grep -r "new SfBarcode\(\)\|SfBarcodeGenerator\|SfQRCodeGenerator" --include="*.cs" --include="*.razor" .
grep -r "BarcodeSymbolType\.\|BarcodeType\." --include="*.cs" --include="*.razor" .
grep -r "DrawToBitmap\|barcode\.Text\s*=" --include="*.cs" .
grep -r "Syncfusion\.Barcode\|Syncfusion\.Blazor\.BarcodeGenerator" --include="*.csproj" .
Documentez les éléments suivants avant d'écrire tout code de migration :
- Listez chaque fichier qui appelle
SyncfusionLicenseProvider.RegisterLicense - Listez chaque instanciation de
SfBarcodeet ses affectations de propriétés - Listez chaque utilisation de composant Razor
<SfBarcodeGenerator>et<SfQRCodeGenerator> - Listez chaque appel de
DrawToBitmapet le chemin de sauvegarde ou d'affichage en aval - Vérifiez si le lecteur de codes-barres OPX est installé ; Si oui, veuillez énumérer chaque appel de lecture
Tâches de mise à jour du code
- Supprimez les packages NuGet de code-barres Syncfusion pour chaque plateforme du projet.
- Retirez le paquet NuGet
Syncfusion.Licensingsi aucun autre contrôle Syncfusion ne reste - Installez le paquet NuGet
IronBarcode - Remplacez
SyncfusionLicenseProvider.RegisterLicense("KEY")parIronBarCode.License.LicenseKey = "KEY"au point d'entrée de l'application - Retirez
builder.Services.AddSyncfusionBlazor()si aucun autre contrôle Syncfusion ne reste - Retirez
builder.ConfigureSyncfusionCore()si aucun autre contrôle Syncfusion ne reste - Retirez
@using Syncfusion.Blazoret@using Syncfusion.Blazor.BarcodeGeneratorde_Imports.razorsi applicable - Remplacez
using Syncfusion.Windows.Forms.Barcodeetusing Syncfusion.Licensingparusing IronBarCode - Remplacez chaque bloc
new SfBarcode()+ affectations de propriétés +DrawToBitmapparBarcodeWriter.CreateBarcode(value, BarcodeEncoding.X).ResizeTo(w, h).SaveAsPng(path) - Remplacez
BarcodeSymbolType.Code128A(et équivalent) parBarcodeEncoding.Code128 - Remplacez
BarcodeType.Code128(enum Blazor) parBarcodeEncoding.Code128 - Remplacez chaque composant Razor
<SfBarcodeGenerator>par un point de terminaison d'API minimal et une référence<img src="...">dans le composant - Remplacez chaque composant Razor
<SfQRCodeGenerator>par un point de terminaisonQRCodeWriter.CreateQrCode()et une référence<img src="..."> - Remplacez tous les appels de lecture Barcode Reader OPX par
BarcodeReader.Read(path) - Ajoutez
BarcodeReader.Read(path)partout où la capacité de lecture était précédemment absente à cause du non-acquisition d'OPX
Test de post-migration
- Vérifiez que les images de codes-barres générées sont valides pour la lecture à l'aide d'un lecteur matériel ou d'une application de lecture de référence.
- Vérifiez qu'aucun filigrane d'essai n'apparaît sur les fichiers générés après l'activation de la clé de licence.
- Confirmez que
BarcodeReader.Read()renvoie la valeur et le format attendus pour chaque type de code-barres utilisé - Testez la sortie PDF avec
.SaveAsPdf()pour confirmer que les dimensions des pages et des codes-barres correspondent aux exigences de conception - Testez directement le point de terminaison de l'API minimale Blazor (via un navigateur ou un client HTTP) avant de le tester dans le composant Razor.
- Vérifier que le déploiement de Docker et Linux produit un résultat identique à celui des machines de développement Windows.
- Effectuez une vérification finale
greppour confirmer qu'il n'y a pas de références restantes àSfBarcode,SfBarcodeGenerator,DrawToBitmap,BarcodeSymbolType, ouSyncfusionLicenseProvider
Principaux avantages de la migration vers IronBarcode
Génération et lecture unifiées : après la migration, la génération et la lecture fonctionnent toutes deux via un seul package NuGet sous une seule licence. Il n'y a pas de produit secondaire à acheter, pas de deuxième interface API à apprendre, et aucune dépendance à un wrapper ZXing .NET consommant un budget de licence qui pourrait être alloué directement à la bibliothèque open source.
Suppression de la rotation des clés spécifique à la version : les clés de licence Code-barres IronBarcode restent valides pour les mises à jour mineures et les correctifs au sein d'une version majeure. Les frais généraux liés à l'obtention d'une nouvelle clé, à la mise à jour des secrets dans chaque environnement de déploiement et au redéploiement pour effacer les filigranes d'essai à chaque mise à jour majeure de la version NuGet sont entièrement éliminés.
Déploiement indépendant de la plateforme : le même package Code-barres IronBarcode et la même API de génération fonctionnent sur les applications de bureau WinForms, les services ASP.NET Core , les Azure Functions, les applications console et les conteneurs Docker Linux. La dépendance du runtime Windows Forms introduite par DrawToBitmap est supprimée, et les déploiements Blazor passent de composants rendus par le navigateur à des points de terminaison d'API côté serveur qui sont testables indépendamment et agnostiques du client.
Prise en charge native du format PDF : La génération et la lecture s'étendent toutes deux nativement au format PDF. La production d'un PDF de code-barres ne nécessite plus la coordination de deux produits Syncfusion ; La lecture des codes-barres à partir des manifestes PDF et des documents d'expédition ne nécessite plus d'étape d'extraction PDF distincte.
Économie des licences prévisible : le modèle de licence perpétuelle d'IronBarcode n'impose aucun seuil de revenus, d'effectifs, de nombre d'employés ou de capital. Les équipes qui ont dépassé les conditions d'éligibilité à la licence communautaire Syncfusion — ou qui prévoient de le faire — passent à un modèle de licence où la croissance organisationnelle ne crée pas d'événement de conformité.
Questions Fréquemment Posées
Pourquoi devrais-je migrer de Syncfusion BarCode 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 Syncfusion 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 Syncfusion Barcode 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 à la fois Syncfusion 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 à Syncfusion Barcode ?
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 Syncfusion ?
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 Syncfusion Barcode 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.

