Zum Fußzeileninhalt springen
MIT ANDEREN KOMPONENTEN VERGLEICHEN

Wie man Barcodes in ZXing für C#-Entwickler scannt

Accusoft BarcodeXpressvs IronBarcode: Lizenzierung, Durchsatz und API-Kompromisse

Wenn Sie eine Barcode-Bibliothek anhand ihrer Testversion evaluieren, erwarten Sie, dass Sie sehen können, ob sie tatsächlich mit Ihren Bildern funktioniert, bevor Sie sich zum Kauf entscheiden. Accusoft BarcodeXpressbietet Ihnen diese Option nicht. Im Evaluierungsmodus werden dekodierte Barcode-Werte mit dem String " UNLICENSED accusoft.com " gestempelt und generierte 2D-Barcodes tragen denselben Stempel. Sie können überprüfen, ob die Bibliothek einen Barcode findet, aber nicht, ob sie den Barcode korrekt liest. Das ist eine Situation, in der man sich festlegt, bevor man die Transaktion überprüft, und das stellt einen erheblichen Reibungspunkt dar, noch bevor man sich mit der Preisgestaltung befasst hat.

Accusoft BarcodeXpressverstehen

Accusoft entwickelt seit Jahrzehnten Dokumentenverarbeitungssoftware für Enterprise . BarcodeXpress ist Teil einer größeren Produktfamilie, zu der auch PrizmDoc, ImageGear und Accusoft Imaging gehören. Teams, die diese Produkte bereits nutzen, stoßen auf eine vertraute API-Oberfläche und können auf eine bestehende Accusoft-Kontobeziehung zurückgreifen. Für die eigenständige Verwendung von Barcodes bietet dieser Kontext weniger Vorteile.

Das Kern-SDK ist als NuGet Paket for .NET Core verfügbar. Die API ist instanzbasiert — Sie erstellen ein BarcodeXpress-Objekt, konfigurieren die Licensing-Eigenschaft und verwenden dann untergeordnete reader- und writer-Objekte für die eigentlichen Operationen. Das Dual-Key-Lizenzsystem unterscheidet BarcodeXpress von den meisten Alternativen.

Wichtigste architektonische Merkmale von BarcodeXpress:

  • Instanzbasierte API: Jede Operation erfordert eine BarcodeXpress-Instanz; statische Komfortmethoden sind nicht Teil des Entwurfs
  • Zwei-Schicht-Lizenzierung: SDK-Lizenzierung (SetSolutionName + SetSolutionKey) und OEM/Runtime-Lizenzierung (SetOEMLicenseKey) sind separate Systeme, die separate Käufe erfordern
  • Evalutionsmodus-Stempel: Im Evaluierungsmodus werden dekodierte Werte mit " UNLICENSED accusoft.com " gestempelt (und generierte 2D-Barcodes werden mit demselben String gestempelt), was einen Test der Genauigkeit vor dem Kauf unmöglich macht
  • Manuelle Formatspezifikation: Der Leser erfordert eine explizite BarcodeTypes-Konfiguration, um zu bestimmen, welche Symbologien durchsucht werden sollen; nicht spezifizierte Formate werden nicht erkannt
  • Standard-Obergrenze von 40 Seiten pro Minute: Die Standard Edition drosselt die Verarbeitung auf 40 Seiten pro Minute, eine Grenze, die die meisten Teams eher nach der Bereitstellung als vorher erreichen.
  • Keine native PDF-Unterstützung: PDF-Dateien müssen mithilfe einer separaten Bibliothek in Bilder umgewandelt werden, bevor der Reader sie verarbeiten kann.
  • Mindestens fünf Laufzeitlizenzen: Selbst für eine Einzelserver-Bereitstellung sind mindestens fünf Laufzeitlizenzen erforderlich.

Das Zwei-Schlüssel-System erklärt

BarcodeXpress unterteilt die Lizenzierung in zwei konzeptionell getrennte Ebenen:

// 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
$vbLabelText   $csharpLabel

Das SetSolutionKey-Paar aktiviert das SDK selbst. Der SetOEMLicenseKey-Aufruf aktiviert die Produktivbereitstellungsfunktionen. Beide müssen vorhanden und gültig sein, damit eine Produktivbereitstellung Barcode-Werte ohne den " UNLICENSED accusoft.com "-Stempel zurückgibt.

