Zum Fußzeileninhalt springen
MIT ANDEREN KOMPONENTEN VERGLEICHEN

Welche C#-Barcode-Bibliothek sollten Sie für die .NET -Entwicklung verwenden?

Jeder Entwickler, der Aspose.BarCode verwendet hat, hat eine Version dieser Zeile geschrieben: new BarCodeReader(path, DecodeType.Code128). Es funktioniert einwandfrei, wenn man weiß, welches Format das Bild hat. Wenn Sie dies nicht tun – wenn ein Dokument von einem externen System, einem Lieferanten, der das Etikettenformat geändert hat, oder einem Benutzer-Upload stammt – raten Sie entweder eine Liste von Decodier-Typen oder verwenden DecodeType.AllSupportedTypes, das typischerweise langsamer ist, gemäß Aspose's eigener Anleitung. Die Anforderung an die Formatvorgabe ist zwar kein K.O.-Kriterium, aber sie führt zu alltäglichen Reibungsverlusten, die sich bei jedem Lesevorgang in Ihrer Codebasis summieren.

Die PDF-Geschichte ist die Budgetgeschichte. Wenn Sie Barcodes aus PDF-Dokumenten verarbeiten, kann Aspose.BarCode dies nicht allein leisten. Sie benötigen Aspose.PDF for .NET, um die Seiten zuerst in Bilder zu rendern. Aspose.PDF ist ein separates Abonnementprodukt zu dem, was Sie bereits für Aspose.BarCode bezahlen. Zwei Abonnements für einen Workflow, den die meisten Entwickler als eine einzige Aufgabe betrachten.

IronBarcode erkennt Barcode-Formate automatisch, liest PDFs nativ in einem einzigen Paket und bietet eine unbefristete Lizenz ab 749 US-Dollar. Dieser Vergleich untersucht beide Bibliotheken detailliert, damit Sie eine fundierte Entscheidung treffen können.

Aspose.BarCode verstehen

Aspose entwickelt seit Jahren Dokumentenverarbeitungsbibliotheken für .NET, Java und andere Plattformen. Aspose.BarCode ist eines von vielen Produkten dieser Familie, neben Aspose.Words, Aspose.Cells, Aspose.PDF, Aspose.Slides und etwa einem Dutzend weiterer Produkte. Für Teams, die bereits Aspose.Total – das Paket mit allen Aspose-Produkten – nutzen, entstehen durch die Integration von Aspose.BarCode keine zusätzlichen Kosten. Für Teams, die lediglich eine Barcode-Bibliothek benötigen, ist das Abonnementmodell hingegen schwerer zu rechtfertigen.

Aspose.BarCode unterstützt über 80 Barcode-Symbologien, eine der vollständigsten Formatlisten in jeder kommerziellen .NET-Barcode-Bibliothek. Diese Bandbreite ist das stärkste Verkaufsargument der Bibliothek. Die API-Oberfläche ist entsprechend groß, und die Ausführlichkeit der API nimmt mit den Funktionen zu. Um einen einfachen Code-128-Barcode zu erzeugen, muss ein BarcodeGenerator instanziiert, XDimension, BarHeight und andere Parameter festgelegt und dann Save mit einem expliziten Formatargument aufgerufen werden. Das Lesen erfordert die Angabe, welche Decodier-Typen durchsucht werden sollen, und dann das Iterieren der von ReadBarCodes() zurückgegebenen Ergebnisse. Beide Operationen funktionieren einwandfrei – sie sind nur etwas ausführlicher als nötig.

Wichtigste architektonische Merkmale von Aspose.BarCode:

  • Format-First-Lesemodell: Jeder Lesevorgang erfordert eine explizite Angabe von DecodeType. Das Fallback DecodeType.AllSupportedTypes ist typischerweise langsamer als eine gezielte Liste, da der Decoder alle bekannten Symboliken der Reihe nach durchläuft.
  • Instance-Based API: Sowohl BarCodeReader als auch BarcodeGenerator sind instanziierte Objekte, die IDisposable implementieren. Sie sollten in using-Blöcke eingebunden werden, um native Ressourcen freizugeben.
  • Keine native PDF-Unterstützung: Aspose.BarCode kann PDF-Dokumente nicht direkt öffnen oder darstellen. Das Lesen von Barcodes aus PDFs erfordert Aspose.PDF, ein separates Abonnementprodukt.
  • Tiefe Parameterhierarchie: Anpassungen werden über generator.Parameters.Barcode.*-Eigenschafts-Ketten behandelt – eine mehrstufige Objekt-Hierarchie, die das Auswendiglernen erfordert.
  • Abonnementlizenzierung: Laut den veröffentlichten Preisen von Aspose sind die Entwickler- und Site-Stufen jährliche Abonnements; Eine eigenständige unbefristete Option wird nicht aufgeführt.
  • Datei-basierte Lizenzaktivierung: Produktionsbereitstellungen erfordern eine .lic-Datei, die über einen bekannten Pfad zugänglich ist, was einen Bereitstellungsschritt für Docker- und Kubernetes-Umgebungen hinzufügt.

