Aspose.BarCode for .NET vs IronBarcode: C# BarCode Bibliothek Vergleich
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 dies nicht der Fall ist – wenn ein Dokument aus einem externen System stammt, von einem Lieferanten, der sein Etikettenformat geändert hat, oder von einem Benutzer hochgeladen wurde –, müssen Sie entweder eine Liste von Dekodierungstypen erraten oder auf DecodeType.AllSupportedTypes zurückgreifen, was merklich langsamer ist. 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 für .NET , um die Seiten zunächst in Bilder umzuwandeln. Aspose.PDF ist ein weiteres Abonnement: 999 bis 4.995 US-Dollar pro Jahr zusätzlich zu den Kosten für Aspose.BarCode. 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 60 Barcode-Symbologien und bietet damit die vollständigste Formatliste aller kommerziellen .NET -Barcodebibliotheken. 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 generieren, muss eine BarcodeGenerator-Instanz erstellt, XDimension, BarHeight und weitere Parameter festgelegt und anschließend Save mit einem expliziten Formatargument aufgerufen werden. Zum Lesen ist es erforderlich, die zu durchsuchenden Dekodierungstypen anzugeben, ReadBarCodes() aufzurufen und dann FoundBarCodes zu iterieren. 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 die explizite Angabe von
DecodeType. Der FallbackDecodeType.AllSupportedTypesist deutlich langsamer als eine gezielte Liste, da der Decoder jede bekannte Symbolik nacheinander durchläuft. - Instanzbasierte API: Sowohl
BarCodeReaderals auchBarcodeGeneratorsind instanziierte Objekte, dieIDisposableimplementieren. Wenn sie nicht inusingBlöcke eingeschlossen werden, führt dies zu Ressourcenlecks. - Keine native PDF-Unterstützung: Aspose.BarCode kann PDF-Dokumente nicht direkt öffnen oder darstellen. Zum Auslesen von Barcodes aus PDFs ist Aspose.PDF erforderlich, ein separates Abonnementprodukt, das 999 bis 4.995 US-Dollar pro Jahr kostet.
- Tiefe Parameterhierarchie: Die Anpassung erfolgt über
generator.Parameters.Barcode.*Eigenschaftsketten – eine mehrstufige Objekthierarchie, die auswendig gelernt werden muss. - Nur Abonnementlizenzen: Alle Stufen sind Jahresabonnements. Eine unbefristete Lizenz ist als eigenständiges Produkt nicht verfügbar.
- Dateibasierte Lizenzaktivierung: Für Produktionsbereitstellungen wird eine
.lic-Datei benötigt, die unter einem bekannten Pfad zugänglich ist. Dies fügt einen zusätzlichen Bereitstellungsschritt für Docker- und Kubernetes-Umgebungen hinzu.
Das Format-First-Lesemodell
Die Lese-API von Aspose.BarCode basiert auf der Annahme, dass der Aufrufer das Barcode-Format kennt:
// Aspose.BarCode: must specify format or use slow AllSupportedTypes
using Aspose.BarCode.BarCodeRecognition;
var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
reader.ReadBarCodes();
foreach (var result in reader.FoundBarCodes)
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
// Aspose.BarCode: must specify format or use slow AllSupportedTypes
using Aspose.BarCode.BarCodeRecognition;
var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
reader.ReadBarCodes();
foreach (var result in reader.FoundBarCodes)
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
Imports Aspose.BarCode.BarCodeRecognition
' Aspose.BarCode: must specify format or use slow AllSupportedTypes
Dim reader As New BarCodeReader("barcode.png", DecodeType.Code128)
reader.ReadBarCodes()
For Each result In reader.FoundBarCodes
Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
Next
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 wird DecodeType.AllSupportedTypes als Ausweichlösung verwendet, die jedoch deutlich langsamer ist als eine gezielte Dekodierungstypliste.
Der Decoder muss ebenfalls entsorgt werden:
using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
Die Nichtverwendung von using führt zu einem Ressourcenleck. Der BarcodeGenerator implementiert auch IDisposable, allerdings sind die Folgen einer Nichtbeachtung weniger gravierend. 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 entwickelt und gepflegt, einem Unternehmen, das sich ausschließlich auf .NET Entwicklerwerkzeuge konzentriert. 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 Formaterkennung:
BarcodeReader.Read()erkennt die Barcode-Symbologie aus dem Bildinhalt, ohne dass der Aufrufer einDecodeTypeÄ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.
- Native PDF-Unterstützung:
BarcodeReader.Read("doc.pdf")liest direkt aus PDF-Dateien ohne zusätzliche Pakete oder Rendering-Schritte. Ergebnisse umfassenresult.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.
- Lizenzaktivierung über Zeichenketten: Der Lizenzschlüssel wird über
IronBarCode.License.LicenseKeyfestgelegt und ist kompatibel mit Umgebungsvariablen und CI/CD Secret Managern.
Funktionsvergleich
| Feature | Aspose.BarCode | IronBarcode |
|---|---|---|
| Formaterkennung | Manuell — muss DecodeType angeben oder langsam AllSupportedTypes verwenden |
Automatischer Ablauf über alle unterstützten Formate hinweg |
| Symbolik zählen | 60+ | 50+ |
| PDF-Unterstützung | Keine native Unterstützung – separate Aspose.PDF-Lizenz erforderlich. | Native — BarcodeReader.Read("doc.pdf") im Paket integriert |
| Preismodell | Nur Abonnement – 999–4.995 $/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. | Staatenlos – natürlich sicher für gleichzeitige Nutzung |
Detaillierter Funktionsvergleich
| Feature | Aspose.BarCode | IronBarcode |
|---|---|---|
| Generation | ||
| API-Stil | new BarcodeGenerator(EncodeTypes.X, "data") |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.X) |
| Anpassungsmodell | generator.Parameters.Barcode.* Eigenschaftshierarchie |
Fluent Method Chain (.ResizeTo(), .ChangeBarCodeColor()) |
| QR-Code mit Logo | Manuelle GDI+-Überlagerung nach der Generierung | .AddBrandLogo("logo.png") eingebaut |
| 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 | 12+ QualitySettings Parameter |
ReadingSpeed enum — drei Ebenen |
| Einweglesegerät | Ja — using var reader = new BarCodeReader(...) |
Nein – statischer Aufruf, kein Objekt zum Freigeben |
| Ergebniszugriff | reader.FoundBarCodesnach dem Aufruf von 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 (999–4.995 US-Dollar/Jahr zusätzlich) | 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 Entwickler | 14.985 $/Jahr (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 | Die Datei .lic muss in das Image kopiert oder eingebunden werden. |
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/9) |
| 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 zur Konfiguration. Ein minimaler Generierungsaufruf erfordert drei Schritte – Instanziierung, Speicheraufruf und Formatspezifikation. Die praktische Nutzung erfordert typischerweise die Navigation zu 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)
Jede Anpassung navigiert in generator.Parameters.Barcode.*, eine mehrstufige Objekthierarchie. 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()
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")
Aspose.BarCode erfordert manuelles Zeichnen mit GDI+, um ein Logo auf einen QR-Code zu legen – also das Generieren des Barcode-Bildes und anschließendes Komponieren des Logos mit der Zentrierung darüber mithilfe von System.Drawing.Graphics. IronBarcodes AddBrandLogo erledigt das mit einem einzigen Aufruf und stellt die Fehlerkorrektur automatisch entsprechend ein.
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. Zusammengenommen belaufen sich die Kosten auf 1.998 bis 9.990 US-Dollar pro Jahr für das, was die meisten Entwickler als eine einzige Funktion 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
Das sind zwei Lizenzkonfigurationen, zwei using-Anweisungen aus zwei Namensräumen, eine Rendering-Pipeline, Speicherstromverwaltung und eine verschachtelte Schleife. Außerdem wird DecodeType.AllSupportedTypes verwendet, da zum Zeitpunkt der Bildextraktion das Format des Barcodes in der Regel noch nicht bekannt ist.
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 mit .pdf endet, und erhalten Barcode-Ergebnisse, die result.PageNumberenthalten, sodass Sie wissen, von welcher Seite jeder einzelne 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
// 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
Die IronBarcode Dokumentation zum Lesen von PDFs behandelt Optionen zur Stapelverarbeitung mehrseitiger Dokumente sowie zur Filterung von Seitenbereichen.
Lesen unbekannter Barcode-Formate
Wenn man nicht weiß, welches Barcode-Format ein Bild enthält, gehen die beiden Bibliotheken sehr unterschiedlich mit der Situation um.
Aspose.BarCode-Ansatz
DecodeType.AllSupportedTypes ist die Lösung von Aspose für Szenarien mit unbekanntem Format. 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;
// AllSupportedTypes scans for every known format — significantly slower
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;
// AllSupportedTypes scans for every known format — significantly slower
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
' AllSupportedTypes scans for every known format — significantly slower
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
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 das Verhältnis zwischen Leistung und Genauigkeit optimieren möchten, ermöglicht Ihnen die Option ReadingSpeed dies, ohne dass Formatkenntnisse erforderlich sind:
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
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)
ReadingSpeed.Faster priorisiert den Durchsatz. ReadingSpeed.Detailed legt Wert auf 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, vollständiger Scan) |
Automatisch – immer schnell, gleicher Aufruf für alle Formate |
reader.ReadBarCodes() |
(part of BarcodeReader.Read — returns results directly) |
reader.FoundBarCodes |
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 = "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 Aspose-Produkt im Portfolio ist, veranlassen die Kosten von 999 bis 4.995 US-Dollar pro Jahr für die Barcode-Funktionalität zu einem Vergleich. 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 mehr als 20 anderen Produkten gebündelt ist – sieht die Rechnung anders aus. 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.
Die Integration von Aspose.PDF erfüllt zwar das unmittelbare Problem, verdoppelt aber die Abonnementkosten. Die Suche nach einem Drittanbieter-Renderer führt zu einer zusätzlichen Abhängigkeit und einem höheren Integrationsaufwand. 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 unter der Annahme von Code-128-Eingaben erstellt wurde und ein Kunde ein DataMatrix-Label hochlädt, liefert ein fest codiertes DecodeType.Code128 stillschweigend keine Ergebnisse. Die Umstellung auf DecodeType.AllSupportedTypes behebt zwar die Korrektheit, führt aber zu Leistungseinbußen.
Teams, die auf dieses Problem gestoßen sind – nämlich immer mehr DecodeType-Werte zu ihrer Reader-Konfiguration hinzuzufügen, wenn neue Formate in der Produktion auftauchen –, müssen oft eine Liste pflegen, die jedes Mal aktualisiert werden muss, wenn eine neue Formatquelle hinzugefügt wird. 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 Tauschen von Paketen ist die Umbenennung von result.CodeTextin 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" .
result.CodeText wird zu result.Value. result.CodeTypeNamewird zu result.Format.ToString(). Die Eigenschaft result.Format ist ein BarcodeEncoding Enumerationswert, der bei Bedarf auch typisierte Vergleiche ermöglicht.
DecodeType-Entfernung
Alle Verweise auf DecodeType.* im Quellcode können entfernt werden:
grep -r "DecodeType\." --include="*.cs" .
grep -r "DecodeType\." --include="*.cs" .
Wenn ein bestimmter DecodeType zur Leistungsverbesserung in einem bekannten Format aufgeführt wurde, bietet ReadingSpeed.Faster in BarcodeReaderOptions einen ähnlichen Vorteil ohne Formatkenntnisse.
Ä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"))
Entfernen Sie die Datei .lic aus dem Repository und den Build-Artefakten. In Dockerentfernen Sie die Zeile COPY Aspose.BarCode.lic und ersetzen sie durch einen Eintrag ENV IRONBARCODE_LICENSE.
Zuordnung von Codierungstypen zu Barcode-Codierung
EncodeTypes.QR entspricht BarcodeEncoding.QRCode — der Unterschied in der Benennung ist der Punkt, an dem Teams nach der Migration des Generierungscodes am häufigsten auf den ersten Kompilierungsfehler stoßen. Alle anderen Zuordnungen sind direkte Entsprechungen mit einheitlicher Benennung.
Zusätzliche IronBarcode Funktionen
Über die zentralen Vergleichspunkte hinaus bietet IronBarcode Funktionen, die je nach Anwendungskontext relevant sein können:
- Mehrfach-Barcode-Erkennung pro Bild :
ExpectMultipleBarcodes = truegibt alle in einem Bild gefundenen Barcodes mit den jeweiligen Positionskoordinaten zurück. - Barcode-Einbettung in PDFs : Barcodes direkt in bestehende PDF-Seiten einfügen, ohne separate PDF-Bibliothek.
- TIFF-Mehrbildlesung : Barcodes aus allen Frames eines mehrseitigen TIFF-Formats in einem einzigen Aufruf lesen.
- Stilisierte QR-Codes : Farbe, Logo und Fehlerkorrekturstufe werden alle innerhalb der flüssigen Kette ohne externe Bildverarbeitung festgelegt.
- Unterstützung für Azure Functions und AWS Lambda : Serverlose Bereitstellungen werden auf beiden Plattformen mit der Standardlizenz unterstützt.
- Binäre Datenkodierung : Byte-Arrays werden direkt in Data Matrix- oder PDF417-Barcodes für Anwendungsfälle mit binären Nutzdaten kodiert.
.NET-Kompatibilität und Zukunftsfähigkeit
IronBarcode unterstützt .NET Framework4.6.2+, .NET Core 3.1+ sowie .NET 5, 6, 7, 8 und 9. Die Bibliothek wird regelmäßig gemäß dem .NET Releasezyklus von Microsoft aktualisiert, wodurch die Kompatibilität mit .NET 10, das voraussichtlich Ende 2026 erscheint, gewährleistet ist. Aspose.BarCode unterstützt denselben .NET Versionsbereich, sodass keine der beiden Bibliotheken Kompatibilitätsvorteile gegenüber aktuellen Versionen 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, verursacht Aspose.BarCode keine zusätzlichen Kosten, und seine Symbologieliste mit über 60 Zeichen ist die umfangreichste, die in einer kommerziellen .NET Barcodebibliothek verfügbar ist. 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 für .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 für .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.