Bei der Code-Überprüfung erzeugt dieses Muster eine vorhersehbare Frage: "Warum haben wir zwei separate Lizenzaktivierungen?" Die Antwort — dass Accusoft SDK-Lizenzierung und Bereitstellungslizenzierung als separate Produkte mit getrennten Abrechnungen behandelt — ist nicht immer offensichtlich aus der API selbst. Teams, die diesen Code sechs Monate nach der Ersteinrichtung warten, müssen oft in der Dokumentation nachschlagen, um zu verstehen, welche Taste welche Funktion hat.

Ohne gültige OEM-Lizenz wirft SetOEMLicenseKey einen Fehler und das SDK fällt in den Evaluierungsmodus zurück. Teams ummanteln die Aktivierung typischerweise in try/catch, damit das Scheitern lautstark protokolliert wird, anstatt im Hintergrund gestempelte Barcode-Werte in der Produktion zu produzieren:

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
$vbLabelText   $csharpLabel

Dieses Schutzmuster fügen Teams hinzu, wenn sie erkennen, dass die Ausgabe im Evaluierungsmodus Ergebnisse stillschweigend stempelt, anstatt während der Dekodierung zu werfen.

IronBarcode verstehen

IronBarcode ist eine eigenständige .NET -Barcode-Bibliothek, die außer ihrem NuGet Paket keine externen Abhängigkeiten aufweist. Es übernimmt sowohl die Generierung als auch das Lesen über statische Factory-Methoden, was bedeutet, dass kein Instanzlebenszyklus verwaltet werden muss und keine Konstruktoraufrufe im Anwendungscode verstreut sind.

Das Single-Key-Lizenzierungsmodell bedeutet, dass das, was Sie im Testmodus testen, auch in der Produktion zum Einsatz kommt – der einzige Unterschied besteht in einem Wasserzeichen auf den generierten Barcode-Bildern während der Testphase. Die dekodierten Werte sind immer vollständig, sodass Sie die Lesegenauigkeit anhand Ihrer tatsächlichen Dokumente überprüfen können, bevor Sie sich für den Kauf entscheiden.

Hauptmerkmale von IronBarcode:

  • Statische API-Design: BarcodeReader.Read() und BarcodeWriter.CreateBarcode() sind zustandslose statische Methoden — keine Instanzverwaltung erforderlich
  • Einzelner Lizenzschlüssel: Ein Schlüssel deckt sowohl die Entwicklungs- als auch die Produktionsumgebung ab; es gibt keine separate Laufzeitlizenzschicht
  • Vollständige Testwerte: Der Testmodus liefert die vollständig dekodierten Werte zurück; Das Wasserzeichen gilt nur für die generierten Ausgabebilder, nicht für die Leseergebnisse.
  • Automatische Formaterkennung: IronBarcode erkennt die Symbolik in allen unterstützten Formaten automatisch; keine BarcodeTypes-Enumeration erforderlich
  • Native PDF-Unterstützung: BarcodeReader.Read("document.pdf") verarbeitet PDF-Dateien direkt ohne einen separaten Rendering-Schritt
  • Keine Durchsatzbegrenzung: Die Verarbeitungsgeschwindigkeit wird nur durch die Hardware- und Netzwerkkapazität begrenzt, nicht durch eine softwareseitig festgelegte Obergrenze.
  • Thread-sicher von Grund auf: Zustandslose statische Methoden können gleichzeitig von beliebig vielen Threads ohne Instanzisolation aufgerufen werden.

Funktionsvergleich

Feature Accusoft BarcodeXpress IronBarcode
Lizenzmodell SDK-Lizenz + separate Laufzeitlizenz Ein einziger ewiger Schlüssel
Verhalten im Auswertungsmodus Barcode-Werte gestempelt mit " UNLICENSED accusoft.com " Es werden vollständige Werte zurückgegeben, ein Wasserzeichen wird nur auf der generierten Ausgabe angezeigt.
Durchsatzgrenze (Standard) 40 Seiten pro Minute Keine Durchsatzbegrenzung
PDF-Unterstützung Für die Bildextraktion wird eine externe PDF-Bibliothek benötigt. Native — BarcodeReader.Read("doc.pdf")
API-Stil Instanzbasierte, ausführliche Konfiguration Statische Factory-Methoden, flüssige API
Thread-Sicherheit Instanz pro Thread erforderlich Zustandslose statische Methoden – von Natur aus threadsicher
Einstiegspreis 1.960 $ + SDK + 2.500 $ + Laufzeit (mind. 5) 749 $ Dauerlizenz (Lite, 1 Entwickler)

Detaillierter Funktionsvergleich

Feature Accusoft BarcodeXpress IronBarcode
Lizenzierung
Lizenzmodell SDK-Schlüssel + Laufzeitschlüssel Ein einziger ewiger Schlüssel
Mindestlaufzeitlizenzen 5 (auch für 1 Server) Konzept ohne Laufzeitlizenz
Auswertungsmodus Werte gestempelt mit " UNLICENSED accusoft.com " Vollständige Werte, Wasserzeichen nur auf den Ausgabebildern
Unbefristete Lizenz Nicht Standard – bitte kontaktieren Sie den Vertrieb. Ja, alle Stufen.
Jährliche Erneuerung Für die Unterstützung erforderlich Optional
Lektüre
automatische Formaterkennung Manuell – Barcode-Typen müssen angegeben werden Automatischer Ablauf über alle unterstützten Formate hinweg
PDF lesen Erfordert eine externe PDF-Bibliothek Native
Mehrere Barcodes pro Bild Ja, mit BarcodeTypes-Konfiguration Ja, mit ExpectMultipleBarcodes-Option
Ergebniseigenschaften BarcodeValue, BarcodeType Value, Format, Confidence, PageNumber
Durchsatzgrenze 40 PPM (Standardausgabe) Keine Begrenzung auf keiner Stufe
Generation
Code 128-Generierung Ja, über writer.BarcodeType Ja, über BarcodeWriter.CreateBarcode()
QR-Code-Generierung Ja Ja, über QRCodeWriter.CreateQrCode()
QR-Code mit Logo Manuelle Bildüberlagerung erforderlich AddBrandLogo("logo.png") eingebaut
Ausgabeformate Datei speichern PNG, JPG, PDF, Binärdaten, Datenstrom
Plattform und Bereitstellung
.NET Framework Separates Legacy-SDK .NET Framework4.6.2+
.NET Core / .NET 5+ Ja (.NET Core SDK) .NET Core 3.1+, .NET 5/6/7/8/9
Linux/Docker Ja Ja – Windows x64/x86, Linux x64, macOS x64/ARM
Docker-Lizenzkonfiguration Lizenzdatei oder Lizenzserver Umgebungsvariable
CI/CD-Integration Sowohl SDK- als auch Laufzeitschlüssel erforderlich Ein Geheimnis
Batch-Verarbeitung
Gewindesicherheit Instanz pro Thread erforderlich Staatenlos — Parallel.FürJeden sicher
Paralleler Batch Erfordert eine Instanzverwaltung pro Thread. Direkte Parallele.ForEach-Unterstützung

Lizenzarchitektur

Der Unterschied in der Komplexität der Lizenzierung zwischen BarcodeXpress und IronBarcode wird am deutlichsten beim Schreiben von Initialisierungscode, der in der Produktion ausgeführt werden soll.

BarcodeXpress-Ansatz

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
$vbLabelText   $csharpLabel

Dieser Konstruktor existiert ausschließlich, um zwei separate Lizenzaktivierungen zu verwalten, bevor eine Barcode-Operation stattfinden kann. Der try/catch-Block um SetOEMLicenseKey ist nicht optional — ohne ihn wird der Dienst stillschweigend gestempelte Werte in jeder Umgebung zurückgeben, in der der OEM-Schlüssel fehlt oder falsch konfiguriert ist.

IronBarcode Ansatz

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"
$vbLabelText   $csharpLabel

Das ist die vollständige Einrichtung der Lizenzierung. Keine separate Freischaltung zur Laufzeit, kein Lösungsname, kein Zwei-Argumente-UnlockRuntime-Aufruf. In Docker wird dies zu einer Umgebungsvariablen, die beim Start ausgelesen wird. In einer CI/CD-Pipeline ist es ein Geheimnis. In einem Container-Orchestrator handelt es sich um eine Umgebungsvariable, die in den Pod injiziert wird.

