Przejdź do treści stopki
FILMY

Jak ustawić region przycinania kodu kreskowego w C#

Migrating fromNetBarcodeto IronBarcode

Niniejszy przewodnik obejmuje kompletną ścieżkę migracji zNetBarcodedo IronBarcode, wraz z instrukcjami usuwania pakietów, aktualizacjami przestrzeni nazw, przykładami tłumaczenia API oraz listą kontrolną służącą do zlokalizowania wszystkich miejsc wywołań przed rozpoczęciem migracji. Poradnik dotyczy typowego scenariusza, w którym projekt zaczyna się zNetBarcodedo generacji kodu kreskowego 1D, a później wymaga formatów 2D, możliwości odczytu lub wyjaśnienia obowiązku licencji SixLabors.ImageSharp — co wszystko jest poza zakresem NetBarcode.

Dlaczego warto przejść z NetBarcode

Limit formatu: Enumeracja Type wNetBarcodedefiniuje dokładnie 11 formatów kodów kreskowych, wszystkie liniowe. Nie ma wpisu dla QR Code, DataMatrix, PDF417 ani Aztec. Gdy w projekcie pojawia się wymóg dotyczący kodu QR — na przykład w celu zapewnienia bezkontaktowych linków dostawczych, głębokich linków mobilnych lub wymogu stosowania kodu DataMatrix w branży farmaceutycznej —NetBarcodenie jest w stanie go spełnić. Jedynym rozwiązaniem w ramach struktury biblioteki jest zaprzestanie jej używania w tym formacie i wprowadzenie oddzielnego pakietu. Każde dodatkowe wymaganie formatu, które wychodzi poza 11 wpisów enum, dodaje kolejną bibliotekę do drzewa zależności.

Brak API do odczytu:NetBarcodegeneruje obrazy BARCODE i nie udostępnia żadnej metody ich dekodowania. Projekt, który wymaga skanowania etykiet zwrotnych, wyodrębniania wartości BarCode'ów z faktur dostawców lub sprawdzania, czy wydrukowany BarCode zgadza się z danymi źródłowymi, musi zawierać oddzielną bibliotekę do odczytu. ZXing.Net jest najczęściej wybieranym rozwiązaniem, wprowadzającym trzeci interfejs API do kodu źródłowego, który zawiera jużNetBarcodei zazwyczaj bibliotekę przeznaczoną specjalnie dla kodów QR.

Licencja komercyjna ImageSharp:NetBarcodezależy od SixLabors.ImageSharp, który używa podzielonej licencji komercyjnej. Bezpłatny poziom dotyczy projektów open source oraz firm, których roczne przychody nie przekraczają określonego progu; powyżej tego progu wymagana jest licencja komercyjna. Warunek ten jest osadzony w łańcuchu zależności przechodnich i nie jest wyświetlany przez NuGet podczas instalacji. Firma detaliczna lub logistyczna przetwarzająca BARCODES na dużą skalę — czyli dokładnie taki przypadek użycia, do którego skierowany jestNetBarcode— może działać powyżej progu bez oceny tego obowiązku.

Gromadzenie wielu bibliotek: Projekty, które sięgają po QRCoder, gdy potrzebne są kody QR, a następnie po ZXing.Net, gdy konieczne staje się odczytanie, gromadzą trzy oddzielne zależności związane z kodami barcode. Każde z nich ma własny harmonogram wydawania, własne wymagania dotyczące wersji ImageSharp oraz własne API, które należy utrzymywać. Konsolidacja w jedną bibliotekę, która obejmuje generowanie, odczyt, 1D i 2D, eliminuje problem zarządzania wersjami między bibliotekami.

Podstawowy problem

Projekt, który zaczyna się od samego NetBarcode, a następnie rozrasta się i wymaga formatów 2D, kończy się tego rodzaju podzielonym importem:

//NetBarcodefor 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
//NetBarcodefor 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
Imports NetBarcode
Imports QRCoder
Imports System.IO

'NetBarcode for 1D — one library, one API
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")

' QRCoder added separately for QR — second library, second API
Dim qrGenerator As New QRCodeGenerator()
Dim qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim png = New PngByteQRCode(qrData).GetGraphic(20)
File.WriteAllBytes("qr.png", png)
$vbLabelText   $csharpLabel

Po migracji do IronBarcode te same dwa wyniki pochodzą z jednego importu:

using IronBarCode;

BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
    .SaveAsPng("label.png")

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsPng("qr.png")
$vbLabelText   $csharpLabel

IronBarcode vs NetBarcode: Porównanie funkcji

Funkcja NetBarcode IronBarcode
Generowanie kodów kreskowych 1D Tak Tak
Generowanie kodów kreskowych 2D (QR, DataMatrix, PDF417, Aztec) Nie Tak
Odczytywanie BarCode z obrazów Nie Tak
Odczytywanie BarCode'ów z dokumentów PDF Nie Tak
Liczba formatów 1D 11 30+
Liczba formatów 2D 0 8+
Całkowita liczba symboli 11 50+
GS1-128, GS1 DataBar Nie Tak
Formaty adresów pocztowych Nie Tak
Wynik w formacie SVG Nie Tak
Przetwarzanie wsadowe Podręcznik Wbudowane
Zależność ImageSharp Tak (podzielona licencja) Nie
Wsparcie komercyjne Społeczność Professional
Model licencji MIT (+ warunki ImageSharp) Komercjalne

Szybki start: Migracja zNetBarcodedo IronBarcode

Krok 1: Zastąp pakiet NuGet

UsuńNetBarcodei jego zależność przechodnią od ImageSharp:

dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
SHELL

Należy pamiętać, że SixLabors.ImageSharp może ponownie pojawić się na liście przywracanych pakietów, jeśli inne pakiety w projekcie również odwołują się do niego tranzytywnie. Po usunięciu, uruchom dotnet list package --include-transitive, aby potwierdzić, czy ImageSharp pozostaje i czy jego komercyjna licencja nadal ma zastosowanie do projektu.

Krok 2: Dodaj IronBarcode

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

Nazwa pakietu NuGet to IronBarcode; przestrzeń nazw używana w kodzie to IronBarCode (zwróć uwagę na wielką literę C).

Krok 3: Zaktualizuj przestrzenie nazw i zainicjuj licencję

Zastąp stare dyrektywy using w każdym pliku zawierającym wywołania NetBarcode:

// Usuń these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;

// Add this:
using IronBarCode;
// Usuń these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;

// Add this:
using IronBarCode;
Imports IronBarCode
$vbLabelText   $csharpLabel

Dodaj inicjalizację licencji raz na starcie aplikacji — w Program.cs, Startup.cs lub w punkcie wejścia projektu:

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Dostępny jest bezpłatny klucz próbny do oceny wersji próbnej; Zakup licencji usuwa znak wodny wersji próbnej z wygenerowanych obrazów BARCODE.

Przykłady migracji kodu

Generowanie kodu 128

Najczęstszy wzorzec użyciaNetBarcodeprzekłada się bezpośrednio na IronBarcode poprzez zmianę konstruktóra na metodę statyczną oraz zmianę nazwy metody.

Podejście NetBarcode:

using NetBarcode;

var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");
using NetBarcode;

var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");
Imports NetBarcode

Dim barcode As New Barcode("12345678901234", Type.Code128)
barcode.SaveImageFile("shipping-label.png")
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128) _
    .SaveAsPng("shipping-label.png")
$vbLabelText   $csharpLabel

Konstruktor new Barcode(data, Type.X) zmienia się na BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X). Metoda SaveImageFile() zmienia się na SaveAsPng(), SaveAsJpeg() lub SaveAsWindowsBitmap() w zależności od wymaganego formatu wyjściowego. Wszystkie dostępne opcje generowania kodów kreskowych 1D są opisane w poradnikach IronBarcode.

EAN-13

Typy BarCodes produktów detalicznych są bezpośrednio mapowane między bibliotekami za pomocą stałej rename i metody rename.

Podejście NetBarcode:

using NetBarcode;

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

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

Dim ean13 As New Barcode("5901234123457", Type.EAN13)
ean13.SaveImageFile("product-ean.png")
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product-ean.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product-ean.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
    .SaveAsPng("product-ean.png")
$vbLabelText   $csharpLabel

Nazwy stałych kodowania odpowiadają odpowiednikomNetBarcodeType, jeśli istnieją bezpośrednie odpowiedniki. Należy zauważyć, że UPC-A (Type.UPCA), UPC-E (Type.UPCE), ITF (Type.ITF) i MSI (Type.MSI) nie są częścią enumeracjiNetBarcodeType — jeśli te formaty są wymagane,IronBarcode wspiera je natywnie za pomocą BarcodeEncoding.UPCA, BarcodeEncoding.UPCE, BarcodeEncoding.ITF i BarcodeEncoding.MSI.

GetImage() do ToPngBinaryData()

MetodaNetBarcodeGetImage() zwraca SixLabors.ImageSharp.Image<Rgba32>, która wymaga jawnych importów ImageSharp w kodzie wywołującym i wiąże logikę dalszą z API ImageSharp.IronBarcode umożliwia bezpośrednie metody wyjścia binarnego i strumieniowego na obiekcie GeneratedBarcode, eliminując całkowicie zależność od ImageSharp w kodzie wywołującym.

Podejście NetBarcode:

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

var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();

using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();

using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
Imports NetBarcode
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats
Imports System.IO

Dim barcode As New Barcode("12345", Type.Code128)
Dim image As Image(Of Rgba32) = barcode.GetImage()

Using stream As New MemoryStream()
    image.SaveAsPng(stream)
    Dim bytes As Byte() = stream.ToArray()
End Using
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);

// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();

// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);

// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();

// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
Imports IronBarCode

Dim barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)

' Retrieve bytes directly — no ImageSharp type in calling code
Dim bytes As Byte() = barcode.ToPngBinaryData()

' Or write to a stream directly
Using stream As New MemoryStream()
    barcode.SaveAsPng(stream)
End Using
$vbLabelText   $csharpLabel

Kod, który wykonywał dalsze manipulacje ImageSharp na wyniku Image<Rgba32> — zmiana rozmiaru, kompozycja, konwersja formatu — będzie wymagał indywidualnej oceny tych operacji, ponieważIronBarcode nie udostępnia obiektu ImageSharp.

Wspólne zastąpienieNetBarcodei QRCoder

Projekty korzystające zNetBarcodei QRCoder mogą zastąpić oba narzędzia jednocześnie. 2D generacja w IronBarcode używa tej samej metody BarcodeWriter.CreateBarcode co generacja 1D; różni się tylko stała BarcodeEncoding. Opcje kodowania i konfiguracji można znaleźć w przewodniku dotyczącym generowania BARCODE-ów 2D.

PodejścieNetBarcodei QRCoder:

using NetBarcode;
using QRCoder;

// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));
using NetBarcode;
using QRCoder;

// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));
Imports NetBarcode
Imports QRCoder

' 1D with NetBarcode
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")

' QR with QRCoder
Dim qrGenerator As New QRCodeGenerator()
Dim qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim qrCode As New PngByteQRCode(qrData)
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20))
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-label.png");
using IronBarCode;

// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-label.png");
Imports IronBarCode

' 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
    .SaveAsPng("label.png")

' QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsPng("qr.png")

' Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix) _
    .SaveAsPng("pharma-label.png")
$vbLabelText   $csharpLabel

Dodanie funkcji czytania

Jeśli w projekcie wykorzystywano również bibliotekę ZXing.Net do odczytu, zależność tę można usunąć wraz z biblioteką NetBarcode. IronBarcode's BarcodeReader obsługuje obrazy i dokumenty PDF z automatycznym wykrywaniem formatu.

Podejście ZXing.Net:

using ZXing;
using ZXing.Common;
using ZXing.Rendering;

var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };

// Bitmap loading and format-specific handling required before decode call
using ZXing;
using ZXing.Common;
using ZXing.Rendering;

var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };

// Bitmap loading and format-specific handling required before decode call
Imports ZXing
Imports ZXing.Common
Imports ZXing.Rendering

Dim reader = New BarcodeReaderGeneric()
reader.Options = New DecodingOptions With {.TryHarder = True}

' Bitmap loading and format-specific handling required before decode call
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

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

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

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

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

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

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

Pełna dokumentacja dotycząca opcji odczytu jest dostępna w przewodniku odczytu BARCODE-ów z obrazów, obejmującym ustawienia regulacji prędkości, wykrywania wielu BARCODE-ów oraz korekcji obrazu.

Dokumentacja APINetBarcodedo IronBarcode

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.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.Codabar) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Codabar) Bezpośrednie odwzorowanie
new Barcode(data, Type.Code93) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code93) 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.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
using SixLabors.ImageSharp.PixelFormats; Usuń Nie jest już potrzebne
using SixLabors.Fonts; Usuń Nie jest już potrzebne

Pełna lista stałych kodowania znajduje się w opisie obsługiwanych formatów BarCode.

Typowe problemy związane z migracją i ich rozwiązania

