Jak dostosowywać i dodawać loga do kodów QR w C# | IronBracode
Migrating fromSyncfusionBarCode to IronBarcode
Ten przewodnik zapewnia pełną ścieżkę migracji z kontrolki kodu kreskowegoSyncfusion— SfBarcode dla WinForms i WPF, SfBarcodeGenerator dla Blazor i MAUI — do IronBarcode. Obejmuje on strukturalne powody, dla których zespoły dokonują tej zmiany, szybki przewodnik krok po kroku dotyczący wymiany pakietów NuGet i konfiguracji licencji, pełne przykłady kodu "przed i po" dla każdego typowego scenariusza oraz listę kontrolną migracji do audytu istniejącej bazy kodu. Jeśli w projekcie wykorzystywane są również inne komponentySyncfusion(tabele, wykresy, harmonogramy), pakiety te i ich rejestracje pozostają bez zmian — zmiany dotyczą wyłącznie kodu związanego z kodami kreskowymi BarCode.
Dlaczego warto przejść zSyncfusionBarCode
Luka w odczycie: SfBarcode i SfBarcodeGenerator to kontrolki generujące bez możliwości odczytu. Nie ma metody .Read() ani .Scan() w żadnej z klas. Gdy projekt wymaga odczytu kodów kreskowych z przesłanych obrazów, zeskanowanych dokumentów lub plików PDF, kontrolka kodów kreskowychSyncfusionnie oferuje żadnego rozwiązania. DokumentacjaSyncfusionwskazuje zespołom rozwiązanie Barcode Reader OPX, które jest oddzielnym produktem komercyjnym, który należy nabyć, licencjonować i utrzymywać niezależnie.
OPX jako płatna nakładka na darmowe oprogramowanie: czytnik BarCode OPX wykorzystuje wewnętrznie ZXing.Net — bibliotekę open source do odczytu kodów kreskowych opublikowaną na licencji Apache 2.0. Apache 2.0 jest licencją liberalną; każdy programista .NET może zainstalować ZXing.Net bezpośrednio za pomocą dotnet add package ZXing.Net i używać go w aplikacjach komercyjnych bez opłat. Pełen przepływ pracySyncfusiondo odczytu i generowania wymaga dwóch oddzielnych produktów Syncfusion, dwóch umów licencyjnych oraz dwóch interfejsów API — podczas gdy możliwość odczytu mogłaby być zaczerpnięta bezpośrednio z bezpłatnej biblioteki, którą opx opakowuje.
Warunki licencji społecznościowej: Licencja społecznościowa firmySyncfusionwymaga spełnienia czterech warunków jednocześnie i w sposób ciągły: roczny przychód brutto poniżej 1 000 000 USD, maksymalnie pięciu programistów, maksymalnie dziesięciu pracowników ogółem oraz łączny pozyskany kapitał zewnętrzny poniżej 3 000 000 USD. Organizacje rządowe nie kwalifikują się do uzyskania licencji niezależnie od wielkości. Naruszenie któregokolwiek z tych warunków powoduje natychmiastowy obowiązek uzyskania licencji komercyjnej. Runda finansowania serii A zazwyczaj powoduje, że w dniu jej zamknięcia zebrany kapitał przekracza 3 000 000 USD, co powoduje naliczenie opłaty licencyjnej niezależnie od wielkości zespołu lub przychodów. Przejście komercyjne przechodzi z $0 do rocznej subskrypcji Essential Studio na każdego dewelopera — a ta subskrypcja obejmuje cały zestaw narzędzi, a nie tylko komponent kodów kreskowych. Opublikowana ścieżkaSyncfusionto niestandardowa oferta od działu sprzedaży.
Rotacja kluczy zależna od wersji: Klucze licencyjneSyncfusionsą powiązane z konkretnymi zakresami wersji Essential Studio. Aktualizacja z wersji 24.x do 25.x wymaga uzyskania nowego klucza z portalu konta, zaktualizowania tego klucza w magazynie sekretów każdego środowiska wdrożeniowego oraz ponownego wdrożenia, aby zapobiec pojawianiu się znaków wodnych wersji próbnej w wynikach produkcyjnych. Dla zespołów o częstym cyklu wydawniczym lub wielu celach wdrożeniowych ta rotacja staje się powtarzającym się obciążeniem operacyjnym, które jest nieproporcjonalne do podstawowego wymogu generowania obrazu BARCODE.
Podstawowy problem
Architektura kontrolkiSyncfusionsprawia, że programowe generowanie plików odbywa się w sposób pośredni. Utworzenie pliku kodu kreskowego za pomocą SfBarcode wymaga wcześniejszego przydzielenia Bitmap, wywoływania DrawToBitmap, a następnie zapisania bitmapy — wzorzec renderowania WinForms, który jest uzależniony od środowiska uruchomieniowego Windows Forms:
//SyncfusionSfBarcode: 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
//SyncfusionSfBarcode: 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
' SyncfusionSfBarcode: 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 generuje pliki bezpośrednio i odczytuje je za pomocą tego samego pakietu:
// 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 aSyncfusionBarCode: porównanie funkcji
| Funkcja | SyncfusionBarCode | IronBarcode |
|---|---|---|
| Generowanie BarCode'ów | Tak — kontrolki interfejsu użytkownika (WinForms, WPF, Blazor, MAUI) | Tak — statyczne API, wszystkie środowiska |
| Odczytywanie BarCode | Nie — wymagany jest oddzielny czytnik BarCode OPX | Tak — ten sam pakiet |
| Produkt do odczytu plików OPX wykorzystuje bibliotekę ZXing.Net (Apache 2.0) | Tak | Nie dotyczy |
| Wyjście w formacie PDF z kodem kreskowym BarCode | Nie — wymaga dodatkowo Syncfusion.PDF | Tak — SaveAsPdf() wbudowany |
| Odczytywanie BarCodes z plików PDF | Nie | Tak — native |
| Generowanie po stronie serwera / bezinterfejsowe | Wymaga środowiska uruchomieniowego WinForms (DrawToBitmap) |
Natywny — bez zależności od interfejsu użytkownika |
| Wdrożenie w środowisku Docker / Linux | Ograniczone | Pełne wsparcie |
| Minimalny interfejs API .NET Core | Nieobsługiwane bezpośrednio | Pełne wsparcie |
| Kod QR z osadzonym logo | Nie | Tak — .AddBrandLogo() |
| Automatyczne wykrywanie formatu podczas odczytu | Nie dotyczy | Tak |
| Społeczność / poziom darmowy | Licencja społecznościowa (cztery warunki równoczesne) | 30-dniowy okres próbny (tylko znak wodny) |
| Model licencji komercyjnej | Roczna subskrypcja (Essential Studio) | Wieczysta (jednorazowa, zobacz ironsoftware.com/csharp/barcode/licensing) |
| Zakres klucza licencyjnego | Specyficzne dla wersji, aktualizowane wraz z głównymi aktualizacjami NuGet | Wersja stabilna w ramach głównej wersji |
| Kroki rejestracji platformy | 3–4 kroki (RegisterLicense + AddSyncfusionBlazor + ConfigureSyncfusionCore + importy Razor) | Jedna linia, wszystkie platformy |
| Zakres formatów 1D | Code 128, Code 39, EAN, UPC, Codabar i inne | Wszystkie formatySyncfusionPlus PDF417, Aztec, MaxiCode, GS1, USPS IMb i ponad 50 innych |
| Zakres formatów 2D | Kod QR, DataMatrix | QR Code, DataMatrix, PDF417, Micro PDF417, Aztec, MaxiCode |
Szybki start
Krok 1: Zastąp pakiety NuGet
Usuń pakiet kodów kreskowychSyncfusiondla używanej platformy. Jeśli projekt jest przeznaczony dla wielu platform, uruchom usuwanie dla każdej z nich:
# 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
Jeśli po usunięciu pakietu BarCode w projekcie nie pozostały żadne inne pakiety Syncfusion, usuń również pakiet licencyjny:
dotnet remove package Syncfusion.Licensing
dotnet remove package Syncfusion.Licensing
Zainstaluj IronBarcode— jeden pakiet dla wszystkich platform:
dotnet add package IronBarcode
dotnet add package IronBarcode
Krok 2: Aktualizacja przestrzeni nazw
Usuń przestrzenie nazwSyncfusionBarCode i dodaj przestrzeń nazw IronBarcode:
// Remove these (barcode-specific; leave others if non-barcodeSyncfusioncontrols 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-barcodeSyncfusioncontrols remain)
using Syncfusion.Windows.Forms.Barcode;
using Syncfusion.Licensing;
// @using Syncfusion.Blazor.BarcodeGenerator (in _Imports.razor)
// Add this
using IronBarCode;
Imports IronBarCode
Krok 3: Inicjalizacja licencji
Usuń rejestrację licencjiSyncfusioni konfigurację platformy z sekcji uruchamiania aplikacji. Następnie dodaj pojedynczy wiersz licencji IronBarcode w tym samym miejscu:
// 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 otherSyncfusioncontrols
builder.ConfigureSyncfusionCore(); // MAUI only — remove if no otherSyncfusioncontrols
// 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 otherSyncfusioncontrols
builder.ConfigureSyncfusionCore(); // MAUI only — remove if no otherSyncfusioncontrols
// 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"
W przypadku potoków CI/CD i kontenerów Docker należy zapisać klucz w zmiennej środowiskowej:
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
Imports System
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
Przykłady migracji kodu
WinForms SfBarcode do BarcodeWriter
Migracja WinForms eliminuje DrawToBitmap i zastępuje ją bezpośrednim łańcuchem wyjściowym pliku. WzórSyncfusionwymaga wcześniejszego przydziału Bitmap o znanych wymiarach;IronBarcode oblicza wymiary w ramach wywołania generującego.
Podejście firmy Syncfusion:
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
Podejście IronBarcode:
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 mapuje się do BarcodeEncoding.Code128. Sekwencja DrawToBitmap + Bitmap.Save redukuje się do .SaveAsPng(). Jeśli kod kreskowy musi być wyświetlony wewnątrz komponentu WinForms PictureBox zamiast być zapisany na dysku, użyj .ToPngBinaryData() do załadowania obrazu do kontrolki. Pełen zakres formatów kodów kreskowych 1D w IronBarcode znacznie wykracza poza listę obsługiwanych formatów przez kontrolkę Syncfusion.
Blazor SfBarcodeGenerator do minimalnego punktu końcowego API
Migracja do Blazora to raczej zmiana strukturalna niż zamiana linii po linii. SfBarcodeGenerator to komponent Razor, który renderuje się w przeglądarce przez warstwę JavaScript Syncfusion.IronBarcode nie posiada komponentu Razor; Jest to biblioteka po stronie serwera. Wzorzec zastępczy to minimalny punkt końcowy API na serwerze, który zwraca bajty kodu kreskowego, odwołujące się w stronie Razor jako źródło obrazu.
Podejście firmy Syncfusion:
@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";
}
Podejście IronBarcode:
Dodaj punkt końcowy generowania w Program.cs:
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)
Odwołaj się do punktu końcowego w komponencie Razor:
@page "/fulfillment"
<img src="/barcode/@orderNumber" alt="Order barcode: @orderNumber" />
@code {
private string orderNumber = "ORD-20240315-001";
}
Ten punkt końcowy można testować niezależnie, można go ponownie wykorzystać z dowolnego klienta HTTP i jest on zgodny z Blazor Server, Blazor WebAssembly z hostowanym backendem API oraz dowolnym innym frontendem internetowym.
Generowanie kodów QR
KomponentSyncfusionQR jest również renderowany przez przeglądarkę bez ścieżki wyjściowej po stronie serwera.IronBarcode generuje kody QR po stronie serwera z bezpośrednim wypisem do pliku.
Podejście firmy Syncfusion:
@using Syncfusion.Blazor.BarcodeGenerator
<SfQRCodeGenerator
Width="300px"
Height="300px"
Value="https://example.com/product/ABC-123">
<QRCodeGeneratorDisplayText Visibility="false">
</QRCodeGeneratorDisplayText>
</SfQRCodeGenerator>
Podejście IronBarcode:
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")
Zastąpienie czytania OPX
Jeśli w projekcie używano czytnika kodów kreskowych BarCode OPX — lub odłożono wymóg odczytu do przyszłego zakupu OPX —IronBarcode zastępuje tę zależność pakietem, który jest już zainstalowany. Brak produktu dodatkowego, brak drugiej licencji.
PodejścieSyncfusion(BarCode Reader OPX):
// Requires separateSyncfusionBarCode Reader 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 separateSyncfusionBarCode Reader 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
Podejście IronBarcode:
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
Dokumentacja dotycząca odczytu kodów kreskowych obejmuje odczyt z tablic bajtów dla procedur obsługi przesyłania, dostosowanie szybkości w stosunku do dokładności oraz wykrywanie wielu kodów kreskowych.
Generowanie BarCode'ów w formacie PDF
Kontrolki BarCodeSyncfusionnie mają ścieżki wyjściowej PDF.IronBarcode traktuje PDF jako format wyjściowy pierwszej klasy.
Podejście firmy Syncfusion:
// Nie direct path — requires combining Syncfusion.Barcode.WinForms and Syncfusion.Pdf
// Step 1: Generate to Bitmap via DrawToBitmap
// Step 2: LoadSyncfusionPDF document
// Step 3: Insert bitmap as image element
// Two packages, two APIs, two license obligations
// Nie direct path — requires combining Syncfusion.Barcode.WinForms and Syncfusion.Pdf
// Step 1: Generate to Bitmap via DrawToBitmap
// Step 2: LoadSyncfusionPDF document
// Step 3: Insert bitmap as image element
// Two packages, two APIs, two license obligations
' Nie direct path — requires combining Syncfusion.Barcode.WinForms and Syncfusion.Pdf
' Step 1: Generate to Bitmap via DrawToBitmap
' Step 2: LoadSyncfusionPDF document
' Step 3: Insert bitmap as image element
' Two packages, two APIs, two license obligations
Podejście IronBarcode:
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
Przewodnik po generowaniu plików PDF z kodami kreskowymi obejmuje wielostronicowe pliki PDF oraz osadzanie kodów kreskowych obok innych treści dokumentu.
SyncfusionBarCode API do IronBarcode Mapping Reference
| Syncfusion | IronBarcode |
|---|---|
SyncfusionLicenseProvider.RegisterLicense("KEY") |
IronBarCode.License.LicenseKey = "key" |
builder.Services.AddSyncfusionBlazor() |
Nie jest wymagane |
builder.ConfigureSyncfusionCore() |
Nie jest wymagane |
new SfBarcode() |
BarcodeWriter.CreateBarcode() (statyczny) |
barcode.Text = "value" |
Pierwszy parametr 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) |
Ręczne Bitmap → MemoryStream |
.ToPngBinaryData() |
<SfBarcodeGenerator Type="BarcodeType.Code128" Value="..."> |
BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128) w punkcie końcowym API |
<SfQRCodeGenerator Value="..."> |
QRCodeWriter.CreateQrCode(value, size) w punkcie końcowym API |
BarcodeType.Code128 (enum Blazor) |
BarcodeEncoding.Code128 |
| Czytnik kodów kreskowych OPX (oddzielny produkt, wykorzystujący bibliotekę ZXing.Net) | BarcodeReader.Read(path) — natywnie, ten sam pakiet |
| Brak odczytu API w kontroli | BarcodeReader.Read(path) |
| Brak możliwości generowania plików PDF | .SaveAsPdf(path) |
| Brak możliwości odczytu plików PDF | BarcodeReader.Read("document.pdf") |
Typowe problemy związane z migracją i ich rozwiązania
Problem 1: Znak wodny wersji próbnej po aktualizacji NuGet
Syncfusion: Aktualizacja z Essential Studio 24.x do 25.x powoduje unieważnienie istniejącego klucza licencyjnego. Wszelkie dane wyjściowe wygenerowane przed aktualizacją magazynu kluczy będą zawierały znak wodny wersji próbnej. Jest to cicha awaria — aplikacja nadal działa, ale generuje wyniki niezgodne z wymaganiami.
Rozwiązanie: Po aktualizacji pakietu IronBarcode NuGet klucz licencyjny nie zmienia się w ramach tej samej wersji głównej. W przypadku wydania wersji z drobnymi zmianami lub poprawkami nie jest wymagana aktualizacja ani ponowne wdrożenie. Podczas aktualizacji do nowej głównej wersji należy zaktualizować klucz raz w punkcie wejścia aplikacji:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Problem 2: Funkcja DrawToBitmap nie działa w środowiskach bezinterfejsowych
Syncfusion: SfBarcode.DrawToBitmap zależy od potoku renderowania Windows Forms. W procesie ASP.NET Core, Azure Function lub kontenerze Docker na Linuxie, wywołanie DrawToBitmap spowoduje rzucenie InvalidOperationException lub wygenerowanie pustej bitmapy, ponieważ nie ma pętli komunikatów Windows Forms.
Rozwiązanie: Zastąp BarcodeWriter.CreateBarcode().IronBarcode generuje kody w kodzie zarządzanym bez żadnych zależności od środowiska uruchomieniowego interfejsu użytkownika:
// 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 nie ma wyjścia po stronie serwera
Syncfusion: SfBarcodeGenerator to komponent Razor bez powierzchni API po stronie serwera. Próby użycia go w akcji kontrolera lub usłudze działającej w tle nie znajdą żadnej odpowiedniej metody do generowania bajtów kodu kreskowego BarCode.
Rozwiązanie: Utwórz minimalny punkt końcowy API, który generuje kod kreskowy po stronie serwera i zwraca go jako odpowiedź HTTP. Odniesienie do punktu końcowego z komponentu Razor za pomocą tagu <img src="...">:
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: Brak możliwości odczytu (nie zakupiono OPX)
Syncfusion: Projekty, w których odłożono odczyt kodów BARCODE, ponieważ nie zakupiono jeszcze OPX, nie mają kodu do odczytu, który należałoby przenieść. Dodanie możliwości odczytu od podstaw wymaga zakupu OPX, integracji oraz nowej Umowy licencyjnej.
Rozwiązanie: Odczyt kodów kreskowych IronBarcode jest zawarty w tym samym pakiecie. Nie jest wymagane żadne zamówienie ani dodatkowa licencja. Dodaj BarcodeReader.Read(path) zawsze, gdy potrzebny jest odczyt:
var results = BarcodeReader.Read("incoming-scan.png");
var results = BarcodeReader.Read("incoming-scan.png");
Dim results = BarcodeReader.Read("incoming-scan.png")
Problem 5: Wygaśnięcie licencji społecznościowej podczas migracji
Syncfusion: Zespół korzystający z licencji Community, który przekroczy dowolny próg kwalifikacyjny w okresie migracji — w tym zamknie rundę finansowania — może zauważyć, że kontrolkiSyncfusionprzestaną generować prawidłowe wyniki przed zakończeniem migracji.
Rozwiązanie: 30-dniowy okres próbny IronBarcode umożliwia pełną ocenę bez żadnych warunków dotyczących przychodów, liczby pracowników czy kapitału. Na wygenerowanym wyniku pojawia się znak wodny wersji próbnej; Aktywacja zakupionego klucza licencyjnego powoduje jego usunięcie. W modelu licencyjnym IronBarcode nie ma ograniczeń dotyczących wielkości organizacji.
Lista kontrolna migracji BarCode Syncfusion
Zadania przed migracją
Przeprowadź audyt kodu źródłowego, aby zlokalizować każdy plik odwołujący się do BarCODE-a Syncfusion:
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" .
Przed napisaniem jakiegokolwiek kodu migracyjnego należy udokumentować następujące kwestie:
- Wypisz każdy plik, który wywołuje
SyncfusionLicenseProvider.RegisterLicense - Wypisz każde utworzenie
SfBarcodei przypisywanie jego właściwości - Wypisz każde użycie komponentu Razor
<SfBarcodeGenerator>i<SfQRCodeGenerator> - Wypisz każde wywołanie
DrawToBitmapi ścieżkę zapisu lub wyświetlania w dół strumienia - Sprawdź, czy zainstalowany jest program BarCode Reader OPX; jeśli tak, wymień wszystkie wezwania do odczytu
Zadania związane z aktualizacją kodu
- Usuń pakiety NuGet z kodami BARCODESyncfusiondla każdej platformy w projekcie
- Usuń pakiet NuGet
Syncfusion.Licensing, jeśli nie pozostają żadne inne kontrolki Syncfusion - Zainstaluj pakiet NuGet
IronBarcode - Zastąp
SyncfusionLicenseProvider.RegisterLicense("KEY")za pomocąIronBarCode.License.LicenseKey = "KEY"w punkcie wejścia aplikacji - Usuń
builder.Services.AddSyncfusionBlazor(), jeśli nie pozostają żadne inne kontrolki Syncfusion - Usuń
builder.ConfigureSyncfusionCore(), jeśli nie pozostają żadne inne kontrolki Syncfusion - Usuń
@using Syncfusion.Blazori@using Syncfusion.Blazor.BarcodeGeneratorz_Imports.razor, jeśli dotyczy - Zastąp
using Syncfusion.Windows.Forms.Barcodeiusing Syncfusion.Licensingza pomocąusing IronBarCode - Zastąp każdy blok
new SfBarcode()+ przypisania właściwości +DrawToBitmapza pomocąBarcodeWriter.CreateBarcode(value, BarcodeEncoding.X).ResizeTo(w, h).SaveAsPng(path) - Zastąp
BarcodeSymbolType.Code128A(i odpowiedniki) za pomocąBarcodeEncoding.Code128 - Zastąp
BarcodeType.Code128(enum Blazor) za pomocąBarcodeEncoding.Code128 - Zastąp każdy komponent Razor
<SfBarcodeGenerator>komponentem API minimalnym i odniesieniem<img src="...">w komponencie - Zastąp każdy komponent Razor
<SfQRCodeGenerator>komponentem APIQRCodeWriter.CreateQrCode()i odniesieniem<img src="..."> - Zastąp wszystkie wywołania odczytu Barcode Reader OPX za pomocą
BarcodeReader.Read(path) - Dodaj
BarcodeReader.Read(path)zawsze, gdy wcześniej brakowało możliwości odczytu z powodu braku zakupu OPX
Testy po migracji
- Sprawdź, czy wygenerowane obrazy BarCode nadają się do skanowania, używając skanera sprzętowego lub aplikacji do odczytu.
- Sprawdź, czy po aktywacji klucza licencyjnego na wygenerowanym pliku nie pojawiają się żadne znaki wodne wersji próbnej
- Potwierdź, że
BarcodeReader.Read()zwraca oczekiwaną wartość i format dla każdego używanego typu kodu kreskowego - Przetestuj wyjście PDF za pomocą
.SaveAsPdf(), aby potwierdzić, że wymiary strony i kodu kreskowego odpowiadają wymaganiom projektowym - Przetestuj bezpośrednio minimalny punkt końcowy API Blazor (przez przeglądarkę lub klienta HTTP) przed testowaniem w komponencie Razor
- Sprawdź, czy wdrożenie w środowisku Docker i Linux daje identyczne wyniki jak na komputerach programistycznych z systemem Windows
- Przeprowadź ostateczny audyt
grep, aby potwierdzić brak pozostałych odniesień doSfBarcode,SfBarcodeGenerator,DrawToBitmap,BarcodeSymbolType, lubSyncfusionLicenseProvider
Kluczowe korzyści wynikające z migracji do IronBarcode
Ujednolicone generowanie i odczyt: Po migracji zarówno generowanie, jak i odczyt działają za pośrednictwem jednego pakietu NuGet na jednej licencji. Nie ma potrzeby zakupu dodatkowego produktu, nauki obsługi kolejnego interfejsu API ani korzystania z opakowania ZXing.Net, które pochłania budżet licencyjny, który można by przeznaczyć na bezpośrednią bibliotekę open source.
Eliminacja rotacji kluczy specyficznej dla wersji: Klucze licencyjne IronBarcode zachowują ważność w przypadku aktualizacji pomniejszych i poprawek w ramach głównej wersji. Całkowicie eliminuje się nakłady operacyjne związane z uzyskiwaniem nowego klucza, aktualizowaniem sekretów w każdym środowisku wdrożeniowym oraz ponownym wdrażaniem w celu usunięcia znaków wodnych wersji próbnej przy każdej większej Aktualizacji wersji NuGet.
Wdrożenie niezależne od platformy: Ten sam pakiet IronBarcode i ten sam interfejs API generowania działają w aplikacjach desktopowych WinForms, usługach ASP.NET Core, Azure Functions, aplikacjach konsolowych oraz kontenerach Docker na systemie Linux. Zależność środowiska uruchomieniowego Windows Forms wprowadzonego przez DrawToBitmap jest usunięta, a wdrożenia Blazor przenoszą się z przeglądarek komponentów na API po stronie serwera, które jest niezależnie testowalne i agnostyczne dla klienta.
Natywna obsługa plików PDF: Generowanie i odczyt plików PDF odbywa się w sposób natywny. Tworzenie pliku PDF z kodem kreskowym nie wymaga już koordynacji dwóch produktów Syncfusion; Odczytywanie BarCodes z manifestów PDF i dokumentów wysyłkowych nie wymaga już oddzielnego etapu ekstrakcji plików PDF.
Przewidywalna ekonomika licencji: Model licencji wieczystej IronBarcode nie nakłada żadnych limitów dotyczących przychodów, liczby pracowników ani kapitału. Zespoły, które przekroczyły warunki kwalifikacyjne licencjiSyncfusionCommunity License — lub które przewidują, że tak się stanie — przechodzą na model licencyjny, w którym rozwój organizacji nie powoduje konieczności dostosowania się do nowych warunków.
Często Zadawane Pytania
Dlaczego warto przejść z Syncfusion BarCode na IronBarcode?
Typowe powody to uproszczenie licencjonowania (eliminacja złożoności związanej z SDK i kluczem uruchomieniowym), zniesienie limitów przepustowości, uzyskanie natywnej obsługi plików PDF, usprawnienie wdrażania w środowisku Docker/CI/CD oraz ograniczenie powtarzalnego kodu API w kodzie produkcyjnym.
Jak zastąpić wywołania API Syncfusion za pomocą IronBarcode?
Zastąp standardowe fragmenty kodu dotyczące tworzenia instancji i licencjonowania wyrażeniem IronBarCode.License.LicenseKey = "key". Zastąp wywołania czytnika wyrażeniem BarcodeReader.Read(path), a wywołania zapisu wyrażeniem BarcodeWriter.CreateBarcode(data, encoding). Metody statyczne nie wymagają zarządzania instancjami.
Jak bardzo zmienia się kod podczas migracji z Syncfusion BarCode do IronBarcode?
Większość migracji skutkuje zmniejszeniem liczby linii kodu. Usuwane są standardowe fragmenty dotyczące licencji, konstruktory instancji oraz jawna konfiguracja formatów. Podstawowe operacje odczytu/zapisu są mapowane na krótsze odpowiedniki w IronBarcode z bardziej przejrzystymi obiektami wynikowymi.
Czy podczas migracji muszę mieć zainstalowane zarówno Syncfusion BarCode, jak i IronBarcode?
Nie. Większość migracji polega na bezpośredniej wymianie, a nie na równoległym działaniu. Należy migrować po jednej klasie usługowej na raz, zastąpić odwołanie do NuGet oraz zaktualizować wzorce instancjonowania i wywoływania API przed przejściem do kolejnej klasy.
Jaka jest nazwa pakietu NuGet dla IronBarcode?
Pakiet nosi nazwę „IronBarcode” (z wielkimi literami B i C). Zainstaluj go za pomocą polecenia „Install-Package IronBarcode” lub „dotnet add package IronBarcode”. Dyrektywa using w kodzie to „using IronBarcode;”.
W jaki sposób IronBarcode upraszcza wdrażanie Docker w porównaniu z Syncfusion BarCode?
IronBarcode to pakiet NuGet bez zewnętrznych plików SDK ani konfiguracji licencji. W Dockerze należy ustawić zmienną środowiskową IRONBARCODE_LICENSE_KEY, a pakiet zajmie się weryfikacją licencji podczas uruchamiania.
Czy IronBarcode automatycznie wykrywa wszystkie formaty kodów kreskowych po migracji z Syncfusion?
Tak. IronBarcode automatycznie wykrywa symbole we wszystkich obsługiwanych formatach. Wyraźne wyliczenie typów kodów kreskowych nie jest wymagane. Jeśli format jest już znany, a wydajność ma znaczenie, BarcodeReaderOptions pozwala ograniczyć obszar wyszukiwania w celu optymalizacji.
Czy IronBarcode może odczytywać BarCodes z plików PDF bez oddzielnej biblioteki?
Tak. BarCodeReader.Read("document.pdf") przetwarza pliki PDF natywnie. Wyniki obejmują PageNumber, Format, Value i Confidence dla każdego znalezionego kodu kreskowego. Nie jest wymagany żaden zewnętrzny etap renderowania pliku PDF.
W jaki sposób IronBarcode obsługuje równoległe przetwarzanie kodów kreskowych?
Metody statyczne IronBarcode są bezstanowe i bezpieczne dla wątków. Użyj Parallel.ForEach bezpośrednio na listach plików bez zarządzania instancjami dla poszczególnych wątków. BarcodeReaderOptions.MaxParallelThreads kontroluje wewnętrzny limit wątków.
Jakie właściwości wyników ulegają zmianie podczas migracji z Syncfusion BarCode do IronBarcode?
Typowe zmiany nazw: BarcodeValue staje się Value, BarcodeType staje się Format. Wyniki IronBarcode zawierają również Confidence i PageNumber. Funkcja wyszukiwania i zamiany w całym rozwiązaniu obsługuje zmiany nazw w istniejącym kodzie przetwarzania wyników.
Jak skonfigurować licencjonowanie IronBarcode w potoku CI/CD?
Zapisz IronBarcode_LICENSE_KEY jako sekret potoku i przypisz IronBarCode.License.LicenseKey w kodzie uruchamiającym aplikację. Jeden sekret obejmuje wszystkie środowiska, w tym środowisko programistyczne, testowe, przejściowe i produkcyjne.
Czy IronBarcode obsługuje generowanie kodów QR z niestandardowym stylem?
Tak. Funkcja QRCodeWriter.CreateQrCode() obsługuje niestandardowe kolory za pomocą ChangeBarCodeColor(), osadzanie logo za pomocą AddBrandLogo(), konfigurowalne poziomy korekcji błędów oraz wiele formatów wyjściowych, w tym PNG, JPG, PDF i strumień.

