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

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 Type definiuje 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() zwraca Image<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() lub GetImage()
  • 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
$vbLabelText   $csharpLabel

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 i BarcodeReader są 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 obiekt GeneratedBarcode z metodami wyjściowymi, w tym SaveAsPng(), 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 .pdf bezpoś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
$vbLabelText   $csharpLabel

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")
$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 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
$vbLabelText   $csharpLabel

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
$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 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
$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

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" />
XML

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().

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie