Passer au contenu du pied de page
VIDéOS

Comment créer un code-barres à partir de données en C#

Passer de LEADTOOLSCode-barres à IronBarcode

Ce guide décrit la migration complète de LEADTOOLSCode-barres vers Code-barres IronBarcode pour les développeurs .NET . Il aborde la suppression des packages NuGet LEADTOOLSet une dépendance native au runtime, le remplacement de la séquence d'initialisation de licence basée sur fichier LEADTOOLSpar une clé de chaîne, et la traduction des modèles de lecture et d'écriture LEADTOOLSdans l'API fluide statique d'IronBarcode. Des exemples de code sont fournis pour chaque scénario de migration majeur, ainsi qu'un tableau de correspondance des API, une liste de contrôle structurée et des conseils sur les problèmes qui surviennent lors de la transition.

Pourquoi migrer depuis LEADTOOLSCode-barres ?

Déploiement de licence basé sur des fichiers : La licence LEADTOOLSnécessite un fichier .LIC physiquement présent sur le disque à un chemin connu sur chaque machine où l'application s'exécute. Les postes de travail des développeurs, les agents de compilation CI, les serveurs de préproduction et les conteneurs de production nécessitent tous que le fichier soit provisionné avant l'initialisation de l'application. Ce modèle opérationnel diffère fondamentalement de celui des secrets sous forme de chaînes de caractères, qui s'intègrent parfaitement aux variables d'environnement, aux gestionnaires de secrets et à la configuration des pipelines CI/CD. Chaque nouvel environnement ajouté à une topologie de déploiement (une nouvelle région cloud, un nouveau pool de nœuds Kubernetes, une nouvelle intégration de développeur) nécessite une étape de provisionnement de fichiers que la licence basée sur des chaînes de caractères n'exige pas.

Emprunte SDK : L'installation du code-barres LEADTOOLSnécessite le package NuGet Leadtools.Barcode (qui inclut Leadtools, Leadtools.Codecs, et les dépendances associées). L'extraction du code-barres PDF ajoute Leadtools.Pdf. Sous Windows, l'environnement d'exécution MSVC++ 2017 est une dépendance native distincte. Le fichier de sortie publié par une application de code-barres LEADTOOLSpèse environ 148 Mo. Les applications qui nécessitent uniquement la lecture ou la génération de codes-barres supportent tout le poids d'une plateforme d'imagerie complète — infrastructure OCR, architecture de codecs de format et capacités de visualisation de documents — que ces fonctionnalités soient utilisées ou non.

Conception de l'API existante : les opérations sur les codes-barres LEADTOOLSnécessitent la construction de plusieurs objets dans une séquence spécifique avant que toute opération puisse être effectuée. La lecture d'un code-barres nécessite une instance RasterCodecs pour charger l'image et une instance BarcodeEngine pour la scanner, avec un tableau BarcodeSymbology explicite déclarant les formats à rechercher. La génération d'un code-barres nécessite la construction d'un objet BarcodeData, la création d'un RasterImage vierge avec des paramètres de pixel explicites, le remplissage avec une couleur de fond utilisant FillCommand, l'écriture du code-barres dessus, et la sauvegarde avec RasterCodecs. Cette API reflète les modèles de conception de son époque. Code-barres IronBarcode effectue les mêmes opérations via des appels de méthodes statiques qui acceptent directement les chemins de fichiers.

Transparence des prix : Les licences de déploiement LEADTOOLSpour les serveurs de production sont proposées séparément par les ventes LEADTOOLSet ne sont pas publiées sur leur site web. Les équipes qui ont besoin d'une vision complète des coûts avant de commencer le développement doivent engager les ventes avant de pouvoir confirmer que LEADTOOLScorrespond à leur budget. Code-barres IronBarcode offre une licence perpétuelle unique qui couvre le développement et le déploiement ensemble, sans exigence de licence de production distincte.

Le problème fondamental

La séquence d'initialisation de LEADTOOLSnécessite plus de 20 lignes et quatre étapes de vérification avant qu'un BarcodeEngine puisse être créé. Code-barres IronBarcode remplace toute la séquence par une seule affectation :

// LEADTOOLS: file path, expiry check, three feature lock checks, engine creation
using Leadtools;
using Leadtools.Barcode;

RasterSupport.SetLicense(
    @"C:\LEADTOOLS23\Support\Common\License\LEADTOOLS.LIC",
    "your-developer-key-here");

if (RasterSupport.KernelExpired)
    throw new InvalidOperationException("LEADTOOLS license has expired");

if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead))
    throw new InvalidOperationException("1D barcode reading is locked");

if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead))
    throw new InvalidOperationException("2D barcode reading is locked");