Problem 1: Zależność przechodnia ImageSharp pozostaje po usunięciu pakietu

Problem: Po uruchomieniu dotnet remove package NetBarcode, dotnet restore pokazuje, że SixLabors.ImageSharp jest nadal obecny w drzewie zależności, ponieważ inny pakiet w projekcie również się do niego odwołuje.

Rozwiązanie: Uruchom dotnet list package --include-transitive, aby zidentyfikować, który pakiet nadal wciąga ImageSharp. Jeśli to tylko NetBarcode, usunięcie jawnego odniesienia do pakietu i przywrócenie powinno to rozwiązać. Jeśli inny pakiet jest odpowiedzialny, zależność od ImageSharp tego pakietu i jego warunek licencji komercyjnej pozostają w zakresie niezależnie od usunięcia NetBarcode.

dotnet list package --include-transitive | grep -i imagesharp
dotnet list package --include-transitive | grep -i imagesharp
SHELL

Problem 2: Typ obrazu nie może być rozwiązany po usunięciu

Problem: Po usunięciu pakietu SixLabors.ImageSharp, każda zmienna zadeklarowana jako Image<Rgba32> lub parametr o typie SixLabors.ImageSharp.Image<Rgba32> powoduje błąd kompilacji, ponieważ typ nie jest już dostępny.

Rozwiązanie: Zastąp każde użycie odpowiednią metodą wyjściową IronBarcode. Jeśli zmienna była używana do uzyskiwania bajtów, zastąp ją .ToPngBinaryData(). Jeśli była zapisywana do strumienia, zastąp ją .SaveAsPng(stream). Jeśli była zapisywana do pliku, zastąp ją .SaveAsPng(path).

// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);

// After — no external image type required
barcode.SaveAsPng(stream);
// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);

// After — no external image type required
barcode.SaveAsPng(stream);
' Before — requires SixLabors.ImageSharp reference
Dim img As Image(Of Rgba32) = barcode.GetImage()
img.SaveAsPng(stream)

' After — no external image type required
barcode.SaveAsPng(stream)
$vbLabelText   $csharpLabel

Problem 3: Kontekst zmiany łamiącej w wersji 1.8

Problem: Bazowe kodu, które były napisane przeciwkoNetBarcodeprzed v1.8 mogą mieć wywołania GetImage(), które przechowywały wynik bez jawnego typowania, opierając się na wewnętrznym typie zwracanym sprzed v1.8. Te wywołania mogą już być zepsute po aktualizacji NetBarcode, niezależnie od migracji IronBarcode.

Rozwiązanie: Skorzystaj z migracji do IronBarcode jako okazji do równoczesnego rozwiązania wszelkich usterek istniejących przed v1.8. Wszystkie miejsca wywołań GetImage() powinny zostać zlokalizowane za pomocą projektowego wyszukiwania i zastąpione odpowiednią metodą wyjścia IronBarcode podczas przepływu migracji. Polecenia grep w poniższej liście kontrolnej migracji identyfikują te lokalizacje.

Lista kontrolna dla migracji z NetBarcode

Przed migracją

Przeglądaj całe użycieNetBarcodeprzed wprowadzeniem jakichkolwiek zmian:

grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
SHELL
  • Zidentyfikuj każdy plik, który wymaga zmiany dyrektywy using
  • Zanotuj wszystkie miejsca wywołań GetImage() i sposób, w jaki zwracany obiekt Image<Rgba32> jest używany dalej
  • Sprawdź, czy QRCoder lub ZXing.Net są obecne i można je usunąć w tym samym przebiegu
  • Uruchom dotnet list package --include-transitive, aby przed usunięciem udokumentować obecny stan zależności ImageSharp
  • Uzyskaj klucz licencyjny IronBarcode(darmowy klucz próbny jest dostępny bez zakupu)

Aktualizacja kodu

  1. Uruchom dotnet remove package NetBarcode
  2. Uruchom dotnet remove package SixLabors.ImageSharp, jeśli nie jest używany przez inne pakiety
  3. Uruchom dotnet add package IronBarcode
  4. Dodaj IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; na starcie aplikacji
  5. Zastąp using NetBarcode; using IronBarCode; w każdym dotkniętym pliku
  6. Usuń using SixLabors.ImageSharp;, using SixLabors.ImageSharp.PixelFormats; i using SixLabors.Fonts; z wszystkich plików
  7. Przetłumacz każde wywołanie new Barcode(data, Type.X) do BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X) używając tabeli mapowania API
  8. Zastąp SaveImageFile() SaveAsPng() lub odpowiednią metodą specyficzną dla formatu
  9. Zastąp wywołania GetImage() ToPngBinaryData(), SaveAsPng() lub SaveAsPng(stream) zgodnie z potrzebą
  10. Jeśli usuwasz QRCoder: zamień łańcuchy QRCodeGenerator + PngByteQRCode na BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
  11. Jeśli usuwasz ZXing.Net: zamień konfigurację czytnika na BarcodeReader.Read(path)

