Przejdź do treści stopki
PORóWNAJ Z INNYMI KOMPONENTAMI

NetBarcode vs IronBarcode: Porównanie bibliotek kodów kreskowych C#

W enumie Type firmy NetBarcode nie ma wpisu dotyczącego kodu QR. Kiedy w trzecim miesiącu projektu dotyczącego etykiet wysyłkowych pojawia się wymóg dodania kodu QR, programiści sięgają po drugą bibliotekę. Ta druga biblioteka posiada własny interfejs API, własny harmonogram wydawania aktualizacji oraz wspólną zależność SixLabors.ImageSharp, której wersja może nie być zgodna z wersją wymagańą przez NetBarcode. W niniejszym porównaniu przeanalizowano, czym jest NetBarcode, gdzie dobrze się sprawdza oraz w jakich obszarach IronBarcode wypełnia luki bez konieczności dodawania drugiego lub trzeciego pakietu.

Zrozumienie NetBarcode

NetBARCODE to biblioteka open source do generowania kodów kreskowych w środowisku .NET, opublikowana na licencji MIT. Zostało stworzone w celu generowania obrazów BARCODE liniowych na podstawie danych tekstowych i doskonale spełnia to zadanie. Biblioteka obsługuje formaty Code128, EAN-13, UPC-A oraz dziesięć innych formatów 1D — wszystkie udostępniane za pośrednictwem prostego konstruktora i niewielkiego zestawu metod wyjściowych. Jego zależność od SixLabors.ImageSharp zapewnia warstwę renderowania obrazów, a od wersji 1.8 zależność ta znajduje odzwierciedlenie w publicznym API poprzez typ zwracany Image<Rgba32> w GetImage().

NetBarcode nie ma na celu byćia uniwersalnym zestawem narzędzi do obsługi kodów kreskowych. Nie posiada funkcji odczytu ani nie obsługuje formatów 2D. Są to świadome decyzje dotyczące zakresu. Biblioteka doskonale nadaje się do aplikacji, które wymagają wyłącznie kodów kreskowych 1D, a jej licencja MIT sprawia, że wdrożenie w środowisku open source jest proste.

Kluczowe cechy architektury:

  • Licencja MIT: Sama biblioteka jest objęta licencją MIT, choć jej zależność SixLabors.ImageSharp posiada odrębną licencję komercyjną, która ma zastosowanie przy przekroczeniu określonego progu przychodów
  • Projekt tylko 1D: Wyliczenie Type definiuje dokładnie 14 formatów BARCODE, wszystkie liniowe; nie ma wpisów 2D
  • Zależność SixLabors.ImageSharp: Renderowanie obrazów jest delegowane do ImageSharp, a od wersji 1.8 metoda GetImage() zwraca Image<Rgba32>, udostępniając typ ImageSharp bezpośrednio w publicznym API
  • API oparte na konstruktorach: BarCODES są tworzone za pomocą new Barcode(data, Type.X) i zapisywane lub pobierane za pomocą SaveImageFile() lub GetImage()
  • Brak API odczytu: NetBarcode służy wyłącznie do generowania; there is no method or class for decoding barcode images
  • Brak przetwarzania wsadowego: każdy BarCode jest niezależnym wywołaniem konstruktora; no built-in enumeration or batch pipeline

Granice projektowe typu Enum

Wyliczenie Type stanowi autorytatywną listę elementów, które może wygenerować NetBarcode. Analiza tekstu pozwala poznać zakres biblioteki:

// NetBarcode Type enum — complete list as of v1.8
public enum Type
{
    Code128,
    Code128A,
    Code128B,
    Code128C,
    Code39,
    Code39Extended,
    Code93,
    EAN8,
    EAN13,
    UPCA,
    UPCE,
    Codabar,
    ITF,
    MSI
}

// These entries do not exist — attempting to use them produces a CS0117 compile error:
// Type.QRCode      — does not exist
// Type.DataMatrix  — does not exist
// Type.PDF417      — does not exist
// Type.Aztec       — does not exist
// NetBarcode Type enum — complete list as of v1.8
public enum Type
{
    Code128,
    Code128A,
    Code128B,
    Code128C,
    Code39,
    Code39Extended,
    Code93,
    EAN8,
    EAN13,
    UPCA,
    UPCE,
    Codabar,
    ITF,
    MSI
}

// These entries do not exist — attempting to use them produces a CS0117 compile error:
// Type.QRCode      — does not exist
// Type.DataMatrix  — does not exist
// Type.PDF417      — does not exist
// Type.Aztec       — does not exist
Public Enum Type
    Code128
    Code128A
    Code128B
    Code128C
    Code39
    Code39Extended
    Code93
    EAN8
    EAN13
    UPCA
    UPCE
    Codabar
    ITF
    MSI
End Enum

' These entries do not exist — attempting to use them produces a BC30456 compile error:
' Type.QRCode      — does not exist
' Type.DataMatrix  — does not exist
' Type.PDF417      — does not exist
' Type.Aztec       — does not exist
$vbLabelText   $csharpLabel