Das Format-First-Lesemodell

Die Lese-API von Aspose.BarCode basiert auf der Annahme, dass der Aufrufer das Barcode-Format kennt:

using Aspose.BarCode.BarCodeRecognition;

var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
foreach (var result in reader.ReadBarCodes())
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
using Aspose.BarCode.BarCodeRecognition;

var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
foreach (var result in reader.ReadBarCodes())
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
Imports Aspose.BarCode.BarCodeRecognition

Dim reader As New BarCodeReader("barcode.png", DecodeType.Code128)
For Each result In reader.ReadBarCodes()
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
Next
$vbLabelText   $csharpLabel

Wenn man das Format kennt, ist dieses Muster in Ordnung. Das Problem ist jedoch, "wenn man das Format kennt". Ein Einkaufssystem, das Lieferantenrechnungen verarbeitet, kann nicht garantieren, dass jeder Lieferant denselben Barcode-Typ verwendet. Ein Dokumentenmanagementsystem, das Benutzer-Uploads akzeptiert, kann nicht vorhersagen, welches Format ein Scanner verwendet hat. In diesen Fällen ist DecodeType.AllSupportedTypes das Fallback und es ist typischerweise langsamer als eine gezielte Liste von Decodier-Typen.

Der Decoder muss ebenfalls entsorgt werden:

using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
$vbLabelText   $csharpLabel

Die Nichtnutzung von using ist ein Ressourcenleck. BarcodeGenerator implementiert ebenfalls IDisposable, obwohl die Folgen, wenn es nicht entsorgt wird, weniger schwerwiegend sind. In beiden Fällen verwalten Sie die Lebensdauer von Objekten, die eine statische Factory-API automatisch übernehmen würde.

IronBarcode verstehen

IronBarcode verwendet statische Factory-Methoden sowohl zum Lesen als auch zum Schreiben. Es gibt keine Instanz, die erstellt, konfiguriert oder freigegeben werden könnte. Die Lese-API ist standardmäßig formatunabhängig, und der gleiche Aufruf funktioniert unabhängig davon, ob die Quelldatei eine PNG-, JPEG-, TIFF- oder PDF-Datei ist.

IronBarcode wird von Iron Software, einem auf .NET-Entwicklertools spezialisierten Unternehmen, entwickelt und gepflegt. Die Bibliothek basiert auf dem Prinzip, dass das Lesen von Barcodes keine Vorkenntnisse über das Barcode-Format erfordern sollte – die Erkennungs-Engine der Bibliothek ermittelt das Format anhand des Bildinhalts. Zur Generierung wird die in anderen Bibliotheken übliche mehrstufige Parameterhierarchie durch eine flüssige Methodenkette ersetzt.

Hauptmerkmale von IronBarcode:

  • Automatische Format-Erkennung: BarcodeReader.Read() identifiziert die Barcode-Symbolik aus Bildinhalt, ohne dass der Anrufer ein DecodeType-Äquivalent angeben muss.
  • Statische, zustandslose API: Alle Lese- und Schreibvorgänge sind statische Methoden. Es müssen keine Wegwerfinstanzen verwaltet werden, und die API ist von Natur aus threadsicher für die gleichzeitige Nutzung.
  • Nativer PDF-Support: BarcodeReader.Read("doc.pdf") liest direkt aus PDF-Dateien, ohne dass zusätzliche Pakete oder Rendervorgänge erforderlich sind. Die Ergebnisse beinhalten result.PageNumber.
  • Fluent Generation API: BarcodeWriter.CreateBarcode() gibt ein verkettbares Objekt zurück. Die Anpassung erfolgt mittels Methodenverkettung anstelle einer Eigenschaftshierarchie.
  • Dauerlizenzmodell: Alle Stufen bieten einen einmaligen Kauf ohne jährliche Verlängerungspflicht.
  • String-basierte Lizenzaktivierung: Der Lizenzschlüssel wird über IronBarCode.License.LicenseKey festgelegt, kompatibel mit Umgebungsvariablen und CI/CD-Geheimnisverwaltungen.

Funktionsvergleich

Feature Aspose.BarCode IronBarcode
Formaterkennung Manuell – muss DecodeType angeben oder langsame AllSupportedTypes verwenden. Automatischer Ablauf über alle unterstützten Formate hinweg
Symbolik zählen 80+ 50+
PDF-Unterstützung Keine native Unterstützung – separate Aspose.PDF-Lizenz erforderlich. Nativ – BarcodeReader.Read("doc.pdf") integriert im Paket.
Preismodell Nur Abonnement — jährliche Stufen ab 999 $/Jahr Dauerlizenz ab 749 $ (einmalig)
Dauerlizenz Nicht verfügbar Ja, alle Stufen.
API-Stil Instanzbasierte, ausführliche Konfiguration Statische Factory-Methoden, flüssige API
Einwegbedarf Ja – BarCodeReader und BarcodeGenerator. Nein – zustandslose statische Methoden
Thread-Sicherheit Für jeden Thread sind separate Instanzen erforderlich. Statische API — siehe IronBarcode-Dokumentation für Hinweise zum Threading

Detaillierter Funktionsvergleich

Feature Aspose.BarCode IronBarcode
Generation
API-Stil new BarcodeGenerator(EncodeTypes.X, "data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.X)
Anpassungsmodell generator.Parameters.Barcode.*-Eigenschaftshierarchie. Fluente Methodenkette (.ResizeTo(), .ChangeBarCodeColor()).
QR-Code mit Logo Manuelle GDI+-Überlagerung nach der Generierung .AddBrandLogo("logo.png") integriert.
Ausgabe in Bytes generator.GenerateBarCodeImage() .ToPngBinaryData()
Farbige Barcodes generator.Parameters.Barcode.BarColor .ChangeBarCodeColor(Color.X)
Lektüre
Formatspezifikation Erforderlich (DecodeType). Nicht erforderlich – automatisch
Fallback für unbekanntes Format DecodeType.AllSupportedTypes (langsam). Gleicher Anruf – kein Fallback-Modus erforderlich
Leistungsoptimierung QualitySettings-Parameter-Set. ReadingSpeed-Enum – drei Ebenen.
Einweglesegerät Ja – using var reader = new BarCodeReader(...). Nein – statischer Aufruf, kein Objekt zum Freigeben
Ergebniszugriff Iterieren reader.ReadBarCodes(). Rückgabewert von BarcodeReader.Read().
Barcode-Werteigenschaft result.CodeText result.Value
Format Name Eigenschaft result.CodeTypeName result.Format.ToString()
PDF-Unterstützung
Native PDF-Lesung Nein Ja
Erforderlich für PDF Aspose.PDF (separates Abonnement) Kein zusätzliches Paket
Seitenzahl in den Ergebnissen Nicht anwendbar result.PageNumber
Lizenzierung
Lizenzmodell Nur Abonnement, jährliche Verlängerung Dauerhafter, einmaliger Kauf
Einzelentwickler 999 $/Jahr 749 $ einmalig
10 Entwickler 4.995 $/Jahr (Standortlizenz) 2.999 $ einmalig (Professional)
Unbegrenzte Bereitstellungen (10 Entwickler) $13,986/Jahr (Site OEM) 5.999 $ einmalig (unbegrenzt)
PDF-Unterstützung inklusive Nein – separates Aspose.PDF-Abonnement erforderlich. Ja
Plattform und Bereitstellung
Lizenzaktivierung .lic-Dateipfad. String-Schlüssel — Umgebungsvariable
Docker-Einsatz Muss die .lic-Datei ins Image kopieren oder mounten. Umgebungsvariable – keine Datei erforderlich
.NET Framework Ja Ja (4.6.2+)
.NET Core / .NET 5+ Ja Ja (.NET Core 3.1+, .NET 5/6/7/8)
Windows Ja Ja (x64/x86)
Linux Ja Ja (x64)
macOS Ja Ja (x64/ARM)
Docker Ja Ja
Azure / AWS Lambda Ja Ja

API-Generierung

Die API zur Generierung ist der Bereich, in dem der Unterschied in der Ausführlichkeit zwischen den beiden Bibliotheken im alltäglichen Code am deutlichsten sichtbar wird.

Aspose.BarCode-Ansatz

Aspose.BarCode verwendet eine BarcodeGenerator-Klasse mit einer Parameters-Hierarchie für die Konfiguration. Ein minimaler Generierungsaufruf erfordert drei Schritte – Instanziierung, Speicheraufruf und Formatspezifikation. Die tatsächliche Verwendung erfordert typischerweise die Navigation in generator.Parameters.Barcode.*:

using Aspose.BarCode.Generation;
using System.Drawing;

var generator = new BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345");

// Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2;
generator.Parameters.Barcode.BarHeight.Pixels = 100;
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial";
generator.Parameters.Barcode.Padding.Left.Pixels = 10;
generator.Parameters.Barcode.Padding.Right.Pixels = 10;
generator.Parameters.BackColor = Color.White;
generator.Parameters.Resolution = 300;

generator.Save("barcode.png", BarCodeImageFormat.Png);
using Aspose.BarCode.Generation;
using System.Drawing;

var generator = new BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345");

// Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2;
generator.Parameters.Barcode.BarHeight.Pixels = 100;
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial";
generator.Parameters.Barcode.Padding.Left.Pixels = 10;
generator.Parameters.Barcode.Padding.Right.Pixels = 10;
generator.Parameters.BackColor = Color.White;
generator.Parameters.Resolution = 300;

generator.Save("barcode.png", BarCodeImageFormat.Png);
Imports Aspose.BarCode.Generation
Imports System.Drawing

Dim generator As New BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345")

' Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2
generator.Parameters.Barcode.BarHeight.Pixels = 100
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial"
generator.Parameters.Barcode.Padding.Left.Pixels = 10
generator.Parameters.Barcode.Padding.Right.Pixels = 10
generator.Parameters.BackColor = Color.White
generator.Parameters.Resolution = 300

generator.Save("barcode.png", BarCodeImageFormat.Png)
$vbLabelText   $csharpLabel

Jede Anpassung navigiert in generator.Parameters.Barcode.*, was eine mehrstufige Objekt-Hierarchie ist. Nicht kompliziert, sobald man es auswendig gelernt hat – aber es erfordert Auswendiglernen.

IronBarcode Ansatz

IronBarcode ersetzt die Parameterhierarchie durch eine flüssige Methodenkette. Die Standardeinstellungen liefern für die meisten Anwendungsfälle korrekte Ergebnisse, und Anpassungen werden direkt im Code vorgenommen:

using IronBarCode;

// Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");

// Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");

// Get as bytes instead of saving to disk
byte[] pngData = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ToPngBinaryData();
using IronBarCode;

// Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");

// Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");

// Get as bytes instead of saving to disk
byte[] pngData = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ToPngBinaryData();
Imports IronBarCode

' Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .SaveAsPng("barcode.png")

' Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ResizeTo(400, 100) _
    .SaveAsPng("barcode.png")

' Get as bytes instead of saving to disk
Dim pngData As Byte() = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

Für QR-Codes bietet die QR-Generierungs-API von IronBarcode Unterstützung für Markenlogos ohne manuelle Bildkomposition:

using IronBarCode;
using IronSoftware.Drawing;

// With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");

// With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded-high-ecc.png");

// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
    .ChangeBarCodeColor(Color.DarkBlue)
    .SaveAsPng("qr-colored.png");
using IronBarCode;
using IronSoftware.Drawing;

// With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");

// With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded-high-ecc.png");

// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
    .ChangeBarCodeColor(Color.DarkBlue)
    .SaveAsPng("qr-colored.png");
Imports IronBarCode
Imports IronSoftware.Drawing

' With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded.png")

' With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode( _
    "https://example.com", _
    500, _
    QRCodeWriter.QrErrorCorrectionLevel.Highest) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded-high-ecc.png")

' Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300) _
    .ChangeBarCodeColor(Color.DarkBlue) _
    .SaveAsPng("qr-colored.png")
$vbLabelText   $csharpLabel

Aspose.BarCode liefert keinen Ein-Klick-Logoassistenten für QR-Codes aus; Der dokumentierte Ansatz ist, das Barcode-Bild zu erzeugen und dann das Logo darüber zu legen (zum Beispiel mit System.Drawing.Graphics). IronBarcode's AddBrandLogo erledigt die Komposition in einem Aufruf und setzt die Fehlerkorrektur automatisch entsprechend fest.

PDF-Barcode-Lesen

Für viele Teams ist dieser Vergleich von größter Bedeutung. Das Auslesen von Barcodes aus PDF-Dokumenten ist ein gängiger Arbeitsablauf: eingehende Rechnungen, als PDF gespeicherte Versandetiketten, gescannte Dokumentenarchive.

Aspose.BarCode-Ansatz

Aspose.BarCode bietet keine native PDF-Unterstützung. Um mit Aspose einen Barcode aus einer PDF-Datei zu lesen, benötigen Sie Aspose.PDF zum Laden der PDF-Datei und zum Rendern der Seiten in Bilder sowie Aspose.BarCode zum Scannen dieser gerenderten Bilder. Beides sind Abonnementprodukte. Beide benötigen eine Lizenzaktivierung. Sie zahlen zwei jährliche Abonnements für das, was die meisten Entwickler als eine einzige Fähigkeit betrachten.

// Requires both Aspose.PDF (separate license) and Aspose.BarCode
using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.BarCode.BarCodeRecognition;
using System.IO;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var barcodeValues = new List<string>();

    // Step 1: Load and render the PDF using Aspose.PDF
    var pdfDocument = new Aspose.Pdf.Document(pdfPath);
    var resolution = new Resolution(300);
    var device = new PngDevice(resolution);

    for (int pageNum = 1; pageNum <= pdfDocument.Pages.Count; pageNum++)
    {
        using var pageStream = new MemoryStream();
        device.Process(pdfDocument.Pages[pageNum], pageStream);
        pageStream.Seek(0, SeekOrigin.Begin);

        // Step 2: Scan the rendered image for barcodes using Aspose.BarCode
        using var reader = new BarCodeReader(pageStream, DecodeType.AllSupportedTypes);
        foreach (var result in reader.ReadBarCodes())
        {
            barcodeValues.Add(result.CodeText);
        }
    }

    return barcodeValues;
}
// Requires both Aspose.PDF (separate license) and Aspose.BarCode
using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.BarCode.BarCodeRecognition;
using System.IO;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var barcodeValues = new List<string>();

    // Step 1: Load and render the PDF using Aspose.PDF
    var pdfDocument = new Aspose.Pdf.Document(pdfPath);
    var resolution = new Resolution(300);
    var device = new PngDevice(resolution);

    for (int pageNum = 1; pageNum <= pdfDocument.Pages.Count; pageNum++)
    {
        using var pageStream = new MemoryStream();
        device.Process(pdfDocument.Pages[pageNum], pageStream);
        pageStream.Seek(0, SeekOrigin.Begin);

        // Step 2: Scan the rendered image for barcodes using Aspose.BarCode
        using var reader = new BarCodeReader(pageStream, DecodeType.AllSupportedTypes);
        foreach (var result in reader.ReadBarCodes())
        {
            barcodeValues.Add(result.CodeText);
        }
    }

    return barcodeValues;
}
Imports Aspose.Pdf
Imports Aspose.Pdf.Devices
Imports Aspose.BarCode.BarCodeRecognition
Imports System.IO

Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
    Dim barcodeValues As New List(Of String)()

    ' Step 1: Load and render the PDF using Aspose.PDF
    Dim pdfDocument As New Aspose.Pdf.Document(pdfPath)
    Dim resolution As New Resolution(300)
    Dim device As New PngDevice(resolution)

    For pageNum As Integer = 1 To pdfDocument.Pages.Count
        Using pageStream As New MemoryStream()
            device.Process(pdfDocument.Pages(pageNum), pageStream)
            pageStream.Seek(0, SeekOrigin.Begin)

            ' Step 2: Scan the rendered image for barcodes using Aspose.BarCode
            Using reader As New BarCodeReader(pageStream, DecodeType.AllSupportedTypes)
                For Each result In reader.ReadBarCodes()
                    barcodeValues.Add(result.CodeText)
                Next
            End Using
        End Using
    Next

    Return barcodeValues
End Function
$vbLabelText   $csharpLabel

Das sind zwei Lizenz-Setups, zwei using-Anweisungen aus zwei Namespaces, ein Rendering-Pipeline, Speicherstream-Management und eine geschachtelte Schleife. Es verwendet auch DecodeType.AllSupportedTypes, weil Sie zum Zeitpunkt der Bildextraktion typischerweise nicht wissen, welches Format der Barcode verwendet.

IronBarcode Ansatz

IronBarcode übernimmt das Parsen von PDFs, das Rendern der Seiten und die Barcode-Erkennung intern. Sie rufen Read mit einem Pfad auf, der in .pdf endet, und es gibt Barcode-Ergebnisse zurück, die result.PageNumber beinhalten, so dass Sie wissen, von welcher Seite jeder stammt. Kein zweites Paket, keine zweite Lizenz, kein Rendering-Code.

using IronBarCode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var results = BarcodeReader.Read(pdfPath);
    return results.Select(r => r.Value).ToList();
}
using IronBarCode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var results = BarcodeReader.Read(pdfPath);
    return results.Select(r => r.Value).ToList();
}
Imports IronBarCode

Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
    Dim results = BarcodeReader.Read(pdfPath)
    Return results.Select(Function(r) r.Value).ToList()
End Function
$vbLabelText   $csharpLabel
// With page number context
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
// With page number context
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
Imports System

' With page number context
Dim results = BarcodeReader.Read("invoice-batch.pdf")
For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}")
Next
$vbLabelText   $csharpLabel

Die IronBarcode Dokumentation zum Lesen von PDFs behandelt Optionen zur Stapelverarbeitung mehrseitiger Dokumente sowie zur Filterung von Seitenbereichen.

Lesen unbekannter Barcode-Formate

Wenn Sie nicht wissen, welches Barcodetyp ein Bild enthält, behandeln die beiden Bibliotheken die Situation unterschiedlich.

Aspose.BarCode-Ansatz

DecodeType.AllSupportedTypes ist Aspose's Lösung für Szenarien unbekannten Formats. In der Dokumentation von Aspose wird selbst eingeräumt, dass dies langsamer ist als die Angabe einer Zielliste, da der Decoder alle bekannten Symboliken nacheinander durchläuft. Bei der Verarbeitung großer Mengen – beispielsweise in einem Lager, das Tausende von Etiketten pro Minute scannt – ist dieser Leistungsunterschied nicht zu vernachlässigen.

using Aspose.BarCode.BarCodeRecognition;

using var reader = new BarCodeReader("unknown-format.png");
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
}
using Aspose.BarCode.BarCodeRecognition;

using var reader = new BarCodeReader("unknown-format.png");
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
}
Imports Aspose.BarCode.BarCodeRecognition

Using reader As New BarCodeReader("unknown-format.png")
    reader.SetBarCodeReadType(DecodeType.AllSupportedTypes)
    For Each result In reader.ReadBarCodes()
        Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
    Next
End Using
$vbLabelText   $csharpLabel

IronBarcode Ansatz

Es gibt keinen "langsamen Modus" und keinen "schnellen Modus" basierend auf Formatkenntnissen. Die Erkennungsmethode von IronBarcode verwendet denselben Algorithmus, unabhängig davon, ob das Bild einen Code 128 oder eine DataMatrix enthält. Wenn Sie die Leistung im Vergleich zu Genauigkeit-Abwägungen optimieren möchten, ermöglicht es ReadingSpeed ohne Formatwissen:

using IronBarCode;

// The same call regardless of format — always auto-detects
var results = BarcodeReader.Read("unknown-format.png");
foreach (var result in results)
{
    Console.WriteLine($"{result.Format}: {result.Value}");
}
using IronBarCode;

// The same call regardless of format — always auto-detects
var results = BarcodeReader.Read("unknown-format.png");
foreach (var result in results)
{
    Console.WriteLine($"{result.Format}: {result.Value}");
}
Imports IronBarCode

' The same call regardless of format — always auto-detects
Dim results = BarcodeReader.Read("unknown-format.png")
For Each result In results
    Console.WriteLine($"{result.Format}: {result.Value}")
Next
$vbLabelText   $csharpLabel
using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read("document.png", options);
using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read("document.png", options);
Imports IronBarCode

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True,
    .MaxParallelThreads = 4
}

Dim results = BarcodeReader.Read("document.png", options)
$vbLabelText   $csharpLabel

ReadingSpeed.Faster priorisiert den Durchsatz. ReadingSpeed.Detailed priorisiert die Genauigkeit bei beschädigten oder kontrastarmen Bildern. Für keine der beiden Methoden müssen Sie das Format im Voraus kennen. Die vollständigen Einstellparameter finden Sie unter IronBarcode Leseoptionen .

API-Mapping-Referenz