Lesen von Barcodes

Das Lesen von Barcodes offenbart den Unterschied zwischen den Konfigurationsphilosophien der beiden Bibliotheken – BarcodeXpress erfordert eine explizite Formataufzählung und eine eigenschaftsbasierte Setup-API, während IronBarcode alles automatisch mit einem einzigen Methodenaufruf erkennt.

BarcodeXpress-Ansatz

Lesen mit BarcodeXpress erfordert das Laden des Bildes in einen System.Drawing.Bitmap, das Zuweisen der Symbologiesammlung an reader.BarcodeTypes als System.Array von BarcodeType-Werten und das Aufrufen von Analyze(bitmap), um Ergebnisse abzurufen. Das SDK liest PDFs nicht direkt — dokumentierte Eingabeformate sind TIFF, JPEG, PNG und 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
$vbLabelText   $csharpLabel

Analyze nimmt ein Bitmap und gibt ein Result[] zurück. Wenn ein Dokument ein Format enthält, das im BarcodeTypes-Array nicht vorhanden ist, wird es nicht gefunden. Dies führt zu einem erhöhten Wartungsaufwand, wenn sich die Dokumentquellen ändern. PDFs erfordern ein vorheriges Rendern zu Bildern mit einer separaten Bibliothek, bevor sie in Analyze eingespeist werden können.

IronBarcode Ansatz

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
$vbLabelText   $csharpLabel

IronBarcode erkennt das Format automatisch für alle unterstützten Symbologien. Wenn das Bild einen Code 128, einen QR-Code und eine DataMatrix enthält, werden alle drei ohne Konfigurationsänderung in der Ergebnisliste angezeigt. Für eine bessere Kontrolle über das Leseverhalten bietet die Klasse BarcodeReaderOptions Einstellungen für Geschwindigkeit, Thread-Anzahl und Multi-Barcode-Unterstützung.

Das native Lesen von PDFs ist ebenfalls über dieselbe Methode möglich:

using IronBarCode;

// NativePDF 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;

// NativePDF 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

' NativePDF 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
$vbLabelText   $csharpLabel

BarcodeXpress kann PDFs nicht nativ lesen. Sie müssen jede Seite zunächst mithilfe einer separaten Bibliothek in ein Bild umwandeln und diese Bilder dann an den BarcodeXpress-Leser übergeben. Dadurch entsteht eine Abhängigkeit, ein zusätzlicher Konvertierungsschritt und je nach gewählter PDF-Bibliothek weitere Lizenzkosten.

Stapelverarbeitung und Gewindesicherheit

Die Verarbeitung großer Mengen von Barcodes offenbart den architektonischen Unterschied zwischen dem zustandsbehafteten Instanzmodell von BarcodeXpress und der zustandslosen statischen API von IronBarcode.

BarcodeXpress-Ansatz

BarcodeXpress ist instanzbasiert und sein reader-Objekt ist zustandsbehaftet. Die parallele Verarbeitung erfordert eine Instanz pro Thread, wobei die vollständige zweistufige Lizenzinitialisierung in jedem Thread-Kontext wiederholt wird:

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
$vbLabelText   $csharpLabel

Die Standardausgabe sieht außerdem eine maximale Lesegeschwindigkeit von 40 Seiten pro Minute vor. Die Bearbeitung eines Stapels von 100.000 Dokumenten bei einer Geschwindigkeit von 40 Seiten pro Minute dauert etwa 41 Stunden. Die Professional Edition hebt diese Beschränkung auf, allerdings zu höheren Kosten pro Entwickler – zusätzlich zu den bereits erworbenen Laufzeitlizenzen.

IronBarcode Ansatz

using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;

// 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;

// 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

' 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)
$vbLabelText   $csharpLabel

Da die statischen Methoden von IronBarcode zustandslos sind, ist Parallel.ForEach über ihnen sicher, ohne dass eine Instanzisolierung erforderlich ist. IronBarcode setzt in keiner Preisstufe eine Durchsatzbegrenzung fest. Um die Leseleistung zu optimieren, bietet die BarcodeReaderOptions-Klasse ReadingSpeed- und MaxParallelThreads-Einstellungen:

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)
$vbLabelText   $csharpLabel

ReadingSpeed.Balanced ist der Standard. Verwenden Sie ReadingSpeed.Faster für Hochdurchsatz-Pipelines, bei denen die Barcodes sauber sind, oder ReadingSpeed.Detailed für beschädigte oder kontrastarme Bilder.

API-Mapping-Referenz

Accusoft BarcodeXpress IronBarcode
new BarcodeXpress(".") Statische Methoden – keine Instanz erforderlich
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 um die OEM-Aktivierung (removed — license is always either valid or not)
reader.Analyze(bitmap) (lädt zuerst System.Drawing.Bitmap) 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)
40 ppm Standardgrenzwert Keine Durchsatzbegrenzung auf keiner Ebene
Bewertung: Werte gestempelt mit " UNLICENSED accusoft.com " Testversion: volle Werte, Wasserzeichen nur auf den Ausgabebildern

Wenn Teams einen Wechsel von Accusoft BarcodeXpresszu IronBarcode erwägen

Skalierung jenseits der 40-ppm-Grenze

Die Begrenzung der Standardausgabe auf 40 Seiten pro Minute klingt großzügig, bis ein Geschäftsteam beschließt, am Ende des Tages eine Stapelverarbeitung für die archivierten Rechnungen eines ganzen Jahres durchzuführen. Bei diesem Tempo dauert die Bearbeitung eines Stapels von 100.000 Dokumenten etwa 41 Stunden. Der Wechsel zur Professional Edition beseitigt zwar die Beschränkung, führt aber zu höheren Kosten pro Entwicklerplatz – zusätzlich zu den bereits erworbenen Laufzeitlizenzen. Teams, die die Durchsatzgrenze erst nach Unterzeichnung eines Kaufvertrags entdecken, stellen oft fest, dass die Gesamtkosten für deren Beseitigung die ursprünglichen Schätzungen erheblich übersteigen.

Lizenzierungskomplexität der CI/CD-Pipeline

Ein typisches CI/CD-Setup führt Builds in kurzlebigen Containern aus. Bei BarcodeXpress benötigt jede Build-Umgebung sowohl das SDK-Schlüsselpaar als auch die Laufzeit-Entsperrschlüssel, die als separate Geheimnisse verwaltet werden. Wenn der Laufzeitschlüssel fehlt oder falsch konfiguriert ist, kann der Build zwar erfolgreich sein, aber Integrationstests liefern verschleierte Werte – ein stiller Fehler, der in einer Testpipeline leicht übersehen werden kann, wenn die Testzusicherungen nicht sorgfältig anhand des tatsächlichen Barcode-Inhalts geschrieben werden.

Anforderungen an eine abgeschottete und sichere Bereitstellung

In einigen Umgebungen – wie etwa Gesundheitssystemen, die Patientendaten verarbeiten, Dokumentenworkflows der Regierung oder Backoffice-Prozessen von Finanzinstituten – ist eine Lizenzvalidierung bei ausgehenden Netzwerkanrufen nicht möglich. Das Laufzeitlizenzsystem von BarcodeXpress nutzt die Lizenzinfrastruktur von Accusoft, was in Umgebungen mit strengen Beschränkungen des ausgehenden Netzwerkzugriffs zu Compliance-Problemen führen kann. Teams, die in solchen Umgebungen arbeiten, wählen oft Bibliotheken, deren Lizenzvalidierung vollständig lokal erfolgt.

Docker und Containerbereitstellung

BarcodeXpress in Docker erfordert typischerweise entweder das Einbinden einer Lizenzdatei in den Container unter einem bekannten Pfad oder die Konfiguration eines Lizenzservers und die Angabe des entsprechenden Pfads im Container. Beide Ansätze erhöhen die Komplexität der Bereitstellung – Lizenzdateien müssen verteilt und synchronisiert werden, und ein Lizenzserver stellt eine zusätzliche Infrastrukturkomponente dar, die gewartet werden muss. Teams, die auf Microservice-Architekturen oder serverlose Bereitstellungsmuster umsteigen, stellen fest, dass sich der Ansatz mit Konfigurationsdateien nicht sauber in unveränderliche Container-Images übersetzen lässt.

Anforderungen an die Genauigkeit der Bewertung

