Jak używać skanera kodów kreskowych w Blazor | IronBarcode
Migrating from Spire.Barcode to IronBarcode
Metoda BarcodeScanner.Scan() w Spire.Barcode wymaga argumentu BarCodeType przy każdym wywołaniu. W miarę jak baza kodu rozrasta się, aby obsługiwać różnorodne źródła dokumentów, nowe etykiety dostawców i nowe formaty kodów kreskowych, ten projekt powoduje pętle zgadywania typów, które z czasem powodują wzrost kosztów utrzymania. Niniejszy przewodnik obejmuje pełną ścieżkę od Spire.BarCode do IronBarcode: powody, dla których zespoły dokonują tej zmiany, mechaniczne kroki niezbędne do jej wykonania oraz wzorce kodu przed i po zmianie dla każdej typowej operacji.
Dlaczego warto przejść z Spire.BarCode
Nadwyżka specyfikacji formatu: Każde wywołanie BarcodeScanner.Scan() w Spire.Barcode wymaga wartości enum BarCodeType, którą musi dostarczyć kod wywołujący. Aplikacje przetwarzające barcodes z nieznanych lub mieszanych źródeł muszą utrzymywać listę potencjalnych typów i przeglądać ją, aż do znalezienia dopasowania. Każdy format dodany do przepływu pracy wymaga aktualizacji tablicy kandydatów, ponownego przetestowania logiki wykrywania oraz potwierdzenia, że kolejność iteracji nie powoduje, że jeden format zasłania inny. Koszt ten rośnie proporcjonalnie do różnorodności formatów.
Ograniczenia wersji bezpłatnej: FreeSpire.BARCODE celowo obniża wydajność odczytu i ogranicza dostępny zestaw symboli w porównaniu z produktem komercyjnym. Testy porównawcze i testy zgodności formatów przeprowadzone podczas oceny FreeSpire.BarCode nie odzwierciedlają zachowania komercyjnego Spire.BarCode. Zespoły, które zdecydują się na zakup na podstawie bezpłatnej wersji próbnej, mogą po zakupie odkryć, że produkt zachowuje się inaczej w środowisku produkcyjnym — szczególnie w zakresie przepustowości i obsługiwanych symboli.
Plik PDF wymagający dwóch bibliotek: Spire.BarCode nie może odczytywać kodów kreskowych bezpośrednio z plików PDF. Przepływy pracy oparte na PDF wymagają oddzielnego pakietu Spire.PDF z własną licencją, plus kod napisanego przez dewelopera do iteracji stron, wyodrębniania obrazów z każdej strony i przekazywania tych obrazów do skanera kodów kreskowych. Zadanie, które koncepcyjnie należy do odczytu kodów kreskowych, jest podzielone na dwa produkty, dwie umowy licencyjne i znaczną część kodu infrastruktury.
Złożoność typu zwrotu: BarcodeScanner.Scan() zwraca string[], który zawiera tylko zdekodowane wartości. Wykryty format BARCODE nie jest zawarty w wyniku. Aplikacje, które muszą kierować wyniki według formatu — na przykład wysyłając wartości kodów QR do jednego procesora, a wartości Code128 do innego — muszą utrzymywać oddzielną zmienną typu pochodzącą z tego etapu iteracji, który wygenerował wynik, tworząc dodatkowe zarządzanie stanem wykraczające poza samo skanowanie.
Podstawowy problem
Pętla zgadywania typu jest najbardziej widocznym objawem obowiązkowego ograniczenia BarCodeType. W kodzie Spire.BarCode przetwarzającym dokumenty z wielu źródeł ten wzorzec pojawia się wielokrotnie:
// Spire.Barcode: growing candidate loop with silent misses
BarcodeScanner scanner = new BarcodeScanner();
var candidates = new[] { BarCodeType.Code128, BarCodeType.QRCode, BarCodeType.DataMatrix, BarCodeType.EAN13, BarCodeType.PDF417 };
string foundValue = null;
foreach (var type in candidates)
{
string[] found = scanner.Scan("barcode.png", type);
if (found.Length > 0)
{
foundValue = found[0];
break;
}
}
// Spire.Barcode: growing candidate loop with silent misses
BarcodeScanner scanner = new BarcodeScanner();
var candidates = new[] { BarCodeType.Code128, BarCodeType.QRCode, BarCodeType.DataMatrix, BarCodeType.EAN13, BarCodeType.PDF417 };
string foundValue = null;
foreach (var type in candidates)
{
string[] found = scanner.Scan("barcode.png", type);
if (found.Length > 0)
{
foundValue = found[0];
break;
}
}
Imports Spire.Barcode
Dim scanner As New BarcodeScanner()
Dim candidates = {BarCodeType.Code128, BarCodeType.QRCode, BarCodeType.DataMatrix, BarCodeType.EAN13, BarCodeType.PDF417}
Dim foundValue As String = Nothing
For Each type In candidates
Dim found As String() = scanner.Scan("barcode.png", type)
If found.Length > 0 Then
foundValue = found(0)
Exit For
End If
Next
IronBarcode całkowicie eliminuje tę pętlę. W bibliotece wbudowana jest funkcja wykrywania formatu:
// IronBarcode: single call, all formats, type included in result
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
Console.WriteLine($"{result.Format}: {result.Value}");
}
// IronBarcode: single call, all formats, type included in result
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
Console.WriteLine($"{result.Format}: {result.Value}");
}
Imports IronBarcode
' IronBarcode: single call, all formats, type included in result
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
Console.WriteLine($"{result.Format}: {result.Value}")
Next
IronBarcode a Spire.Barcode: porównanie funkcji
| Funkcja | Spire.Barcode | IronBarcode |
|---|---|---|
| Automatyczne wykrywanie formatu | Nie | Tak |
| Wymagany parametr BarCodeType | Tak | Nie |
| Formatowanie metadanych w wyniku | Nie | Tak |
| Odczyt plików PDF w języku ojczystym | Nie (wymaga Spire.PDF) | Tak |
| Dodatkowa biblioteka dla plików PDF | Spire.PDF (oddzielna licencja) | None |
| Wydajność odczytu w ramach bezpłatnego pakietu | Celowo pogorszona jakość | Pełna prędkość |
| Znaki wodne w wersji bezpłatnej | Duży, obejmuje BarCode | Małe, tylko krawędzie |
| Symbole poziomów bezpłatnych | ~20 typów | Ponad 50 typów |
| Rejestracja w ramach bezpłatnego pakietu | Tak | Nie |
| Model API generowania | Obiekt Settings + generator | Fabryka statyczna z płynnym łańcuchem |
| QR kod z niestandardowym logo | Tylko poziom komercyjny | Wszystkie poziomy |
| Typ zwracany z odczytu | string[] |
BarcodeResults (z metadanymi typu) |
| Liczba symboli | 39+ (komercyjne) | 50+ |
| Model licencji | Wielodostępna licencja wieczysta + subskrypcja | Licencja wieczysta z opcjonalnym przedłużeniem |
Szybki start
Krok 1: Zastąp pakiet NuGet
Usuń pakiet lub pakiety Spire, które są obecnie w użyciu:
# Remove whichever variant is installed
dotnet remove package FreeSpire.Barcode
# or
dotnet remove package Spire.Barcode
# If Spire.PDF was installed only for barcode extraction, remove it as well
dotnet remove package Spire.PDF
# Remove whichever variant is installed
dotnet remove package FreeSpire.Barcode
# or
dotnet remove package Spire.Barcode
# If Spire.PDF was installed only for barcode extraction, remove it as well
dotnet remove package Spire.PDF
Jeśli Spire.PDF jest używane do innych operacji dokumentowych poza ekstrakcją kodu kreskowego, zachowaj je i usuń tylko ścieżki kodu związane z kodem kreskowym.
Zainstaluj IronBarcode:
dotnet add package IronBarcode
dotnet add package IronBarcode
Krok 2: Aktualizacja przestrzeni nazw
Zastąp wszystkie importy nazw przestrzeni Spire importami nazw przestrzeni IronBarcode:
// Remove:
using Spire.Barcode;
using Spire.Pdf;
// Add:
using IronBarCode;
// Remove:
using Spire.Barcode;
using Spire.Pdf;
// Add:
using IronBarCode;
Imports IronBarCode
Krok 3: Inicjalizacja licencji
Zastąp inicjalizację licencji Spire pojedynczym przypisaniem właściwości IronBarcode podczas uruchamiania aplikacji. Informacje na temat formatów kluczy i opcji wdrażania można znaleźć na stronie licencji IronBarcode:
// Remove (FreeSpire registration):
Spire.Barcode.BarcodeSettings.ApplyKey("your-free-key");
// Remove (commercial Spire license):
Spire.License.LicenseProvider.SetLicenseKey("your-commercial-key");
// Add (IronBarcode):
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Remove (FreeSpire registration):
Spire.Barcode.BarcodeSettings.ApplyKey("your-free-key");
// Remove (commercial Spire license):
Spire.License.LicenseProvider.SetLicenseKey("your-commercial-key");
// Add (IronBarcode):
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Remove (FreeSpire registration):
Spire.Barcode.BarcodeSettings.ApplyKey("your-free-key")
' Remove (commercial Spire license):
Spire.License.LicenseProvider.SetLicenseKey("your-commercial-key")
' Add (IronBarcode):
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
W środowiskach Docker i CI klucz licencyjny można podać za pomocą zmiennej środowiskowej:
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
Imports System
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
Przykłady migracji kodu
Odczytywanie BarCodes o znanym formacie
Odczyt jednego formatu w Spire.Barcode przekazuje typ jawnie i otrzymuje string[].
Podejście Spire.BarCode:
using Spire.Barcode;
BarcodeScanner scanner = new BarcodeScanner();
string[] results = scanner.Scan("shipping-label.png", BarCodeType.Code128);
if (results.Length > 0)
{
ProcessShipment(results[0]);
}
using Spire.Barcode;
BarcodeScanner scanner = new BarcodeScanner();
string[] results = scanner.Scan("shipping-label.png", BarCodeType.Code128);
if (results.Length > 0)
{
ProcessShipment(results[0]);
}
Imports Spire.Barcode
Dim scanner As New BarcodeScanner()
Dim results As String() = scanner.Scan("shipping-label.png", BarCodeType.Code128)
If results.Length > 0 Then
ProcessShipment(results(0))
End If
Podejście IronBarcode:
using IronBarCode;
var results = BarcodeReader.Read("shipping-label.png");
if (results.Any())
{
ProcessShipment(results.First().Value);
}
using IronBarCode;
var results = BarcodeReader.Read("shipping-label.png");
if (results.Any())
{
ProcessShipment(results.First().Value);
}
Imports IronBarCode
Dim results = BarcodeReader.Read("shipping-label.png")
If results.Any() Then
ProcessShipment(results.First().Value)
End If
Parametr BarCodeType jest usunięty. Jeśli logika dalszego przetwarzania musi potwierdzić wykryty format, results.First().Format dostarcza go bez konieczności używania osobnej zmiennej stanowej.
Zwijanie pętli typu mieszanego
Gdy kod źródłowy Spire.BarCode obsługuje dokumenty, które mogą zawierać dowolny z kilku formatów, pętla odgadywania typu narasta z czasem, w miarę jak nowe formaty wchodzą do przepływu pracy.
Podejście Spire.BarCode:
using Spire.Barcode;
BarcodeScanner scanner = new BarcodeScanner();
BarCodeType[] candidates = new[]
{
BarCodeType.Code128,
BarCodeType.QRCode,
BarCodeType.DataMatrix,
BarCodeType.EAN13,
BarCodeType.PDF417
};
List<string> allValues = new List<string>();
foreach (BarCodeType type in candidates)
{
string[] found = scanner.Scan("document-scan.png", type);
allValues.AddRange(found);
}
using Spire.Barcode;
BarcodeScanner scanner = new BarcodeScanner();
BarCodeType[] candidates = new[]
{
BarCodeType.Code128,
BarCodeType.QRCode,
BarCodeType.DataMatrix,
BarCodeType.EAN13,
BarCodeType.PDF417
};
List<string> allValues = new List<string>();
foreach (BarCodeType type in candidates)
{
string[] found = scanner.Scan("document-scan.png", type);
allValues.AddRange(found);
}
Imports Spire.Barcode
Dim scanner As New BarcodeScanner()
Dim candidates As BarCodeType() = {
BarCodeType.Code128,
BarCodeType.QRCode,
BarCodeType.DataMatrix,
BarCodeType.EAN13,
BarCodeType.PDF417
}
Dim allValues As New List(Of String)()
For Each type As BarCodeType In candidates
Dim found As String() = scanner.Scan("document-scan.png", type)
allValues.AddRange(found)
Next
Podejście IronBarcode:
using IronBarCode;
// The entire loop is replaced by a single call
var results = BarcodeReader.Read("document-scan.png");
List<string> allValues = results.Select(r => r.Value).ToList();
using IronBarCode;
// The entire loop is replaced by a single call
var results = BarcodeReader.Read("document-scan.png");
List<string> allValues = results.Select(r => r.Value).ToList();
Imports IronBarCode
' The entire loop is replaced by a single call
Dim results = BarcodeReader.Read("document-scan.png")
Dim allValues As List(Of String) = results.Select(Function(r) r.Value).ToList()
Funkcja odczytu obrazów IronBarcode obsługuje wszystkie ponad 50 symboli w jednym przebiegu. Podczas dostosowywania prędkości odczytu do przetwarzania wsadowego o dużej objętości, BarcodeReaderOptions zapewnia tę kontrolę bez dodawania gałęzi specyficznych dla formatu:
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var results = BarcodeReader.Read("document-scan.png", options);
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var results = BarcodeReader.Read("document-scan.png", options);
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim results = BarcodeReader.Read("document-scan.png", options)
Aby uzyskać wskazówki dotyczące wyboru odpowiedniej wartości ReadingSpeed, zobacz dokumentację opcji prędkości odczytu.
Generowanie BarCode
Generowanie Spire.Barcode wymaga utworzenia obiektu BarcodeSettings, przypisania każdej właściwości indywidualnie, przekazania ustawień do BarCodeGenerator, a następnie wywołania GenerateImage() przed zapisem jakiegokolwiek pliku.
Podejście Spire.BarCode:
using Spire.Barcode;
BarcodeSettings settings = new BarcodeSettings();
settings.Type = BarCodeType.Code128;
settings.Data = "SHIP-9842-XZ";
settings.ShowText = true;
settings.TextMargin = 5;
settings.BarHeight = 60;
settings.Unit = GraphicsUnit.Pixel;
BarCodeGenerator generator = new BarCodeGenerator(settings);
Image barcodeImage = generator.GenerateImage();
barcodeImage.Save("shipping-label.png", ImageFormat.Png);
using Spire.Barcode;
BarcodeSettings settings = new BarcodeSettings();
settings.Type = BarCodeType.Code128;
settings.Data = "SHIP-9842-XZ";
settings.ShowText = true;
settings.TextMargin = 5;
settings.BarHeight = 60;
settings.Unit = GraphicsUnit.Pixel;
BarCodeGenerator generator = new BarCodeGenerator(settings);
Image barcodeImage = generator.GenerateImage();
barcodeImage.Save("shipping-label.png", ImageFormat.Png);
Imports Spire.Barcode
Imports System.Drawing
Imports System.Drawing.Imaging
Dim settings As New BarcodeSettings()
settings.Type = BarCodeType.Code128
settings.Data = "SHIP-9842-XZ"
settings.ShowText = True
settings.TextMargin = 5
settings.BarHeight = 60
settings.Unit = GraphicsUnit.Pixel
Dim generator As New BarCodeGenerator(settings)
Dim barcodeImage As Image = generator.GenerateImage()
barcodeImage.Save("shipping-label.png", ImageFormat.Png)
Podejście IronBarcode:
using IronBarCode;
BarcodeWriter.CreateBarcode("SHIP-9842-XZ", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("shipping-label.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("SHIP-9842-XZ", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng("shipping-label.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("SHIP-9842-XZ", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng("shipping-label.png")
Mutowalny obiekt BarcodeSettings i oddzielna instancja BarCodeGenerator zostają zastąpione jednym statycznym wywołaniem fabryki z płynnym łańcuchem. Nie ma ryzyka przypadkowego współdzielenia ustawień w różnych, równoczesnych wywołaniach, ponieważ każde wywołanie CreateBarcode() jest niezależne.
Odczytywanie BarCodes z dokumentu PDF
Spire.BarCode nie może bezpośrednio odczytywać plików PDF. Podejście oparte na Spire wymaga oddzielnego pakietu Spire.PDF do otwarcia pliku, iteracji jego stron, wyodrębnienia obrazów rastrowych z każdej strony, a następnie przekazania tych obrazów jeden po drugim do skanera kodów kreskowych.
Podejście Spire.BarCode:
using Spire.Pdf;
using Spire.Barcode;
var pdf = new PdfDocument();
pdf.LoadFromFile("invoices.pdf");
var scanner = new BarcodeScanner();
var extractedValues = new List<string>();
foreach (PdfPageBase page in pdf.Pages)
{
Image[] images = page.ExtractImages();
foreach (Image image in images)
{
string[] found = scanner.Scan(image, BarCodeType.QRCode);
extractedValues.AddRange(found);
}
}
using Spire.Pdf;
using Spire.Barcode;
var pdf = new PdfDocument();
pdf.LoadFromFile("invoices.pdf");
var scanner = new BarcodeScanner();
var extractedValues = new List<string>();
foreach (PdfPageBase page in pdf.Pages)
{
Image[] images = page.ExtractImages();
foreach (Image image in images)
{
string[] found = scanner.Scan(image, BarCodeType.QRCode);
extractedValues.AddRange(found);
}
}
Imports Spire.Pdf
Imports Spire.Barcode
Dim pdf As New PdfDocument()
pdf.LoadFromFile("invoices.pdf")
Dim scanner As New BarcodeScanner()
Dim extractedValues As New List(Of String)()
For Each page As PdfPageBase In pdf.Pages
Dim images() As Image = page.ExtractImages()
For Each image As Image In images
Dim found() As String = scanner.Scan(image, BarCodeType.QRCode)
extractedValues.AddRange(found)
Next
Next
Podejście IronBarcode:
using IronBarCode;
var results = BarcodeReader.Read("invoices.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} = {barcode.Value}");
}
using IronBarCode;
var results = BarcodeReader.Read("invoices.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} = {barcode.Value}");
}
Imports IronBarCode
Dim results = BarcodeReader.Read("invoices.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} = {barcode.Value}")
Next
IronBarcode odczytuje dokumenty PDF bezpośrednio bez potrzeby użycia Spire.PDF lub jakiegokolwiek ręcznego zarządzania stronami. Numer strony, z której wyodrębniono każdy BARCODE, jest dostępny w obiekcie wynikowym. Po zastąpieniu kodu odczytującego PDF, referencja do pakietu Spire.PDF i wszystkie importy using Spire.Pdf; mogą zostać usunięte z projektu.
Spire.BarCode API do IronBarcode– dokumentacja API dla mapowania
| Spire.Barcode | IronBarcode | Uwagi |
|---|---|---|
new BarcodeScanner() |
BarcodeReader.Read() (statyczny) |
Nie jest wymagana instancja skanera |
scanner.Scan(path, BarCodeType.X) |
BarcodeReader.Read(path) |
Parametr typu usunięty |
BarCodeType.Code128 (required) |
Wykryto automatycznie | Nie jest wymagany odpowiednik |
BarCodeType.QRCode (required) |
Wykryto automatycznie | Nie jest wymagany odpowiednik |
string[] results z Scan() |
BarcodeResults kolekcja |
Dostęp do wartości za pośrednictwem .Value |
results[0] (string) |
results[0].Value |
|
| Nieznany format wyniku | result.Format |
Typ zawarty w obiekcie wynikowym |
new BarcodeSettings() |
Parametry na CreateBarcode() |
Nie jest wymagany obiekt ustawień |
settings.Type = BarCodeType.X |
BarcodeEncoding.X jako drugi parametr |
|
settings.Data = "value" |
Pierwszy parametr CreateBarcode() |
|
new BarCodeGenerator(settings) |
Nie jest potrzebne | Fabryka statyczna zastępuje ją |
generator.GenerateImage() |
.SaveAsPng() / .SaveAsJpeg() |
Metody wyjściowe specyficzne dla formatu |
BarcodeSettings.ApplyKey("key") |
IronBarCode.License.LicenseKey = "key" |
Ustaw raz podczas uruchamiania |
Spire.License.LicenseProvider.SetLicenseKey("key") |
IronBarCode.License.LicenseKey = "key" |
Ta sama zamiana pojedynczego wiersza |
Spire.PDF (do odczytu PDF) |
Nie jest potrzebne | Wbudowana natywna obsługa plików PDF |
Typowe problemy związane z migracją i ich rozwiązania
Problem 1: Usunięcie parametru BarCodeType
Spire.Barcode: scanner.Scan(path, BarCodeType.Code128) — argument typu jest wymagany przez sygnaturę metody. Usunięcie tego powoduje błąd kompilacji.
Rozwiązanie: Zastąp całe wywołanie BarcodeReader.Read(path). Przeszukaj kod źródłowy, aby zlokalizować każde wystąpienie BarCodeType.. Pętle zgadywania typu (bloki foreach iterujące po tablicy kandydatów BarCodeType[]) mogą zostać całkowicie usunięte; pojedyncze wywołanie BarcodeReader.Read() zastępuje pętlę.
Problem 2: typ zwracany string[]
Spire.Barcode: Scan() returns string[]. Kod dalszego przetwarzania, który przypisuje to do zmiennej string[] lub przekazuje do metody oczekującej string[], nie skompiluje się po migracji.
Rozwiązanie: Zaktualizuj miejsca wywołań, aby działały z BarcodeResults. Aby uzyskać prostą tablicę ciągów, użyj .Select(r => r.Value).ToArray(). Aby uzyskać dostęp do pierwszego wyniku, użyj .First()?.Value. Jeśli wykryty format jest potrzebny w dalszym przetwarzaniu, jest dostępny w obiekcie wyniku poprzez .Format — nie jest potrzebna osobna zmienna stanowa.
// If a plain string array is needed:
string[] texts = BarcodeReader.Read("barcode.png")
.Select(r => r.Value)
.ToArray();
// If only the first value is needed:
string first = BarcodeReader.Read("barcode.png").First()?.Value;
// If a plain string array is needed:
string[] texts = BarcodeReader.Read("barcode.png")
.Select(r => r.Value)
.ToArray();
// If only the first value is needed:
string first = BarcodeReader.Read("barcode.png").First()?.Value;
Imports System.Linq
' If a plain string array is needed:
Dim texts As String() = BarcodeReader.Read("barcode.png") _
.Select(Function(r) r.Value) _
.ToArray()
' If only the first value is needed:
Dim first As String = BarcodeReader.Read("barcode.png").FirstOrDefault()?.Value
Problem 3: Porządkowanie pakietu Spire.PDF
Spire.Barcode: Przepływy pracy odczytujące PDF zależą od Spire.PDF w celu dostępu do stron i ekstrakcji obrazów. Projekt odwołuje się do pakietu i zawiera importy using Spire.Pdf; oraz PdfDocument / PdfPageBase, które są używane w kilku plikach.
Rozwiązanie: Po zastąpieniu całego kodu ekstrakcji kodów kreskowych z PDF wykorzystującego BarcodeReader.Read("file.pdf"), przeprowadź kontrolę za pomocą grep, aby upewnić się, że nie ma pozostałych referencji Spire.Pdf przed usunięciem pakietu:
grep -r "using Spire.Pdf" --include="*.cs" .
grep -r "Spire\.Pdf\|PdfPageBase\|ExtractImages" --include="*.cs" .
grep -r "using Spire.Pdf" --include="*.cs" .
grep -r "Spire\.Pdf\|PdfPageBase\|ExtractImages" --include="*.cs" .
Usuń pakiet dopiero po usunięciu wszystkich odwołań:
dotnet remove package Spire.PDF
dotnet remove package Spire.PDF
Problem 4: Zmiany w przestrzeni nazw
Spire.Barcode: Przestrzeń nazw Spire.Barcode zawiera BarcodeScanner, BarcodeSettings, BarCodeGenerator oraz BarCodeType. Przestrzeń nazw IronBarCode zawiera BarcodeReader, BarcodeWriter, BarcodeEncoding oraz BarcodeReaderOptions.
Rozwiązanie: Zastąp using Spire.Barcode; globalnie przez using IronBarCode;. Enum BarCodeType używany podczas generacji jest zastąpiony przez BarcodeEncoding. Enum BarCodeType używany podczas odczytu nie ma odpowiednika w IronBarcode— jest po prostu usunięty, ponieważ wykrywanie formatu jest automatyczne.
Lista kontrolna migracji Spire.BarCode
Zadania przed migracją
Przed wprowadzeniem zmian należy przeprowadzić audyt kodu źródłowego w celu zidentyfikowania wszystkich miejsc użycia Spire.BARCODE:
grep -r "using Spire.Barcode" --include="*.cs" .
grep -r "using Spire.Pdf" --include="*.cs" .
grep -r "BarcodeScanner\|BarcodeSettings\|BarCodeGenerator\|BarCodeType\." --include="*.cs" .
grep -r "ApplyKey\|SetLicenseKey" --include="*.cs" .
grep -r "ExtractImages\|PdfPageBase" --include="*.cs" .
grep -r "using Spire.Barcode" --include="*.cs" .
grep -r "using Spire.Pdf" --include="*.cs" .
grep -r "BarcodeScanner\|BarcodeSettings\|BarCodeGenerator\|BarCodeType\." --include="*.cs" .
grep -r "ApplyKey\|SetLicenseKey" --include="*.cs" .
grep -r "ExtractImages\|PdfPageBase" --include="*.cs" .
- Dokumentuj wszystkie pliki zawierające tablice kandydatów
BarCodeType(pętle zgadywania typu do usunięcia) - Zidentyfikuj wszelkie zmienne
string[], które otrzymują wyniki zScan()i będą wymagały aktualizacji typu - Sprawdź, czy
Spire.PDFjest używane do operacji innych niż ekstrakcja kodu kreskowego
Zadania związane z aktualizacją kodu
- Usuń pakiet NuGet
FreeSpire.BarcodelubSpire.Barcode - Usuń pakiet NuGet
Spire.PDF, jeśli ekstrakcja kodu kreskowego była jego jedynym zastosowaniem - Zainstaluj pakiet NuGet
IronBarcode - Zastąp wszystkie
using Spire.Barcode;przezusing IronBarCode; - Usuń wszystkie importy
using Spire.Pdf;, gdzie nie są już potrzebne - Zastąp inicjalizację licencji:
ApplyKey()lubSetLicenseKey()przezIronBarCode.License.LicenseKey = "key" - Usuń wszystkie instancje
new BarcodeScanner() - Zastąp wszystkie wywołania
scanner.Scan(path, BarCodeType.X)przezBarcodeReader.Read(path) - Usuń pętle foreach z domyślnym typowaniem; zastąp każde pojedyncze wywołanie przez
BarcodeReader.Read() - Usunąć bloki dotyczące iteracji stron PDF i wyodrębniania obrazów; zastąp przez
BarcodeReader.Read("file.pdf") - Zaktualizuj przypisania wyników
string[], aby używać.Valuelub.Select(r => r.Value).ToArray() - Zastąp bloki
new BarcodeSettings()przez łańcuchyBarcodeWriter.CreateBarcode(data, encoding) - Usuń instancje
new BarCodeGenerator(settings) - Zastąp
.GenerateImage()+image.Save()przez.SaveAsPng()lub.SaveAsJpeg() - Zastąp wartości enum
BarCodeType.Xpodczas generacji przezBarcodeEncoding.X
Testy po migracji
- Potwierdź, że wszystkie formaty wcześniej skanowane za pomocą pętli kandydatów są poprawnie wykryte przez
BarcodeReader.Read() - Zmierz przepustowość przetwarzania wsadowego i upewnij się, że spełnia ona wymagania produkcyjne
- Sprawdź, czy ekstrakcja BARCODE-ów z plików PDF daje poprawne wartości i numery stron
- Sprawdź jakość wygenerowanego BarCoda i możliwość jego skanowania za pomocą skanera fizycznego lub programowego
- Sprawdź, czy klucz licencyjny został poprawnie załadowany we wszystkich środowiskach wdrożeniowych (lokalnym, testowym, produkcyjnym, CI/CD)
- Uruchom polecenia audytu grep z sekcji "Zadania przed migracją", aby upewnić się, że nie pozostały żadne odniesienia do Spire
Kluczowe korzyści wynikające z migracji do IronBarcode
Eliminacja nakładów związanych z utrzymaniem formatów: Po migracji nie ma już listy typów, którą trzeba by utrzymywać, ani pętli odgadywania typów, którą trzeba by aktualizować, gdy nowy format BARCODE wchodzi do przepływu pracy. BarcodeReader.Read() automatycznie obsługuje pełny zestaw symboli, a wykryty format jest dołączony do każdego obiektu wyniku do dalszego przetwarzania.
Dokładna ocena przed podjęciem decyzji: Wersja próbna IronBarcode działa na tym samym pliku binarnym co produkt licencjonowany, z pełną prędkością odczytu i kompletnym zestawem symboli. Testy wydajności i testy pokrycia formatów przeprowadzone podczas oceny wersji próbnej są bezpośrednio przenoszone do środowiska produkcyjnego. Zespoły mogą podejmować decyzje zakupowe z pewnością, że oceniane zachowanie jest tym samym zachowaniem, które zostanie wdrożone.
Jednopakietowe wsparcie PDF: Ekstrakcja kodów kreskowych z plików PDF jest obsługiwana przez to samo wywołanie BarcodeReader.Read() używane do obrazów. Nie są wymagane żadne biblioteki dodatkowe, żadne dodatkowe licencje ani kod do ręcznej iteracji stron. Zespoły, które wcześniej utrzymywały zarówno Spire.Barcode, jak i Spire.PDF, redukują do pojedynczej zależności dla całego przepływu pracy z kodami kreskowymi.
Obiekty wyniku z metadanymi formatu: Każdy wpis w kolekcji BarcodeResults posiada zdekodowaną wartość, wykrytą symbologię, numer strony źródłowej dla danych wejściowych PDF i region obwiedni w źródłowym obrazie. Aplikacje, które muszą kierować, filtrować lub rejestrować według formatu, mają te informacje dostępne w wyniku bez dodatkowego zarządzania stanem.
Uproszczone API generowania: Statyczny wzorzec fabryki w BarcodeWriter.CreateBarcode() eliminuje mutowalny obiekt BarcodeSettings i oddzielną instancję BarCodeGenerator. Każde wywołanie generacji jest samodzielne, co zmniejsza ryzyko przenikania się konfiguracji między równoległymi operacjami.
Kompatybilność z przyszłymi wersjami:IronBarcode otrzymuje regularne aktualizacje dostosowane do wydań środowiska uruchomieniowego .NET. Wraz ze wzrostem popularności platformy .NET 10 do 2026 r. aktualizacje kompatybilności zapewniają, że migrowane bazy kodu będą nadal kompilowane i działać bez konieczności wprowadzania zmian w bibliotekach przy każdej nowej wersji .NET.
Często Zadawane Pytania
Dlaczego warto przejść z Spire.BarCode na IronBarcode?
Typowe powody to uproszczenie licencjonowania (eliminacja złożoności związanej z SDK i kluczem uruchomieniowym), zniesienie limitów przepustowości, uzyskanie natywnej obsługi plików PDF, usprawnienie wdrażania w środowisku Docker/CI/CD oraz ograniczenie powtarzalnego kodu API w kodzie produkcyjnym.
Jak zastąpić wywołania API Spire.BarCode przez 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 Spire.BarCode do IronBarcode?
Większość migracji skutkuje zmniejszeniem liczby linii kodu. Usuwane są standardowe fragmenty dotyczące licencji, konstruktory instancji oraz jawna konfiguracja formatów. Podstawowe operacje odczytu/zapisu są mapowane na krótsze odpowiedniki w IronBarcode z bardziej przejrzystymi obiektami wynikowymi.
Czy podczas migracji muszę mieć zainstalowane zarówno Spire.BarCode, jak i IronBarcode?
Nie. Większość migracji polega na bezpośredniej wymianie, a nie na równoległym działaniu. Należy migrować po jednej klasie usługowej na raz, zastąpić odwołanie do NuGet oraz zaktualizować wzorce instancjonowania i wywoływania API przed przejściem do kolejnej klasy.
Jaka jest nazwa pakietu NuGet dla IronBarcode?
Pakiet nosi nazwę „IronBarcode” (z wielkimi literami B i C). Zainstaluj go za pomocą polecenia „Install-Package IronBarcode” lub „dotnet add package IronBarcode”. Dyrektywa using w kodzie to „using IronBarcode;”.
W jaki sposób IronBarcode upraszcza wdrażanie Docker w porównaniu z Spire.BarCode?
IronBarcode to pakiet NuGet bez zewnętrznych plików SDK ani konfiguracji licencji. W Dockerze należy ustawić zmienną środowiskową IRONBARCODE_LICENSE_KEY, a pakiet zajmie się weryfikacją licencji podczas uruchamiania.
Czy IronBarcode automatycznie wykrywa wszystkie formaty BarCode po migracji z Spire.BarCode?
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 Spire.BarCode do IronBarcode?
Typowe zmiany nazw: BarcodeValue staje się Value, BarcodeType staje się Format. Wyniki IronBarcode zawierają również Confidence i PageNumber. Funkcja wyszukiwania i zamiany w całym rozwiązaniu obsługuje zmiany nazw w istniejącym kodzie przetwarzania wyników.
Jak skonfigurować licencjonowanie IronBarcode w potoku CI/CD?
Zapisz IronBarcode_LICENSE_KEY jako sekret potoku i przypisz IronBarCode.License.LicenseKey w kodzie uruchamiającym aplikację. Jeden sekret obejmuje wszystkie środowiska, w tym środowisko programistyczne, testowe, przejściowe i produkcyjne.
Czy IronBarcode obsługuje generowanie kodów QR z niestandardowym stylem?
Tak. Funkcja QRCodeWriter.CreateQrCode() obsługuje niestandardowe kolory za pomocą ChangeBarCodeColor(), osadzanie logo za pomocą AddBrandLogo(), konfigurowalne poziomy korekcji błędów oraz wiele formatów wyjściowych, w tym PNG, JPG, PDF i strumień.