if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite))
    throw new InvalidOperationException("Barcode writing is locked");

var engine = new BarcodeEngine();
// LEADTOOLS: file path, expiry check, three feature lock checks, engine creation
using Leadtools;
using Leadtools.Barcode;

RasterSupport.SetLicense(
    @"C:\LEADTOOLS23\Support\Common\License\LEADTOOLS.LIC",
    "your-developer-key-here");

if (RasterSupport.KernelExpired)
    throw new InvalidOperationException("LEADTOOLS license has expired");

if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead))
    throw new InvalidOperationException("1D barcode reading is locked");

if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead))
    throw new InvalidOperationException("2D barcode reading is locked");

if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite))
    throw new InvalidOperationException("Barcode writing is locked");

var engine = new BarcodeEngine();
Imports Leadtools
Imports Leadtools.Barcode

' LEADTOOLS: file path, expiry check, three feature lock checks, engine creation
RasterSupport.SetLicense("C:\LEADTOOLS23\Support\Common\License\LEADTOOLS.LIC", "your-developer-key-here")

If RasterSupport.KernelExpired Then
    Throw New InvalidOperationException("LEADTOOLS license has expired")
End If

If RasterSupport.IsLocked(RasterSupportType.Barcode1DRead) Then
    Throw New InvalidOperationException("1D barcode reading is locked")
End If

If RasterSupport.IsLocked(RasterSupportType.Barcode2DRead) Then
    Throw New InvalidOperationException("2D barcode reading is locked")
End If

If RasterSupport.IsLocked(RasterSupportType.BarcodeWrite) Then
    Throw New InvalidOperationException("Barcode writing is locked")
End If

Dim engine As New BarcodeEngine()
$vbLabelText   $csharpLabel
// IronBarcode: one line, no file required
using IronBarCode;

IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
// IronBarcode: one line, no file required
using IronBarCode;

IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
Imports IronBarCode

IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
$vbLabelText   $csharpLabel

Comparaison des fonctionnalités Code-barres IronBarcode et de LEADTOOLSBarcode

Fonction LEADTOOLSCode-barres Code-barres IronBarcode
Modèle de licence Fichier + clé de développeur Clé de chaîne uniquement
Packages NuGet requis 5+ 1
Dépendance d'exécution native MSVC++ 2017 (Windows) None
Taille de sortie publiée ~148 Mo ~39 Mo
Nombre total de symbologies prises en charge 40 ans et plus 50 ans et plus
Détection automatique du format de code-barres Limité Oui
extraction de codes-barres PDF Emballage séparé requis Intégré
Correction d'erreur ML Non Oui
logo de code QR Non Oui
Déploiement de Docker Montage de fichier requis Variable d'environnement
Code d'initialisation Plus de 20 lignes 1 ligne
style API Graphe d'objets hérité Statique fluide
Multiplateforme Partiel (dépendances natives) Complet (.NET Standard)
Tarification des licences de déploiement Contactez le service commercial (non publié) Inclus dans l'achat perpétuel

Démarrage rapide : Migration des codes-barres LEADTOOLSvers IronBarcode

Étape 1 : Supprimer les packages LEADTOOLS

Supprimez tous les packages LEADTOOLSdu projet :

dotnet remove package Leadtools.Barcode
dotnet remove package Leadtools
dotnet remove package Leadtools.Codecs
dotnet remove package Leadtools.Codecs.Png
dotnet remove package Leadtools.Codecs.Jpeg
dotnet remove package Leadtools.Barcode
dotnet remove package Leadtools
dotnet remove package Leadtools.Codecs
dotnet remove package Leadtools.Codecs.Png
dotnet remove package Leadtools.Codecs.Jpeg
SHELL

Si le codec PDF a été ajouté pour l'extraction des codes-barres à partir des fichiers PDF :

dotnet remove package Leadtools.Pdf
dotnet remove package Leadtools.Pdf
SHELL

Sur les déploiements Windows Server, le runtime MSVC++ 2017 peut être supprimé des scripts de provisionnement une fois la migration terminée. Code-barres IronBarcode ne présente aucune dépendance d'exécution native sur aucune plateforme.

Étape 2 : Installer IronBarcode

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

Ce package unique inclut la prise en charge de tous les formats d'image, l'extraction native des codes-barres PDF, la correction d'erreurs ML et plus de 50 symbologies prises en charge. Aucun pack de codecs supplémentaire n'est requis.

Étape 3 : Initialiser la licence

Remplacez l'ensemble du bloc d'initialisation LEADTOOLSpar une seule ligne. Localisez chaque appel à RasterSupport.SetLicense dans la base de code — il y en aura généralement un seul, au démarrage de l'application — et remplacez toute la séquence d'initialisation environnante :

