Wie man QR-Codes anpassbar macht und Logos hinzufügt in C# | IronBracode
Migrating from Syncfusion BarCodeto IronBarcode
Dieser Leitfaden bietet einen vollständigen Migrationspfad von den Barcode-Steuerelementen von Syncfusion — SfBarcode für WinForms und WPF, SfBarcodeGenerator für Blazor und MAUI — zu IronBarcode. Es behandelt die strukturellen Gründe, warum Teams diesen Übergang vornehmen, eine Schritt-für-Schritt-Schnellstartanleitung für den Austausch der NuGet -Pakete und die Lizenzeinrichtung, vollständige Vorher-Nachher-Codebeispiele für jedes gängige Szenario sowie eine Migrations-Checkliste zur Überprüfung einer bestehenden Codebasis. Wenn das Projekt auch andere Syncfusion Komponenten (Grids, Charts, Scheduler) verwendet, bleiben diese Pakete und ihre Registrierungen unberührt – es ändert sich lediglich der barcodespezifische Code.
Warum von Syncfusion BarCodemigrieren?
Leselücke: SfBarcode und SfBarcodeGenerator sind Generationssteuerungen ohne Lesefähigkeit. Es gibt keine .Read() oder .Scan() Methode in einer der Klassen. Wenn für ein Projekt Barcodes aus hochgeladenen Bildern, gescannten Dokumenten oder PDF-Dateien gelesen werden müssen, bietet die Barcode-Steuerung von Syncfusion keine Lösung. Die Syncfusion Dokumentation verweist Teams auf Barcode Reader OPX als Lösung. Dabei handelt es sich um ein separates kommerzielles Produkt, das unabhängig erworben, lizenziert und gewartet werden muss.
OPX als kostenpflichtige Wrapper-Software für freie Software: Barcode-Leser OPX verwendet intern ZXing .NET – eine Open-Source-Barcode-Lesebibliothek, die unter der Apache 2.0-Lizenz veröffentlicht wurde. Apache 2.0 ist eine freizügige Lizenz; Jeder .NET-Entwickler kann ZXing.Net direkt mit dotnet add package ZXing.Net installieren und es in kommerziellen Anwendungen kostenlos verwenden. Ein vollständiger Syncfusion-Lese- und Generierungsworkflow erfordert zwei separate Syncfusion-Produkte, zwei Lizenzvereinbarungen und zwei API-Oberflächen — während die Lesefähigkeit direkt aus der freien Bibliothek, die OPX umhüllt, stammen könnte.
Lizenzklippe für die Community: Die Community-Lizenz von Syncfusion setzt voraus, dass vier Bedingungen gleichzeitig und fortlaufend erfüllt sind: jährlicher Bruttoumsatz unter 1.000.000 US-Dollar, maximal fünf Entwickler, maximal zehn Mitarbeiter und maximal 3.000.000 US-Dollar eingeworbenes Fremdkapital. Behörden sind unabhängig von ihrer Größe ausgeschlossen. Das Nichterfüllen einer einzigen Bedingung führt sofort zur Verpflichtung zur kommerziellen Lizenzierung. Bei einer Series-A-Finanzierungsrunde übersteigt das eingeworbene Kapital typischerweise am Tag des Abschlusses 3.000.000 US-Dollar, wodurch unabhängig von Teamgröße oder Umsatz eine Lizenzgebühr fällig wird. Der kommerzielle Übergang geht von 0 $ zu einem jährlichen Essential Studio Abonnement pro Entwickler — und dieses Abonnement deckt die gesamte Suite ab, nicht nur die Barcode-Komponente. Der von Syncfusion veröffentlichte Weg ist ein individuelles Angebot vom Vertrieb.
Versionsspezifische Schlüsselrotation: Syncfusion Lizenzschlüssel sind an bestimmte Essential Studio-Versionsbereiche gebunden. Für das Upgrade von Version 24.x auf 25.x ist es erforderlich, einen neuen Schlüssel vom Kontoportal abzurufen, diesen Schlüssel im Secrets Store jeder Bereitstellungsumgebung zu aktualisieren und die Bereitstellung erneut durchzuführen, um zu verhindern, dass Testwasserzeichen in den Produktionsausgaben erscheinen. Für Teams mit häufigen Release-Zyklen oder mehreren Bereitstellungszielen wird diese Rotation zu einem wiederkehrenden operativen Mehraufwand, der in keinem Verhältnis zur eigentlichen Anforderung der Generierung eines Barcode-Bildes steht.
Das grundsätzliche Problem
Die Steuerungsarchitektur von Syncfusion macht die programmatische Dateigenerierung indirekt. Das Erstellen einer Barcode-Datei mit SfBarcode erfordert das Vorzuweisen eines Bitmap, das Aufrufen von DrawToBitmap und dann das Speichern der Bitmap — ein WinForms-Darstellungsmuster, das die Windows Forms-Laufzeit als Abhängigkeit mit sich bringt:
// Syncfusion SfBarcode: indirect file output through DrawToBitmap
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
var barcode = new SfBarcode();
barcode.Text = "SHIP-2024-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.Width = 400;
barcode.Height = 150;
using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("shipping-label.png", ImageFormat.Png);
// Reading: not possible — requires separate OPX purchase
// Syncfusion SfBarcode: indirect file output through DrawToBitmap
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
var barcode = new SfBarcode();
barcode.Text = "SHIP-2024-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.Width = 400;
barcode.Height = 150;
using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("shipping-label.png", ImageFormat.Png);
// Reading: not possible — requires separate OPX purchase
Imports Syncfusion.Licensing
Imports System.Drawing
Imports System.Drawing.Imaging
' Syncfusion SfBarcode: indirect file output through DrawToBitmap
SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY")
Dim barcode As New SfBarcode()
barcode.Text = "SHIP-2024-001"
barcode.Symbology = BarcodeSymbolType.Code128A
barcode.Width = 400
barcode.Height = 150
Using bitmap As New Bitmap(barcode.Width, barcode.Height)
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle)
bitmap.Save("shipping-label.png", ImageFormat.Png)
End Using
' Reading: not possible — requires separate OPX purchase
IronBarcode generiert Dateien direkt und liest sie mit demselben Paket:
// IronBarcode: direct generation and reading in one package
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.SaveAsPng("shipping-label.png");
// Read — same package, no additional product required
var results = BarcodeReader.Read("shipping-label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
// IronBarcode: direct generation and reading in one package
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.SaveAsPng("shipping-label.png");
// Read — same package, no additional product required
var results = BarcodeReader.Read("shipping-label.png");
foreach (var result in results)
Console.WriteLine($"{result.Format}: {result.Value}");
Imports IronBarCode
' IronBarcode: direct generation and reading in one package
License.LicenseKey = "YOUR-LICENSE-KEY"
' Generate
BarcodeWriter.CreateBarcode("SHIP-2024-001", BarcodeEncoding.Code128) _
.ResizeTo(400, 150) _
.SaveAsPng("shipping-label.png")
' Read — same package, no additional product required
Dim results = BarcodeReader.Read("shipping-label.png")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
IronBarcode vs. Syncfusion Barcode: Funktionsvergleich
| Feature | Syncfusion BarCode | IronBarcode |
|---|---|---|
| Barcode-Generierung | Ja – UI-Steuerelemente (WinForms, WPF, Blazor, MAUI) | Ja – statische API, alle Umgebungen |
| Barcode-Lesung | Nein – ein separates Barcode-Lesegerät OPX ist erforderlich. | Ja – dasselbe Paket |
| OPX liest das Produkt und kapselt ZXing .NET (Apache 2.0) ein. | Ja | Nicht anwendbar |
| PDF-Barcode-Ausgabe | Nein – zusätzlich wird die Syncfusion.Pdf-Datei benötigt. | Ja — SaveAsPdf() integriert |
| PDF-Barcode-Lesen | Nein | Ja – einheimische |
| Serverseitige / Headless-Generierung | Erfordert WinForms-Laufzeit (DrawToBitmap) |
Native – keine Abhängigkeit von der Benutzeroberfläche |
| Docker-/Linux-Bereitstellung | Beschränkt | Volle Unterstützung |
| Minimale ASP.NET Core -API | Nicht direkt unterstützt | Volle Unterstützung |
| QR-Code mit eingebettetem Logo | Nein | Ja — .AddBrandLogo() |
| Automatische Formaterkennung beim Lesen | Nicht anwendbar | Ja |
| Community / kostenlose Stufe | Gemeinschaftslizenz (vier gleichzeitige Bedingungen) | 30-Tage-Testversion (nur Wasserzeichen) |
| Kommerzielles Lizenzmodell | Jahresabonnement (Essential Studio) | Unbefristet (einmalig, siehe ironsoftware.com/csharp/barcode/licensing) |
| Geltungsbereich des Lizenzschlüssels | Versionsspezifisch, wechselt mit größeren NuGet Updates. | Versionsstabil innerhalb der Hauptversion |
| Schritte zur Plattformregistrierung | 3–4 Schritte (Lizenz registrieren + SyncfusionBlazor hinzufügen + SyncfusionCore konfigurieren + Razor Importe) | Eine Linie, alle Bahnsteige |
| 1D-Formatbereich | Code 128, Code 39, EAN, UPC, Codabar und andere | Alle Syncfusion Formate Plus PDF417, Aztec, MaxiCode, GS1, USPS IMb und über 50 weitere. |
| 2D-Formatbereich | QR-Code, DataMatrix | QR-Code, DataMatrix, PDF417, Micro PDF417, Aztec, MaxiCode |
Schnellstart
Schritt 1: Ersetzen von NuGet-Paketen
Entfernen Sie das Syncfusion Barcode-Paket für die verwendete Plattform. Wenn das Projekt mehrere Plattformen anvisiert, führen Sie die Entfernung für jede Plattform durch:
# Blazor
dotnet remove package Syncfusion.Blazor.BarcodeGenerator
# WinForms
dotnet remove package Syncfusion.SfBarcode.Windows
# WPF
dotnet remove package Syncfusion.SfBarcode.WPF
# MAUI
dotnet remove package Syncfusion.Maui.Barcode
# Blazor
dotnet remove package Syncfusion.Blazor.BarcodeGenerator
# WinForms
dotnet remove package Syncfusion.SfBarcode.Windows
# WPF
dotnet remove package Syncfusion.SfBarcode.WPF
# MAUI
dotnet remove package Syncfusion.Maui.Barcode
Falls nach dem Entfernen des Barcode-Pakets keine weiteren Syncfusion Pakete mehr im Projekt vorhanden sind, entfernen Sie auch das Lizenzierungspaket:
dotnet remove package Syncfusion.Licensing
dotnet remove package Syncfusion.Licensing
Installieren Sie IronBarcode – ein Paket für alle Plattformen:
dotnet add package IronBarcode
dotnet add package IronBarcode
Schritt 2: Namespaces aktualisieren
Entfernen Sie die Syncfusion Barcode-Namensräume und fügen Sie den IronBarcode -Namensraum hinzu:
// Remove these (barcode-specific; leave others if non-barcode Syncfusion controls remain)
using Syncfusion.Windows.Forms.Barcode;
using Syncfusion.Licensing;
// @using Syncfusion.Blazor.BarcodeGenerator (in _Imports.razor)
// Add this
using IronBarCode;
// Remove these (barcode-specific; leave others if non-barcode Syncfusion controls remain)
using Syncfusion.Windows.Forms.Barcode;
using Syncfusion.Licensing;
// @using Syncfusion.Blazor.BarcodeGenerator (in _Imports.razor)
// Add this
using IronBarCode;
Imports IronBarCode
Schritt 3: Lizenz initialisieren
Entfernen Sie die Syncfusion -Lizenzregistrierung und die Plattformkonfiguration aus dem Anwendungsstart. Fügen Sie anschließend an derselben Startstelle eine einzelne IronBarcode -Lizenzzeile hinzu:
// Remove from Program.cs / App.xaml.cs / MauiProgram.cs:
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
builder.Services.AddSyncfusionBlazor(); // Blazor only — remove if no other Syncfusion controls
builder.ConfigureSyncfusionCore(); // MAUI only — remove if no other Syncfusion controls
// Add at the same startup point:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Remove from Program.cs / App.xaml.cs / MauiProgram.cs:
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
builder.Services.AddSyncfusionBlazor(); // Blazor only — remove if no other Syncfusion controls
builder.ConfigureSyncfusionCore(); // MAUI only — remove if no other Syncfusion controls
// Add at the same startup point:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Remove from Program.vb / App.xaml.vb / MauiProgram.vb:
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY")
builder.Services.AddSyncfusionBlazor() ' Blazor only — remove if no other Syncfusion controls
builder.ConfigureSyncfusionCore() ' MAUI only — remove if no other Syncfusion controls
' Add at the same startup point:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Für CI/CD-Pipelines und Docker-Container speichern Sie den Schlüssel in einer Umgebungsvariablen:
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
Imports System
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
Beispiele für die Code-Migration
WinForms SfBarcode zu BarcodeWriter
Die WinForms-Migration beseitigt die DrawToBitmap Indirektion und ersetzt sie durch eine direkte Datei-Ausgabekette. Das Syncfusion-Muster erfordert das Vorzuweisen eines Bitmap bekannter Dimensionen; IronBarcode berechnet die Dimensionen im Rahmen des Generierungsaufrufs.
Syncfusion Ansatz:
using Syncfusion.Windows.Forms.Barcode;
using System.Drawing;
using System.Drawing.Imaging;
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
var barcode = new SfBarcode();
barcode.Text = "ORD-20240315-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.BarHeight = 100;
barcode.NarrowBarWidth = 1;
barcode.ShowText = true;
barcode.Width = 400;
barcode.Height = 150;
using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("order-label.png", ImageFormat.Png);
using Syncfusion.Windows.Forms.Barcode;
using System.Drawing;
using System.Drawing.Imaging;
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY");
var barcode = new SfBarcode();
barcode.Text = "ORD-20240315-001";
barcode.Symbology = BarcodeSymbolType.Code128A;
barcode.BarHeight = 100;
barcode.NarrowBarWidth = 1;
barcode.ShowText = true;
barcode.Width = 400;
barcode.Height = 150;
using var bitmap = new Bitmap(barcode.Width, barcode.Height);
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle);
bitmap.Save("order-label.png", ImageFormat.Png);
Imports Syncfusion.Windows.Forms.Barcode
Imports System.Drawing
Imports System.Drawing.Imaging
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-VERSION-SPECIFIC-KEY")
Dim barcode As New SfBarcode()
barcode.Text = "ORD-20240315-001"
barcode.Symbology = BarcodeSymbolType.Code128A
barcode.BarHeight = 100
barcode.NarrowBarWidth = 1
barcode.ShowText = True
barcode.Width = 400
barcode.Height = 150
Using bitmap As New Bitmap(barcode.Width, barcode.Height)
barcode.DrawToBitmap(bitmap, barcode.ClientRectangle)
bitmap.Save("order-label.png", ImageFormat.Png)
End Using
IronBarcode -Ansatz:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
BarcodeWriter.CreateBarcode("ORD-20240315-001", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.AddBarcodeText()
.SaveAsPng("order-label.png");
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
BarcodeWriter.CreateBarcode("ORD-20240315-001", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.AddBarcodeText()
.SaveAsPng("order-label.png");
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
BarcodeWriter.CreateBarcode("ORD-20240315-001", BarcodeEncoding.Code128) _
.ResizeTo(400, 150) _
.AddBarcodeText() _
.SaveAsPng("order-label.png")
BarcodeSymbolType.Code128A wird zu BarcodeEncoding.Code128. Die DrawToBitmap + Bitmap.Save Sequenz kollabiert zu .SaveAsPng(). Falls der Barcode in einem WinForms PictureBox angezeigt und nicht auf Festplatte gespeichert werden muss, verwenden Sie .ToPngBinaryData(), um das Bild in die Steuerung zu laden. Die vollständige Palette der 1D-Barcode-Formate in IronBarcode geht weit über die vom Syncfusion Steuerelement unterstützte Liste hinaus.
Blazor SfBarcodeGenerator zu Minimalem API-Endpunkt
Die Blazor -Migration ist eher eine strukturelle Veränderung als ein Zeilenaustausch. SfBarcodeGenerator ist eine Razor-Komponente, die im Browser über Syncfusions JavaScript-Ebene gerendert wird. IronBarcode enthält keine Razor Komponente; Es handelt sich um eine serverseitige Bibliothek. Das Ersatzmuster ist ein minimaler API-Endpunkt auf dem Server, der Barcode-Bytes zurückgibt und auf der Razor -Seite als Bildquelle referenziert wird.
Syncfusion Ansatz:
@page "/fulfillment"
@using Syncfusion.Blazor.BarcodeGenerator
<SfBarcodeGenerator
Width="300px"
Height="150px"
Type="BarcodeType.Code128"
Value="@orderNumber">
<BarcodeGeneratorDisplayText Visibility="true"></BarcodeGeneratorDisplayText>
</SfBarcodeGenerator>
@code {
private string orderNumber = "ORD-20240315-001";
}
IronBarcode -Ansatz:
Fügen Sie einen Generierungspunkt in Program.cs hinzu:
using IronBarCode;
app.MapGet("/barcode/{value}", (string value) =>
{
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(300, 150)
.AddBarcodeText()
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});
using IronBarCode;
app.MapGet("/barcode/{value}", (string value) =>
{
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(300, 150)
.AddBarcodeText()
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});
Imports IronBarCode
app.MapGet("/barcode/{value}", Function(value As String)
Dim bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) _
.ResizeTo(300, 150) _
.AddBarcodeText() _
.ToPngBinaryData()
Return Results.File(bytes, "image/png")
End Function)
Verweisen Sie auf den Endpunkt in der Razor Komponente:
@page "/fulfillment"
<img src="/barcode/@orderNumber" alt="Order barcode: @orderNumber" />
@code {
private string orderNumber = "ORD-20240315-001";
}
Dieser Endpunkt ist unabhängig testbar, von jedem HTTP-Client wiederverwendbar und kompatibel mit Blazor Server, Blazor WebAssembly mit einem gehosteten API-Backend und jedem anderen Web-Frontend.
QR-Code-Generierung
Die Syncfusion QR-Komponente wird ebenfalls im Browser gerendert, ohne serverseitigen Ausgabepfad. IronBarcode generiert QR-Codes serverseitig mit direkter Dateiausgabe.
Syncfusion Ansatz:
@using Syncfusion.Blazor.BarcodeGenerator
<SfQRCodeGenerator
Width="300px"
Height="300px"
Value="https://example.com/product/ABC-123">
<QRCodeGeneratorDisplayText Visibility="false">
</QRCodeGeneratorDisplayText>
</SfQRCodeGenerator>
IronBarcode -Ansatz:
using IronBarCode;
// Standard QR code
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 300,
QRCodeWriter.QrErrorCorrectionLevel.High)
.SaveAsPng("product-qr.png");
// QR code with embedded brand logo — not available in Syncfusion
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("company-logo.png")
.SaveAsPng("product-qr-branded.png");
using IronBarCode;
// Standard QR code
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 300,
QRCodeWriter.QrErrorCorrectionLevel.High)
.SaveAsPng("product-qr.png");
// QR code with embedded brand logo — not available in Syncfusion
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 500,
QRCodeWriter.QrErrorCorrectionLevel.Highest)
.AddBrandLogo("company-logo.png")
.SaveAsPng("product-qr-branded.png");
Imports IronBarCode
' Standard QR code
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 300, QRCodeWriter.QrErrorCorrectionLevel.High) _
.SaveAsPng("product-qr.png")
' QR code with embedded brand logo — not available in Syncfusion
QRCodeWriter.CreateQrCode("https://example.com/product/ABC-123", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.AddBrandLogo("company-logo.png") _
.SaveAsPng("product-qr-branded.png")
OPX-Lesegerät-Ersatz
Wenn das Projekt Barcode Reader OPX verwendet hat oder eine Leseanforderung auf einen späteren Kauf von OPX verschoben hat, ersetzt IronBarcode diese Abhängigkeit durch das bereits installierte Paket. Kein Folgeprodukt, keine Zweitlizenz.
Syncfusion Ansatz (Barcode-Lesegerät OPX):
// Requires separate Syncfusion BarCodeReader OPX purchase
// OPX wraps ZXing.Net internally (Apache 2.0 — free to use directly)
using Syncfusion.BarcodeReader;
var reader = new BarcodeReader();
var results = reader.ReadBarcodes("warehouse-scan.png");
foreach (var result in results)
Console.WriteLine($"Value: {result.Value}");
// Requires separate Syncfusion BarCodeReader OPX purchase
// OPX wraps ZXing.Net internally (Apache 2.0 — free to use directly)
using Syncfusion.BarcodeReader;
var reader = new BarcodeReader();
var results = reader.ReadBarcodes("warehouse-scan.png");
foreach (var result in results)
Console.WriteLine($"Value: {result.Value}");
Imports Syncfusion.BarcodeReader
Dim reader As New BarcodeReader()
Dim results = reader.ReadBarcodes("warehouse-scan.png")
For Each result In results
Console.WriteLine($"Value: {result.Value}")
Next
IronBarcode -Ansatz:
using IronBarCode;
// Included in the same NuGet package as generation — no second product required
var results = BarcodeReader.Read("warehouse-scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Confidence: {result.Confidence}%");
}
using IronBarCode;
// Included in the same NuGet package as generation — no second product required
var results = BarcodeReader.Read("warehouse-scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Confidence: {result.Confidence}%");
}
Imports IronBarCode
' Included in the same NuGet package as generation — no second product required
Dim results = BarcodeReader.Read("warehouse-scan.png")
For Each result In results
Console.WriteLine($"Format: {result.Format}")
Console.WriteLine($"Value: {result.Value}")
Console.WriteLine($"Confidence: {result.Confidence}%")
Next
Die Dokumentation zum Barcode-Lesen umfasst das Lesen aus Byte-Arrays für Upload-Handler, die Optimierung des Verhältnisses von Geschwindigkeit zu Genauigkeit sowie die Erkennung mehrerer Barcodes.
PDF-Barcode-Generierung
Syncfusion Barcode-Steuerelemente verfügen über keinen PDF-Ausgabepfad. IronBarcode behandelt PDF als erstklassiges Ausgabeformat.
Syncfusion Ansatz:
//Neindirect path — requires combining Syncfusion.Barcode.WinForms and Syncfusion.Pdf
// Step 1: Generate to Bitmap via DrawToBitmap
// Step 2: Load Syncfusion PDF document
// Step 3: Insert bitmap as image element
// Two packages, two APIs, two license obligations
//Neindirect path — requires combining Syncfusion.Barcode.WinForms and Syncfusion.Pdf
// Step 1: Generate to Bitmap via DrawToBitmap
// Step 2: Load Syncfusion PDF document
// Step 3: Insert bitmap as image element
// Two packages, two APIs, two license obligations
'Neindirect path — requires combining Syncfusion.Barcode.WinForms and Syncfusion.Pdf
' Step 1: Generate to Bitmap via DrawToBitmap
' Step 2: Load Syncfusion PDF document
' Step 3: Insert bitmap as image element
' Two packages, two APIs, two license obligations
IronBarcode -Ansatz:
using IronBarCode;
// Generate directly to PDF — no secondary library required
BarcodeWriter.CreateBarcode("PALLET-2024-0891", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.SaveAsPdf("pallet-label.pdf");
// Read barcodes from an existing PDF
var pdfResults = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in pdfResults)
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
using IronBarCode;
// Generate directly to PDF — no secondary library required
BarcodeWriter.CreateBarcode("PALLET-2024-0891", BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.SaveAsPdf("pallet-label.pdf");
// Read barcodes from an existing PDF
var pdfResults = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in pdfResults)
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
Imports IronBarCode
' Generate directly to PDF — no secondary library required
BarcodeWriter.CreateBarcode("PALLET-2024-0891", BarcodeEncoding.Code128) _
.ResizeTo(400, 150) _
.SaveAsPdf("pallet-label.pdf")
' Read barcodes from an existing PDF
Dim pdfResults = BarcodeReader.Read("shipping-manifest.pdf")
For Each result In pdfResults
Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
Der Leitfaden zur Barcode-PDF-Generierung behandelt mehrseitige PDF-Ausgaben und das Einbetten von Barcodes neben anderen Dokumentinhalten.
Syncfusion BarCodeAPI zu IronBarcode Mapping-Referenz
| Syncfusion | IronBarcode |
|---|---|
SyncfusionLicenseProvider.RegisterLicense("KEY") |
IronBarCode.License.LicenseKey = "key" |
builder.Services.AddSyncfusionBlazor() |
Nicht erforderlich |
builder.ConfigureSyncfusionCore() |
Nicht erforderlich |
new SfBarcode() |
BarcodeWriter.CreateBarcode() (statisch) |
barcode.Text = "value" |
Erster Parameter von CreateBarcode() |
barcode.Symbology = BarcodeSymbolType.Code128A |
BarcodeEncoding.Code128 |
barcode.Symbology = BarcodeSymbolType.QRBarcode |
QRCodeWriter.CreateQrCode() |
barcode.BarHeight = 100 |
.ResizeTo(width, 100) |
barcode.ShowText = true |
.AddBarcodeText() |
barcode.DrawToBitmap(bitmap, rect) |
.SaveAsPng(path) |
Manuelles Bitmap → MemoryStream |
.ToPngBinaryData() |
<SfBarcodeGenerator Type="BarcodeType.Code128" Value="..."> |
BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) im API-Endpunkt |
<SfQRCodeGenerator Value="..."> |
QRCodeWriter.CreateQrCode(value, size) im API-Endpunkt |
BarcodeType.Code128 (Blazor-Enum) |
BarcodeEncoding.Code128 |
| Barcode-Lesegerät OPX (separates Produkt, beinhaltet ZXing .NET) | BarcodeReader.Read(path) — nativ, gleiches Paket |
| Keine Lese-API in Kontrolle | BarcodeReader.Read(path) |
| Keine PDF-Ausgabe in der Steuerung | .SaveAsPdf(path) |
| Kein PDF-Lesen | BarcodeReader.Read("document.pdf") |
Gängige Migrationsprobleme und Lösungen
Problem 1: Testwasserzeichen nach NuGet Update
Syncfusion: Durch das Upgrade von Essential Studio 24.x auf 25.x wird der bestehende Lizenzschlüssel ungültig. Alle Ausgaben, die vor der Aktualisierung des Geheimnisspeichers generiert wurden, werden mit einem Testwasserzeichen versehen. Dies ist ein stiller Fehler – die Anwendung läuft zwar weiter, erzeugt aber nicht konforme Ergebnisse.
Lösung: Nach der Aktualisierung des IronBarcode NuGet Pakets ändert sich der Lizenzschlüssel innerhalb einer Hauptversion nicht. Für kleinere Updates oder Patches ist keine Aktualisierung der Geheimnisse oder eine erneute Bereitstellung erforderlich. Beim Upgrade auf eine neue Hauptversion muss der Schlüssel einmalig am Einstiegspunkt der Anwendung aktualisiert werden:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Problem 2: DrawToBitmap schlägt in Headless-Umgebungen fehl
Syncfusion: SfBarcode.DrawToBitmap hängt von der Windows Forms-Darstellungspipeline ab. In einem ASP.NET Core-Prozess, Azure-Funktion oder Linux-Docker-Container wird das Aufrufen von DrawToBitmap InvalidOperationException auslösen oder eine leere Bitmap erzeugen, da keine Windows Forms-Nachrichtenschleife vorhanden ist.
Lösung: Ersetzen Sie durch BarcodeWriter.CreateBarcode(). IronBarcode generiert Barcodes in verwaltetem Code ohne Abhängigkeit von der UI-Laufzeitumgebung:
// Works in ASP.NET Core, Azure Functions, Docker on Linux, console apps
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.ToPngBinaryData();
// Works in ASP.NET Core, Azure Functions, Docker on Linux, console apps
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(400, 150)
.ToPngBinaryData();
' Works in ASP.NET Core, Azure Functions, Docker on Linux, console apps
Dim bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) _
.ResizeTo(400, 150) _
.ToPngBinaryData()
Problem 3: SfBarcodeGenerator liefert keine serverseitige Ausgabe
Syncfusion: SfBarcodeGenerator ist eine Razor-Komponente ohne serverseitige API-Oberfläche. Bei dem Versuch, es in einer Controller-Aktion oder einem Hintergrunddienst zu verwenden, findet sich keine geeignete Methode zum Generieren von Barcode-Bytes.
Lösung: Erstellen Sie einen minimalen API-Endpunkt, der den Barcode serverseitig generiert und als HTTP-Antwort zurückgibt. Verweisen Sie den Endpunkt von der Razor-Komponente über einen <img src="..."> Tag:
app.MapGet("/barcode/{value}", (string value) =>
{
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(300, 150)
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});
app.MapGet("/barcode/{value}", (string value) =>
{
var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
.ResizeTo(300, 150)
.ToPngBinaryData();
return Results.File(bytes, "image/png");
});
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
app.MapGet("/barcode/{value}", Function(value As String)
Dim bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) _
.ResizeTo(300, 150) _
.ToPngBinaryData()
Return Results.File(bytes, "image/png")
End Function)
Problem 4: Fehlende Lesefunktion (OPX nicht erworben)
Syncfusion: Projekte, bei denen das Barcode-Lesen verschoben wurde, weil OPX noch nicht erworben wurde, verfügen über keinen Lesecode, der migriert werden könnte. Um die Lesefähigkeit von Grund auf neu hinzuzufügen, sind die Beschaffung von OPX, die Integration und eine neue Lizenzvereinbarung erforderlich.
Lösung: Die IronBarcode Lesefunktion ist im selben Paket enthalten. Es ist keine Beschaffung oder Zweitlizenz erforderlich. Fügen Sie BarcodeReader.Read(path) überall dort hinzu, wo das Lesen erforderlich ist:
var results = BarcodeReader.Read("incoming-scan.png");
var results = BarcodeReader.Read("incoming-scan.png");
Dim results = BarcodeReader.Read("incoming-scan.png")
Problem 5: Ablauf der Gemeinschaftslizenz während der Migration
Syncfusion: Ein Team, das die Community-Lizenz verwendet und während des Migrationszeitraums eine der Zulassungsschwellen überschreitet – einschließlich des Abschlusses einer Finanzierungsrunde –, muss möglicherweise feststellen, dass die Syncfusion Steuerelemente keine gültigen Ausgaben mehr erzeugen, bevor die Migration abgeschlossen ist.
Lösung: Die 30-tägige Testphase von IronBarcode ermöglicht eine umfassende Evaluierung ohne Umsatz-, Mitarbeiterzahl- oder Kapitalbeschränkungen. Das Testwasserzeichen erscheint auf der generierten Ausgabe; Durch die Aktivierung eines gekauften Lizenzschlüssels wird dieser entfernt. Im IronBarcode -Lizenzmodell gibt es keine Beschränkungen hinsichtlich der Unternehmensgröße.
Syncfusion Barcode-Migrations-Checkliste
Vor der Migration anfallende Aufgaben
Überprüfen Sie den Quellcode, um alle Dateien zu finden, die auf den Syncfusion -Barcode verweisen:
grep -r "SyncfusionLicenseProvider.RegisterLicense\|AddSyncfusionBlazor\|ConfigureSyncfusionCore" --include="*.cs" .
grep -r "new SfBarcode\(\)\|SfBarcodeGenerator\|SfQRCodeGenerator" --include="*.cs" --include="*.razor" .
grep -r "BarcodeSymbolType\.\|BarcodeType\." --include="*.cs" --include="*.razor" .
grep -r "DrawToBitmap\|barcode\.Text\s*=" --include="*.cs" .
grep -r "Syncfusion\.Barcode\|Syncfusion\.Blazor\.BarcodeGenerator" --include="*.csproj" .
grep -r "SyncfusionLicenseProvider.RegisterLicense\|AddSyncfusionBlazor\|ConfigureSyncfusionCore" --include="*.cs" .
grep -r "new SfBarcode\(\)\|SfBarcodeGenerator\|SfQRCodeGenerator" --include="*.cs" --include="*.razor" .
grep -r "BarcodeSymbolType\.\|BarcodeType\." --include="*.cs" --include="*.razor" .
grep -r "DrawToBitmap\|barcode\.Text\s*=" --include="*.cs" .
grep -r "Syncfusion\.Barcode\|Syncfusion\.Blazor\.BarcodeGenerator" --include="*.csproj" .
Dokumentieren Sie Folgendes, bevor Sie Migrationscode schreiben:
- Listen Sie jede Datei auf, die
SyncfusionLicenseProvider.RegisterLicenseaufruft - Listen Sie jede
SfBarcodeInstanzierung und deren Eigenschaftszuweisungen auf - Listen Sie jede Nutzung von
<SfBarcodeGenerator>und<SfQRCodeGenerator>Razor-Komponenten auf - Listen Sie jeden
DrawToBitmapAufruf und den nachgelagerten Speicher- oder Anzeigepfad auf - Prüfen Sie, ob der Barcode-Leser OPX installiert ist; Falls ja, listen Sie alle Lesungsanrufe auf.
Aufgaben der Code-Aktualisierung
- Entfernen Sie die Syncfusion Barcode- NuGet Pakete für jede Plattform im Projekt.
- Entfernen Sie das
Syncfusion.LicensingNuGet-Paket, wenn keine anderen Syncfusion-Steuerelemente verbleiben - Installieren Sie das
IronBarcodeNuGet-Paket - Ersetzen Sie
SyncfusionLicenseProvider.RegisterLicense("KEY")durchIronBarCode.License.LicenseKey = "KEY"an der Anwendungseintrittsstelle - Entfernen Sie
builder.Services.AddSyncfusionBlazor(), wenn keine anderen Syncfusion-Steuerelemente verbleiben - Entfernen Sie
builder.ConfigureSyncfusionCore(), wenn keine anderen Syncfusion-Steuerelemente verbleiben - Entfernen Sie
@using Syncfusion.Blazorund@using Syncfusion.Blazor.BarcodeGeneratoraus_Imports.razor, falls zutreffend - Ersetzen Sie
using Syncfusion.Windows.Forms.Barcodeundusing Syncfusion.Licensingdurchusing IronBarCode - Ersetzen Sie jeden
new SfBarcode()+ Eigenschaftszuweisungen +DrawToBitmapBlock durchBarcodeWriter.CreateBarcode(value, BarcodeEncoding.X).ResizeTo(w, h).SaveAsPng(path) - Ersetzen Sie
BarcodeSymbolType.Code128A(und Äquivalente) durchBarcodeEncoding.Code128 - Ersetzen Sie
BarcodeType.Code128(Blazor-Enum) durchBarcodeEncoding.Code128 - Ersetzen Sie jede
<SfBarcodeGenerator>Razor-Komponente durch einen minimalen API-Endpunkt und einen<img src="...">Verweis in der Komponente - Ersetzen Sie jede
<SfQRCodeGenerator>Razor-Komponente durch einenQRCodeWriter.CreateQrCode()Endpunkt und einen<img src="...">Verweis - Ersetzen Sie alle Barcode Reader OPX-Leseaufrufe durch
BarcodeReader.Read(path) - Fügen Sie
BarcodeReader.Read(path)hinzu, wo auch immer vorher eine Lese-Fähigkeit fehlte, da OPX nicht gekauft wurde
Post-Migrationstests
- Überprüfen Sie mithilfe eines Hardware-Scanners oder einer Referenzleseanwendung, ob die generierten Barcode-Bilder scan-gültig sind.
- Stellen Sie sicher, dass nach der Aktivierung des Lizenzschlüssels keine Testwasserzeichen auf den generierten Ausgaben erscheinen.
- Bestätigen Sie, dass
BarcodeReader.Read()den erwarteten Wert und das Format für jeden verwendeten Barcode-Typ zurückgibt - Testen Sie die PDF-Ausgabe mit
.SaveAsPdf(), um zu bestätigen, dass die Seitendimensionen und die Barcode-Dimensionen den Entwurfsspezifikationen entsprechen - Testen Sie den minimalen API-Endpunkt von Blazor direkt (über Browser oder HTTP-Client), bevor Sie innerhalb der Razor Komponente testen.
- Bestätigen Sie, dass die Docker- und Linux-Bereitstellung die gleiche Ausgabe wie die Windows-Entwicklungsrechner erzeugt.
- Führen Sie einen abschließenden
grepAudit durch, um sicherzustellen, dass keine verbleibenden Verweise aufSfBarcode,SfBarcodeGenerator,DrawToBitmap,BarcodeSymbolTypeoderSyncfusionLicenseProvidervorhanden sind
Wichtigste Vorteile der Migration zu IronBarcode
Einheitliche Generierung und Lesung: Nach der Migration erfolgen sowohl die Generierung als auch die Lesung über ein einziges NuGet Paket unter einer einzigen Lizenz. Es gibt kein zweites Produkt zu kaufen, keine zweite API-Oberfläche zu erlernen und keine Abhängigkeit von einem ZXing .NET -Wrapper, die ein Lizenzbudget verbraucht, das stattdessen für die direkte Open-Source-Bibliothek verwendet werden könnte.
Wegfall der versionsspezifischen Schlüsselrotation: IronBarcode Lizenzschlüssel bleiben auch bei kleineren Updates und Patches innerhalb einer Hauptversion gültig. Der operative Aufwand, einen neuen Schlüssel zu beschaffen, Geheimnisse in jeder Bereitstellungsumgebung zu aktualisieren und bei jedem größeren NuGet Versionsupdate die Testwasserzeichen erneut zu entfernen, entfällt vollständig.
Plattformunabhängige Bereitstellung: Das gleiche IronBarcode Paket und die gleiche API-Generierung funktionieren in WinForms-Desktopanwendungen, ASP.NET Core -Diensten, Azure Functions, Konsolenanwendungen und Linux-Docker-Containern. Die Windows Forms-Laufzeitabhängigkeit eingeführt durch DrawToBitmap wird entfernt, und Blazor-Implementierungen wechseln von browsergerenderten Komponenten zu serverseitigen API-Endpunkten, die unabhängig testbar und klienten-agnostisch sind.
Native PDF-Unterstützung: Sowohl die Generierung als auch das Lesen von PDFs erfolgen nativ. Die Erstellung eines Barcode-PDFs erfordert nicht mehr die Koordination zweier Syncfusion Produkte; Das Auslesen von Barcodes aus PDF-Manifesten und Versanddokumenten erfordert keinen separaten PDF-Extraktionsschritt mehr.
Vorhersehbare Lizenzökonomie: Das unbefristete Lizenzmodell von IronBarcode setzt keine Umsatz-, Personal-, Mitarbeiterzahl- oder Kapitalschwellenwerte voraus. Teams, die die Voraussetzungen für die Syncfusion Community License bereits erfüllt haben oder dies voraussichtlich bald tun werden, wechseln zu einem Lizenzmodell, bei dem das organisatorische Wachstum keinen Compliance-Fall auslöst.
Häufig gestellte Fragen
Warum sollte ich von Syncfusion BarCode zu IronBarcode migrieren?
Zu den häufigsten Gründen gehören die Vereinfachung der Lizenzierung (Beseitigung der Komplexität von SDK und Laufzeitschlüsseln), die Beseitigung von Durchsatzbeschränkungen, die Verbesserung der nativen PDF-Unterstützung, die Verbesserung der Docker/CI/CD-Bereitstellung und die Verringerung von API-Boilerplate im Produktionscode.
Wie kann ich Syncfusion-API-Aufrufe durch IronBarcode ersetzen?
Ersetzen Sie Instanzerstellung und Lizenzierung durch IronBarCode.License.LicenseKey = "key". Ersetzen Sie die Leseaufrufe durch BarcodeReader.Read(path) und die Schreibaufrufe durch BarcodeWriter.CreateBarcode(data, encoding). Statische Methoden erfordern keine Instanzverwaltung.
Wie viel Code ändert sich bei der Migration von Syncfusion BarCode zu IronBarcode?
Die meisten Migrationen führen zu weniger Codezeilen. Lizenzierungs-Boilerplate, Instanzkonstruktoren und explizite Formatkonfiguration werden entfernt. Zentrale Lese-/Schreibvorgänge werden auf kürzere IronBarcode-Äquivalente mit saubereren Ergebnisobjekten abgebildet.
Müssen Syncfusion Barcode und IronBarcode während der Migration installiert bleiben?
Nein. Die meisten Migrationen sind direkte Ersetzungen und keine Paralleloperationen. Migrieren Sie eine Serviceklasse nach der anderen, ersetzen Sie die NuGet-Referenz und aktualisieren Sie die Instanzierungs- und API-Aufrufmuster, bevor Sie zur nächsten Klasse übergehen.
Wie lautet der NuGet-Paketname für IronBarcode?
Das Paket ist 'IronBarCode' (mit großem B und C). Installieren Sie es mit 'Install-Package IronBarCode' oder 'dotnet add package IronBarCode'. Die using-Anweisung im Code lautet 'using IronBarCode;'.
Wie vereinfacht IronBarcode die Docker-Bereitstellung im Vergleich zu Syncfusion BarCode?
IronBarcode ist ein NuGet-Paket, für das keine externen SDK-Dateien oder Lizenzkonfigurationen erforderlich sind. In Docker setzen Sie die Umgebungsvariable IRONBARCODE_LICENSE_KEY und das Paket übernimmt die Lizenzvalidierung beim Start.
Erkennt IronBarcode nach der Migration von Syncfusion alle Barcode-Formate automatisch?
Ja, IronBarcode erkennt automatisch die Symbologie aller unterstützten Formate. Eine explizite Aufzählung von BarcodeTypes ist nicht erforderlich. Wenn das Format bereits bekannt ist und die Leistung eine Rolle spielt, ermöglicht BarcodeReaderOptions die Einschränkung des Suchraums als eine Optimierung.
Kann IronBarcode Barcodes aus PDFs ohne eine separate Bibliothek lesen?
Ja, BarcodeReader.Read("document.pdf") verarbeitet PDF-Dateien nativ. Die Ergebnisse enthalten PageNumber, Format, Value und Confidence für jeden gefundenen Barcode. Es ist kein externer PDF-Rendering-Schritt erforderlich.
Wie handhabt IronBarcode die parallele Verarbeitung von Barcodes?
Die statischen Methoden von IronBarcode sind zustandslos und thread-sicher. Verwenden Sie Parallel.ForEach direkt über Dateilisten ohne Instanzmanagement pro Thread. BarcodeReaderOptions.MaxParallelThreads steuert das interne Thread-Budget.
Welche Ergebniseigenschaften ändern sich bei der Migration von Syncfusion BarCode zu IronBarcode?
Übliche Umbenennungen: BarcodeValue wird zu Value, BarcodeType wird zu Format. IronBarcode-Ergebnisse fügen auch Confidence und PageNumber hinzu. Eine lösungsweite Such- und Ersetzungsfunktion übernimmt die Umbenennungen im bestehenden Ergebnisverarbeitungscode.
Wie kann ich die IronBarcode-Lizenzierung in einer CI/CD-Pipeline einrichten?
Speichern Sie IRONBARCODE_LICENSE_KEY als Pipeline-Geheimnis und weisen Sie IronBarCode.License.LicenseKey im Startup-Code der Anwendung zu. Ein Geheimnis deckt alle Umgebungen ab, einschließlich Entwicklung, Test, Staging und Produktion.
Unterstützt IronBarcode die Generierung von QR-Codes mit benutzerdefiniertem Styling?
Ja. QRCodeWriter.CreateQrCode() unterstützt benutzerdefinierte Farben über ChangeBarCodeColor(), das Einbetten von Logos über AddBrandLogo(), konfigurierbare Fehlerkorrekturstufen und mehrere Ausgabeformate einschließlich PNG, JPG, PDF und Stream.

