Przejdź do treści stopki
FILMY

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

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

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
SHELL

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
SHELL

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

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

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

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

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

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

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

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

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

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

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

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

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

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" .
SHELL

Usuń pakiet dopiero po usunięciu wszystkich odwołań:

dotnet remove package Spire.PDF
dotnet remove package Spire.PDF
SHELL

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" .
SHELL
  • Dokumentuj wszystkie pliki zawierające tablice kandydatów BarCodeType (pętle zgadywania typu do usunięcia)
  • Zidentyfikuj wszelkie zmienne string[], które otrzymują wyniki z Scan() i będą wymagały aktualizacji typu
  • Sprawdź, czy Spire.PDF jest używane do operacji innych niż ekstrakcja kodu kreskowego

Zadania związane z aktualizacją kodu

  1. Usuń pakiet NuGet FreeSpire.Barcode lub Spire.Barcode
  2. Usuń pakiet NuGet Spire.PDF, jeśli ekstrakcja kodu kreskowego była jego jedynym zastosowaniem
  3. Zainstaluj pakiet NuGet IronBarcode
  4. Zastąp wszystkie using Spire.Barcode; przez using IronBarCode;
  5. Usuń wszystkie importy using Spire.Pdf;, gdzie nie są już potrzebne
  6. Zastąp inicjalizację licencji: ApplyKey() lub SetLicenseKey() przez IronBarCode.License.LicenseKey = "key"
  7. Usuń wszystkie instancje new BarcodeScanner()
  8. Zastąp wszystkie wywołania scanner.Scan(path, BarCodeType.X) przez BarcodeReader.Read(path)
  9. Usuń pętle foreach z domyślnym typowaniem; zastąp każde pojedyncze wywołanie przez BarcodeReader.Read()
  10. Usunąć bloki dotyczące iteracji stron PDF i wyodrębniania obrazów; zastąp przez BarcodeReader.Read("file.pdf")
  11. Zaktualizuj przypisania wyników string[], aby używać .Value lub .Select(r => r.Value).ToArray()
  12. Zastąp bloki new BarcodeSettings() przez łańcuchy BarcodeWriter.CreateBarcode(data, encoding)
  13. Usuń instancje new BarCodeGenerator(settings)
  14. Zastąp .GenerateImage() + image.Save() przez .SaveAsPng() lub .SaveAsJpeg()
  15. Zastąp wartości enum BarCodeType.X podczas generacji przez BarcodeEncoding.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.

Zwróć uwagęSpire jest zastrzeżonym znakiem towarowym jego właściciela. Ta strona nie jest powiązana z, popierana ani sponsorowana przez e-iceblue. 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 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ń.

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