// Before: entire LEADTOOLSinitialization block (20+ lines)
// After:
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Before: entire LEADTOOLSinitialization block (20+ lines)
// After:
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

La clé de licence peut être fournie par tout mécanisme de configuration capable de chaîne de caractères : une variable d'environnement, appsettings.json, Azure Key Vault, AWS Secrets Manager ou un secret Kubernetes. Pour la configuration des licences en fonction de l'environnement, les modèles de déploiement Docker et toutes les approches de configuration prises en charge, consultez la documentation relative à la configuration des clés de licence .

Exemples de migration de code

Lecture des codes-barres à partir d'images

LEADTOOLS sépare le chargement d'images et la lecture de codes-barres en deux couches d'objets distinctes. Une instance RasterCodecs charge le fichier image dans un RasterImage, et une instance BarcodeEngine le scanne. L'appelant doit également fournir un tableau explicite de valeurs BarcodeSymbology ; Les formats non répertoriés dans le tableau ne seront pas détectés.

Approche LEADTOOLS :

using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

using var codecs = new RasterCodecs();
using var image = codecs.Load("scan.png");

var engine = new BarcodeEngine();

var symbologies = new[]
{
    BarcodeSymbology.Code128,
    BarcodeSymbology.Code39,
    BarcodeSymbology.QR,
    BarcodeSymbology.DataMatrix,
    BarcodeSymbology.EAN13,
    BarcodeSymbology.UPCA
};

var barcodes = engine.Reader.ReadBarcodes(
    image,
    LogicalRectangle.Empty,
    0,
    symbologies);

foreach (var barcode in barcodes)
    Console.WriteLine($"{barcode.Symbology}: {barcode.Value}");
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

using var codecs = new RasterCodecs();
using var image = codecs.Load("scan.png");

var engine = new BarcodeEngine();

var symbologies = new[]
{
    BarcodeSymbology.Code128,
    BarcodeSymbology.Code39,
    BarcodeSymbology.QR,
    BarcodeSymbology.DataMatrix,
    BarcodeSymbology.EAN13,
    BarcodeSymbology.UPCA
};

var barcodes = engine.Reader.ReadBarcodes(
    image,
    LogicalRectangle.Empty,
    0,
    symbologies);

foreach (var barcode in barcodes)
    Console.WriteLine($"{barcode.Symbology}: {barcode.Value}");
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs

Dim codecs As New RasterCodecs()
Using codecs
    Dim image = codecs.Load("scan.png")
    Using image
        Dim engine As New BarcodeEngine()

        Dim symbologies = New BarcodeSymbology() {
            BarcodeSymbology.Code128,
            BarcodeSymbology.Code39,
            BarcodeSymbology.QR,
            BarcodeSymbology.DataMatrix,
            BarcodeSymbology.EAN13,
            BarcodeSymbology.UPCA
        }

        Dim barcodes = engine.Reader.ReadBarcodes(
            image,
            LogicalRectangle.Empty,
            0,
            symbologies)

        For Each barcode In barcodes
            Console.WriteLine($"{barcode.Symbology}: {barcode.Value}")
        Next
    End Using
End Using
$vbLabelText   $csharpLabel

Approche IronBarcode :

using IronBarCode;

var results = BarcodeReader.Read("scan.png");

foreach (var result in results)
    Console.WriteLine($"{result.Format}: {result.Value}");
using IronBarCode;

var results = BarcodeReader.Read("scan.png");

foreach (var result in results)
    Console.WriteLine($"{result.Format}: {result.Value}");
Imports IronBarCode

Dim results = BarcodeReader.Read("scan.png")

For Each result In results
    Console.WriteLine($"{result.Format}: {result.Value}")
Next
$vbLabelText   $csharpLabel

IronBarcode accepte directement le chemin d'accès au fichier, charge l'image en interne et détecte automatiquement les formats parmi plus de 50 symbologies prises en charge, sans que l'utilisateur ait à préciser les types attendus. Pour une configuration avancée (optimisation de la vitesse de lecture, détection de plusieurs codes-barres et gestion des images de faible qualité), consultez le guide de lecture des codes-barres à partir d'images .

Générer un code-barres Code 128

La génération LEADTOOLSnécessite la construction d'un objet BarcodeData, l'allocation d'un RasterImage vierge avec des indicateurs de mémoire explicites, profondeur de pixel et ordre des octets, le remplissage de l'image avec une couleur de fond, l'écriture du code-barres sur celle-ci, puis la sauvegarde avec RasterCodecs. Code-barres IronBarcode réalise toutes ces étapes grâce à une seule chaîne de méthodes fluides.

Approche LEADTOOLS :

using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