Testy po migracji

  • Zbuduj projekt i potwierdź zero błędów kompilacji
  • Uruchom istniejące testy jednostkowe w celu sprawdzenia wygenerowanego kodu kreskowego
  • Zweryfikuj wizualnie obrazy kodów kreskowych pod kątem poprawnej symboliki i czytelnej treści
  • Zweryfikuj wyjście kodu QR, jeśli ten format został dodany podczas migracji
  • Przetestuj funkcjonalność odczytu, jeśli dodano skanowanie kodu kreskowego
  • Uruchom dotnet list package --include-transitive, aby potwierdzić, że ImageSharp nie jest już obecny, jeśli został usunięty
  • Zatwierdź, że inicjalizacja klucza licencyjnego działa przed pierwszą operacją kodu kreskowego

Kluczowe korzyści wynikające z migracji do IronBarcode

Zunifikowane pokrycie formatu: Po migracji kody QR, DataMatrix, PDF417, Aztec i wszystkie inne formaty 2D są dostępne poprzez to samo wywołanie API używane dla Code128 i EAN-13. Nie jest potrzebna druga biblioteka, gdy wymagania dotyczące formatu się rozszerzają, a stała BarcodeEncoding to jedyna rzecz, która zmienia się między typami formatów.

Wbudowane odczytywanie: BarcodeReader.Read() obsługuje pliki obrazów i dokumenty PDF z automatycznym wykrywaniem formatu. Projekty, które wcześniej wymagały ZXing.Net do odczytu, mogą usunąć to zależność i skonsolidować do jednej biblioteki kodów kreskowych, zmniejszając powierzchnię API, którą deweloperzy muszą poznać.

Brak zobowiązań względem ImageSharp:IronBarcode nie ma zależności od SixLabors.ImageSharp. Po migracji podzielony warunek licencyjny zawarty w przejrzystych zależnościachNetBarcodenie ma już zastosowania do projektu. Przeglądy zgodności licencyjnej stają się prostsze, ponieważ zobowiązania biblioteki kodów kreskowych są bezpośrednio określone i nie zależą od progu przychodów zewnętrznej biblioteki przetwarzania obrazów.

Stabilne publiczne API:IronBarcode nie ujawnia typów zewnętrznych w swojej publicznej powierzchni API. Zwracany typ GeneratedBarcode z BarcodeWriter.CreateBarcode jest własnym typem IronBarcode, co oznacza, że przyszłe aktualizacje wewnętrznego renderowania IronBarcode nie spowodują zerwania zmian w wywołującym kodzie w sposób, w jaki zrobiła to zmiana typuNetBarcodew wersji v1.8 GetImage().

Pojedyncza zależność do utrzymania: Zastąpienie NetBarcode, QRCoder i ZXing.Net przez IronBarcode redukuje trzy cykle aktualizacji, trzy zestawy notatek o wersjach i trzy potencjalne konflikty wersji do jednego. W miarę postępu wersji .NET i konieczności aktualizacji zależności, praca konserwacyjna obejmuje jedną bibliotekę zamiast trzech.

Zwróć uwagęNetBarcode, QRCoder i ZXing.NET są zarejestrowanymi znakami towarowymi ich właścicieli. Ta strona nie jest powiązana z, popierana przez, ani sponsorowana przez NetBarcode, QRCoder lub ZXing.NET. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.

Często Zadawane Pytania

Dlaczego warto przejść z NetBarcode na IronBarcode?

Typowe powody to uproszczenie licencjonowania (eliminacja złożoności związanej z SDK i kluczem uruchomieniowym), zniesienie limitów przepustowości, uzyskanie natywnej obsługi plików PDF, usprawnienie wdrażania w środowisku Docker/CI/CD oraz ograniczenie powtarzalnego kodu API w kodzie produkcyjnym.

Jak zastąpić wywołania API NetBarcode za pomocą IronBarcode?