Teams, die die Lesegenauigkeit ihrer eigenen Dokumente überprüfen müssen, bevor sie sich zum Kauf entscheiden, empfinden den Evaluierungsmodus von BarcodeXpress als grundlegend einschränkend. Tests mit realen Dokumentenscans – bei denen geprüft wird, ob die Bibliothek mit kontrastarmen Barcodes, verzerrten Bildern oder Seiten mit mehreren Barcodes zurechtkommt – erfordern vollständig dekodierte Werte. Die teilweise verdeckte Ausgabe zeigt lediglich an, dass die Bibliothek einen Barcode gefunden hat, nicht aber, ob sie ihn korrekt gelesen hat.

Gemeinsame Überlegungen zur Migration

Instanzverwaltung für statische Aufrufe

BarcodeXpress erfordert, dass eine BarcodeXpress-Instanz erstellt und lizenziert wird, bevor eine Operation stattfindet. Die statischen Methoden von IronBarcode benötigen keine Instanz. Teams, die migrationsbedingt umstellen, haben in der Regel eine BarcodeService-Klasse, deren Konstruktor größtenteils Lizenzierungs-Standardtext ist — nach der Migration kann dieser Konstruktor vollständig entfernt oder auf eine einzelne Lizenzschlüsselzuweisung reduziert werden.

Entfernung der BarcodeTypes-Aufzählung

Jede BarcodeXpress-Leseoperation erfordert eine BarcodeTypes-Array-Zuweisung, um festzulegen, welche Symbologien durchsucht werden sollen. IronBarcode erkennt standardmäßig alle unterstützten Formate automatisch. Während der Migration können alle reader.BarcodeTypes = ...-Zuweisungen ohne Ersatz gelöscht werden. Wenn es einen Leistungsgrund gibt, den Suchbereich einzuschränken, unterstützt BarcodeReaderOptions die Formatfilterung als explizite Opt-in-Option und nicht als erforderlichen Standard.

Ergebnis: Änderungen des Eigenschaftsnamens

Zwei Umbenennungen von Eigenschaften betreffen den gesamten ergebnisverarbeitenden Code: result.BarcodeValue wird zu result.Value, und result.BarcodeType wird zu result.Format. Eine lösungsweite Such- und Ersetzungsfunktion erledigt beides. IronBarcode-Ergebnisse bieten auch result.Confidence und result.PageNumber, die kein BarcodeXpress-Äquivalent haben und für zusätzliche Filterung ohne Codeänderungen zur vorhandenen Ergebnisverarbeitung verwendet werden können.

Docker-Lizenzkonfiguration

BarcodeXpress Docker-Bereitstellungen verwenden typischerweise eine eingebundene Lizenzkonfigurationsdatei. IronBarcode verwendet eine Umgebungsvariable. Die Migration beinhaltet das Entfernen der COPY-Anweisung für die Konfigurationsdatei und das Hinzufügen einer einzigen Umgebung variablen Zuweisung. In Kubernetes wird der Lizenzschlüssel zu einer geheimen Referenz in der Pod-Spezifikation anstatt zu einem eingebundenen Volume.

Zusätzliche IronBarcode Funktionen

Über die in diesem Vergleich behandelten Kernfunktionen hinaus bietet IronBarcode Funktionen, die nicht zum Angebot von BarcodeXpress gehören:

  • QR-Code mit Logo: QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") bettet ein Markenimage nativ in einen QR-Code ein, mit konfigurierbarem Fehlerkorrekturlevel, um die Scan-Zuverlässigkeit zu erhalten
  • Barcode-Aufdruck auf PDFs : Barcodes direkt in bestehende PDF-Dokumente schreiben, ohne separate PDF-Bibliothek
  • Stapelverarbeitungsexport : Verarbeiten Sie ganze PDF-Dokumente in einem einzigen Aufruf und erhalten Sie Ergebnisse pro Seite mit Seitenzahl, Format, Wert und Konfidenzbewertung.

.NET-Kompatibilität und Zukunftsfähigkeit

IronBarcode unterstützt .NET Framework4.6.2 und höher, .NET Core 3.1 sowie .NET 5, 6, 7, 8 und 9. Zu den Zielplattformen gehören Windows x64 und x86, Linux x64 sowie macOS x64 und ARM. BarcodeXpress for .NET Core ist ein separates SDK von der älteren .NET FrameworkEdition – Teams, die das Zielframework ihrer Anwendung aktualisieren, müssen dies berücksichtigen. Das Einzelpaket von IronBarcode deckt alle unterstützten Laufzeitumgebungen ab. Regelmäßige Updates verfolgen neue .NET-Veröffentlichungen, sobald sie veröffentlicht werden.

Abschluss

BarcodeXpress und IronBarcode repräsentieren zwei unterschiedliche Designphilosophien für kommerzielle .NET -Barcodebibliotheken. BarcodeXpress behandelt den SDK-Zugriff und die Produktionsbereitstellung als separate lizenzierte Produkte mit separater Abrechnung, separaten Schlüsselsystemen und separaten Mindestabnahmemengen. IronBarcode behandelt die Bibliothek als ein einziges Produkt mit einem einzigen Schlüssel, der alle Umgebungen von der Entwicklung bis zur Produktion abdeckt.

BarcodeXpress ist eine sinnvolle Wahl für Teams, die bereits in das Accusoft-Produktökosystem eingebunden sind – Organisationen, die PrizmDoc oder ImageGear verwenden, werden die API von BarcodeXpress als vertraut empfinden und ihre Accusoft-Kontobeziehung für einen konsolidierten Support als nützlich empfinden. Für diese Teams stellt das Zwei-Schlüssel-Lizenzsystem ein etabliertes Betriebsmuster und keine neue Reibungsquelle dar. Das SDK eignet sich auch für Umgebungen, in denen die Dokumentenquellen gut kontrolliert sind und die Formatvorgaben stabil sind, was die manuelle BarcodeTypes-Spezifikation zu einer akzeptablen einmaligen Konfiguration macht, anstatt laufender Wartung.

IronBarcode eignet sich besser für Teams, die in Containern, CI/CD-Pipelines und Cloud-Umgebungen arbeiten, wo die Komplexität des Lizenzmanagements den operativen Aufwand direkt beeinflusst. Das automatische Erkennungsmodell, die statische API und die native PDF-Unterstützung reduzieren den Umfang des Integrationscodes, und das Einzelschlüssel-Lizenzmodell vereinfacht die Geheimnisverwaltung in Entwicklungs-, Test- und Produktionsumgebungen. Für Teams, die die Lesegenauigkeit vor dem Kauf bewerten müssen, ermöglicht die vollständige Testausgabe – Wasserzeichen auf den generierten Bildern, nicht auf den Leseergebnissen – ein echtes Benchmarking vor dem Kauf.

Die Preisunterschiede sind in jeder Preisstufe erheblich. Auf Ebene einzelner Entwickler ist die Kluft zwischen dem BarcodeXpress SDK Plus minimalen Laufzeitlizenzen und der Lite Version von IronBarcode beträchtlich. Für Teams, bei denen die Kostenunterschiede zugunsten der Integration in das Accusoft-Ökosystem zweitrangig sind, bleibt BarcodeXpress eine sinnvolle Wahl. Für Teams, die Barcode-Bibliotheken anhand ihrer eigenen Vorzüge evaluieren, ist IronBarcode aufgrund der Einschränkungen im Evaluierungsmodus, der Zwei-Schlüssel-Lizenzierung und der Durchsatzbegrenzungen die unkompliziertere Option.

Hinweis:Accusoft ist ein eingetragenes Warenzeichen seines jeweiligen Eigentümers. Diese Seite ist weder mit Accusoft verbunden noch von ihnen genehmigt oder gesponsert. Alle Produktnamen, Logos und Marken sind Eigentum ihrer jeweiligen Eigentümer. Vergleiche dienen nur zu Informationszwecken und spiegeln öffentlich zugängliche Informationen zum Zeitpunkt des Schreibens wider.

Häufig gestellte Fragen

Was ist Accusoft BarcodeXpress?

Accusoft BarcodeXpress ist eine .NET-Barcode-Bibliothek zum Erzeugen und Lesen von Barcodes in C#-Anwendungen. Sie ist eine von mehreren Alternativen, die Entwickler bei der Auswahl einer Barcode-Lösung for .NET-Projekte in Betracht ziehen.

Was sind die Hauptunterschiede zwischen Accusoft BarcodeXpress und IronBarcode?