var engine = new BarcodeEngine();

var barcodeData = new BarcodeData()
{
    Symbology = BarcodeSymbology.Code128,
    Value = "ITEM-98765",
    Bounds = new LeadRect(0, 0, 500, 120)
};

using var image = new RasterImage(
    RasterMemoryFlags.Conventional,
    500, 120, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    null, IntPtr.Zero, 0);

new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, barcodeData, null);

using var codecs = new RasterCodecs();
codecs.Save(image, "item-barcode.png", RasterImageFormat.Png, 0);
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

var engine = new BarcodeEngine();

var barcodeData = new BarcodeData()
{
    Symbology = BarcodeSymbology.Code128,
    Value = "ITEM-98765",
    Bounds = new LeadRect(0, 0, 500, 120)
};

using var image = new RasterImage(
    RasterMemoryFlags.Conventional,
    500, 120, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    null, IntPtr.Zero, 0);

new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, barcodeData, null);

using var codecs = new RasterCodecs();
codecs.Save(image, "item-barcode.png", RasterImageFormat.Png, 0);
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs

Dim engine As New BarcodeEngine()

Dim barcodeData As New BarcodeData() With {
    .Symbology = BarcodeSymbology.Code128,
    .Value = "ITEM-98765",
    .Bounds = New LeadRect(0, 0, 500, 120)
}

Using image As New RasterImage(
    RasterMemoryFlags.Conventional,
    500, 120, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    Nothing, IntPtr.Zero, 0)

    Dim fillCommand As New FillCommand(RasterColor.White)
    fillCommand.Run(image)
    engine.Writer.WriteBarcode(image, barcodeData, Nothing)

    Using codecs As New RasterCodecs()
        codecs.Save(image, "item-barcode.png", RasterImageFormat.Png, 0)
    End Using
End Using
$vbLabelText   $csharpLabel

Approche IronBarcode :

using IronBarCode;

BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128)
    .ResizeTo(500, 120)
    .SaveAsPng("item-barcode.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128)
    .ResizeTo(500, 120)
    .SaveAsPng("item-barcode.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128) _
    .ResizeTo(500, 120) _
    .SaveAsPng("item-barcode.png")
$vbLabelText   $csharpLabel

Pour une présentation complète du dimensionnement, du style, du contrôle des marges et des formats de sortie pris en charge, consultez la section création d'images de codes-barres .

La génération de code QR LEADTOOLSsuit le même motif de construction RasterImage en plusieurs étapes que les autres types de code-barres. Code-barres IronBarcode fournit QRCodeWriter avec une méthode dédiée AddBrandLogo pour intégrer un logo au centre d'un code QR.

Approche LEADTOOLS :

using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

var engine = new BarcodeEngine();

var qrData = new BarcodeData()
{
    Symbology = BarcodeSymbology.QR,
    Value = "https://example.com/product/12345",
    Bounds = new LeadRect(0, 0, 400, 400)
};

using var image = new RasterImage(
    RasterMemoryFlags.Conventional,
    400, 400, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    null, IntPtr.Zero, 0);

new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, qrData, null);

using var codecs = new RasterCodecs();
codecs.Save(image, "product-qr.png", RasterImageFormat.Png, 0);
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

var engine = new BarcodeEngine();

var qrData = new BarcodeData()
{
    Symbology = BarcodeSymbology.QR,
    Value = "https://example.com/product/12345",
    Bounds = new LeadRect(0, 0, 400, 400)
};

using var image = new RasterImage(
    RasterMemoryFlags.Conventional,
    400, 400, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    null, IntPtr.Zero, 0);

new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, qrData, null);

using var codecs = new RasterCodecs();
codecs.Save(image, "product-qr.png", RasterImageFormat.Png, 0);
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs

Dim engine As New BarcodeEngine()

Dim qrData As New BarcodeData() With {
    .Symbology = BarcodeSymbology.QR,
    .Value = "https://example.com/product/12345",
    .Bounds = New LeadRect(0, 0, 400, 400)
}

Using image As New RasterImage(
    RasterMemoryFlags.Conventional,
    400, 400, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    Nothing, IntPtr.Zero, 0)

    Dim fillCommand As New FillCommand(RasterColor.White)
    fillCommand.Run(image)
    engine.Writer.WriteBarcode(image, qrData, Nothing)

    Using codecs As New RasterCodecs()
        codecs.Save(image, "product-qr.png", RasterImageFormat.Png, 0)
    End Using
End Using
$vbLabelText   $csharpLabel

Approche IronBarcode :

using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com/product/12345", 400, QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("brand-logo.png")
    .SaveAsPng("product-qr.png");
using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com/product/12345", 400, QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("brand-logo.png")
    .SaveAsPng("product-qr.png");
Imports IronBarCode

QRCodeWriter.CreateQrCode("https://example.com/product/12345", 400, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
    .AddBrandLogo("brand-logo.png") _
    .SaveAsPng("product-qr.png")
$vbLabelText   $csharpLabel

Extraction des codes-barres à partir de documents PDF

L'extraction de code-barres PDF LEADTOOLSnécessite le package séparé Leadtools.Pdf, une configuration de chargement PDF explicite, une requête de comptage de pages manuelle, et une boucle sur chaque page. Chaque page doit être chargée individuellement en tant que RasterImage avant le balayage. Code-barres IronBarcode inclut la prise en charge des fichiers PDF dans son package de base et gère l'itération des pages en interne.

Approche LEADTOOLS :

using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

// Requires: dotnet add package Leadtools.Pdf
using var codecs = new RasterCodecs();
codecs.Options.Pdf.Load.Resolution = 300;
codecs.Options.Pdf.Load.DisplayDepth = 24;

var engine = new BarcodeEngine();
var results = new List<string>();
int pageCount = codecs.GetTotalPages("shipment.pdf");

for (int page = 1; page <= pageCount; page++)
{
    using var image = codecs.Load(
        "shipment.pdf", 0,
        CodecsLoadByteOrder.BgrOrGray,
        page, page);

    var barcodes = engine.Reader.ReadBarcodes(
        image, LogicalRectangle.Empty, 0, null);

    foreach (var barcode in barcodes)
        results.Add($"Page {page}: {barcode.Value}");
}
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

// Requires: dotnet add package Leadtools.Pdf
using var codecs = new RasterCodecs();
codecs.Options.Pdf.Load.Resolution = 300;
codecs.Options.Pdf.Load.DisplayDepth = 24;

var engine = new BarcodeEngine();
var results = new List<string>();
int pageCount = codecs.GetTotalPages("shipment.pdf");

for (int page = 1; page <= pageCount; page++)
{
    using var image = codecs.Load(
        "shipment.pdf", 0,
        CodecsLoadByteOrder.BgrOrGray,
        page, page);

    var barcodes = engine.Reader.ReadBarcodes(
        image, LogicalRectangle.Empty, 0, null);

    foreach (var barcode in barcodes)
        results.Add($"Page {page}: {barcode.Value}");
}
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs

' Requires: dotnet add package Leadtools.Pdf
Using codecs As New RasterCodecs()
    codecs.Options.Pdf.Load.Resolution = 300
    codecs.Options.Pdf.Load.DisplayDepth = 24

    Dim engine As New BarcodeEngine()
    Dim results As New List(Of String)()
    Dim pageCount As Integer = codecs.GetTotalPages("shipment.pdf")

    For page As Integer = 1 To pageCount
        Using image = codecs.Load("shipment.pdf", 0, CodecsLoadByteOrder.BgrOrGray, page, page)
            Dim barcodes = engine.Reader.ReadBarcodes(image, LogicalRectangle.Empty, 0, Nothing)

            For Each barcode In barcodes
                results.Add($"Page {page}: {barcode.Value}")
            Next
        End Using
    Next
End Using
$vbLabelText   $csharpLabel

Approche IronBarcode :

using IronBarCode;

var results = BarcodeReader.Read("shipment.pdf");

foreach (var result in results)
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
using IronBarCode;

var results = BarcodeReader.Read("shipment.pdf");

foreach (var result in results)
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
Imports IronBarCode

Dim results = BarcodeReader.Read("shipment.pdf")

For Each result In results
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
$vbLabelText   $csharpLabel

Déploiement Docker

L'exigence de gestion des fichiers qui définit chaque déploiement Docker LEADTOOLSest entièrement éliminée lors de la migration vers IronBarcode.

Approche LEADTOOLS :

FROM mcr.microsoft.com/dotnet/aspnet:8.0

WORKDIR /app
COPY publish/ .

# License file must be physically present in the container image
COPY LEADTOOLS.LIC /app/license/LEADTOOLS.LIC

ENV LEADTOOLS_LICENSE_PATH=/app/license/LEADTOOLS.LIC
ENV LEADTOOLS_DEVELOPER_KEY=your-developer-key

ENTRYPOINT ["dotnet", "YourApp.dll"]

Approche IronBarcode :

FROM mcr.microsoft.com/dotnet/aspnet:8.0

WORKDIR /app
COPY publish/ .

ENV IRONBARCODE_LICENSE=your-license-key

ENTRYPOINT ["dotnet", "YourApp.dll"]

La clé de licence est injectée lors de l'exécution du conteneur via les secrets Docker, les secrets Kubernetes ou tout autre mécanisme de variable d'environnement. Aucune étape de provisionnement de fichiers n'est requise. Le guide de déploiement Docker et Linux couvre les images de base Alpine et Debian, les builds multi-étapes et les modèles de déploiement Kubernetes.

Référence de correspondance entre l'API de codes-barres LEADTOOLSet IronBarcode

LEADTOOLS Code-barres IronBarcode Notes
RasterSupport.SetLicense(path, key) IronBarCode.License.LicenseKey = "key" Clé uniquement — aucun fichier
RasterSupport.KernelExpired (removed) Aucune vérification de date d'expiration nécessaire
RasterSupport.IsLocked(RasterSupportType.Barcode1DRead) (removed) Toutes les fonctionnalités sont incluses
RasterSupport.IsLocked(RasterSupportType.Barcode2DRead) (removed) Toutes les fonctionnalités sont incluses
RasterSupport.IsLocked(RasterSupportType.BarcodeWrite) (removed) Toutes les fonctionnalités sont incluses
new BarcodeEngine() Statique — aucune instance BarcodeReader, BarcodeWriter sont statiques
new RasterCodecs() (removed) Transmettez directement le chemin du fichier
codecs.Load(imagePath) (removed) Transmettez directement le chemin du fichier
engine.Reader.ReadBarcodes(image, LogicalRectangle.Empty, 0, symbologies) BarcodeReader.Read(imagePath) Détection automatique des symbologies
BarcodeData.Value result.Value Même nom de propriété
BarcodeData.Symbology result.Format Propriété renommée
new BarcodeData() { Symbology = BarcodeSymbology.Code128 } BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) Création fluide
BarcodeSymbology.Code128 BarcodeEncoding.Code128 modification de l'espace de noms
BarcodeSymbology.QR BarcodeEncoding.QRCode changement de nom
BarcodeSymbology.DataMatrix BarcodeEncoding.DataMatrix Même nom
BarcodeSymbology.PDF417 BarcodeEncoding.PDF417 Même nom
BarcodeSymbology.EAN13 BarcodeEncoding.EAN13 Même nom
BarcodeSymbology.UPCA BarcodeEncoding.UPCA Même nom
BarcodeSymbology.Interleaved2of5 BarcodeEncoding.Interleaved2of5 Même nom
BarcodeSymbology.Codabar BarcodeEncoding.Codabar Même nom
engine.Writer.WriteBarcode(image, data, null) + codecs.Save(...) .SaveAsPng(path) Une chaîne de méthodes
new RasterImage(...) + new FillCommand(RasterColor.White).Run(image) (removed) Interne à Code-barres IronBarcode

Problèmes de migration courants et solutions

Problème n° 1 : Références aux fichiers .LIC dans l'intégration continue/le déploiement continu (CI/CD)

LEADTOOLS : Les pipelines CI/CD qui créent ou déploient des applications LEADTOOLSdoivent prévoir le fichier .LIC — soit en le vérifiant dans le contrôle de version, en le décodant à partir d'un secret base64, ou en le montant en tant qu'artéfact de volume. Chaque étape du pipeline qui exécute l'application a besoin que le fichier soit accessible.

Solution : Supprimez toute gestion de fichier .LIC du pipeline. Remplacez par un secret en chaîne :

# Example: GitHub Actions environment variable
env:
  IRONBARCODE_LICENSE: ${{secrets.IRONBARCODE_LICENSE}}
# Example: GitHub Actions environment variable
env:
  IRONBARCODE_LICENSE: ${{secrets.IRONBARCODE_LICENSE}}
YAML

La valeur de chaîne est stockée dans le magasin de secrets CI/CD avec d'autres informations d'identification de type chaîne. Aucun décodage de fichier, aucun provisionnement d'artefacts, aucune configuration de volume n'est requis.

Problème n° 2 : Dépendance de l'environnement d'exécution MSVC++ sous Windows

LEADTOOLS : Les déploiements sur Windows Server nécessitent l'installation du runtime MSVC++ 2017 sur l'hôte. Les scripts de provisionnement, les images de base des conteneurs et les AMI Windows utilisés pour les déploiements LEADTOOLSincluent généralement une étape d'installation de ce runtime.

Solution : Supprimez l'étape d'installation de MSVC++ 2017 Runtime de tous les scripts de provisionnement Windows et des images de conteneur. Code-barres IronBarcode ne dépend d'aucune dépendance d'exécution native. L'image de base dotnet/aspnet est suffisante sans packages d'exécution supplémentaires.

Problème 3 : Vérifications du verrouillage des fonctionnalités RasterSupportType