Nie jest to brakująca funkcja oczekująca na pull request. Enum zawiera czternaście pozycji, wszystkie 1D, co odzwierciedla zamierzony zakres biblioteki. Każda aplikacja wymagająca kodów QR, DataMatrix, PDF417 lub Aztec musi uzyskać oddzielny pakiet, aby zapewnić te formaty.

Zrozumienie IronBarcode

IronBarcode to komercyjna biblioteka kodów kreskowych .NET, która w jednym pakiecie obejmuje zarówno generowanie, jak i odczyt. Jest ona tworzona i utrzymywana przez Iron Software, a regularne aktualizacje są dostosowane do aktualnych wersji .NET. Statyczna powierzchnia API biblioteki została zaprojektowana w taki sposób, że przejście z jednego formatu BARCODE na inny wymaga jedynie zmiany jednej stałej — to samo wywołanie BarcodeWriter.CreateBarcode, które generuje Code128, generuje również kody QR, DataMatrix, PDF417 i Aztec.

IronBarcode obsługuje odczyt kodów kreskowych za pośrednictwem klasy BarcodeReader, która akceptuje pliki graficzne i dokumenty PDF oraz zwraca zdekodowane wyniki wraz z identyfikacją formatu. Oznacza to, że generowanie i odczyt mają jedną zależność, jedną licencję i jeden zestaw informacji o wydaniu do śledzenia.

Kluczowe cechy:

  • Ujednolicone generowanie i odczyt: Zarówno BarcodeWriter, jak i BarcodeReader są zawarte w jednym pakiecie NuGet
  • Ponad 50 obsługiwanych formatów: formaty 1D obejmują wszystkie odpowiedniki NetBarcode; Formaty 2D obejmują QR Code, DataMatrix, PDF417, Aztec i inne
  • Fluent Chain API: BarcodeWriter.CreateBarcode(data, encoding) zwraca obiekt GeneratedBarcode z metodami wyjściowymi, w tym SaveAsPng(), SaveAsJpeg(), ToPngBinaryData() oraz przeciążeniami opartymi na strumieniu
  • Brak zależności od ImageSharp: renderowanie obrazów w IronBarcode jest samodzielne; nie wprowadzono żadnej zależności przechodniej SixLabors
  • Obsługa plików PDF: Interfejs API do odczytu akceptuje bezpośrednio pliki .pdf, oprócz formatów obrazów
  • Licencja komercyjna: wymagańy jest klucz licencyjny; trial mode is available and removes watermarks upon purchase

Porównanie funkcji

Funkcja NetBarcode IronBarcode
Generowanie kodów kreskowych 1D Tak Tak
Generowanie kodów kreskowych 2D Nie Tak
Odczytywanie BarCode Nie Tak
Obsługa plików PDF Nie Tak
Całkowita liczba symboli 14 50+
Zależność ImageSharp Tak (licencja dzielona) Nie
Model licencji MIT (+ warunki ImageSharp) Komercjalne

Szczegółowe porównanie funkcji

Funkcja NetBarcode IronBarcode
Generacja
Code128, EAN-13, UPC-A, Code39 Tak Tak
EAN-8, UPC-E, Code93, Codabar, ITF, MSI Tak Tak
Kod QR Nie Tak
DataMatrix Nie Tak
PDF417 Nie Tak
Aztec Nie Tak
GS1-128, GS1 DataBar Nie Tak
Formaty pocztowe (Intelligent Mail, Royal Mail) Nie Tak
Wynik w formacie SVG Nie Tak
Czytanie
Odkoduj obrazy BarCode Nie Tak
Odczyt z dokumentów PDF Nie Tak
Wykrywanie wielu kodów BarCode Nie Tak
Automatyczne wykrywanie formatu Nie Tak
Projektowanie API
Tworzenie oparte na konstruktorach Tak Nie (metoda statyczna)
Płynny łańcuch wyjściowy Nie Tak
Obsługa przetwarzania wsadowego Podręcznik Wbudowane
Licencjonowanie i zależności
Licencja biblioteki MIT Komercjalne
Zależność ImageSharp Tak Nie
Wsparcie komercyjne Społeczność Professional

Zakres formatu

Podejście NetBarcode

NetBARCODE udostępnia 14 formatów BARCODE liniowych poprzez wyliczenie Type. W tym zakresie wybór formatu jest prosty — wystarczy przekazać odpowiedni element wyliczenia do konstruktora. Granica jest równie jasna: próba użycia formatu spoza wyliczenia powoduje błąd kompilacji.

// NetBarcode — formats that compile and produce output
using NetBarcode;

var code128 = new Barcode("12345678901234", Type.Code128);
code128.SaveImageFile("shipping.png");

var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product.png");