Zastąp standardowe fragmenty kodu dotyczące tworzenia instancji i licencjonowania wyrażeniem IronBarCode.License.LicenseKey = "key". Zastąp wywołania czytnika wyrażeniem BarcodeReader.Read(path), a wywołania zapisu wyrażeniem BarcodeWriter.CreateBarcode(data, encoding). Metody statyczne nie wymagają zarządzania instancjami.

Jak bardzo zmienia się kod podczas migracji z NetBarcode do IronBarcode?

Większość migracji skutkuje zmniejszeniem liczby linii kodu. Usuwane są standardowe fragmenty dotyczące licencji, konstruktory instancji oraz jawna konfiguracja formatów. Podstawowe operacje odczytu/zapisu są mapowane na krótsze odpowiedniki w IronBarcode z bardziej przejrzystymi obiektami wynikowymi.

Czy podczas migracji muszę mieć zainstalowane zarówno NetBarcode, jak i IronBarcode?

Nie. Większość migracji polega na bezpośredniej wymianie, a nie na równoległym działaniu. Należy migrować po jednej klasie usługowej na raz, zastąpić odwołanie do NuGet oraz zaktualizować wzorce instancjonowania i wywoływania API przed przejściem do kolejnej klasy.

Jaka jest nazwa pakietu NuGet dla IronBarcode?

Pakiet nosi nazwę „IronBarcode” (z wielkimi literami B i C). Zainstaluj go za pomocą polecenia „Install-Package IronBarcode” lub „dotnet add package IronBarcode”. Dyrektywa using w kodzie to „using IronBarcode;”.

W jaki sposób IronBarcode upraszcza wdrażanie Docker w porównaniu z NetBarcode?

IronBarcode to pakiet NuGet bez zewnętrznych plików SDK ani konfiguracji licencji. W Dockerze należy ustawić zmienną środowiskową IRONBARCODE_LICENSE_KEY, a pakiet zajmie się weryfikacją licencji podczas uruchamiania.

Czy IronBarcode automatycznie wykrywa wszystkie formaty kodów kreskowych po migracji z NetBarcode?

Tak. IronBarcode automatycznie wykrywa symbole we wszystkich obsługiwanych formatach. Wyraźne wyliczenie typów kodów kreskowych nie jest wymagane. Jeśli format jest już znany, a wydajność ma znaczenie, BarcodeReaderOptions pozwala ograniczyć obszar wyszukiwania w celu optymalizacji.

Czy IronBarcode może odczytywać BarCodes z plików PDF bez oddzielnej biblioteki?

Tak. BarCodeReader.Read("document.pdf") przetwarza pliki PDF natywnie. Wyniki obejmują PageNumber, Format, Value i Confidence dla każdego znalezionego kodu kreskowego. Nie jest wymagany żaden zewnętrzny etap renderowania pliku PDF.

W jaki sposób IronBarcode obsługuje równoległe przetwarzanie kodów kreskowych?

Metody statyczne IronBarcode są bezstanowe i bezpieczne dla wątków. Użyj Parallel.ForEach bezpośrednio na listach plików bez zarządzania instancjami dla poszczególnych wątków. BarcodeReaderOptions.MaxParallelThreads kontroluje wewnętrzny limit wątków.

Jakie właściwości wyników ulegają zmianie podczas migracji z NetBarcode do IronBarcode?

Typowe zmiany nazw: BarcodeValue staje się Value, BarcodeType staje się Format. Wyniki IronBarcode zawierają również Confidence i PageNumber. Funkcja wyszukiwania i zamiany w całym rozwiązaniu obsługuje zmiany nazw w istniejącym kodzie przetwarzania wyników.

Jak skonfigurować licencjonowanie IronBarcode w potoku CI/CD?

Zapisz IronBarcode_LICENSE_KEY jako sekret potoku i przypisz IronBarCode.License.LicenseKey w kodzie uruchamiającym aplikację. Jeden sekret obejmuje wszystkie środowiska, w tym środowisko programistyczne, testowe, przejściowe i produkcyjne.

Czy IronBarcode obsługuje generowanie kodów QR z niestandardowym stylem?

Tak. Funkcja QRCodeWriter.CreateQrCode() obsługuje niestandardowe kolory za pomocą ChangeBarCodeColor(), osadzanie logo za pomocą AddBrandLogo(), konfigurowalne poziomy korekcji błędów oraz wiele formatów wyjściowych, w tym PNG, JPG, PDF i strumień.

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