IronBarcode verwendet eine statische, zustandslose API, die keine Instanzverwaltung erfordert, während Accusoft BarcodeXpress in der Regel eine Instanzerstellung und -konfiguration vor der Verwendung erfordert. IronBarcode bietet außerdem native PDF-Unterstützung, automatische Formaterkennung und Single-Key-Lizenzierung in allen Umgebungen.

Ist IronBarcode einfacher zu lizenzieren als Accusoft BarcodeXpress?

IronBarcode verwendet einen einzigen Lizenzschlüssel, der sowohl die Entwicklungs- als auch die Produktionsbereitstellung abdeckt. Dies vereinfacht CI/CD-Pipelines und Docker-Konfigurationen im Vergleich zu Lizenzierungssystemen, die SDK-Schlüssel von Laufzeitschlüsseln trennen.

Unterstützt IronBarcode alle Barcodeformate, die auch Accusoft BarcodeXpress unterstützt?

IronBarcode unterstützt über 30 Barcode-Symbologien, darunter QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 und viele mehr. Die automatische Formaterkennung bedeutet, dass keine explizite Formataufzählung erforderlich ist.

Unterstützt IronBarcode das native Lesen von PDF-Barcodes?

Ja, IronBarcode liest Barcodes direkt aus PDF-Dateien mit BarcodeReader.Read("document.pdf"), ohne dass eine separate PDF-Rendering-Bibliothek erforderlich ist. Die seitenweisen Ergebnisse umfassen Seitenzahl, Barcodeformat, Wert und Konfidenzwert.

Wie handhabt IronBarcode die Stapelverarbeitung im Vergleich zu Accusoft BarcodeXpress?

Die statischen Methoden von IronBarcode sind zustandslos und natürlich thread-sicher, was die direkte Verwendung von Parallel.ForEach ohne Instanzverwaltung pro Thread ermöglicht. Es gibt auf keiner Preisstufe eine Obergrenze für den Durchsatz.

Welche .NET Versionen werden von IronBarcode unterstützt?

IronBarcode unterstützt .NET Framework 4.6.2+, .NET Core 3.1 und .NET 5, 6, 7, 8 und 9 in einem einzigen NuGet-Paket. Zu den Zielplattformen gehören Windows x64/x86, Linux x64 und macOS x64/ARM.

Wie installiere ich IronBarcode in einem .NET-Projekt?

Installieren Sie IronBarcode über NuGet: Führen Sie "Install-Package IronBarCode" in der Paketmanager-Konsole oder "dotnet add package IronBarCode" in der CLI aus. Es sind keine zusätzlichen SDK-Installationsprogramme oder Laufzeitdateien erforderlich.

Kann ich IronBarcode vor dem Kauf testen, im Gegensatz zu Accusoft BarcodeXpress?

Ja, der Testmodus von IronBarcode liefert vollständige dekodierte Barcodewerte - nur die erzeugten Ausgabebilder erhalten ein Wasserzeichen. Sie können die Lesegenauigkeit an Ihren eigenen Dokumenten testen, bevor Sie sich zum Kauf verpflichten.

Was ist der Preisunterschied zwischen Accusoft BarcodeXpress und IronBarcode?

Die Preise für IronBarcode beginnen bei 749 US-Dollar für eine unbefristete Einzelentwicklerlizenz für Entwicklung und Produktion. Preisdetails und Volumenoptionen sind auf der IronBarcode-Lizenzierungsseite verfügbar. Es ist keine separate Runtime-Lizenz erforderlich.

Ist der Umstieg von Accusoft BarcodeXpress auf IronBarcode einfach?

Bei der Migration von Accusoft BarcodeXpress zu IronBarcode geht es in erster Linie darum, instanzbasierte API-Aufrufe durch statische Methoden von IronBarcode zu ersetzen, Lizenzierungsvorlagen zu entfernen und die Namen von Ergebniseigenschaften zu aktualisieren. Bei den meisten Migrationen wird eher Code reduziert als hinzugefügt.

Kann IronBarcode QR-Codes mit Logos generieren?

Ja. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") bettet ein Markenbild nativ in einen QR-Code mit konfigurierbarer Fehlerkorrektur ein. Farbige QR-Codes werden auch über ChangeBarCodeColor() unterstützt.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen

Iron-Support-Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an