// NetBarcode — formats that produce CS0117 compile errors
// var qr     = new Barcode("data", Type.QRCode);     // error CS0117
// var dm     = new Barcode("data", Type.DataMatrix);  // error CS0117
// var p417   = new Barcode("data", Type.PDF417);      // error CS0117
// var aztec  = new Barcode("data", Type.Aztec);       // error CS0117
// NetBarcode — formats that compile and produce output
using NetBarcode;

var code128 = new Barcode("12345678901234", Type.Code128);
code128.SaveImageFile("shipping.png");

var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product.png");

// NetBarcode — formats that produce CS0117 compile errors
// var qr     = new Barcode("data", Type.QRCode);     // error CS0117
// var dm     = new Barcode("data", Type.DataMatrix);  // error CS0117
// var p417   = new Barcode("data", Type.PDF417);      // error CS0117
// var aztec  = new Barcode("data", Type.Aztec);       // error CS0117
Imports NetBarcode

Dim code128 As New Barcode("12345678901234", Type.Code128)
code128.SaveImageFile("shipping.png")

Dim ean13 As New Barcode("5901234123457", Type.EAN13)
ean13.SaveImageFile("product.png")

' NetBarcode — formats that produce CS0117 compile errors
' Dim qr As New Barcode("data", Type.QRCode)     ' error CS0117
' Dim dm As New Barcode("data", Type.DataMatrix) ' error CS0117
' Dim p417 As New Barcode("data", Type.PDF417)   ' error CS0117
' Dim aztec As New Barcode("data", Type.Aztec)   ' error CS0117
$vbLabelText   $csharpLabel

Branże, w których ta granica staje się ograniczeniem, obejmują śledzenie produktów farmaceutycznych (kod DataMatrix wymagańy zgodnie z wymógąmi FDA dotyczącymi BARCODE-ów 2D), karty pokładowe linii lotniczych (Aztec), listy przewozowe (PDF417) oraz marketing mobilny (kod QR). Każdy z tych wymagań wyklucza NetBarcode jako samodzielne rozwiązanie.

Podejście IronBarcode

IronBarcode udostępnia wszystkie obsługiwane formaty za pośrednictwem tej samej metody BarcodeWriter.CreateBarcode. Powierzchnia API nie zmienia się przy przejściu z formatu 1D do formatu 2D — różni się jedynie stała BarcodeEncoding.

using IronBarCode;

// 1D formats — identical API to the 2D examples below
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("shipping.png");

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product.png");

// 2D formats — same method, different encoding constant
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-label.png");

BarcodeWriter.CreateBarcode("M1DOE/JOHN MR ABC123 JFKLHR 0012 123Y015A0001 100", BarcodeEncoding.Aztec)
    .SaveAsPng("boarding-pass.png");
using IronBarCode;

// 1D formats — identical API to the 2D examples below
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("shipping.png");

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product.png");

// 2D formats — same method, different encoding constant
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-label.png");

BarcodeWriter.CreateBarcode("M1DOE/JOHN MR ABC123 JFKLHR 0012 123Y015A0001 100", BarcodeEncoding.Aztec)
    .SaveAsPng("boarding-pass.png");
Imports IronBarCode

' 1D formats — identical API to the 2D examples below
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128) _
    .SaveAsPng("shipping.png")

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
    .SaveAsPng("product.png")

' 2D formats — same method, different encoding constant
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsPng("qr.png")

BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix) _
    .SaveAsPng("pharma-label.png")

BarcodeWriter.CreateBarcode("M1DOE/JOHN MR ABC123 JFKLHR 0012 123Y015A0001 100", BarcodeEncoding.Aztec) _
    .SaveAsPng("boarding-pass.png")
$vbLabelText   $csharpLabel

Pełna lista obsługiwanych stałych jest dostępna w dokumentacji dotyczącej obsługiwanych formatów BARCODE, obejmującej wszystkie formaty generowania BARCODE 2D oraz pełny zestaw BARCODE 1D.

Projekt API generowania

Podejście NetBarcode

Model generowania NetBarcode opiera się na konstruktorach. Obiekt Barcode jest instancjonowany przy użyciu ciągu danych i wartości wyliczeniowej Type. Wynik jest zapisywany bezpośrednio jako SaveImageFile() lub pobierany jako Image<Rgba32> za pośrednictwem GetImage(). Od wersji 1.8 typem zwracanym przez GetImage() jest typ SixLabors.ImageSharp, co oznacza, że każdy kod, który przechowuje lub przetwarza wartość zwracaną, musi importować i działać w ramach interfejsu API ImageSharp.

using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

// Constructor-based creation
var barcode = new Barcode("12345678901234", Type.Code128);

// Save to file — straightforward
barcode.SaveImageFile("code128.png");

// GetImage() returns Image<Rgba32> — ImageSharp import required
Image<Rgba32> image = barcode.GetImage();

// Further processing requires familiarity with the ImageSharp API
using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

// Constructor-based creation
var barcode = new Barcode("12345678901234", Type.Code128);

// Save to file — straightforward
barcode.SaveImageFile("code128.png");

