Comment scanner des codes-barres dans ZXing pour les développeurs C#
Accusoft BarcodeXpresscontre Code-barres IronBarcode : Licences, Débit, et Compromis d'API
Lorsque vous évaluez une bibliothèque de codes-barres via sa version d'essai, vous vous attendez à vérifier si elle fonctionne réellement avec vos images avant de procéder à un achat. Accusoft BarcodeXpressne vous offre pas cette option. En mode évaluation, les valeurs de codes-barres décodées sont estampillées avec la chaîne " UNLICENSED accusoft.com " et les codes-barres 2D générés portent le même tampon. Vous pouvez vérifier que la bibliothèque trouve un code-barres, mais vous ne pouvez pas vérifier qu'elle le lit correctement. Il s'agit d'une situation où l'on s'engage avant même de vérifier, et cela constitue un point de friction important avant même d'avoir examiné les prix.
Comprendre Accusoft BarcodeXpress
Accusoft conçoit depuis des décennies des logiciels d'imagerie documentaire pour les environnements Enterprise . BarcodeXpress fait partie d'une gamme de produits plus large qui comprend PrizmDoc, ImageGear et Accusoft Imaging. Les équipes utilisant déjà ces produits retrouvent une interface API familière et peuvent s'appuyer sur leur compte Accusoft existant. Pour une utilisation autonome des codes-barres, ce contexte présente moins d'intérêt.
Le kit de développement logiciel (SDK) principal est disponible sous forme de package NuGet for .NET Core. L'API est basée sur une instance — vous créez un objet BarcodeXpress, configurez la propriété Licensing, puis utilisez les objets enfants reader et writer pour les opérations réelles. Le système de licences à double clé distingue BarcodeXpress de la plupart des alternatives.
Principales caractéristiques architecturales de BarcodeXpress :
- API basée sur l'instance : Chaque opération nécessite une instance
BarcodeXpress; les méthodes statiques de commodité ne font pas partie de la conception - Licences à deux niveaux : Les licences SDK (
SetSolutionName+SetSolutionKey) et les licences OEM/runtime (SetOEMLicenseKey) sont des systèmes séparés nécessitant des achats distincts - Estampillage en mode évaluation : En mode évaluation, les valeurs décodées sont estampillées avec
" UNLICENSED accusoft.com "(et les codes-barres 2D générés sont estampillés avec la même chaîne), rendant impossible le test de précision avant-achat - Spécification manuelle du format : Le lecteur nécessite une configuration explicite
BarcodeTypespour énumérer quelles symbologies rechercher ; les formats non spécifiés ne sont pas détectés - Plafond standard de 40 pages par minute : L'édition standard limite le traitement à 40 pages par minute, une limite que la plupart des équipes rencontrent après le déploiement plutôt qu'avant.
- Prise en charge native des fichiers PDF : les fichiers PDF doivent être pré-convertis en images à l'aide d'une bibliothèque externe avant de pouvoir être traités par le lecteur.
- Minimum de cinq licences d'exécution : même un déploiement sur un seul serveur nécessite l'achat d'au moins cinq licences d'exécution.
Explication du système à deux clés
BarcodeXpress divise le système de licences en deux couches conceptuellement distinctes :
// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;
// Constructor takes the path to the runtime files (e.g. ".").
var barcodeXpress = new BarcodeXpress(".");
// Step 1: SDK license (for development).
// SetSolutionName and SetSolutionKey are methods, not properties.
// SetSolutionKey takes four 32-bit integers (not a parsed long).
barcodeXpress.Licensing.SetSolutionName("YourCompanyName");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// Step 2: OEM/runtime license (for production — minimum 5 purchased).
try
{
barcodeXpress.Licensing.SetOEMLicenseKey("YourOEMLicenseString");
}
catch (Exception ex)
{
// Without a valid OEM license, the SDK runs in stamped evaluation mode.
Console.WriteLine($"OEM license activation failed: {ex.Message}");
}
// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;
// Constructor takes the path to the runtime files (e.g. ".").
var barcodeXpress = new BarcodeXpress(".");
// Step 1: SDK license (for development).
// SetSolutionName and SetSolutionKey are methods, not properties.
// SetSolutionKey takes four 32-bit integers (not a parsed long).
barcodeXpress.Licensing.SetSolutionName("YourCompanyName");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// Step 2: OEM/runtime license (for production — minimum 5 purchased).
try
{
barcodeXpress.Licensing.SetOEMLicenseKey("YourOEMLicenseString");
}
catch (Exception ex)
{
// Without a valid OEM license, the SDK runs in stamped evaluation mode.
Console.WriteLine($"OEM license activation failed: {ex.Message}");
}
Imports Accusoft.BarcodeXpressSdk
' BarcodeXpress: two separate license keys required
' Constructor takes the path to the runtime files (e.g. ".").
Dim barcodeXpress As New BarcodeXpress(".")
' Step 1: SDK license (for development).
' SetSolutionName and SetSolutionKey are methods, not properties.
' SetSolutionKey takes four 32-bit integers (not a parsed long).
barcodeXpress.Licensing.SetSolutionName("YourCompanyName")
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
' Step 2: OEM/runtime license (for production — minimum 5 purchased).
Try
barcodeXpress.Licensing.SetOEMLicenseKey("YourOEMLicenseString")
Catch ex As Exception
' Without a valid OEM license, the SDK runs in stamped evaluation mode.
Console.WriteLine($"OEM license activation failed: {ex.Message}")
End Try
Le couple SetSolutionKey active le SDK lui-même. L'appel SetOEMLicenseKey active les capacités de déploiement en production. Les deux doivent être présents et valides pour qu'un déploiement en production renvoie des valeurs de codes-barres sans le tampon " UNLICENSED accusoft.com ".
Lors de l'examen du code, ce modèle produit une question prévisible : " Pourquoi avons-nous deux activations de licence séparées ? " La réponse — qu'Accusoft traite la licence SDK et la licence de déploiement comme des produits séparés avec facturation séparée — n'est pas toujours évidente depuis l'API elle-même. Les équipes chargées de la maintenance de ce code six mois après sa configuration initiale doivent souvent se référer à la documentation pour comprendre à quoi correspond chaque clé.
Sans licence OEM valide, SetOEMLicenseKey génère une exception et le SDK revient en mode évaluation. Les équipes enveloppent typiquement l'activation dans try/catch afin que l'échec soit consigné bruyamment au lieu de produire silencieusement des valeurs de code-barres estampillées en production :
try
{
barcodeXpress.Licensing.SetOEMLicenseKey(oemKey);
}
catch (Exception ex)
{
// In evaluation mode, barcode values are stamped with
// " UNLICENSED accusoft.com " in the output.
throw new InvalidOperationException(
"OEM license activation failed — barcode values will be stamped", ex);
}
try
{
barcodeXpress.Licensing.SetOEMLicenseKey(oemKey);
}
catch (Exception ex)
{
// In evaluation mode, barcode values are stamped with
// " UNLICENSED accusoft.com " in the output.
throw new InvalidOperationException(
"OEM license activation failed — barcode values will be stamped", ex);
}
Try
barcodeXpress.Licensing.SetOEMLicenseKey(oemKey)
Catch ex As Exception
' In evaluation mode, barcode values are stamped with
' " UNLICENSED accusoft.com " in the output.
Throw New InvalidOperationException("OEM license activation failed — barcode values will be stamped", ex)
End Try
Cette garde est le modèle que les équipes ajoutent lorsqu'elles réalisent que la sortie en mode évaluation tamponne silencieusement les résultats plutôt que de lever une exception lors du décodage.
Comprendre IronBarcode
IronBarcode est une bibliothèque de codes-barres .NET autonome, sans aucune dépendance externe autre que son package NuGet . Il gère à la fois la génération et la lecture via des méthodes de fabrique statiques, ce qui signifie qu'il n'y a pas de cycle de vie d'instance à gérer et pas d'appels de constructeur dispersés dans le code de l'application.
Le modèle de licence à clé unique signifie que ce que vous testez en mode d'essai est ce qui est exécuté en production ; la seule différence est un filigrane sur les images de codes-barres générées pendant la période d'essai. Les valeurs décodées sont toujours complètes, ce qui vous permet de vérifier la précision de lecture sur vos documents avant de décider d'acheter.
Caractéristiques principales d' IronBarcode:
- Conception d'API statique :
BarcodeReader.Read()etBarcodeWriter.CreateBarcode()sont des méthodes statiques sans état — aucune gestion d'instance requise - Clé de licence unique : une seule clé couvre à la fois le développement et le déploiement en production ; il n'y a pas de couche de licence d'exécution distincte
- Valeurs d'essai complètes : le mode d'essai renvoie des valeurs décodées complètes ; Le filigrane s'applique uniquement aux images de sortie générées, et non aux résultats de lecture.
- Détection automatique du format : Code-barres IronBarcode détecte automatiquement la symbologie dans tous les formats pris en charge ; aucune énumération
BarcodeTypesn'est nécessaire - Prise en charge native du PDF :
BarcodeReader.Read("document.pdf")traite les fichiers PDF directement sans étape de rendu séparée - Aucun plafond de débit : la vitesse de traitement est uniquement limitée par la capacité du matériel et du réseau, et non par un plafond imposé par logiciel.
- Conception thread-safe : les méthodes statiques sans état peuvent être appelées simultanément par un nombre quelconque de threads sans isolation d'instance.
Comparaison des fonctionnalités
| Fonction | Accusoft BarcodeXpress | Code-barres IronBarcode |
|---|---|---|
| Modèle de licence | Licence SDK + licence d'exécution distincte | Clé perpétuelle unique |
| Comportement du mode d'évaluation | Valeurs de code-barres estampillées avec " UNLICENSED accusoft.com " | Valeurs complètes renvoyées, filigrane uniquement sur le résultat généré |
| Limite de débit (standard) | 40 pages par minute | Aucune limite de débit |
| Prise en charge des fichiers PDF | Nécessite une bibliothèque PDF externe pour l'extraction d'images | Natif — BarcodeReader.Read("doc.pdf") |
| Style API | Configuration détaillée basée sur les instances | Méthodes de fabrique statiques, API fluide |
| Sécurité des threads | Instance par thread requise | Méthodes statiques sans état — naturellement thread-safe |
| point d'entrée en matière de prix | 1 960 $ + SDK + 2 500 $ + environnement d'exécution (min. 5) | 749 $ perpétuel (Lite, 1 développeur) |
Comparaison détaillée des fonctionnalités
| Fonction | Accusoft BarcodeXpress | Code-barres IronBarcode |
|---|---|---|
| Licence | ||
| Modèle de licence | Clé SDK + clé d'exécution | Clé perpétuelle unique |
| Licences d'exécution minimales | 5 (même pour 1 serveur) | Concept de licence sans exécution |
| Mode d'évaluation | Valeurs estampillées avec " UNLICENSED accusoft.com " | Valeurs complètes, filigrane uniquement sur les images de sortie |
| Licence perpétuelle | Non standard — contactez le service commercial | Oui, tous les niveaux |
| renouvellement annuel | Nécessaire pour le support | En option |
| En lisant | ||
| Détection automatique du format | Manuel — doit préciser les types de codes-barres | Automatique pour tous les formats pris en charge |
| Lecture de PDF | Nécessite une bibliothèque PDF externe | Natif |
| Plusieurs codes-barres par image | Oui, avec la configuration BarcodeTypes |
Oui, avec l'option ExpectMultipleBarcodes |
| Propriétés du résultat | BarcodeValue, BarcodeType |
Value, Format, Confidence, PageNumber |
| Limite de débit | 40 PPM (Édition standard) | Aucune limite à aucun niveau |
| Génération | ||
| Génération du code 128 | Oui, via writer.BarcodeType |
Oui, via BarcodeWriter.CreateBarcode() |
| génération de code QR | Oui | Oui, via QRCodeWriter.CreateQrCode() |
| Code QR avec logo | Superposition d'image manuelle requise | AddBrandLogo("logo.png") intégré |
| Formats de sortie | enregistrement du fichier | PNG, JPG, PDF, données binaires, flux |
| Plateforme et déploiement | ||
| .NET Framework | Kit de développement logiciel (SDK) hérité séparé | .NET Framework4.6.2+ |
| .NET Core / .NET 5+ | Oui (kit de développement logiciel .NET Core ) | .NET Core 3.1+, .NET 5/6/7/8/9 |
| Linux/Docker | Oui | Oui — Windows x64/x86, Linux x64, macOS x64/ARM |
| Configuration de la licence Docker | fichier de licence ou serveur de licences | Variable d'environnement |
| Intégration CI/CD | Les clés SDK et d'exécution sont toutes deux requises. | Un secret |
| Traitement par lots | ||
| Sécurité du fil | Instance par thread requise | Sans état — Parallel.ForEach coffre-fort |
| Lot parallèle | Nécessite une gestion d'instance par thread | Prise en charge de Direct Parallel.ForEach |
Architecture des licences
La différence de complexité des licences entre BarcodeXpress et Code-barres IronBarcode est surtout visible lors de l'écriture du code d'initialisation qui sera exécuté en production.
Approche BarcodeXpress
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
_barcodeXpress = new BarcodeXpress(".");
// Layer 1: SDK license
_barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// Layer 2: OEM/runtime license — separate purchase, minimum 5
try
{
_barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");
}
catch (Exception ex)
{
throw new InvalidOperationException(
"OEM license activation failed — barcode values will be stamped", ex);
}
}
}
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
_barcodeXpress = new BarcodeXpress(".");
// Layer 1: SDK license
_barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// Layer 2: OEM/runtime license — separate purchase, minimum 5
try
{
_barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");
}
catch (Exception ex)
{
throw new InvalidOperationException(
"OEM license activation failed — barcode values will be stamped", ex);
}
}
}
Imports Accusoft.BarcodeXpressSdk
Public Class BarcodeService
Private ReadOnly _barcodeXpress As BarcodeXpress
Public Sub New()
_barcodeXpress = New BarcodeXpress(".")
' Layer 1: SDK license
_barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
' Layer 2: OEM/runtime license — separate purchase, minimum 5
Try
_barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString")
Catch ex As Exception
Throw New InvalidOperationException("OEM license activation failed — barcode values will be stamped", ex)
End Try
End Sub
End Class
Ce constructeur existe entièrement pour gérer deux activations de licence séparées avant toute opération de code-barres. Le try/catch autour de SetOEMLicenseKey n'est pas optionnel — sans cela, le service renverra silencieusement des valeurs estampillées dans tout environnement où la clé OEM est absente ou mal configurée.
Approche IronBarcode
using IronBarCode;
// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
using IronBarCode;
// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
' In Program.vb or startup configuration
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
C'est l'ensemble complet des licences. Pas de déverrouillage runtime séparé, pas de nom de solution, pas d'appel UnlockRuntime avec deux arguments. Dans Docker, cela devient une variable d'environnement lue au démarrage. Dans un pipeline CI/CD, il s'agit d'un secret. Dans un orchestrateur de conteneurs, il s'agit d'une variable d'environnement injectée dans le pod.
Lecture des codes-barres
La lecture des codes-barres révèle la différence entre les philosophies de configuration des deux bibliothèques : BarcodeXpress exige une énumération explicite du format et une API de configuration basée sur les propriétés, tandis Code-barres IronBarcode détecte automatiquement tout à partir d'un seul appel de méthode.
Approche BarcodeXpress
La lecture avec BarcodeXpress nécessite de charger l'image dans un System.Drawing.Bitmap, d'assigner l'ensemble de symbologie à reader.BarcodeTypes en tant que System.Array de valeurs BarcodeType, et d'appeler Analyze(bitmap) pour récupérer les résultats. Le SDK ne lit pas les PDF directement — les formats d'entrée documentés sont TIFF, JPEG, PNG, et BMP :
using Accusoft.BarcodeXpressSdk;
using System.Drawing;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var barcodeXpress = new BarcodeXpress(".");
barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");
using var bitmap = new Bitmap(imagePath);
// BarcodeTypes is a System.Array of BarcodeType values (not a [Flags]
// enum). Pass Enum.GetValues to scan for everything, or assign a
// narrower array to restrict the search space.
barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
};
Result[] results = barcodeXpress.reader.Analyze(bitmap);
return results.Select(r => r.BarcodeValue);
}
using Accusoft.BarcodeXpressSdk;
using System.Drawing;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var barcodeXpress = new BarcodeXpress(".");
barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString");
using var bitmap = new Bitmap(imagePath);
// BarcodeTypes is a System.Array of BarcodeType values (not a [Flags]
// enum). Pass Enum.GetValues to scan for everything, or assign a
// narrower array to restrict the search space.
barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
};
Result[] results = barcodeXpress.reader.Analyze(bitmap);
return results.Select(r => r.BarcodeValue);
}
Imports Accusoft.BarcodeXpressSdk
Imports System.Drawing
Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
Dim barcodeXpress = New BarcodeXpress(".")
barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
barcodeXpress.Licensing.SetOEMLicenseKey("OEMLicenseString")
Using bitmap As New Bitmap(imagePath)
' BarcodeTypes is a System.Array of BarcodeType values (not a [Flags]
' enum). Pass Enum.GetValues to scan for everything, or assign a
' narrower array to restrict the search space.
barcodeXpress.Reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
}
Dim results As Result() = barcodeXpress.Reader.Analyze(bitmap)
Return results.Select(Function(r) r.BarcodeValue)
End Using
End Function
Analyze prend un Bitmap et renvoie un Result[]. Si un document contient un format non présent dans le tableau BarcodeTypes, il ne sera pas trouvé. Cela engendre des frais de maintenance supplémentaires lorsque les sources de documents changent. Les PDF nécessitent un pré-rendu en images avec une bibliothèque séparée avant qu'ils ne puissent être introduits dans Analyze.
Approche IronBarcode
using IronBarCode;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value);
}
using IronBarCode;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value);
}
Imports IronBarCode
Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
Dim results = BarcodeReader.Read(imagePath)
Return results.Select(Function(r) r.Value)
End Function
IronBarcode détecte automatiquement le format pour toutes les symbologies prises en charge. Si l'image contient un Code 128, un code QR et un DataMatrix, les trois apparaissent dans la collection de résultats sans aucune modification de configuration. Pour un contrôle plus précis du comportement de lecture, la classe BarcodeReaderOptions expose des paramètres de vitesse, de nombre de threads et de lecture de plusieurs codes-barres.
La lecture native des fichiers PDF est également possible via la même méthode :
using IronBarCode;
// NatifPDF support — no separate library needed
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}");
}
using IronBarCode;
// NatifPDF support — no separate library needed
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}");
}
Imports IronBarCode
' NatifPDF support — no separate library needed
Dim results = BarcodeReader.Read("invoice-batch.pdf")
For Each result In results
Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}")
Next
BarcodeXpress ne lit pas les fichiers PDF nativement. Vous devez d'abord convertir chaque page en image, à l'aide d'une bibliothèque distincte, puis transmettre ces images au lecteur BarcodeXpress. Cela ajoute une dépendance, une étape de conversion et un coût de licence supplémentaire en fonction de la bibliothèque PDF choisie.
Traitement par lots et sécurité des filetages
Le traitement à haut volume de codes-barres met en évidence la différence architecturale entre le modèle d'instance avec état de BarcodeXpress et l'API statique sans état d'IronBarcode.
Approche BarcodeXpress
BarcodeXpress est basé sur une instance et son objet reader est avec état. Le traitement parallèle nécessite une instance par thread, l'initialisation complète de la licence à deux niveaux étant répétée dans chaque contexte de thread :
using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;
using System.Drawing;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
using var bitmap = new Bitmap(path);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
};
var barcodes = _barcodeXpress.reader.Analyze(bitmap);
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;
using System.Drawing;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
using var bitmap = new Bitmap(path);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
};
var barcodes = _barcodeXpress.reader.Analyze(bitmap);
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
Imports Accusoft.BarcodeXpressSdk
Imports System.Collections.Generic
Imports System.Drawing
Public Function ProcessBatch(imagePaths As IEnumerable(Of String)) As Dictionary(Of String, String)
Dim results As New Dictionary(Of String, String)()
For Each path In imagePaths
Using bitmap As New Bitmap(path)
_barcodeXpress.reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
}
Dim barcodes = _barcodeXpress.reader.Analyze(bitmap)
If barcodes.Length > 0 Then
results(path) = barcodes(0).BarcodeValue
End If
End Using
Next
Return results
End Function
L'édition standard impose également un plafond de 40 pages par minute. Le traitement d'un lot de 100 000 documents à 40 PPM prend environ 41 heures. L'édition Professional supprime cette limite, mais à un coût plus élevé par développeur, en plus des licences d'exécution déjà achetées.
Approche IronBarcode
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;
// Code-barres IronBarcode — parallel batch with thread-safe static API
var files = Directory.GetFiles("/incoming/scans", "*.png");
var allResults = new ConcurrentBag<string>();
Parallel.ForEach(files, file =>
{
var r = BarcodeReader.Read(file);
foreach (var barcode in r)
allResults.Add($"{file}: {barcode.Value}");
});
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;
// Code-barres IronBarcode — parallel batch with thread-safe static API
var files = Directory.GetFiles("/incoming/scans", "*.png");
var allResults = new ConcurrentBag<string>();
Parallel.ForEach(files, file =>
{
var r = BarcodeReader.Read(file);
foreach (var barcode in r)
allResults.Add($"{file}: {barcode.Value}");
});
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
Imports System.IO
' Code-barres IronBarcode — parallel batch with thread-safe static API
Dim files = Directory.GetFiles("/incoming/scans", "*.png")
Dim allResults = New ConcurrentBag(Of String)()
Parallel.ForEach(files, Sub(file)
Dim r = BarcodeReader.Read(file)
For Each barcode In r
allResults.Add($"{file}: {barcode.Value}")
Next
End Sub)
Parce que les méthodes statiques de Code-barres IronBarcode sont sans état, Parallel.ForEach sur eux est sûr sans nécessiter d'isolation d'instance. Code-barres IronBarcode n'impose aucun plafond de débit, quel que soit le niveau de prix. Pour ajuster les performances de lecture, la classe BarcodeReaderOptions fournit des réglages ReadingSpeed et MaxParallelThreads :
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read("warehouse-scan.png", options);
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read("warehouse-scan.png", options);
Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim results = BarcodeReader.Read("warehouse-scan.png", options)
ReadingSpeed.Balanced est la valeur par défaut. Utilisez ReadingSpeed.Faster pour des pipelines à haut débit où les codes-barres sont propres, ou ReadingSpeed.Detailed pour des images endommagées ou à faible contraste.
Référence de mappage d'API
| Accusoft BarcodeXpress | Code-barres IronBarcode |
|---|---|
new BarcodeXpress(".") |
Méthodes statiques — aucune instance requise |
Licensing.SetSolutionName("...") |
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY" |
Licensing.SetSolutionKey(int, int, int, int) |
(removed — not needed) |
Licensing.SetOEMLicenseKey(string) |
(removed — no separate runtime license concept) |
| try/catch autour de l'activation OEM | (removed — license is always either valid or not) |
reader.Analyze(bitmap) (charge System.Drawing.Bitmap en premier) |
BarcodeReader.Read(path) |
reader.BarcodeTypes = new[] { BarcodeType.Code128Barcode, ... } |
(removed — auto-detection handles all formats) |
result.BarcodeValue |
result.Value |
result.BarcodeType |
result.Format |
writer.BarcodeType = BarcodeType.Code128 |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
writer.BarcodeValue = "data" |
(first argument to CreateBarcode) |
writer.SaveToFile(path) |
.SaveAsPng(path) |
| Limite standard de 40 ppm | Aucune limite de débit à aucun niveau |
| Évaluation : valeurs estampillées avec " UNLICENSED accusoft.com " | Essai : valeurs complètes, filigrane uniquement sur les images de sortie |
Lorsque les équipes envisagent de passer d'Accusoft BarcodeXpress à IronBarcode
Dépasser le seuil des 40 ppm
La limite de 40 pages par minute de l'édition standard semble généreuse jusqu'à ce qu'une équipe commerciale décide d'effectuer un traitement par lots en fin de journée sur une année entière de factures archivées. Le traitement d'un lot de 100 000 documents à ce rythme prend environ 41 heures. Passer à l'édition Professional supprime la limite, mais au prix d'un coût plus élevé par poste de développeur, en plus des licences d'exécution déjà achetées. Les équipes qui découvrent le plafond de débit après avoir signé un bon de commande constatent souvent que le coût total de sa suppression dépasse largement les estimations initiales.
Complexité des licences des pipelines CI/CD
Une configuration CI/CD typique exécute les builds dans des conteneurs éphémères. Avec BarcodeXpress, chaque environnement de compilation nécessite à la fois la paire de clés du SDK et les clés de déverrouillage d'exécution, gérées comme des secrets distincts. Si la clé d'exécution est manquante ou mal configurée, la compilation peut réussir, mais les tests d'intégration renvoient des valeurs masquées — un mode de défaillance silencieux facile à manquer dans un pipeline de test si les assertions de test ne sont pas soigneusement écrites par rapport au contenu réel du code-barres.
Exigences de déploiement isolé et sécurisé
Certains environnements — systèmes de santé traitant les dossiers des patients, flux de travail documentaires gouvernementaux, traitement administratif des institutions financières — ne peuvent pas effectuer de validation de licence lors d'appels réseau sortants. Le système de licences d'exécution de BarcodeXpress repose sur l'infrastructure de licences d'Accusoft, ce qui peut poser un problème de conformité dans les environnements soumis à des restrictions strictes en matière de trafic réseau sortant. Les équipes travaillant dans ces environnements choisissent souvent des bibliothèques dont la validation des licences est entièrement locale.
Déploiement de Docker et de conteneurs
BarcodeXpress dans Docker nécessite généralement soit de monter un fichier de licence dans le conteneur à un emplacement connu, soit de configurer un serveur de licences et de pointer le conteneur vers celui-ci. Les deux approches ajoutent de la complexité au déploiement : les fichiers de licence doivent être distribués et synchronisés, et un serveur de licences représente un élément d'infrastructure supplémentaire à maintenir. Les équipes qui adoptent des architectures de microservices ou des modèles de déploiement sans serveur constatent que l'approche par fichier de configuration ne se traduit pas facilement en images de conteneurs immuables.
Exigences en matière de précision d'évaluation
Les équipes qui ont besoin de valider la précision de lecture sur leurs propres documents avant de procéder à un achat trouvent le mode d'évaluation de BarcodeXpress fondamentalement limitant. Les tests effectués sur des documents numérisés réels — vérifiant si la bibliothèque gère les codes-barres à faible contraste, les images déformées ou les pages à codes-barres multiples — nécessitent des valeurs décodées complètes. Les résultats partiellement masqués indiquent seulement que la bibliothèque a trouvé un code-barres, et non si elle l'a lu correctement.
Considérations courantes en matière de migration
Gestion des instances pour les appels statiques
BarcodeXpress nécessite qu'une instance BarcodeXpress soit créée et licenciée avant toute opération. Les méthodes statiques d'IronBarcode ne nécessitent pas d'instance. Les équipes qui migrent ont généralement une classe BarcodeService dont le constructeur est en grande partie un boilerplate de licence — après la migration, ce constructeur peut être entièrement supprimé ou réduit à une simple assignation de clé de licence.
Suppression de l'énumération des types de codes-barres
Chaque opération de lecture BarcodeXpress nécessite une assignation de tableau BarcodeTypes pour énumérer quelles symbologies rechercher. Code-barres IronBarcode détecte automatiquement tous les formats pris en charge par défaut. Pendant la migration, toutes les assignations reader.BarcodeTypes = ... peuvent être supprimées sans remplacement. S'il y a une raison de performance pour restreindre l'espace de recherche, BarcodeReaderOptions supporte le filtrage de format comme un opt-in explicite plutôt qu'un défaut requis.
Résultat : Modifications du nom de la propriété
Deux renommages de propriétés affectent tout le code de traitement des résultats : result.BarcodeValue devient result.Value, et result.BarcodeType devient result.Format. Une fonction de recherche et de remplacement à l'échelle de la solution gère les deux. Les résultats Code-barres IronBarcode exposent également result.Confidence et result.PageNumber, qui n'ont pas d'équivalent BarcodeXpress et peuvent être utilisés pour un filtrage supplémentaire sans modifications du code de gestion des résultats existants.
Configuration de la licence Docker
Les déploiements Docker de BarcodeXpress utilisent généralement un fichier de configuration de licence monté. Code-barres IronBarcode utilise une variable d'environnement. La migration implique la suppression de l'instruction COPY pour le fichier de configuration et l'ajout d'une assignation d'une seule variable d'environnement. Dans Kubernetes, la clé de licence devient une référence secrète dans la spécification du pod plutôt qu'un volume monté.
Fonctionnalités supplémentaires IronBarcode
Au-delà des fonctionnalités essentielles abordées dans cette comparaison, Code-barres IronBarcode offre des capacités qui ne font pas partie de l'offre de BarcodeXpress :
- QR Code avec Logo :
QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")intègre une image de marque dans un QR code nativement, avec un niveau de correction d'erreur configurable pour maintenir la fiabilité du scan - Ajout de codes-barres sur les PDF : Insérez des codes-barres directement sur des documents PDF existants sans bibliothèque PDF distincte.
- Exportation par lots : Traitez des documents PDF entiers en une seule opération et recevez des résultats par page avec numéro de page, format, valeur et score de confiance.
Compatibilité .NET et préparation à l'avenir
IronBarcode prend en charge .NET Framework4.6.2 et versions ultérieures, .NET Core 3.1 et .NET 5, 6, 7, 8 et 9. Les plateformes cibles incluent Windows x64 et x86, Linux x64 et macOS x64 et ARM. BarcodeXpress for .NET Core est un SDK distinct de l'ancienne édition .NET Framework ; les équipes qui mettent à niveau le framework cible de leur application doivent en tenir compte. Le package unique d'IronBarcode couvre tous les environnements d'exécution pris en charge. Des mises à jour régulières suivent les nouvelles versions de .NET au fur et à mesure de leur publication.
Conclusion
BarcodeXpress et Code-barres IronBarcode représentent deux philosophies de conception différentes pour les bibliothèques de codes-barres .NET commerciales. BarcodeXpress considère l'accès au SDK et le déploiement en production comme des produits sous licence distincts, avec une facturation, des systèmes de clés et des exigences d'achat minimales distincts. Code-barres IronBarcode considère la bibliothèque comme un produit unique avec une seule clé qui couvre tous les environnements, du développement à la production.
BarcodeXpress est un choix judicieux pour les équipes déjà intégrées à l'écosystème de produits Accusoft ; les organisations utilisant PrizmDoc ou ImageGear trouveront l'API de BarcodeXpress familière et leur relation avec leur compte Accusoft utile pour un support consolidé. Pour ces équipes, le système de licences à deux clés constitue un modèle opérationnel établi plutôt qu'une nouvelle source de friction. Le SDK convient également aux environnements où les sources de documents sont bien contrôlées et les exigences de format stables, faisant de la spécification manuelle BarcodeTypes une configuration unique acceptable plutôt qu'une maintenance continue.
IronBarcode est mieux adapté aux équipes déployant sur des conteneurs, des pipelines CI/CD et des environnements cloud où la complexité de la gestion des licences affecte directement les frais généraux opérationnels. Le modèle de détection automatique, l'API statique et la prise en charge native du format PDF réduisent la surface du code d'intégration, et le modèle de licence à clé unique simplifie la gestion des secrets dans les environnements de développement, de test et de production. Pour les équipes qui doivent évaluer la précision de lecture avant l'achat, le résultat complet de l'essai — avec un filigrane sur les images générées et non sur les résultats de lecture — permet une véritable évaluation comparative avant l'achat.
La différence de prix est significative à tous les niveaux. Au niveau d'un développeur individuel, l'écart entre le SDK BarcodeXpress Plus les licences d'exécution minimales et le niveau Lite d'IronBarcode est considérable. Pour les équipes pour lesquelles l'intégration à l'écosystème Accusoft prime sur la différence de coût, BarcodeXpress reste un choix judicieux. En revanche, pour celles qui évaluent les bibliothèques de codes-barres selon leurs propres mérites, les limitations du mode d'évaluation, la licence à deux clés et les plafonds de débit font Code-barres IronBarcode l'option la plus simple.
Questions Fréquemment Posées
Qu'est-ce que Accusoft BarcodeXpress ?
Accusoft BarcodeXpress est une bibliothèque de codes-barres .NET permettant de générer et de lire des codes-barres dans des applications C#. C'est l'une des nombreuses alternatives que les développeurs évaluent lorsqu'ils choisissent une solution de code-barres pour les projets .NET.
Quelles sont les principales différences entre Accusoft BarcodeXpress et IronBarcode ?
IronBarcode utilise une API statique, sans état, ne nécessitant aucune gestion d'instance, alors qu'Accusoft BarcodeXpress requiert généralement la création et la configuration d'une instance avant utilisation. IronBarcode offre également une prise en charge native du format PDF, une détection automatique du format et une licence à clé unique pour tous les environnements.
IronBarcode est-il plus facile à licencier qu'Accusoft BarcodeXpress ?
IronBarcode utilise une clé de licence unique couvrant à la fois les déploiements de développement et de production. Cela simplifie les pipelines CI/CD et les configurations Docker par rapport aux systèmes de licence qui séparent les clés SDK des clés d'exécution.
IronBarcode prend-il en charge tous les formats de codes-barres pris en charge par Accusoft BarcodeXpress ?
IronBarcode prend en charge plus de 30 symbologies de codes-barres, notamment QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1, et bien d'autres encore. L'auto-détection du format signifie qu'aucune énumération explicite du format n'est nécessaire.
IronBarcode prend-il en charge la lecture de codes-barres PDF en mode natif ?
Oui. IronBarcode lit les codes-barres directement à partir de fichiers PDF en utilisant BarcodeReader.Read("document.pdf") sans nécessiter de bibliothèque de rendu PDF séparée. Les résultats par page comprennent le numéro de page, le format du code-barres, la valeur et le score de confiance.
Comment IronBarcode gère-t-il le traitement par lots par rapport à Accusoft BarcodeXpress ?
Les méthodes statiques d'IronBarcode sont sans état et naturellement à l'abri des threads, ce qui permet d'utiliser directement Parallel.ForEach sans gestion d'instance par thread. Il n'y a pas de plafond de débit, quel que soit le niveau de prix.
Quelles versions de .NET sont prises en charge par IronBarcode ?
IronBarcode prend en charge .NET Framework 4.6.2+, .NET Core 3.1 et .NET 5, 6, 7, 8 et 9 dans un seul package NuGet. Les plates-formes visées sont Windows x64/x86, Linux x64 et macOS x64/ARM.
Comment installer IronBarcode for .NET dans un projet .NET ?
Installez IronBarcode via NuGet : exécutez "Install-Package IronBarCode" dans la console du Package Manager, ou "dotnet add package IronBarCode" dans le CLI. Aucun installateur SDK ou fichier d'exécution supplémentaire n'est nécessaire.
Puis-je évaluer IronBarcode avant de l'acheter, contrairement à Accusoft BarcodeXpress ?
Oui. Le mode d'essai d'IronBarcode renvoie des valeurs de code-barres décodées complètes - seules les images de sortie générées reçoivent un filigrane. Vous pouvez comparer la précision de lecture sur vos propres documents avant de vous engager dans un achat.
Quelle est la différence de prix entre Accusoft BarcodeXpress et IronBarcode ?
IronBarcode est proposé à partir de 749 dollars pour une licence perpétuelle pour un seul développeur couvrant le développement et la production. Les détails des prix et les options de volume sont disponibles sur la page de licence d'IronBarcode. Il n'est pas nécessaire de disposer d'une licence d'exécution distincte.
Est-il simple de migrer d'Accusoft BarcodeXpress vers IronBarcode ?
La migration d'Accusoft BarcodeXpress vers IronBarcode implique principalement le remplacement des appels API basés sur les instances par les méthodes statiques d'IronBarcode, la suppression du boilerplate de licence et la mise à jour des noms de propriétés des résultats. La plupart des migrations impliquent une réduction du code plutôt qu'un ajout.
IronBarcode génère-t-il des codes QR avec des logos ?
Oui. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") incorpore une image de marque dans un code QR de manière native avec une correction d'erreur configurable. Les codes QR colorés sont également pris en charge via ChangeBarCodeColor().