LEADTOOLS : La séquence d'initialisation inclut les vérifications RasterSupport.IsLocked() pour chaque fonctionnalité de code-barres — Barcodes1D, Barcodes2D et BarcodeWrite. Ces contrôles constituent un code de défense requis par l'architecture LEADTOOLSpour vérifier que le fichier de licence couvre chaque fonctionnalité requise.

Solution : Supprimez tous les appels RasterSupport.IsLocked(). Code-barres IronBarcode inclut toutes les fonctionnalités de lecture et d'écriture dans une seule licence. Il n'existe pas d'états de verrouillage par fonctionnalité et aucune étape de vérification des fonctionnalités n'est nécessaire :

// Remove these lines entirely:
// if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite)) ...
// Remove these lines entirely:
// if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite)) ...
' Remove these lines entirely:
' If RasterSupport.IsLocked(RasterSupportType.Barcode1DRead) ...
' If RasterSupport.IsLocked(RasterSupportType.Barcode2DRead) ...
' If RasterSupport.IsLocked(RasterSupportType.BarcodeWrite) ...
$vbLabelText   $csharpLabel

Problème 4 : Suppression du tableau de symboles de codes-barres

LEADTOOLS : Chaque appel à engine.Reader.ReadBarcodes() nécessite un paramètre BarcodeSymbology[] explicite. Les codes-barres dont la symbologie ne figure pas dans le tableau ne seront pas détectés, ce qui peut entraîner des lectures manquées silencieuses lorsqu'un nouveau type de code-barres est introduit dans un document d'entrée.

Solution : Supprimez le tableau de symbologie. BarcodeReader.Read() détecte automatiquement tous les formats pris en charge. Si un ajustement des performances est nécessaire pour un ensemble de formats connus, BarcodeReaderOptions fournit des indices optionnels sans nécessiter d'énumération exhaustive :

// Optional: hint the reader for performance in format-known scenarios
var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("scan.png", options);
// Optional: hint the reader for performance in format-known scenarios
var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("scan.png", options);
Imports System

' Optional: hint the reader for performance in format-known scenarios
Dim options As New BarcodeReaderOptions With {
    .ExpectBarcodeTypes = BarcodeEncoding.Code128 Or BarcodeEncoding.QRCode
}
Dim results = BarcodeReader.Read("scan.png", options)
$vbLabelText   $csharpLabel

Liste de contrôle de migration des codes-barres LEADTOOLS

Tâches préalables à la migration

Avant d'apporter des modifications, vérifiez l'ensemble de l'utilisation de LEADTOOLSdans le code source :

grep -r "using Leadtools" --include="*.cs" .
grep -r "RasterSupport\|BarcodeEngine\|RasterCodecs" --include="*.cs" .
grep -r "BarcodeSymbology\|BarcodeData\|RasterImage" --include="*.cs" .
grep -r "LEADTOOLS.LIC\|SetLicense\|KernelExpired" --include="*.cs" .
grep -r "COPY LEADTOOLS.LIC\|LEADTOOLS_LICENSE_PATH" --include="*.dockerfile" --include="Dockerfile" .
grep -r "using Leadtools" --include="*.cs" .
grep -r "RasterSupport\|BarcodeEngine\|RasterCodecs" --include="*.cs" .
grep -r "BarcodeSymbology\|BarcodeData\|RasterImage" --include="*.cs" .
grep -r "LEADTOOLS.LIC\|SetLicense\|KernelExpired" --include="*.cs" .
grep -r "COPY LEADTOOLS.LIC\|LEADTOOLS_LICENSE_PATH" --include="*.dockerfile" --include="Dockerfile" .
SHELL

Documentez le nombre et l'emplacement des blocs d'initialisation, des sites d'appels de lecture, des sites d'appels d'écriture et des références Dockerfile avant de commencer les modifications de code.

Tâches de mise à jour du code

  1. Supprimez les cinq packages NuGet LEADTOOLS(et le codec PDF s'il est présent).
  2. Installez IronBarcode via dotnet add package IronBarcode
  3. Remplacez toutes les importations de namespace using Leadtools.* par using IronBarCode
  4. Remplacez l'ensemble du bloc d'initialisation RasterSupport.SetLicense par IronBarCode.License.LicenseKey = "key"
  5. Supprimez toutes les vérifications RasterSupport.KernelExpired
  6. Supprimez toutes les vérifications RasterSupport.IsLocked(RasterSupportType.*)
  7. Supprimez toutes les instanciations new BarcodeEngine()
  8. Supprimez toutes les instanciations new RasterCodecs() des chemins de code des code-barres
  9. Remplacez codecs.Load(path) + engine.Reader.ReadBarcodes(image, ...) par BarcodeReader.Read(path)
  10. Remplacez new BarcodeData(...) + new RasterImage(...) + FillCommand + WriteBarcode + codecs.Save() par BarcodeWriter.CreateBarcode(...).SaveAsPng(path)
  11. Remplacez les références d'enum BarcodeSymbology.* par BarcodeEncoding.* (note : QR devient QRCode)
  12. Supprimez les lignes COPY LEADTOOLS.LIC de tous les Dockerfiles
  13. Supprimez les déclarations de variables d'environnement LEADTOOLS_LICENSE_PATH et LEADTOOLS_DEVELOPER_KEY des Dockerfiles et de la configuration de déploiement
  14. Ajoutez la variable d'environnement IRONBARCODE_LICENSE aux Dockerfiles et à la configuration des secrets
  15. Supprimez l'installation de MSVC++ 2017 Runtime des scripts de provisionnement Windows

Test de post-migration

  • Vérifiez que toutes les opérations de lecture de code-barres renvoient les valeurs attendues pour tous les types de symbologie précédemment couverts par le tableau BarcodeSymbology[]
  • Vérifiez que les codes 128, les codes QR et tout autre type de code-barres généré produisent un résultat valide et scannable.
  • Confirmez que l'extraction de code-barres PDF fonctionne correctement sans Leadtools.Pdf
  • Construisez et démarrez l'image du conteneur sans monter de fichier .LIC et confirmez que l'application s'initialise correctement
  • Exécutez le pipeline CI/CD sans l'étape de provisionnement de fichier .LIC et confirmez que toutes les étapes se terminent avec succès
  • Vérifiez que la taille de sortie publiée et le temps d'extraction de l'image conteneur se sont améliorés.

Principaux avantages de la migration vers IronBarcode

Architecture de déploiement simplifiée : après la migration, chaque environnement (développement, CI, préproduction, production) reçoit la licence via le même mécanisme de secrets à valeur de chaîne utilisé pour les clés API, les mots de passe de base de données et autres informations d'identification. Aucun provisionnement de fichiers, aucune gestion d'artefacts et aucun montage de volume ne sont requis. L'ajout d'un nouvel environnement de déploiement est identique à l'ajout de n'importe quel autre secret.

Surface de dépendance réduite : un seul package NuGet en remplace cinq, et la nécessité de l'environnement d'exécution MSVC++ 2017 est éliminée. La taille des données publiées par un service de codes-barres passe d'environ 148 Mo à environ 39 Mo. Des images plus petites signifient des extractions de conteneurs plus rapides, des coûts de stockage inférieurs dans les registres de conteneurs et des temps de démarrage à froid réduits dans les environnements sans serveur et à mise à l'échelle automatique.

Démarrage simplifié de l'application : la séquence d'initialisation LEADTOOLSde 20 lignes (résolution du chemin d'accès aux fichiers, vérification de l'expiration et trois contrôles de verrouillage par fonctionnalité) est remplacée par une seule ligne. Le démarrage de l'application est plus rapide et le chemin d'accès au code d'initialisation ne dépend plus du système de fichiers, ce qui évite tout risque d'échec dans un nouvel environnement.

Détection complète des formats : Code-barres IronBarcode lit plus de 50 symbologies prises en charge sans que l'appelant ait besoin de spécifier les formats attendus. Le risque de lectures ratées silencieuses — causé par l'omission d'une symbologie dans le tableau BarcodeSymbology[] de LEADTOOLS— est éliminé. Lorsqu'un nouveau type de code-barres apparaît dans un document d'entrée, Code-barres IronBarcode le détecte sans nécessiter de modification du code.

Coût total prévisible : L'achat d'une seule licence perpétuelle couvre le développement, les tests et les déploiements en production illimités, sans suivi des déploiements, sans obligation de renouvellement annuel et sans licence de production distincte à obtenir. Les équipes peuvent ainsi confirmer le coût total de la bibliothèque avant de commencer le développement, sans avoir besoin d'un entretien commercial.

Conception API moderne : BarcodeReader.Read() et BarcodeWriter.CreateBarcode() sont des points d'entrée statiques qui acceptent les chemins de fichiers directement. La construction d'objets multicouches requise par la lecture et l'écriture de LEADTOOLS(instances de codec, instances de moteur, allocation d'image, remplissage d'arrière-plan) est gérée en interne. Le code qui lit et génère les codes-barres est plus court, plus facile à examiner et plus facile à tester.

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

Questions Fréquemment Posées

Pourquoi devrais-je migrer de LEADTOOLS 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 à l'API LEADTOOLS 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 LEADTOOLS 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 LEADTOOLS 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 à LEADTOOLS 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 LEADTOOLS ?

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 LEADTOOLS 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.

Curtis Chau
Rédacteur technique

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

Lire la suite

Équipe de soutien Iron

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