// GetImage() returns Image<Rgba32> — ImageSharp import required
Image<Rgba32> image = barcode.GetImage();

// Further processing requires familiarity with the ImageSharp API
using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
Imports NetBarcode
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats
Imports System.IO

' Constructor-based creation
Dim barcode As New Barcode("12345678901234", Type.Code128)

' Save to file — straightforward
barcode.SaveImageFile("code128.png")

' GetImage() returns Image(Of Rgba32) — ImageSharp import required
Dim image As Image(Of Rgba32) = barcode.GetImage()

' Further processing requires familiarity with the ImageSharp API
Using stream As New MemoryStream()
    image.SaveAsPng(stream)
    Dim bytes As Byte() = stream.ToArray()
End Using
$vbLabelText   $csharpLabel

Typ zwracany przez metodę GetImage() wiąże kod niższego poziomu z biblioteką ImageSharp. Każda metoda, która przyjmuje lub przechowuje wynik, musi zadeklarować go jako Image<Rgba32>, wprowadzając zależność przechodnią do kodu wywołującego.

Podejście IronBarcode

IronBarcode wykorzystuje łańcuch płynny. BarcodeWriter.CreateBarcode zwraca obiekt GeneratedBarcode, który obsługuje wiele metod wyjściowych. Obsługa obrazów odbywa się wewnętrznie — kod wywołujący nie ma dostępu do typu ImageSharp.

using IronBarCode;

// Fluent generation — save directly to file
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("code128.png");

// Multiple output options on the same GeneratedBarcode object
var barcode = BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128);
barcode.SaveAsPng("code128.png");
barcode.SaveAsJpeg("code128.jpg");
byte[] bytes = barcode.ToPngBinaryData();

using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
using IronBarCode;

// Fluent generation — save directly to file
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("code128.png");

// Multiple output options on the same GeneratedBarcode object
var barcode = BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128);
barcode.SaveAsPng("code128.png");
barcode.SaveAsJpeg("code128.jpg");
byte[] bytes = barcode.ToPngBinaryData();

using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
Imports IronBarCode

' Fluent generation — save directly to file
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128) _
    .SaveAsPng("code128.png")

' Multiple output options on the same GeneratedBarcode object
Dim barcode = BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
barcode.SaveAsPng("code128.png")
barcode.SaveAsJpeg("code128.jpg")
Dim bytes As Byte() = barcode.ToPngBinaryData()

Using stream As New MemoryStream()
    barcode.SaveAsPng(stream)
End Using
$vbLabelText   $csharpLabel

Szczegółowe opcje generowania kodów kreskowych 1D, w tym szerokość, wysokość i konfiguracja etykiet, zostały omówione w dokumentacji IronBarcode.

Umiejętność czytania

Podejście NetBarcode

NetBarcode nie posiada API do odczytu. Nie ma metody, klasy ani konfiguracji, która dekodowałaby obraz kodu kreskowego z powrotem do ciągu danych. Jest to celowe ograniczenie zakresu, a nie pominięcie w oczekiwaniu na wydanie. Projekt, który generuje BarCodes za pomocą NetBarcode, a następnie musi je odczytać — w celu weryfikacji wydrukowanej etykiety, zeskanowania przesyłki zwrotnej lub wyodrębnienia wartości z faktury dostawcy — musi wprowadzić oddzielną bibliotekę do tego celu.

// NetBarcode — no reading method exists
// The following does not compile because the method does not exist:
// var result = barcode.Read("image.png");  // method does not exist

// The typical workaround requires ZXing.Net as a third-party dependency
// NetBarcode — no reading method exists
// The following does not compile because the method does not exist:
// var result = barcode.Read("image.png");  // method does not exist

// The typical workaround requires ZXing.Net as a third-party dependency
' NetBarcode — no reading method exists
' The following does not compile because the method does not exist:
' Dim result = barcode.Read("image.png")  ' method does not exist

' The typical workaround requires ZXing.Net as a third-party dependency
$vbLabelText   $csharpLabel

Biblioteka ZXing.Net jest najczęściej dodawanym elementem do odczytu obok NetBarcode, zapewniając trzeci interfejs API i trzeci pakiet do zarządzania wersjami obok NetBarcode i dowolnej biblioteki 2D już dodanej dla kodów QR.

Podejście IronBarcode

IronBarcode zawiera BarcodeReader w tym samym pakiecie co BarcodeWriter. API odczytu akceptuje pliki graficzne i dokumenty PDF i zwraca zbiór zdekodowanych wyników, z których każdy zawiera wartość BARCODE, typ formatu oraz numer strony w przypadku odczytu z pliku PDF.

using IronBarCode;

// Read barcodes from an image file
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
    Console.WriteLine($"{r.BarcodeType}: {r.Value}");
}

// Read barcodes from a PDF document — no additional library required
var pdfResults = BarcodeReader.Read("invoice.pdf");
foreach (var r in pdfResults)
{
    Console.WriteLine($"Page {r.PageNumber}: {r.Value}");
}
using IronBarCode;

