Passer de Neodynamic Barcode à IronBarcode
Ce guide fournit un chemin de migration complet de Neodynamic.SDK.Barcode et Neodynamic.SDK.BarcodeReader vers IronBarcode. Il couvre la suppression des deux packages Neodynamic, le remplacement de la configuration à double licence par une clé unique, la traduction des appels API de génération et de lecture, et le processus d'acquisition de la capacité de lecture des codes-barres 2D qui n'était pas possible avec la suite de produits Neodynamic. Ce guide est destiné aux développeurs qui possèdent déjà du code Neodynamic et qui ont besoin d'une approche systématique, fichier par fichier, pour mener à bien la migration.
Pourquoi migrer depuis les codes-barres néodynamiques
2D Reading Gap : le kit de développement logiciel Code-barres néodynamique Professional génère des codes-barres QR Code, DataMatrix, PDF417 et Aztec. Aucun de ces formats ne peut être lu par le kit de développement logiciel (SDK) de lecture de codes-barres associé. Un projet qui génère des codes QR pour les étiquettes de produits, les conteneurs d'expédition ou le suivi de documents ne peut pas relire ces mêmes codes à l'aide du lecteur qu'il a acheté en même temps que le générateur. Code-barres IronBarcode lit et génère les codes QR, DataMatrix, PDF417, Aztec et tous les autres formats 2D pris en charge grâce à la même bibliothèque et à la même licence.
Surcharge en Double Produit : Chaque projet utilisant les SDKs Neodynamic comporte deux entrées PackageReference, deux directives using, deux blocs de licence, et deux cycles de mise à jour distincts. Ces frais généraux se répètent sur chaque machine de développeur, chaque pipeline d'intégration continue et chaque environnement de production. Le résultat mécanique de cette migration est la consolidation de deux progiciels ayant des exigences de maintenance distinctes en une seule dépendance avec une seule licence.
Le problème de la troisième bibliothèque : les équipes qui ont rencontré le manque de lecture 2D et qui ont choisi de le contourner plutôt que de migrer ont généralement ajouté une troisième bibliothèque — ZXing .NET étant le choix le plus courant — spécifiquement pour couvrir la lecture des codes QR. Cette décision troque une limitation contre une complexité différente : trois dépendances liées aux codes-barres, chacune avec ses propres contraintes de version, ses propres notes de version et son propre potentiel de conflit lors de la mise à jour du runtime .NET ou du framework dépendant. Code-barres IronBarcode remplace les trois.
Complexité des prix : Le SDK Code-barres néodynamique Professional est tarifé par développeur (Basic à partir d'environ 352 $, Ultimate à partir d'environ 705 $ via ComponentSource). Le SDK de lecteur de code-barres a un coût distinct. Un projet qui a besoin à la fois de génération et de lecture 1D doit acheter les deux, et le coût combiné évolue avec la taille de l'équipe en plus du tarif du lecteur. Un projet qui a besoin d'une lecture 2D ne peut toujours pas satisfaire cette exigence à n'importe quel prix dans la gamme de produits de Neodynamic. Code-barres IronBarcode Lite couvre la génération et la lecture — 1D et 2D — sous une seule licence. Les prix actuels sont sur la page de licence IronBarcode.
Le problème fondamental
Le problème fondamental de toute base de code utilisant les deux SDK Neodynamic pour un flux de travail complet de codes-barres est que la lecture des codes QR n'a jamais été possible :
// Before: Lecteur de codes-barres néodynamique does not support QR codes
using Neodynamic.SDK.BarcodeReader;
using System.Drawing;
public string ReadQrCode(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
var reader = new BarcodeReader();
var results = reader.Read(bitmap);
// Results are always null or empty for 2D barcodes
if (results == null || !results.Any())
{
throw new NotSupportedException(
"Neodynamic Barcode Reader does not support QR codes");
}
return results.First().Value;
}
Après la migration vers IronBarcode, la même opération devient un appel de lecture standard sans traitement spécifique au format :
// After: Code-barres IronBarcode reads QR codes with the same call used for all formats
using IronBarCode;
public string ReadQrCode(string imagePath)
{
var result = BarcodeReader.Read(imagePath).FirstOrDefault();
return result?.Value;
}
Chaque espace réservé throw new NotSupportedException(...) dans une base de code qui référence la lecture de codes-barres 2D est supprimé lors de cette migration et remplacé par un appel de lecture fonctionnel.
Comparaison des fonctionnalités des codes-barres Code-barres IronBarcode et Neodynamic Barcode
| Fonction | Code-barres néodynamique Professional | Lecteur de codes-barres néodynamique | Code-barres IronBarcode |
|---|---|---|---|
| Code 128, EAN-13, UPC-A génération | Oui | N/A | Oui |
| Génération de codes QR, DataMatrix et PDF417 | Oui | N/A | Oui |
| Lecture de codes-barres 1D | N/A | Oui | Oui |
| Lecture de code QR | N/A | Non | Oui |
| Lecture DataMatrix | N/A | Non | Oui |
| Lecture PDF417 | N/A | Non | Oui |
| Lecture native des codes-barres PDF | Non | Non | Oui |
| Détection automatique du format | N/A | Non | Oui |
| Packages NuGet requis | 1 | 1 | 1 (couvre les deux) |
| Clés de licence requises | 1 | 1 (séparé) | 1 (couvre tout) |
| Dépendance de dessin du système | Oui | Oui | Non |
| Prise en charge de Linux/Docker | Limité | Limité | Oui |
| Prise en charge de .NET 8 et .NET 9 | Oui | Limité | Oui |
| lecture par lots asynchrone | Non | Non | Oui |
Démarrage rapide : Migration des codes-barres Neodynamic vers IronBarcode
Étape 1 : Supprimer les deux packages néodynamiques
Les deux paquets doivent être retirés. Ils n'ont aucune dépendance commune qui affecte l'ordre de suppression :
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
Vérifiez que les deux entrées ont disparu du fichier .csproj avant de continuer.
Étape 2 : Ajouter un IronBarcode
dotnet add package IronBarcode
Étape 3 : Remplacer la configuration de la double licence
Supprimez les deux blocs de licences Neodynamic et remplacez-les par une seule attribution de clé Code-barres IronBarcode . Cette affectation se fait une fois au démarrage de l'application — dans Program.cs, Startup.cs, ou la racine de composition de l'application :
// Before: two license blocks, two products
using Neodynamic.SDK.Barcode;
using Neodynamic.SDK.BarcodeReader;
BarcodeProfessional.LicenseOwner = "Your Company";
BarcodeProfessional.LicenseKey = "GEN-LICENSE-KEY";
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseOwner = "Your Company";
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseKey = "READ-LICENSE-KEY";Imports Neodynamic.SDK.Barcode
Imports Neodynamic.SDK.BarcodeReader
BarcodeProfessional.LicenseOwner = "Your Company"
BarcodeProfessional.LicenseKey = "GEN-LICENSE-KEY"
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseOwner = "Your Company"
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseKey = "READ-LICENSE-KEY"// After: one key covers generation and reading across all formats
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
' After: one key covers generation and reading across all formats
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"Tous les fichiers de configuration, variables d'environnement ou systèmes de stockage de secrets contenant des clés de licence Neodynamic peuvent être désactivés une fois la migration vérifiée.
Exemples de migration de code
Générer un code-barres Code 128
Approche néodynamique :
using Neodynamic.SDK.Barcode;
using System.Drawing.Imaging;
public void GenerateCode128(string data, string outputPath)
{
var barcode = new BarcodeProfessional();
barcode.Code = data;
barcode.Symbology = Symbology.Code128;
barcode.BarcodeUnit = BarcodeUnit.Pixel;
System.Drawing.Image image = barcode.GetBarcodeImage();
image.Save(outputPath, ImageFormat.Png);
}Imports Neodynamic.SDK.Barcode
Imports System.Drawing.Imaging
Public Sub GenerateCode128(data As String, outputPath As String)
Dim barcode As New BarcodeProfessional()
barcode.Code = data
barcode.Symbology = Symbology.Code128
barcode.BarcodeUnit = BarcodeUnit.Pixel
Dim image As System.Drawing.Image = barcode.GetBarcodeImage()
image.Save(outputPath, ImageFormat.Png)
End SubApproche IronBarcode :
using IronBarCode;
public void GenerateCode128(string data, string outputPath)
{
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.SaveAsPng(outputPath);
}Imports IronBarCode
Public Sub GenerateCode128(data As String, outputPath As String)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.SaveAsPng(outputPath)
End SubL'importation System.Drawing.Imaging n'est plus nécessaire. L'instance BarcodeInfo et ses affectations de propriétés se résument à un seul appel de méthode. Pour connaître les options de dimensionnement, d'annotation et de format de sortie, consultez le guide de création de codes-barres 1D .
Générer un code QR
Approche néodynamique :
using Neodynamic.SDK.Barcode;
public void GenerateQrCode(string data, string outputPath)
{
var barcode = new BarcodeProfessional();
barcode.Code = data;
barcode.Symbology = Symbology.QRCode;
barcode.QRCodeECL = QRCodeErrorCorrectionLevel.H;
barcode.GetBarcodeImage().Save(outputPath, System.Drawing.Imaging.ImageFormat.Png);
}Imports Neodynamic.SDK.Barcode
Imports System.Drawing.Imaging
Public Sub GenerateQrCode(data As String, outputPath As String)
Dim barcode As New BarcodeProfessional()
barcode.Code = data
barcode.Symbology = Symbology.QRCode
barcode.QRCodeECL = QRCodeErrorCorrectionLevel.H
barcode.GetBarcodeImage().Save(outputPath, ImageFormat.Png)
End SubApproche IronBarcode :
using IronBarCode;
public void GenerateQrCode(string data, string outputPath)
{
QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng(outputPath);
}Imports IronBarCode
Public Sub GenerateQrCode(data As String, outputPath As String)
QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.SaveAsPng(outputPath)
End SubLa traduction de génération ne modifie que l'interface de l'API. La principale différence introduite par cette migration est que la même application peut désormais lire les codes QR qu'elle génère, grâce à la même bibliothèque Code-barres IronBarcode et à la même licence. Pour un traitement complet de la création de codes-barres 2D, consultez le guide de création de codes-barres 2D .
Lecture des codes-barres 1D
Approche néodynamique :
using Neodynamic.SDK.BarcodeReader;
using System.Drawing;
public string[] Read1DBarcodes(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
var reader = new BarcodeReader();
var results = reader.Read(bitmap);
return results?.Select(r => r.Value).ToArray() ?? Array.Empty<string>();
}Imports Neodynamic.SDK.BarcodeReader
Imports System.Drawing
Public Function Read1DBarcodes(imagePath As String) As String()
Using bitmap As New Bitmap(imagePath)
Dim reader As New BarcodeReader()
Dim results = reader.Read(bitmap)
Return If(results?.Select(Function(r) r.Value).ToArray(), Array.Empty(Of String)())
End Using
End FunctionApproche IronBarcode :
using IronBarCode;
public string[] Read1DBarcodes(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value).ToArray();
}Imports IronBarCode
Public Function Read1DBarcodes(imagePath As String) As String()
Dim results = BarcodeReader.Read(imagePath)
Return results.Select(Function(r) r.Value).ToArray()
End FunctionLa construction Bitmap et l'importation System.Drawing sont supprimées. Code-barres IronBarcode accepte directement le chemin du fichier. Le nom de propriété result.Value est le même dans les deux API, donc le code en aval qui traite les valeurs retournées ne change pas. Pour les options de lecture et de prétraitement d'images de codes-barres multiples, consultez le guide de lecture des codes-barres à partir d'images .
Lecture des codes QR (auparavant impossible)
Approche néodynamique :
// This method could not be implemented with Neodynamic Barcode Reader
public string ReadQrCode(string imagePath)
{
throw new NotSupportedException(
"Neodynamic Barcode Reader does not support QR codes");
}' This method could not be implemented with Neodynamic Barcode Reader
Public Function ReadQrCode(imagePath As String) As String
Throw New NotSupportedException("Neodynamic Barcode Reader does not support QR codes")
End FunctionApproche IronBarcode :
using IronBarCode;
public string ReadQrCode(string imagePath)
{
var result = BarcodeReader.Read(imagePath).FirstOrDefault();
return result?.Value;
}Imports IronBarCode
Public Function ReadQrCode(imagePath As String) As String
Dim result = BarcodeReader.Read(imagePath).FirstOrDefault()
Return If(result?.Value, Nothing)
End FunctionChaque espace réservé throw new NotSupportedException(...) qui référence la lecture de codes-barres 2D devient un appel de lecture standard. Le corps de la méthode passe d'une exception levée à une implémentation fonctionnelle. Aucune manipulation particulière n'est requise pour les codes QR ; Code-barres IronBarcode identifie automatiquement le format.
Lecture des codes-barres dans les documents PDF (Nouvelle fonctionnalité)
Approche néodynamique :
// Neodynamic Reader cannot read barcodes from PDF files directly
// An image extraction step using a separate library was required before reading
// Non direct equivalent exists
Approche IronBarcode :
using IronBarCode;
public void ReadBarcodesFromPdf(string pdfPath)
{
var results = BarcodeReader.Read(pdfPath);
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value} | Format: {result.Format} | Page: {result.PageNumber}");
}
}Imports IronBarCode
Public Sub ReadBarcodesFromPdf(pdfPath As String)
Dim results = BarcodeReader.Read(pdfPath)
For Each result In results
Console.WriteLine($"Value: {result.Value} | Format: {result.Format} | Page: {result.PageNumber}")
Next
End SubIronBarcode lit les codes-barres directement sur les documents PDF, sur toutes les pages. Le numéro de page sur lequel chaque code-barres a été trouvé est indiqué dans le résultat. Cette fonctionnalité ne nécessite aucune bibliothèque supplémentaire ni étape intermédiaire d'extraction d'image.
Référence de correspondance entre l'API Neodynamic Barcode et IronBarcode
| API néodynamique | Équivalent Code-barres IronBarcode | Notes |
|---|---|---|
BarcodeInfo.LicenseOwner = "..." | IronBarCode.License.LicenseKey = "key" | Fusionné en une seule clé |
BarcodeInfo.LicenseKey = "..." | (part of single key above) | Aucun champ propriétaire séparé |
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseOwner | (removed) | Non requis |
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseKey | (removed) | Non requis |
new BarcodeInfo() | BarcodeWriter.CreateBarcode(data, encoding) | Statique, aucune instance |
barcode.Value = data | Premier paramètre de CreateBarcode | Adopté lors de la construction |
barcode.Symbology = Symbology.Code128 | BarcodeEncoding.Code128 | Deuxième paramètre |
barcode.Symbology = Symbology.QRCode | BarcodeEncoding.QRCode | L'aller-retour complet est désormais pris en charge. |
barcode.QRCodeECL = QRCodeErrorCorrectionLevel.H | QRCodeWriter.QrErrorCorrectionLevel.Highest | Point d'entrée de classe différent |
barcode.GetImage().Save(path, ImageFormat.Png) | .SaveAsPng(path) | Fluent, sans énumération ImageFormat |
BarcodeReader.Read(bitmap) | BarcodeReader.Read(imagePath) | Le chemin du fichier remplace l'image bitmap. |
result.Value | result.Value | Même nom de propriété |
Symbology.DataMatrix | BarcodeEncoding.DataMatrix | Génération seulement → génération et lecture |
throw new NotSupportedException(...) pour la lecture 2D | BarcodeReader.Read(imagePath) | Remplacer par une implémentation fonctionnelle |
Problèmes de migration courants et solutions
Problème 1 : Commande de retrait de deux colis
Problème : Le fait pour les développeurs de supprimer un seul package Neodynamic tout en laissant l'autre provoque des erreurs de compilation car les deux SDK ne partagent aucun type, mais certains fichiers sources peuvent importer les deux espaces de noms dans le même fichier.
Solution : Supprimez les deux packages avant d'apporter des modifications au code source. Après les avoir tous deux supprimés, recherchez toutes les directives using Neodynamic.SDK.Barcode et using Neodynamic.SDK.BarcodeReader et éliminez-les ensemble :
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
Ensuite, effectuez un audit avec :
grep -r "Neodynamic.SDK" --include="*.cs" .
Problème 2 : Nettoyage de la configuration des licences doubles
Problème : Les deux blocs de licence Neodynamic apparaissent souvent dans des emplacements différents — un dans la classe de démarrage de l'application et un dans un initialiseur de service. Si un seul bloc est supprimé, le code restant fait référence à un espace de noms qui n'existe plus et ne peut pas être compilé.
Solution : Recherchez les quatre affectations de propriétés de licence Neodynamic et supprimez-les ensemble avant d'ajouter la clé IronBarcode :
grep -r "LicenseOwner\|LicenseKey" --include="*.cs" .
Remplacez les quatre lignes par une seule affectation :
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"Problème 3 : Suppression de NotSupportedException des blocs catch
Problème : Certaines bases de code qui utilisaient le Reader Neodynamic ont ajouté des blocs catch (NotSupportedException) spécifiquement pour gérer l'échec silencieux des lectures de codes-barres 2D. Ces blocs de réception doivent être supprimés en même temps que le code de lancement ; sinon, la clause catch réfère un chemin de code qui ne peut plus se produire.
Solution : Recherchez NotSupportedException dans les fichiers liés aux codes-barres et examinez chaque occurrence. Si l'exception a été levée en réponse à une tentative de lecture au format 2D, supprimez à la fois le bloc throw et le bloc catch :
grep -r "NotSupportedException" --include="*.cs" .
Remplacez le corps de méthode lancée par BarcodeReader.Read(imagePath) et supprimez le bloc catch correspondant chez tout appelant.
Liste de contrôle de migration des codes-barres néodynamiques
Pré-migration
- Recherchez toutes les références de package Neodynamic :
grep -r "Neodynamic.SDK" --include="*.csproj" . - Recherchez toutes les directives using Neodynamic :
grep -r "using Neodynamic" --include="*.cs" . - Rechercher les emplacements de configuration des licences :
grep -r "LicenseOwner\|LicenseKey" --include="*.cs" . - Recherchez tous les sites d'instanciation
BarcodeInfo:grep -r "new BarcodeInfo\(\)" --include="*.cs" . - Recherchez tous les appels de lecture Neodynamic :
grep -r "BarcodeReader.Read" --include="*.cs" . - Recherchez toutes les utilisations
NotSupportedExceptiondans les chemins de codes-barres :grep -r "NotSupportedException" --include="*.cs" . - Identifiez toute bibliothèque tierce (ZXing .NET ou similaire) ajoutée spécifiquement pour pallier le manque de prise en charge de la lecture 2D ; celle-ci pourra être supprimée après la migration.
- Enregistrez toutes les clés de licence Neodynamic afin qu'elles puissent être désactivées dans les systèmes de sécurité après vérification.
Tâches de mise à jour du code
- Exécutez
dotnet remove package Neodynamic.SDK.Barcode - Exécutez
dotnet remove package Neodynamic.SDK.BarcodeReader - Exécutez
dotnet add package IronBarcode - Supprimez toutes les directives
using Neodynamic.SDK.Barcodeetusing Neodynamic.SDK.BarcodeReader - Ajoutez
using IronBarCodedans tous les fichiers effectuant des opérations sur les codes-barres - Supprimez les deux blocs de configuration de licence Neodynamic
- Ajoutez
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"une fois lors du démarrage de l'application - Remplacez
new BarcodeInfo()+ les affectations de propriétés +barcode.GetImage().Save(...)parBarcodeWriter.CreateBarcode(data, encoding).SaveAsPng(path) - Remplacez les motifs
QRCodeWriteren conséquence en utilisantQRCodeWriter.CreateQrCode() - Remplacez les appels
BarcodeReader.Read(bitmap)en supprimant la constructionnew Bitmap(imagePath)et en passant le chemin du fichier directement àBarcodeReader.Read(imagePath) - Retirez tous les espaces réservés
throw new NotSupportedException(...)pour la lecture 2D et remplacez-les parBarcodeReader.Read(imagePath) - Supprimez les blocs
catch (NotSupportedException)correspondants chez les appelants - Supprimez toute bibliothèque tierce ajoutée uniquement pour combler le manque de lecture Neodynamic 2D.
Test de post-migration
- Vérifiez que la génération du code-barres Code 128 produit un résultat correspondant aux dimensions et aux paramètres DPI précédents.
- Vérifier que la génération du code QR produit une sortie scannable
- Vérifier que la lecture des codes-barres 1D renvoie les mêmes valeurs que l'implémentation précédente du lecteur néodynamique
- Vérifiez que la lecture du QR Code réussit sur les images qui jetaient auparavant
NotSupportedException - Vérifiez que la lecture des fichiers DataMatrix et PDF417 réussit si ces formats apparaissent dans les données d'entrée de l'application.
- Tester la lecture des codes-barres PDF si l'application traite les documents PDF
- Vérifiez que toutes les références à la clé de licence Neodynamic ont été supprimées des fichiers de configuration et des variables d'environnement.
- Vérifiez que la bibliothèque 2D tierce (le cas échéant) a été entièrement supprimée et qu'aucune importation restante ne la référence.
Principaux avantages de la migration vers IronBarcode
Capacité de lecture-écriture unifiée : après la migration, chaque symbologie générée par Code-barres IronBarcode peut également être relue via la même bibliothèque. L'asymétrie entre le générateur et le lecteur de Neodynamic — où les codes QR, DataMatrix, PDF417 et Aztec pouvaient être produits mais pas utilisés — est éliminée. Les applications qui nécessitaient auparavant une solution de contournement ou une troisième bibliothèque pour la lecture 2D bénéficient désormais de cette fonctionnalité sans aucun travail d'intégration supplémentaire.
Administration de licence unique : un package NuGet , une clé de licence et un bloc de configuration remplacent deux abonnements produits distincts. Le renouvellement, la rotation des clés et la gestion des variables d'environnement deviennent deux fois moins complexes. La réduction des frais administratifs est continue et non un gain ponctuel.
Lecture native des codes-barres PDF : Code-barres IronBarcode lit directement les codes-barres des documents PDF et renvoie les métadonnées relatives au numéro de page ainsi que les valeurs des codes-barres. Les applications qui traitent les manifestes d'expédition, les documents de facturation ou les dossiers médicaux contenant des codes-barres intégrés ne nécessitent plus d'étape intermédiaire d'extraction d'image ni de bibliothèque PDF supplémentaire pour prendre en charge la lecture des codes-barres. Consultez la liste complète des formats de codes-barres pris en charge pour connaître l'ensemble des symbologies et des types de saisie couverts.
Élimination de la Dépendance de System.Drawing : Les SDKs Neodynamic dépendent de System.Drawing, ce qui nécessite une configuration de bibliothèque native supplémentaire sur Linux et dans les conteneurs Docker. Code-barres IronBarcode n'a pas de dépendance System.Drawing, ce qui signifie que la même base de code s'exécute sur Windows, Linux et dans les environnements cloud conteneurisés sans changements de configuration spécifiques à la plateforme.
Coût de licence simplifié pour une fonctionnalité complète : un projet qui nécessitait les deux SDK Neodynamic Plus qu'une troisième bibliothèque pour la lecture 2D payait pour trois dépendances afin d'accomplir ce Code-barres IronBarcode fournit sous une seule licence. Pour les projets nécessitant une génération et une lecture 2D, la migration permet de regrouper l'empreinte technique et le coût des licences en un seul produit commercial. Les informations tarifaires actuelles sont disponibles sur la page de licences IronBarcode .

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