Aspose.BarCode IronBarcode
new BarcodeGenerator(EncodeTypes.Code128, "data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
generator.Save("file.png", BarCodeImageFormat.Png) .SaveAsPng("file.png")
new BarCodeReader(path, DecodeType.Code128) BarcodeReader.Read(path)
DecodeType.AllSupportedTypes (langsamer, erschöpfender Scan). Automatisch – immer schnell, gleicher Aufruf für alle Formate
reader.ReadBarCodes() (part of BarcodeReader.Read — returns results directly)
Iteration von reader.ReadBarCodes(). Rückgabewert von BarcodeReader.Read.
result.CodeText result.Value
result.CodeTypeName result.Format.ToString()
result.Confidence result.Confidence
Aspose.BarCode + Aspose.PDF for PDF reading BarcodeReader.Read("doc.pdf") – ein Paket.
license.SetLicense("Aspose.BarCode.lic") IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
new Aspose.BarCode.Metered() + .SetMeteredKey() (not needed — single key covers all environments)
generator.GenerateBarCodeImage() .ToPngBinaryData() oder .SaveAsPng().
QREncodeMode.Auto + QRErrorLevel.LevelH + manuelle Logo-Überlagerung. QRCodeWriter.CreateQrCode().AddBrandLogo()

Wenn Teams einen Wechsel von Aspose.BarCode zu IronBarcode erwägen

Mehrere Szenarien veranlassen Entwicklungsteams üblicherweise dazu, IronBarcode als Alternative zu Aspose.BarCode zu evaluieren.

Die Abonnementverlängerung ist da

Bei der jährlichen Abonnementverlängerung überprüfen Teams am häufigsten ihre Bibliotheksentscheidungen. Wenn Aspose.BarCode das einzige Produkt in der Aspose-Produktpalette ist, zieht der Barcode-Funktionalitätsvergleich die Zahlung von 999 $/Jahr pro Entwickler (oder 4.995 $/Jahr in der Site-Stufe) nach sich. Das Gespräch verläuft üblicherweise so: "Das zahlen wir jedes Jahr auf ewig." Was kostet IronBarcode einmalig? In der Professional Version (2.999 US-Dollar für 10 Entwickler) amortisiert sich IronBarcode innerhalb des ersten Jahres mit der Standortlizenz.

Für Teams, die Aspose.Total verwenden — wo Aspose.BarCode mit vielen anderen Aspose-Produkten gebündelt ist — ist die Rechnung anders. Die Grenzkosten von Aspose.BarCode innerhalb dieses Pakets nähern sich Null. Diese Teams haben weniger Grund zum Wechseln.

PDF-Unterstützung wird zur Voraussetzung

Viele Projekte beginnen mit dem Auslesen von Barcodes aus Bildern und fügen dann später die PDF-Unterstützung hinzu, wenn ein Beteiligter feststellt, dass die eingehenden Dokumente PDFs und keine Bilddateien sind. An diesem Punkt steht das Aspose.BarCode-Team vor einer Entscheidung: Aspose.PDF hinzufügen (ein weiteres Abonnement), einen PDF-Renderer von Drittanbietern finden oder die Barcode-Bibliothek neu bewerten.

Das Hinzufügen von Aspose.PDF löst die unmittelbare Anforderung, bedeutet jedoch ein zweites jährliches Abonnement. Das Finden eines Drittanbieters für Renderer fügt eine Abhängigkeit und einen Integrationsaufwand hinzu. Das Ergebnis ist oft die erneute Überprüfung der Barcode-Bibliothek – und die Entdeckung, dass IronBarcode PDFs nativ gegen eine einmalige Gebühr lesen kann.

Formatunbekannte Szenarien in der Produktion

Kundenorientierte Anwendungen, die Dokumenten-Uploads akzeptieren, können nicht steuern, welches Barcode-Format ein hochgeladenes Dokument verwendet. Wenn die Anwendung mit dem Erwartung, dass Code-128-Eingaben vorliegen, erstellt wurde und ein Kunde ein DataMatrix-Etikett hochlädt, wird ein festgelegtes DecodeType.Code128 stillschweigend keine Ergebnisse zurückgeben. Ändern zu DecodeType.AllSupportedTypes korrigiert die Richtigkeit, führt aber zu einem Leistungseinbruch.

Teams, die auf dieses Problem gestoßen sind – sie fügen ihrer Lese-Konfiguration immer mehr DecodeType-Werte hinzu, da in der Produktion neue Formate erscheinen – enden oft damit, eine Liste zu pflegen, die bei jeder neuen Formatquelle aktualisiert werden muss. Die automatische Erkennung von IronBarcode macht diese Liste überflüssig.

Cloud- und containerbasierte Bereitstellungen

Die dateibasierte Lizenzierung von Aspose.BarCode erfordert einen zusätzlichen Bereitstellungsschritt: Die Lizenzdatei muss zur Laufzeit über einen Pfad zugänglich sein, den die Anwendung lesen kann. In einem GitOps-Workflow landet die Lizenzdatei entweder in der Quellcodeverwaltung (ein Sicherheitsrisiko) oder muss über ein eingebundenes geheimes Volume eingebunden werden. Der schlüsselbasierte Ansatz von IronBarcode fügt sich nahtlos in Kubernetes Secrets und CI/CD Secret-Variablen ein, ohne dass im Container-Image eine Datei verwaltet werden muss.

Gemeinsame Überlegungen zur Migration

Teams, die von Aspose.BarCode auf IronBarcode umsteigen, müssen einige wenige, vorhersehbare technische Anpassungen vornehmen.

Zuordnung von Eigenschaftsnamen

Der häufigste Kompilierungsfehler nach dem Pakettausch ist das Umbenennen von result.CodeText zu result.Value. Eine Suche im gesamten Quellcode deckt dies schnell ab:

grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
SHELL

result.CodeText wird zu result.Value. result.CodeTypeName wird zu result.Format.ToString(). Die result.Format-Eigenschaft ist ein BarcodeEncoding-Enum-Wert, der auch typisierte Vergleiche dort ermöglicht, wo sie benötigt werden.

DecodeType-Entfernung

Jeder DecodeType.*-Verweis im Codebestand kann entfernt werden:

grep -r "DecodeType\." --include="*.cs" .
grep -r "DecodeType\." --include="*.cs" .
SHELL

Wenn ein bestimmter DecodeType aufgelistet wurde, um die Leistung für ein bekanntes Format zu verbessern, bietet ReadingSpeed.Faster in BarcodeReaderOptions einen ähnlichen Vorteil ohne Anforderungen an das Formatwissen.

Änderung der Lizenzinitialisierung

Aspose.BarCode verwendet eine .lic-Datei, die über license.SetLicense() geladen wird. IronBarcode verwendet einen String-Schlüssel:

IronBarCode.License.LicenseKey =
    Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
    ?? throw new InvalidOperationException("IronBarcode license key not configured");
IronBarCode.License.LicenseKey =
    Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
    ?? throw new InvalidOperationException("IronBarcode license key not configured");
Imports IronBarCode
Imports System

License.LicenseKey = If(Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE"), Throw New InvalidOperationException("IronBarcode license key not configured"))
$vbLabelText   $csharpLabel

Entfernen Sie die .lic-Datei aus dem Repository und den Build-Artefakten. Entfernen Sie in Dockerdie COPY Aspose.BarCode.lic-Zeile und ersetzen Sie sie durch einen ENV IRONBARCODE_LICENSE-Eintrag.

Zuordnung von Codierungstypen zu Barcode-Codierung

EncodeTypes.QR mappt auf BarcodeEncoding.QRCode – der Benennungsunterschied ist der Punkt, an dem Teams am häufigsten dem ersten Kompilierungsfehler begegnen, nachdem sie den Generierungscode migriert haben. Die meisten anderen Zuordnungen sind direkte Entsprechungen mit konsistenter Benennung.

Zusätzliche IronBarcode Funktionen

Über die zentralen Vergleichspunkte hinaus bietet IronBarcode Funktionen, die je nach Anwendungskontext relevant sein können:

.NET-Kompatibilität und Zukunftsfähigkeit

IronBarcode unterstützt .NET Framework4.6.2+, .NET Core 3.1+ und .NET 5, 6, 7, und 8. Die Bibliothek erhält regelmäßige Updates im Einklang mit Microsofts .NET-Veröffentlichungsrhythmus. Aspose.BarCode unterstützt einen vergleichbaren .NET-Versionenbereich, sodass keine der Bibliotheken auf den aktuellen Versionen einen Kompatibilitätsvorteil bietet. Der entscheidende Unterschied für die Zukunftsfähigkeit liegt in der Lizenzierung: Eine heute erworbene unbefristete IronBarcode -Lizenz deckt zukünftige .NET Versionen ohne zusätzliche Kosten ab, während Aspose.BarCode-Abonnements eine fortlaufende Verlängerung erfordern, um Zugriff auf aktualisierte Versionen zu erhalten.

Abschluss

Aspose.BarCode und IronBarcode repräsentieren zwei unterschiedliche Philosophien im Design von Barcode-Bibliotheken. Aspose.BarCode basiert auf einer expliziten, instanzbasierten API, bei der der Aufrufer das Format angibt, die Lebensdauer von Objekten verwaltet und jede Operation über eine Eigenschaftshierarchie konfiguriert. IronBarcode basiert auf einer statischen, formatunabhängigen API, wobei die Bibliothek die Erkennung, den Objektlebenszyklus und das PDF-Rendering intern übernimmt. Keiner der beiden Ansätze ist an sich richtig – die richtige Wahl hängt davon ab, was die Anwendung benötigt.

Aspose.BarCode ist die bessere Wahl für Teams, die bereits im Aspose-Ökosystem tätig sind. Wenn Aspose.Total bereits lizenziert ist, entstehen durch Aspose.BarCode keine Marginalkosten, und seine über 80 Symbologien sind eine der breitesten Verfügbarkeiten in jeder kommerziellen .NET-Barcode-Bibliothek. Für Anwendungen, die ungewöhnliche Formate erfordern – MaxiCode, DotCode oder spezielle Postsymbologien, die nicht in der Liste der über 50 Symbole von IronBarcode enthalten sind – ist Aspose.BarCode möglicherweise die einzig praktikable Option. Seine Reife und Formatvielfalt sind echte Stärken.

Für Teams, die Aspose.BarCode als Einzelkauf in Betracht ziehen, gestaltet sich die Wertberechnung schwieriger. Die Anforderung an die Formatvorgabe führt zu zusätzlichen Schwierigkeiten bei jedem Lesevorgang. Das Fehlen einer nativen PDF-Unterstützung verdoppelt die Abonnementkosten für eine Funktion, die IronBarcode bereits im Basispaket bietet. Und das Abonnementmodell bedeutet, dass sich die Kosten jährlich erhöhen – 4.995 US-Dollar pro Jahr für ein Team von 10 Entwicklern summieren sich über fünf Jahre auf 24.975 US-Dollar, verglichen mit 2.999 US-Dollar bei einem einmaligen Kauf von IronBarcode Professional . Die automatische Erkennung, die native PDF-Lesefunktion und die unbefristete Lizenz von IronBarcode lösen alle drei Probleme in einem einzigen Paket.

Die Entscheidung hängt letztendlich von der Passung zum Ökosystem und den Symbolikanforderungen ab. Teams, die eng mit Aspose-Produkten integriert sind, oder Teams, die Formate außerhalb der von IronBarcode unterstützten Liste benötigen, gehören zu Aspose.BarCode. Teams, die eine eigenständige Dauerlizenz, native PDF-Lesefunktion und eine API wünschen, die keine Formatkenntnisse bei jedem Lesevorgang erfordert, werden IronBarcode als die praktischere Wahl empfinden.

Häufig gestellte Fragen

Was ist Aspose.BarCode for .NET?

Aspose.BarCode for .NET 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 Aspose.BarCode for .NET und IronBarcode?

IronBarcode verwendet eine statische, zustandslose API, die keine Instanzverwaltung erfordert, während Aspose.BarCode for .NET 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 Aspose.BarCode for .NET?

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 Barcode-Formate, die Aspose.BarCode for .NET 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 Aspose.BarCode for .NET?

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 Aspose.BarCode?

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 Aspose.BarCode for .NET 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 es einfach, von Aspose.BarCode for .NET zu IronBarcode zu migrieren?

Bei der Migration von Aspose.BarCode for .NET zu IronBarcode geht es in erster Linie darum, instanzbasierte API-Aufrufe durch die statischen 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