// Read barcodes from an image file
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
    Console.WriteLine($"{r.BarcodeType}: {r.Value}");
}

// Read barcodes from a PDF document — no additional library required
var pdfResults = BarcodeReader.Read("invoice.pdf");
foreach (var r in pdfResults)
{
    Console.WriteLine($"Page {r.PageNumber}: {r.Value}");
}
Imports IronBarCode

' Read barcodes from an image file
Dim imageResults = BarcodeReader.Read("shipping-label.png")
For Each r In imageResults
    Console.WriteLine($"{r.BarcodeType}: {r.Value}")
Next

' Read barcodes from a PDF document — no additional library required
Dim pdfResults = BarcodeReader.Read("invoice.pdf")
For Each r In pdfResults
    Console.WriteLine($"Page {r.PageNumber}: {r.Value}")
Next
$vbLabelText   $csharpLabel

Przewodnik dotyczący odczytu kodów kreskowych z obrazów obejmuje opcje dostosowywania szybkości, wykrywania wielu kodów kreskowych oraz korekcji obrazu dostępne w interfejsie API odczytu.

Kwestie dotyczące zależności i licencji

NetBarcode i ImageSharp

NetBarcode jest objęty licencją MIT. Biblioteka SixLabors.ImageSharp, od której jest ona zależna, stosuje inny model: jest bezpłatna dla projektów open source oraz dla firm, których roczne przychody brutto nie przekraczają określonego progu, ale powyżej tego progu wymagańa jest licencja komercyjna. Podział ten ma zastosowanie niezależnie od tego, czy ImageSharp jest wyraźnie wymieniony w pliku .csproj projektu, czy też pojawia się pośrednio poprzez NetBarcode.


<PackageReference Include="NetBarcode" Version="1.8.2" />

<PackageReference Include="NetBarcode" Version="1.8.2" />
XML

W przypadku firmy detalicznej lub logistycznej przetwarzającej BarCodes na dużą skalę — głównego przypadku użycia, do którego skierowany jest NetBarcode — roczne przychody często przekraczają próg, od którego obowiązuje komercyjna licencja ImageSharp. Audyt zgodności może ujawnić ten obowiązek osadzony w drzewie pakietów.

Wersja 1.8 wprowadziła dodatkową konsekwencję zależności od ImageSharp: typ zwracanej wartości GetImage() zmienił się z reprezentacji wewnętrznej na SixLabors.ImageSharp.Image<Rgba32>. Istniejący kod, który wywoływał GetImage() bez jawnego typowania, przestał działać w czasie kompilacji, a nowe dyrektywy using dla SixLabors.ImageSharp i SixLabors.ImageSharp.PixelFormats stały się wymagańe. Gdy własne API ImageSharp ewoluuje w przyszłych wersjach, ma to wpływ na publiczny interfejs API NetBarcode.

IronBarcode

IronBarcode nie jest zależny od SixLabors.ImageSharp. Warunki licencji są określone bezpośrednio na stronie licencyjnej IronBarcode, bez progu podziału ani przechodnich zobowiązań komercyjnych. Dostępny jest klucz próbny do oceny wersji próbnej; Zakupione licencje usuwają znak wodny wersji próbnej z wygenerowanych wyników.

Przewodnik po mapowaniu API

NetBarcode IronBarcode Uwagi
new Barcode(data, Type.Code128) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) Konstruktor → metoda statyczna
new Barcode(data, Type.EAN13) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN13) Bezpośrednie odwzorowanie
new Barcode(data, Type.UPCA) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.UPCA) Bezpośrednie odwzorowanie
new Barcode(data, Type.Code39) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code39) Bezpośrednie odwzorowanie
new Barcode(data, Type.EAN8) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN8) Bezpośrednie odwzorowanie
new Barcode(data, Type.UPCE) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.UPCE) Bezpośrednie odwzorowanie
new Barcode(data, Type.ITF) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.ITF) Bezpośrednie odwzorowanie
new Barcode(data, Type.Codabar) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Codabar) Bezpośrednie odwzorowanie
barcode.SaveImageFile("x.png") .SaveAsPng("x.png") Zmiana nazwy metody
barcode.SaveImageFile("x.jpg") .SaveAsJpeg("x.jpg") Zmiana nazwy metody
barcode.GetImage()Image<Rgba32> .ToPngBinaryData() lub .SaveAsPng() Brak eksponowanego typu ImageSharp
Nie Type.QRCode BarcodeEncoding.QRCode Nowa funkcja
Nie Type.DataMatrix BarcodeEncoding.DataMatrix Nowa funkcja
Nie Type.PDF417 BarcodeEncoding.PDF417 Nowa funkcja
Nie Type.Aztec BarcodeEncoding.Aztec Nowa funkcja
Brak API do odczytu BarcodeReader.Read(path) Nowa funkcja
using NetBarcode; using IronBarCode; Zastąpienie przestrzeni nazw
using SixLabors.ImageSharp; Usuń Nie jest już potrzebne

Pełne informacje na temat formatów znajdują się w dokumentacji dotyczącej obsługiwanych formatów BarCode.

Kiedy zespoły rozważają przejście z NetBarcode na IronBarcode

Wymagania dotyczące kodów QR i formatów 2D

Najczęstszym powodem rozważania alternatywy dla NetBarcode jest nowe wymaganie dotyczące kodów QR. Aplikacje, które zaczynają od generowania kodów kreskowych 1D dla etykiet detalicznych lub listów przewozowych, często otrzymują kolejne wymagania dotyczące kodów QR — linków bezdotykowych, głębokich linków do aplikacji mobilnych, kampanii marketingowych. Ponieważ wyliczenie Type nie ma wpisu QR, wymóg ten nie może zostać spełniony w ramach NetBarcode. Zespoły, które dodają oddzielną bibliotekę kodów QR, aby wypełnić tę lukę, stają następnie przed drugą oceną, gdy DataMatrix jest wymagańy do integracji farmaceutycznej lub PDF417 dla przewoźnika logistycznego, który wymaga go na etykietach wysyłkowych.

Odczytywanie BarCode staje się konieczne

Niektóre projekty zaczynają się od samego generowania, a później dodają wymóg walidacji lub przetwarzania dokumentów: potwierdzenie, że wydrukowany BARCODE pasuje do danych źródłowych, wyciąganie wartości BARCODE-ów z przychodzących faktur dostawców lub skanowanie etykiet przesyłek zwrotnych. NetBarcode nie zapewnia takiej możliwości. Dodanie ZXing.Net lub podobnej biblioteki do odczytu wprowadza trzecie API, którego trzeba się nauczyć i które trzeba utrzymywać w tym samym kodzie źródłowym, który już zawiera NetBarcode i bibliotekę QR. W projektach, w których przewiduje się zapotrzebowanie na odczyt danych, nawet w przyszłej fazie, często bardziej efektywne jest wybranie biblioteki, która od samego początku obsługuje oba te zadania.

Audyt licencji komercyjnej ImageSharp

Podczas przeglądów prawnych i zgodnościowych zależności stron trzecich czasami pojawia się warunek licencji komercyjnej SixLabors.ImageSharp osadzony w drzewie pakietów NetBarcode. W przypadku firm, których roczne przychody brutto przekraczają próg, obowiązek ten ma zastosowanie niezależnie od tego, czy ImageSharp został wybrany celowo, czy też trafił do nich pośrednio poprzez NetBarcode. Zespoły, które odkryją to podczas audytu — a nie przed wdrożeniem — staną przed koniecznością retroaktywnego naprawiania błędów zamiast planowanej migracji. Ocena licencji zależności przed rozpoczęciem projektu jest lepszym rozwiązaniem.

Zmniejszenie złożoności wielu bibliotek

Zespoły, które korzystają z NetBarcode do generowania kodów 1D, biblioteki przeznaczonej do generowania kodów QR oraz ZXing.Net do odczytu, muszą dbać o kompatybilność wersji trzech oddzielnych pakietów. Każdy cykl aktualizacji wymaga sprawdzenia, czy wszystkie trzy biblioteki korzystają z tej samej wersji ImageSharp. Każdy nowy programista w projekcie ma do czynienia z trzema różnymi interfejsami API, które koncepcyjnie dotyczą tej samej kwestii. Konsolidacja w jedną bibliotekę BarCODE upraszcza wdrażanie, zmniejsza ryzyko konfliktów między wersjami i skupia konserwację w jednym cyklu wydawniczym.

Typowe kwestie związane z migracją

Zamiana pakietów i czyszczenie zależności przechodnich

Pierwszym krokiem jest usunięcie NetBarcode za pomocą dotnet remove package NetBarcode. Pakiet SixLabors.ImageSharp może ponownie pojawić się w drzewie zależności, jeśli inne pakiety w projekcie również pobierają go w sposób przechodni. Po usunięciu sprawdź przywróconą listę pakietów za pomocą dotnet list package --include-transitive, aby potwierdzić, czy ImageSharp nadal występuje i czy nadal obowiązują warunki jego licencji komercyjnej.

Zastąpienie typu zwracanego przez metodę GetImage()

Wszelki kod, który przechowywał wynik GetImage() jako Image<Rgba32>, musi zostać zaktualizowany. Typ ImageSharp nie ma bezpośredniego odpowiednika w IronBarcode; Wybór zamiennika zależy od tego, w jaki sposób obraz został wykorzystany w dalszej części procesu. Kod, który zapisał obraz do strumienia, można zastąpić .SaveAsPng(stream) bezpośrednio w obiekcie GeneratedBarcode. Kod, który pobrał surowe bajty, może używać .ToPngBinaryData(). Kod, który wykonywał dalsze operacje ImageSharp na zwróconym obrazie, będzie wymagał indywidualnej oceny tych operacji.

