LEADTOOLS Barcode vs IronBarcode: Porównanie bibliotek kodów kreskowych C#
NetBarcodevs IronBarcode: Porównanie generacji tylko 1D z pełnym zestawem narzędzi kodów kreskowych
Enum TypeNetBarcodenie zawiera wpisu dla 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ą wymaganą 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 celuje w Code128, EAN-13, Code39 i kilka innych formatów 1D — wszystkie udostępniane za pomocą prostego konstruktora i zestawu metod wyjściowych. Jego zależność od SixLabors.ImageSharp dostarcza warstwę renderowania obrazu, a od wersji 1.8 ta zależność jest odzwierciedlona w publicznym API przez 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 licencjaMITsprawia, ż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: Enum
Typedefiniuje 11 wartości w 8 rodzinach symbolik liniowych; nie ma wpisów 2D ani wpisów dla UPC-A, UPC-E, ITF czy MSI - Zależność SixLabors.ImageSharp: Renderowanie obrazu jest delegowane do ImageSharp, a od wersji 1.8 metoda
GetImage()zwracaImage<Rgba32>, bezpośrednio eksponując typ ImageSharp w publicznym API - API oparte na konstruktorze: Kody kreskowe są tworzone za pomocą
new Barcode(data, Type.X)i zapisywane lub pobierane za pomocąSaveImageFile()lubGetImage() - Brak API odczytu:NetBarcodesłuży wyłącznie do generowania; nie ma metody ani klasy do dekodowania obrazów kodów kreskowych
- Brak przetwarzania wsadowego: każdy BarCode jest niezależnym wywołaniem konstruktóra; no built-in enumeration or batch pipeline
Granice projektowe typu Enum
Enum Type jest autorytatywną listą tego, coNetBarcodepotrafi generować. Analiza tekstu pozwala poznać zakres biblioteki:
//NetBarcodeType enum — complete list as of v1.8
public enum Type
{
Codabar,
Code11,
Code128,
Code128A,
Code128B,
Code128C,
Code39,
Code39E,
Code93,
EAN13,
EAN8
}
// 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
// Type.UPCA — does not exist
// Type.UPCE — does not exist
// Type.ITF — does not exist
// Type.MSI — does not exist
//NetBarcodeType enum — complete list as of v1.8
public enum Type
{
Codabar,
Code11,
Code128,
Code128A,
Code128B,
Code128C,
Code39,
Code39E,
Code93,
EAN13,
EAN8
}
// 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
// Type.UPCA — does not exist
// Type.UPCE — does not exist
// Type.ITF — does not exist
// Type.MSI — does not exist
Public Enum Type
Codabar
Code11
Code128
Code128A
Code128B
Code128C
Code39
Code39E
Code93
EAN13
EAN8
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
' Type.UPCA — does not exist
' Type.UPCE — does not exist
' Type.ITF — does not exist
' Type.MSI — does not exist
Enum ma jedenaście wpisów w ośmiu rodzinach symbologii liniowej i odzwierciedla to zakres bibliotek. Każda aplikacja wymagająca kodów QR, DataMatrix, PDF417, Aztec, UPC-A, UPC-E, ITF czy MSI musi uzyskać osobny pakiet dla dostarczenia tych formatów.
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 jest zaprojektowana tak, aby zmiana formatu kodu kreskowego wymagała tylko zmiany jednej stałej — ta sama funkcja BarcodeWriter.CreateBarcode, która generuje Code128, generuje również kody QR, DataMatrix,PDF417i Aztec.
IronBarcode obsługuje odczytywanie kodów kreskowych przez klasę BarcodeReader, która akceptuje pliki obrazów i dokumenty PDF, zwracając zdekodowane wyniki 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:
- Zunifikowane Generowanie i Odczytywanie: Zarówno
BarcodeWriter, jak iBarcodeReadersą zawarte w pojedynczej paczce NuGet - Ponad 50 obsługiwanych formatów: formaty 1D obejmują wszystkie odpowiedniki NetBarcode; Formaty 2D obejmują QR Code, DataMatrix, PDF417,Azteci inne
- Płynne API Łańcucha:
BarcodeWriter.CreateBarcode(data, encoding)zwraca obiektGeneratedBarcodez metodami wyjściowymi, w tymSaveAsPng(),SaveAsJpeg(),ToPngBinaryData(), i 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
- Wsparcie dla PDF: API odczytywania akceptuje pliki
.pdfbezpośrednio oprócz formatów obrazów - Licencja komercyjna: wymagany jest klucz licencyjny; Tryb próbny jest dostępny i usuwa znaki wodne po zakupie
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 | 11 wartości wyliczenia / 8 rodzin | 50+ |
| Zależność ImageSharp | Tak (licencja dzielona) | Nie |
| Model licencji | MIT(+ warunki ImageSharp) | Komercjalne |
Szczegółowe porównanie funkcji
| Funkcja | NetBarcode | IronBarcode |
|---|---|---|
| Generacja | ||
| Code128 (plus 128A/B/C), Code39, Code39 Extended, Code93, Code11 | Tak | Tak |
| EAN-13, EAN-8, Codabar | Tak | Tak |
| UPC-A, UPC-E, ITF, MSI | Nie | 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 konstruktórach | 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 dostarcza 11 wartości enumu kodów kreskowych liniowych w 8 rodzinach symbolik poprzez enum Type. W tym zakresie wybór formatu jest prosty — wystarczy przekazać odpowiedni element wyliczenia do konstruktóra. 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
// var upca = new Barcode("data", Type.UPCA); // error CS0117
// var itf = new Barcode("data", Type.ITF); // 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
// var upca = new Barcode("data", Type.UPCA); // error CS0117
// var itf = new Barcode("data", Type.ITF); // 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
' Dim upca As New Barcode("data", Type.UPCA) ' error CS0117
' Dim itf As New Barcode("data", Type.ITF) ' error CS0117
Branże, w których ta granica staje się ograniczeniem, obejmują śledzenie produktów farmaceutycznych (kodDataMatrixwymagany zgodnie z wymogą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ń wykluczaNetBarcodejako samodzielne rozwiązanie.
Podejście IronBarcode
IronBarcode eksponuje wszystkie obsługiwane formaty przez tę samą metodę BarcodeWriter.CreateBarcode. Powierzchnia API nie zmienia się przy przechodzeniu z formatu 1D na 2D — różni się tylko 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")
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 generowaniaNetBarcodeopiera się na konstruktórach. Obiekt Barcode jest zainicjowany za pomocą ciągu danych i wartości enumu Type. Wyjście jest albo zapisywane bezpośrednio za pomocą SaveImageFile() albo pobierane jako Image<Rgba32> za pomocą GetImage(). Od wersji 1.8, typ zwracany przez GetImage() to typ SixLabors.ImageSharp, co oznacza, że każdy kod przechowujący lub przetwarzający wartość zwracaną musi importować i działać w ramach 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
Typ zwracany przez metodę GetImage() wiąże kod potomny z biblioteką ImageSharp. Każda metoda, która akceptuje lub przechowuje wynik, musi deklarować go jako Image<Rgba32>, wprowadzając przejściową zależność do kodu wywołującego.
Podejście IronBarcode
IronBarcode wykorzystuje łańcuch płynny. BarcodeWriter.CreateBarcode zwraca obiekt GeneratedBarcode, który ma 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
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
Biblioteka ZXing.Net jest najczęściej dodawanym elementem do odczytu obok NetBarcode, zapewniając trzeci interfejs API i trzeci pakiet do zarządzania wersjami obokNetBarcodei dowolnej biblioteki 2D już dodanej dla kodów QR.
Podejście IronBarcode
IronBarcode zawiera BarcodeReader w tej samej paczce, 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.Format}: {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.Format}: {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.Format}: {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
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
NetBarcodei 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 wymagana jest licencja komercyjna. Ten podział obowiązuje bez względu na to, czy ImageSharp jest wyraźnie wymieniony w .csproj projektu, czy przychodzi przejściowo przez NetBarcode.
<PackageReference Include="NetBarcode" Version="1.8.3" />
<PackageReference Include="NetBarcode" Version="1.8.3" />
W przypadku firmy detalicznej lub logistycznej przetwarzającej BarCodes na dużą skalę — głównego przypadku użycia, do którego skierowany jestNetBarcode— 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.
Wydanie v1.8 wprowadziło dodatkową konsekwencję zależności ImageSharp: typ zwracany przez GetImage() zmienił się z wewnętrznego przedstawienia na SixLabors.ImageSharp.Image<Rgba32>. Istniejący kod, który wywoływał GetImage() bez wyraźnego typowania, przestał działać podczas kompilacji, a nowe dyrektywy using dla SixLabors.ImageSharp i SixLabors.ImageSharp.PixelFormats stały się wymagane. 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.Code128A/B/C) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) |
IronBarcode automatycznie wybiera podzbiór |
new Barcode(data, Type.EAN13) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN13) |
Bezpośrednie odwzorowanie |
new Barcode(data, Type.EAN8) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN8) |
Bezpośrednie odwzorowanie |
new Barcode(data, Type.Code39) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code39) |
Bezpośrednie odwzorowanie |
new Barcode(data, Type.Code39E) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code39Extended) |
Bezpośrednie odwzorowanie |
new Barcode(data, Type.Code93) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code93) |
Bezpośrednie odwzorowanie |
new Barcode(data, Type.Code11) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code11) |
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 |
Brak Type.UPCA / UPCE / ITF / MSI |
BarcodeEncoding.UPCA / UPCE / ITF / MSI |
Nowa funkcja |
Brak Type.QRCode |
BarcodeEncoding.QRCode |
Nowa funkcja |
Brak Type.DataMatrix |
BarcodeEncoding.DataMatrix |
Nowa funkcja |
Brak Type.PDF417 |
BarcodeEncoding.PDF417 |
Nowa funkcja |
Brak 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 zNetBarcodena IronBarcode
Wymagania dotyczące kodów QR i formatów 2D
Najczęstszym powodem rozważania alternatywy dlaNetBarcodejest 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ż enum Type nie zawiera wpisu QR, nie można spełnić tego wymagania w NetBarcode. Zespoły, które dodają oddzielną bibliotekę kodów QR, aby wypełnić tę lukę, stają następnie przed drugą oceną, gdyDataMatrixjest wymagany do integracji farmaceutycznej lubPDF417dla 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.Net/Barcodenie 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ż zawieraNetBarcodei 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ą zNetBarcodedo 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
UsunięcieNetBarcodeza pomocą dotnet remove package NetBarcode to pierwszy krok. Pakiet SixLabors.ImageSharp może ponownie pojawić się w drzewie zależności, jeśli inne pakiety w projekcie również go przejmują. Po usunięciu, sprawdź przywróconą listę pakietów za pomocą dotnet list package --include-transitive, aby potwierdzić, czy ImageSharp nadal jest obecny i czy nadal obowiązuje jego warunek licencji komercyjnej.
Zastąpienie typu zwracanego przez metodę GetImage()
Każdy kod, który przechowywał wynik GetImage() jako Image<Rgba32>, musi być 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 zapisywał obraz do strumienia, można zastąpić .SaveAsPng(stream) bezpośrednio na obiekcie GeneratedBarcode. Kod, który pobierał 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
Pliki, które importowały using NetBarcode;, using SixLabors.ImageSharp;, using SixLabors.ImageSharp.PixelFormats; lub using SixLabors.Fonts;, muszą mieć te dyrektywy zastąpione 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 wymogą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 celuje w nowe wersje .NET i zachowuje zgodność z .NET Standard dla projektów, które jeszcze nie migrowały do nowoczesnego .NET. Regularna kadencja wydania Iron Software wyrównuje aktualizacje kompatybilności z każdym głównym wydaniem .NET.Net/Barcodejest 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.Net/Barcodeto skupiona, czysta implementacja generowania 1D kodów kreskowych: jedenaście wartości wyliczenia w ośmiu rodzinach symbologii liniowej, prosty API oparty na konstruktorze i licencja MIT, która utrzymuje proces adopcji płynny dla projektów open-source w zakresie 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.
Dla projektów, gdzie wymagania rzeczywiście ograniczają się do generowania liniowego kodu kreskowego w obrębie obsługiwanej grupy — systemu kasowego wytwarzającego kody EAN-13 dla europejskich skanerów sklepów detalicznych lub wewnętrznego narzędzia o określonym i krótkim czasie życia —NetBarcodedostarcza, co jest potrzebne, bez wprowadzania komercyjnej zależności. Biblioteka jest dobrze zbudowana w ramach swojego zakresu, a ten zakres jest jasny od pierwszego spojrzenia na enum 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ą odNetBarcodedo 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 jedenaście wartości wyliczenia 1D zNetBarcodew ośmiu rodzinach symbologii i brak zdolności czytania pasują doskonale do specyfikacji,NetBarcodeto technicznie solidny wybór. 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().