Aktualizacja przestrzeni nazw

W plikach, które zaimportowały using NetBarcode;, using SixLabors.ImageSharp;, using SixLabors.ImageSharp.PixelFormats; lub using SixLabors.Fonts;, należy zastąpić te dyrektywy na using IronBarCode;. Wyszukiwanie tych instrukcji using w całym projekcie pozwala zidentyfikować każdy plik, który wymaga uwagi przed rozpoczęciem kompilacji.

Dodatkowe możliwości IronBarcode

Oprócz podstawowych funkcji generowania i odczytu omówionych w tym porównaniu, IronBarcode oferuje:

  • Generowanie BarCode'ów w formacie SVG: Generowanie obrazów BarCode'ów w formacie wektorowym, odpowiednich do procesów drukowania i skalowalnych projektów etykiet
  • Stylizacja BarCode'ów: Konfiguracja koloru paska, koloru tła, czcionki adnotacji, marginesu i obrotu generowanych BarCode'ów
  • GS1-128 i GS1 DataBar: BARCODE o strukturze identyfikatora aplikacji, zapewniający zgodność z wymógąmi handlu detalicznego i łańcucha dostaw
  • Formaty pocztowe: Intelligent Mail, Royal Mail i inne symbole pocztowe stosowane w aplikacjach pocztowych
  • Wyodrębnianie kodów kreskowych z plików PDF: Odczytuj kody kreskowe bezpośrednio z wielostronicowych dokumentów PDF bez konieczności korzystania z oddzielnej biblioteki PDF
  • Generowanie partii: wydajne przetwarzanie zbiorów danych BarCode w ramach jednego potoku
  • MAUI i urządzenia mobilne: IronBarcode obsługuje aplikacje .NET MAUI do wielopłatformowych procesów związanych z kodami kreskowymi na urządzeniach mobilnych i stacjonarnych

Zgodność z platformą .NET i gotowość na przyszłość

IronBarcode jest przeznaczony dla platform .NET 8 i .NET 9 oraz zachowuje zgodność z .NET Standard dla projektów, które nie zostały jeszcze przeniesione na nowoczesną platformę .NET. Ponieważ .NET 10 ma pojawić się pod koniec 2026 r., regularne tempo wydawania aktualizacji przez Iron Software gwarantuje, że aktualizacje zapewniające kompatybilność będą pojawiać się po każdej większej aktualizacji .NET. NetBarcode jest przeznaczony dla .NET Standard 2.0 i działa na aktualnych środowiskach uruchomieniowych poprzez tę warstwę kompatybilności, chociaż częstotliwość aktualizacji biblioteki i zestaw formatów 2D są ustalone przez zakres jej projektu.

Wnioski

NetBarcode i IronBarcode reprezentują różne pozycje w spektrum zakresu biblioteki BarCode. NetBarcode to ukierunkowana, przejrzysta implementacja generowania kodów kreskowych 1D: czternaście formatów, proste API konstruktora oraz licencja MIT, która zapewnia płynne wdrażanie w projektach open source mieszczących się w progu przychodów ImageSharp. IronBarcode to szeroki zestaw narzędzi obejmujący generowanie ponad 50 formatów, odczyt z obrazów i plików PDF oraz płynny interfejs API, który traktuje formaty 1D i 2D identycznie.

W przypadku projektów, w których wymagania ograniczają się wyłącznie do generowania kodów kreskowych liniowych — systemów kasowych generujących kody EAN-13 i UPC-A dla tradycyjnych skanerów detalicznych lub narzędzi wewnętrznych o stałym i krótkim cyklu życia — NetBarcode zapewnia to, co jest potrzebne, bez wprowadzania zależności komercyjnej. Biblioteka jest dobrze zbudowana w ramach swojego zakresu, a zakres ten jest jasny już na pierwszy rzut oka na wyliczenie Type.

W przypadku projektów, w których zakres formatowania może się rozszerzyć, gdzie w końcu konieczne będzie odczytanie danych lub gdzie problemem jest weryfikacja zgodności zależności przechodniej ImageSharp, IronBarcode rozwiązuje wszystkie trzy kwestie za pomocą jednego pakietu. Zespoły, które zaczynają od NetBarcode do generowania kodów 1D, a później dodają QRCoder do kodów 2D i ZXing.Net do odczytu, mają trzy osobne obowiązki związane z utrzymaniem bibliotek; IronBarcode łączy je w jedno.

Wybór wynika bezpośrednio z wymagań projektu. Jeśli czternaście formatów 1D i brak możliwości odczytu dokładnie odpowiada specyfikacji, NetBarcode jest dobrym wyborem pod względem technicznym. Jeśli specyfikacja obejmuje dowolny format 2D, dowolny proces odczytu lub jakiekolwiek obawy dotyczące warunków licencji ImageSharp, IronBarcode jest bardziej kompletnym rozwiązaniem.

Często Zadawane Pytania

Co to jest NetBarcode?

NetBarcode to biblioteka kodów kreskowych .NET do generowania i odczytywania kodów kreskowych w aplikacjach C#. Jest jedną z kilku alternatyw ocenianych przez programistów podczas wyboru rozwiązania kodów kreskowych dla projektów .NET.

Jakie są główne różnice między NetBarcode a IronBarcode?

IronBarcode używa statycznego, bezstanowego API, które nie wymaga zarządzania instancjami, podczas gdy NetBarcode zazwyczaj wymaga utworzenia i skonfigurowania instancji przed użyciem. IronBarcode zapewnia również natywne wsparcie dla PDF, automatyczne wykrywanie formatu oraz jednokey'owe licencjonowanie we wszystkich środowiskach.

Czy IronBarcode jest łatwiejsze do licencjonowania niż NetBarcode?

IronBarcode wykorzystuje pojedynczy klucz licencyjny obejmujący zarówno wdrożenia deweloperskie, jak i produkcyjne. Upraszcza to procesy CI/CD oraz konfiguracje Docker w porównaniu z systemami licencyjnymi, które oddzielają klucze SDK od kluczy środowiska uruchomieniowego.

Czy IronBarcode obsługuje wszystkie formaty kodów kreskowych, które obsługuje NetBarcode?

IronBarcode obsługuje ponad 30 symboli kodów kreskowych, w tym QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 i wiele innych. Automatyczne wykrywanie formatu oznacza, że nie jest wymagane jawne wyliczanie formatów.

Czy IronBarcode obsługuje natywne odczytywanie kodów kreskowych z plików PDF?

Tak. IronBarcode odczytuje kody kreskowe bezpośrednio z plików PDF za pomocą BarcodeReader.Read("document.pdf") bez konieczności korzystania z oddzielnej biblioteki do renderowania plików PDF. Wyniki dla każdej strony obejmują numer strony, format kodu kreskowego, wartość oraz wskaźnik pewności.

Jak IronBarcode radzi sobie z przetwarzaniem wsadowym w porównaniu do NetBarcode?

Metody statyczne IronBarcode są bezstanowe i z natury bezpieczne dla wątków, co umożliwia bezpośrednie użycie Parallel.ForEach bez zarządzania instancjami dla poszczególnych wątków. Nie ma ograniczeń przepustowości w żadnym przedziale cenowym.

Jakie wersje .NET obsługuje IronBarcode?

IronBarcode obsługuje .NET Framework 4.6.2+, .NET Core 3.1 oraz .NET 5, 6, 7, 8 i 9 w jednym pakiecie NuGet. Obsługiwane platformy to Windows x64/x86, Linux x64 oraz macOS x64/ARM.

Jak zainstalować IronBarcode w projekcie .NET?

Zainstaluj IronBarcode za pomocą NuGet: uruchom polecenie „Install-Package IronBarCode” w konsoli menedżera pakietów lub „dotnet add package IronBarCode” w interfejsie CLI. Nie są wymagane żadne dodatkowe instalatory SDK ani pliki uruchomieniowe.

Czy mogę ocenić IronBarcode przed zakupem, w przeciwieństwie do NetBarcode?

Tak. Tryb próbny IronBarcode zwraca pełne, zdekodowane wartości BarCode — tylko wygenerowane obrazy wyjściowe są opatrzone znakiem wodnym. Przed podjęciem decyzji o zakupie można sprawdzić dokładność odczytu na własnych dokumentach.

Jaka jest różnica cenowa między NetBarcode a IronBarcode?

Cena IronBarcode zaczyna się od 749 USD za Licencję wieczystą dla jednego programisty, obejmującą etapy rozwoju i produkcji. Szczegóły dotyczące cen i opcji zakupu hurtowego są dostępne na stronie licencyjnej IronBarcode. Nie ma wymogu posiadania oddzielnej licencji na środowisko uruchomieniowe.

Czy migracja z NetBarcode do IronBarcode jest prosta?

Migracja z NetBarcode do IronBarcode polega głównie na zastąpieniu wywołań API opartych na instancji metodami statycznymi IronBarcode, usunięciu boilerplate'u licencyjnego oraz aktualizacji nazw właściwości wynikowych. Większość migracji polega na redukcji kodu, a nie na jego dodawaniu.

Czy IronBarcode generuje kody QR z logo?

Tak. Funkcja QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") osadza obraz marki w kodzie QR w sposób natywny z konfigurowalną korekcją błędów. Kolorowe kody QR są również obsługiwane za pomocą funkcji ChangeBarCodeColor().

Jordi Bardia
Inżynier oprogramowania
Jordi jest najbardziej biegły w Pythonie, C# i C++. Kiedy nie wykorzystuje swoich umiejętności w Iron Software, programuje gry. Dzieląc odpowiedzialność za testowanie produktów, rozwój produktów i badania, Jordi wnosi ogromną wartość do ciągłej poprawy produktów. Różnorodne doświadczenia ...
Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie