Przejdź do treści stopki
FILMY

Jak tworzyć kod kreskowy z danych w C#

Migrating fromLEADTOOLSBarCode to IronBarcode

Niniejszy przewodnik obejmuje kompletną migrację zLEADTOOLSBarCode do IronBarcode for .NET dla programistów .NET. Rozwiązuje to usunięcieLEADTOOLSpaczek NuGet i jednego natywnego zależności runtime, zastąpienie sekwencją inicjalizacji licencji opartych na plikachLEADTOOLSna klucz w postaci ciągu znaków oraz przekształcenie wzorców odczytu i zapisuLEADTOOLSna statyczne płynne API IronBarcode. Dla każdego głównego scenariusza migracji podano przykłady kodu wraz z tabelą mapowania API, uporządkowaną listą kontrolną oraz wskazówkami dotyczącymi problemów pojawiających się podczas przejścia.

Dlaczego warto przejść zLEADTOOLSBarCode

Rozmieszczenie licencji opartej na pliku: LicencjonowanieLEADTOOLSwymaga, aby plik .LIC był fizycznie obecny na dysku w znanej ścieżce na każdym komputerze, na którym działa aplikacja. Stacje robocze programistów, agenci kompilacji CI, serwery stagingowe i kontenery produkcyjne wymagają, aby plik został przygotowany przed uruchomieniem aplikacji. Jest to model operacyjny zasadniczo różniący się od sekretów opartych na ciągach znaków, które idealnie pasują do zmiennych środowiskowych, menedżerów sekretów i konfiguracji potoku CI/CD. Każde nowe środowisko dodane do topologii wdrożenia — nowy region chmury, nowa pula węzłów Kubernetes, nowy programista — wymaga etapu przygotowania plików, czego nie wymaga licencjonowanie oparte na ciągach znaków.

Slad SDK: InstalacjaLEADTOOLSbarcode wymaga pakietu Leadtools.Barcode NuGet (który podejmuje Leadtools, Leadtools.Codecs i powiązane zależności). Ekstrakcja kodu kreskowego z PDF dodaje Leadtools.Pdf. W systemie Windows środowisko uruchomieniowe MSVC++ 2017 jest oddzielną zależnością natywną. Publikowany wynik działania aplikacji do obsługi kodów kreskowychLEADTOOLSwynosi około 148 MB. Aplikacje, które wymagają jedynie odczytu lub generowania BarCode'ów, korzystają z pełnego zakresu możliwości kompleksowej platformy obrazówania — infrastruktury OCR, architektury kodeków formatów oraz funkcji przeglądania dokumentów — niezależnie od tego, czy te funkcje są wykorzystywane.

Projekt starszego API: Operacje związane z kodami barcode wLEADTOOLSwymagają utworzenia wielu obiektów w określonej kolejności, zanim będzie można wykonać jakąkolwiek pracę. Odczytanie kodu kreskowego wymaga instancji RasterCodecs do załadowania obrazu oraz instancji BarcodeEngine do jego zeskanowania, z wyraźną deklaracją tablicy BarcodeSymbology określającą, które formaty należy szukać. Generowanie kodu kreskowego wymaga skonstruowania obiektu BarcodeData, stworzenia pustego RasterImage z wyraźnymi parametrami pikselowymi, wypełnienia go kolorem tła za pomocą FillCommand, nałożenia kodu kreskowego na niego i zapisania za pomocą RasterCodecs. To API odzwierciedla wzorce projektowe swojej epoki.IronBarcode wykonuje te same operacje poprzez wywołania metod statycznych, które bezpośrednio akceptują ścieżki do plików.

Przejrzystość cen: Licencje wdrożenioweLEADTOOLSdla serwerów produkcyjnych są dodatkowo kwotowane przez sprzedażLEADTOOLSi nie są publikowane na ich stronie internetowej. Zespoły, które potrzebują pełnego obrazu kosztów przed rozpoczęciem rozwoju, muszą skontaktować się ze sprzedażą przed potwierdzeniem, żeLEADTOOLSpasuje do ich budżetu.IronBarcode oferuje jednorazową licencję wieczystą, która obejmuje rozwój i wdrożenie razem, bez wymaganej osobnej licencji produkcyjnej.

Podstawowy problem

Sekwencja inicjalizacjiLEADTOOLSwymaga ponad 20 linii i cztery kroki weryfikacji przed utworzeniem BarcodeEngine.IronBarcode zastępuje całą sekwencję pojedynczym przypisaniem:

// LEADTOOLS: file path, expiry check, three feature lock checks, engine creation
using Leadtools;
using Leadtools.Barcode;

RasterSupport.SetLicense(
    @"C:\LEADTOOLS23\Support\Common\License\LEADTOOLS.LIC",
    "your-developer-key-here");

if (RasterSupport.KernelExpired)
    throw new InvalidOperationException("LEADTOOLS license has expired");

if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead))
    throw new InvalidOperationException("1D barcode reading is locked");

if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead))
    throw new InvalidOperationException("2D barcode reading is locked");

if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite))
    throw new InvalidOperationException("Barcode writing is locked");

var engine = new BarcodeEngine();
// LEADTOOLS: file path, expiry check, three feature lock checks, engine creation
using Leadtools;
using Leadtools.Barcode;

RasterSupport.SetLicense(
    @"C:\LEADTOOLS23\Support\Common\License\LEADTOOLS.LIC",
    "your-developer-key-here");

if (RasterSupport.KernelExpired)
    throw new InvalidOperationException("LEADTOOLS license has expired");

if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead))
    throw new InvalidOperationException("1D barcode reading is locked");

if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead))
    throw new InvalidOperationException("2D barcode reading is locked");

if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite))
    throw new InvalidOperationException("Barcode writing is locked");

var engine = new BarcodeEngine();
Imports Leadtools
Imports Leadtools.Barcode

' LEADTOOLS: file path, expiry check, three feature lock checks, engine creation
RasterSupport.SetLicense("C:\LEADTOOLS23\Support\Common\License\LEADTOOLS.LIC", "your-developer-key-here")

If RasterSupport.KernelExpired Then
    Throw New InvalidOperationException("LEADTOOLS license has expired")
End If

If RasterSupport.IsLocked(RasterSupportType.Barcode1DRead) Then
    Throw New InvalidOperationException("1D barcode reading is locked")
End If

If RasterSupport.IsLocked(RasterSupportType.Barcode2DRead) Then
    Throw New InvalidOperationException("2D barcode reading is locked")
End If

If RasterSupport.IsLocked(RasterSupportType.BarcodeWrite) Then
    Throw New InvalidOperationException("Barcode writing is locked")
End If

Dim engine As New BarcodeEngine()
$vbLabelText   $csharpLabel
// IronBarcode: one line, no file required
using IronBarCode;

IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
// IronBarcode: one line, no file required
using IronBarCode;

IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
Imports IronBarCode

IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
$vbLabelText   $csharpLabel

IronBarcode aLEADTOOLSBarCode: porównanie funkcji

Funkcja LEADTOOLSBarCode IronBarcode
Model licencji Plik + klucz programisty Tylko klucz ciągu znaków
Wymagane pakiety NuGet 5+ 1
Natywna zależność środowiska uruchomieniowego MSVC++ 2017 (Windows) None
Rozmiar opublikowanego pliku ~148 MB ~39 MB
Łączna liczba obsługiwanych symboli 40+ 50+
Automatyczne wykrywanie formatu BarCode Ograniczone Tak
Pobieranie kodów kreskowych z plików PDF Wymagany osobny pakiet Wbudowane
Korekta błędów ML Nie Tak
Logo z kodem QR Nie Tak
Wdrożenie Docker Wymagane zamontowanie pliku Zmienna środowiskowa
Kod inicjalizacyjny Ponad 20 wierszy 1 wiersz
Styl API Graf obiektów starszego typu Statyczne płynne
Wielopłatformowe Częściowe (natywne zależności) Pełna wersja (.NET Standard)
Ceny licencji wdrożeniowych Skontaktuj się z działem sprzedaży (numer nie jest publikowany) Wliczone w zakup na czas nieokreślony

Szybki start: Migracja zLEADTOOLSBarCode do IronBarcode

Krok 1: Usuń pakiety LEADTOOLS

Usuń wszystkie pakietyLEADTOOLSz projektu:

dotnet remove package Leadtools.Barcode
dotnet remove package Leadtools
dotnet remove package Leadtools.Codecs
dotnet remove package Leadtools.Codecs.Png
dotnet remove package Leadtools.Codecs.Jpeg
dotnet remove package Leadtools.Barcode
dotnet remove package Leadtools
dotnet remove package Leadtools.Codecs
dotnet remove package Leadtools.Codecs.Png
dotnet remove package Leadtools.Codecs.Jpeg
SHELL

Jeśli dodano kodek PDF do wyodrębniania BARCODE-ów z plików PDF:

dotnet remove package Leadtools.Pdf
dotnet remove package Leadtools.Pdf
SHELL

W przypadku wdrożeń na serwerach Windows Server środowisko uruchomieniowe MSVC++ 2017 można usunąć ze skryptów provisioningu po zakończeniu migracji.IronBarcode nie ma żadnych natywnych zależności środowiskowych na żadnej platformie.

Krok 2: Zainstaluj IronBarcode

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

Ten pojedynczy pakiet obejmuje obsługę wszystkich formatów obrazów, natywne wyodrębnianie BARCODE-ów z plików PDF, korekcję błędów opartą na uczeniu maszynowym oraz wszystkie ponad 50 obsługiwanych symboli. Nie są wymagane żadne dodatkowe pakiety kodeków.

Krok 3: Zainicjuj licencję

Zastąpić cały blok inicjalizacjiLEADTOOLSjednym wierszem. Zlokalizuj każde wywołanie do RasterSupport.SetLicense w kodzie — zazwyczaj będzie to tylko jedno wywołanie, przy starcie aplikacji — i zastąp całą otaczającą sekwencję inicjalizacji:

// Before: entireLEADTOOLSinitialization block (20+ lines)
// After:
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Before: entireLEADTOOLSinitialization block (20+ lines)
// After:
using IronBarCode;

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

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

Klucz licencyjny można uzyskać z dowolnego mechanizmu konfiguracji, który obsługuje ciągi znaków: zmiennej środowiskowej, appsettings.json, Azure Key Vault, AWS Secrets Manager lub sekretu Kubernetes. Informacje na temat konfiguracji licencji opartej na środowisku, wzorców wdrażania Docker oraz wszystkich obsługiwanych metod konfiguracji można znaleźć w dokumentacji dotyczącej konfiguracji klucza licencyjnego.

Przykłady migracji kodu

Odczytywanie BarCodes z obrazów

LEADTOOLS oddziela ładowanie obrazów od skanowania BARCODE, tworząc dwie odrębne warstwy obiektów. Instancja RasterCodecs ładuje plik obrazu do RasterImage, a instancja BarcodeEngine skanuje go. Dzwoniący musi również zapewnić wyraźną tablicę wartości BarcodeSymbology; formaty niewymienione w tablicy nie zostaną wykryte.

Podejście LEADTOOLS:

using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

using var codecs = new RasterCodecs();
using var image = codecs.Load("scan.png");

var engine = new BarcodeEngine();

var symbologies = new[]
{
    BarcodeSymbology.Code128,
    BarcodeSymbology.Code39,
    BarcodeSymbology.QR,
    BarcodeSymbology.DataMatrix,
    BarcodeSymbology.EAN13,
    BarcodeSymbology.UPCA
};

var barcodes = engine.Reader.ReadBarcodes(
    image,
    LogicalRectangle.Empty,
    0,
    symbologies);

foreach (var barcode in barcodes)
    Console.WriteLine($"{barcode.Symbology}: {barcode.Value}");
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

using var codecs = new RasterCodecs();
using var image = codecs.Load("scan.png");

var engine = new BarcodeEngine();

var symbologies = new[]
{
    BarcodeSymbology.Code128,
    BarcodeSymbology.Code39,
    BarcodeSymbology.QR,
    BarcodeSymbology.DataMatrix,
    BarcodeSymbology.EAN13,
    BarcodeSymbology.UPCA
};

var barcodes = engine.Reader.ReadBarcodes(
    image,
    LogicalRectangle.Empty,
    0,
    symbologies);

foreach (var barcode in barcodes)
    Console.WriteLine($"{barcode.Symbology}: {barcode.Value}");
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs

Dim codecs As New RasterCodecs()
Using codecs
    Dim image = codecs.Load("scan.png")
    Using image
        Dim engine As New BarcodeEngine()

        Dim symbologies = New BarcodeSymbology() {
            BarcodeSymbology.Code128,
            BarcodeSymbology.Code39,
            BarcodeSymbology.QR,
            BarcodeSymbology.DataMatrix,
            BarcodeSymbology.EAN13,
            BarcodeSymbology.UPCA
        }

        Dim barcodes = engine.Reader.ReadBarcodes(
            image,
            LogicalRectangle.Empty,
            0,
            symbologies)

        For Each barcode In barcodes
            Console.WriteLine($"{barcode.Symbology}: {barcode.Value}")
        Next
    End Using
End Using
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

var results = BarcodeReader.Read("scan.png");

foreach (var result in results)
    Console.WriteLine($"{result.Format}: {result.Value}");
using IronBarCode;

var results = BarcodeReader.Read("scan.png");

foreach (var result in results)
    Console.WriteLine($"{result.Format}: {result.Value}");
Imports IronBarCode

Dim results = BarcodeReader.Read("scan.png")

For Each result In results
    Console.WriteLine($"{result.Format}: {result.Value}")
Next
$vbLabelText   $csharpLabel

IronBarcode akceptuje bezpośrednio ścieżkę do pliku, ładuje obraz wewnętrznie i automatycznie wykrywa formaty spośród ponad 50 obsługiwanych symboli, bez konieczności wyliczania oczekiwanych typów przez wywołującego. Aby uzyskać informacje na temat zaawansowanej konfiguracji — dostosowywania prędkości odczytu, wykrywania wielu kodów kreskowych oraz obsługi obrazów o niskiej jakości — zapoznaj się z przewodnikiem dotyczącym odczytu kodów kreskowych z obrazów.

Generowanie kodu kreskowego Code 128 BarCode

GenerowanieLEADTOOLSwymaga skonstruowania obiektu BarcodeData, przydzielenia pustego RasterImage z wyraźnymi flagami pamięci, głębokością pikseli i kolejnością bajtów, wypełnienia obrazu kolorem tła, umieszczenia na nim kodu kreskowego, a następnie zapisania za pomocą RasterCodecs.IronBarcode wykonuje wszystkie te kroki za pomocą jednego płynnego łańcucha metod.

Podejście LEADTOOLS:

using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

var engine = new BarcodeEngine();

var barcodeData = new BarcodeData()
{
    Symbology = BarcodeSymbology.Code128,
    Value = "ITEM-98765",
    Bounds = new LeadRect(0, 0, 500, 120)
};

using var image = new RasterImage(
    RasterMemoryFlags.Conventional,
    500, 120, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    null, IntPtr.Zero, 0);

new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, barcodeData, null);

using var codecs = new RasterCodecs();
codecs.Save(image, "item-barcode.png", RasterImageFormat.Png, 0);
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

var engine = new BarcodeEngine();

var barcodeData = new BarcodeData()
{
    Symbology = BarcodeSymbology.Code128,
    Value = "ITEM-98765",
    Bounds = new LeadRect(0, 0, 500, 120)
};

using var image = new RasterImage(
    RasterMemoryFlags.Conventional,
    500, 120, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    null, IntPtr.Zero, 0);

new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, barcodeData, null);

using var codecs = new RasterCodecs();
codecs.Save(image, "item-barcode.png", RasterImageFormat.Png, 0);
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs

Dim engine As New BarcodeEngine()

Dim barcodeData As New BarcodeData() With {
    .Symbology = BarcodeSymbology.Code128,
    .Value = "ITEM-98765",
    .Bounds = New LeadRect(0, 0, 500, 120)
}

Using image As New RasterImage(
    RasterMemoryFlags.Conventional,
    500, 120, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    Nothing, IntPtr.Zero, 0)

    Dim fillCommand As New FillCommand(RasterColor.White)
    fillCommand.Run(image)
    engine.Writer.WriteBarcode(image, barcodeData, Nothing)

    Using codecs As New RasterCodecs()
        codecs.Save(image, "item-barcode.png", RasterImageFormat.Png, 0)
    End Using
End Using
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128)
    .ResizeTo(500, 120)
    .SaveAsPng("item-barcode.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128)
    .ResizeTo(500, 120)
    .SaveAsPng("item-barcode.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("ITEM-98765", BarcodeEncoding.Code128) _
    .ResizeTo(500, 120) _
    .SaveAsPng("item-barcode.png")
$vbLabelText   $csharpLabel

Pełny przewodnik dotyczący rozmiarów, stylów, kontroli marginesów i obsługiwanych formatów wyjściowych można znaleźć w sekcji tworzenie obrazów BARCODE.

Generowanie kodu QR z logo marki

Generacja kodu QRLEADTOOLSpodąża tym samym wieloetapowym wzorcem konstrukcji RasterImage, co inne typy kodów kreskowych.IronBarcode oferuje QRCodeWriter z dedykowaną metodą AddBrandLogo do osadzania logo w centrum kodu QR.

Podejście LEADTOOLS:

using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

var engine = new BarcodeEngine();

var qrData = new BarcodeData()
{
    Symbology = BarcodeSymbology.QR,
    Value = "https://example.com/product/12345",
    Bounds = new LeadRect(0, 0, 400, 400)
};

using var image = new RasterImage(
    RasterMemoryFlags.Conventional,
    400, 400, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    null, IntPtr.Zero, 0);

new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, qrData, null);

using var codecs = new RasterCodecs();
codecs.Save(image, "product-qr.png", RasterImageFormat.Png, 0);
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

var engine = new BarcodeEngine();

var qrData = new BarcodeData()
{
    Symbology = BarcodeSymbology.QR,
    Value = "https://example.com/product/12345",
    Bounds = new LeadRect(0, 0, 400, 400)
};

using var image = new RasterImage(
    RasterMemoryFlags.Conventional,
    400, 400, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    null, IntPtr.Zero, 0);

new FillCommand(RasterColor.White).Run(image);
engine.Writer.WriteBarcode(image, qrData, null);

using var codecs = new RasterCodecs();
codecs.Save(image, "product-qr.png", RasterImageFormat.Png, 0);
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs

Dim engine As New BarcodeEngine()

Dim qrData As New BarcodeData() With {
    .Symbology = BarcodeSymbology.QR,
    .Value = "https://example.com/product/12345",
    .Bounds = New LeadRect(0, 0, 400, 400)
}

Using image As New RasterImage(
    RasterMemoryFlags.Conventional,
    400, 400, 24,
    RasterByteOrder.Bgr,
    RasterViewPerspective.TopLeft,
    Nothing, IntPtr.Zero, 0)

    Dim fillCommand As New FillCommand(RasterColor.White)
    fillCommand.Run(image)
    engine.Writer.WriteBarcode(image, qrData, Nothing)

    Using codecs As New RasterCodecs()
        codecs.Save(image, "product-qr.png", RasterImageFormat.Png, 0)
    End Using
End Using
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com/product/12345", 400, QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("brand-logo.png")
    .SaveAsPng("product-qr.png");
using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com/product/12345", 400, QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("brand-logo.png")
    .SaveAsPng("product-qr.png");
Imports IronBarCode

QRCodeWriter.CreateQrCode("https://example.com/product/12345", 400, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
    .AddBrandLogo("brand-logo.png") _
    .SaveAsPng("product-qr.png")
$vbLabelText   $csharpLabel

Pobieranie BarCode'ów z dokumentów PDF

Ekstrakcja kodu kreskowego z PDFLEADTOOLSwymaga osobnego pakietu Leadtools.Pdf, wyraźnej konfiguracji ładowania PDF, zapytania o liczbę stron manualnych i pętli po każdej stronie. Każda strona musi być załadowana indywidualnie jako RasterImage przed skanowaniem.IronBarcode zawiera obsługę plików PDF w pakiecie podstawowym i wewnętrznie obsługuje iterację stron.

Podejście LEADTOOLS:

using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

// Requires: dotnet add package Leadtools.Pdf
using var codecs = new RasterCodecs();
codecs.Options.Pdf.Load.Resolution = 300;
codecs.Options.Pdf.Load.DisplayDepth = 24;

var engine = new BarcodeEngine();
var results = new List<string>();
int pageCount = codecs.GetTotalPages("shipment.pdf");

for (int page = 1; page <= pageCount; page++)
{
    using var image = codecs.Load(
        "shipment.pdf", 0,
        CodecsLoadByteOrder.BgrOrGray,
        page, page);

    var barcodes = engine.Reader.ReadBarcodes(
        image, LogicalRectangle.Empty, 0, null);

    foreach (var barcode in barcodes)
        results.Add($"Page {page}: {barcode.Value}");
}
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

// Requires: dotnet add package Leadtools.Pdf
using var codecs = new RasterCodecs();
codecs.Options.Pdf.Load.Resolution = 300;
codecs.Options.Pdf.Load.DisplayDepth = 24;

var engine = new BarcodeEngine();
var results = new List<string>();
int pageCount = codecs.GetTotalPages("shipment.pdf");

for (int page = 1; page <= pageCount; page++)
{
    using var image = codecs.Load(
        "shipment.pdf", 0,
        CodecsLoadByteOrder.BgrOrGray,
        page, page);

    var barcodes = engine.Reader.ReadBarcodes(
        image, LogicalRectangle.Empty, 0, null);

    foreach (var barcode in barcodes)
        results.Add($"Page {page}: {barcode.Value}");
}
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs

' Requires: dotnet add package Leadtools.Pdf
Using codecs As New RasterCodecs()
    codecs.Options.Pdf.Load.Resolution = 300
    codecs.Options.Pdf.Load.DisplayDepth = 24

    Dim engine As New BarcodeEngine()
    Dim results As New List(Of String)()
    Dim pageCount As Integer = codecs.GetTotalPages("shipment.pdf")

    For page As Integer = 1 To pageCount
        Using image = codecs.Load("shipment.pdf", 0, CodecsLoadByteOrder.BgrOrGray, page, page)
            Dim barcodes = engine.Reader.ReadBarcodes(image, LogicalRectangle.Empty, 0, Nothing)

            For Each barcode In barcodes
                results.Add($"Page {page}: {barcode.Value}")
            Next
        End Using
    Next
End Using
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

var results = BarcodeReader.Read("shipment.pdf");

foreach (var result in results)
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
using IronBarCode;

var results = BarcodeReader.Read("shipment.pdf");

foreach (var result in results)
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
Imports IronBarCode

Dim results = BarcodeReader.Read("shipment.pdf")

For Each result In results
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
$vbLabelText   $csharpLabel

Wdrażanie Docker

Wymóg zarządzania plikami, który definiuje każde wdrożenieLEADTOOLSw Dockerze, zostaje całkowicie wyeliminowany podczas migracji do IronBarcode.

Podejście LEADTOOLS:

FROM mcr.microsoft.com/dotnet/aspnet:8.0

WORKDIR /app
COPY publish/ .

# License file must be physically present in the container image
COPY LEADTOOLS.LIC /app/license/LEADTOOLS.LIC

ENV LEADTOOLS_LICENSE_PATH=/app/license/LEADTOOLS.LIC
ENV LEADTOOLS_DEVELOPER_KEY=your-developer-key

ENTRYPOINT ["dotnet", "YourApp.dll"]

Podejście IronBarcode:

FROM mcr.microsoft.com/dotnet/aspnet:8.0

WORKDIR /app
COPY publish/ .

ENV IRONBARCODE_LICENSE=your-license-key

ENTRYPOINT ["dotnet", "YourApp.dll"]

Klucz licencyjny jest wstrzykiwany w czasie wykonywania kontenera za pośrednictwem sekretów Docker, sekretów Kubernetes lub dowolnego mechanizmu zmiennych środowiskowych. Nie jest wymagane dostarczanie plików. Przewodnik wdrażania Docker i Linux obejmuje obrazy bazowe Alpine i Debian, kompilacje wieloetapowe oraz wzorce wdrażania Kubernetes.

Dokumentacja API kodów kreskowychLEADTOOLSdo IronBarcode

LEADTOOLS IronBarcode Uwagi
RasterSupport.SetLicense(path, key) IronBarCode.License.LicenseKey = "key" Tylko klucz — bez pliku
RasterSupport.KernelExpired (removed) Nie jest wymagana kontrola ważności
RasterSupport.IsLocked(RasterSupportType.Barcode1DRead) (removed) Wszystkie funkcje w zestawie
RasterSupport.IsLocked(RasterSupportType.Barcode2DRead) (removed) Wszystkie funkcje w zestawie
RasterSupport.IsLocked(RasterSupportType.BarcodeWrite) (removed) Wszystkie funkcje w zestawie
new BarcodeEngine() Statyczne — brak instancji BarcodeReader, BarcodeWriter są statyczne
new RasterCodecs() (removed) Przekaż ścieżkę do pliku bezpośrednio
codecs.Load(imagePath) (removed) Przekaż ścieżkę do pliku bezpośrednio
engine.Reader.ReadBarcodes(image, LogicalRectangle.Empty, 0, symbologies) BarcodeReader.Read(imagePath) Automatyczne wykrywanie symboli
BarcodeData.Value result.Value Ta sama nazwa właściwości
BarcodeData.Symbology result.Format Zmieniono nazwę właściwości
new BarcodeData() { Symbology = BarcodeSymbology.Code128 } BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) Płynne tworzenie
BarcodeSymbology.Code128 BarcodeEncoding.Code128 Zmiana przestrzeni nazw
BarcodeSymbology.QR BarcodeEncoding.QRCode Zmiana nazwy
BarcodeSymbology.DataMatrix BarcodeEncoding.DataMatrix Ta sama nazwa
BarcodeSymbology.PDF417 BarcodeEncoding.PDF417 Ta sama nazwa
BarcodeSymbology.EAN13 BarcodeEncoding.EAN13 Ta sama nazwa
BarcodeSymbology.UPCA BarcodeEncoding.UPCA Ta sama nazwa
BarcodeSymbology.Interleaved2of5 BarcodeEncoding.Interleaved2of5 Ta sama nazwa
BarcodeSymbology.Codabar BarcodeEncoding.Codabar Ta sama nazwa
engine.Writer.WriteBarcode(image, data, null) + codecs.Save(...) .SaveAsPng(path) Łańcuch metod
new RasterImage(...) + new FillCommand(RasterColor.White).Run(image) (removed) Wewnętrzne dla IronBarcode

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

Problem 1: Odwołania do plików .LIC w CI/CD

LEADTOOLS: Potoki CI/CD, które budują lub wdrażają aplikacje LEADTOOLS, muszą zapewnić plik .LIC — albo go wprowadzając do kontroli źródła, dekodując z tajemnicy base64, albo montując jako artefakt woluminu. Każdy etap potoku, w którym uruchamiana jest aplikacja, wymaga dostępu do tego pliku.

Rozwiązanie: Usunąć całą obsługę plików .LIC z potoku. Zastąpić sekretem w postaci ciągu znaków:

# Example: GitHub Actions environment variable
env:
  IRONBARCODE_LICENSE: ${{secrets.IRONBARCODE_LICENSE}}
# Example: GitHub Actions environment variable
env:
  IRONBARCODE_LICENSE: ${{secrets.IRONBARCODE_LICENSE}}
YAML

Wartość ciągu znaków jest przechowywana w magazynie sekretów CI/CD wraz z innymi poświadczeniami o wartości ciągu znaków. Nie jest wymagane dekodowanie plików, dostarczanie artefaktów ani konfiguracja woluminów.

Problem 2: Zależność środowiska uruchomieniowego MSVC++ od systemu Windows

LEADTOOLS: Wdrożenia na serwerach Windows wymagają zainstalowania środowiska uruchomieniowego MSVC++ 2017 na hoście. Skrypty provisioningu, obrazy bazowe kontenerów i obrazy AMI systemu Windows używane do wdrożeńLEADTOOLSzazwyczaj zawierają krok polegający na instalacji tego środowiska uruchomieniowego.

Rozwiązanie: Usuń krok instalacji środowiska uruchomieniowego MSVC++ 2017 ze wszystkich skryptów konfiguracyjnych systemu Windows i obrazów kontenerów.IronBarcode nie ma żadnych natywnych zależności środowiskowych. Obraz bazowy dotnet/aspnet wystarcza bez dodatkowych pakietów uruchomieniowych.

Problem 3: Kontrola blokady funkcji RasterSupportType

LEADTOOLS: Sekwencja inicjalizacji obejmuje kontrole RasterSupport.IsLocked() dla każdej funkcji kodu kreskowego — Barcodes1D, Barcodes2D, i BarcodeWrite. Są to kody zabezpieczające wymagane przez architekturęLEADTOOLSw celu weryfikacji, czy plik licencji obejmuje wszystkie wymagane funkcje.

Rozwiązanie: Usunąć wszystkie wywołania do RasterSupport.IsLocked().IronBarcode obejmuje wszystkie funkcje odczytu i zapisu w ramach jednej licencji. Nie ma stanów blokady poszczególnych funkcji i nie jest wymagany etap weryfikacji funkcji:

// Remove these lines entirely:
// if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite)) ...
// Remove these lines entirely:
// if (RasterSupport.IsLocked(RasterSupportType.Barcode1DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.Barcode2DRead)) ...
// if (RasterSupport.IsLocked(RasterSupportType.BarcodeWrite)) ...
' Remove these lines entirely:
' If RasterSupport.IsLocked(RasterSupportType.Barcode1DRead) ...
' If RasterSupport.IsLocked(RasterSupportType.Barcode2DRead) ...
' If RasterSupport.IsLocked(RasterSupportType.BarcodeWrite) ...
$vbLabelText   $csharpLabel

Problem 4: Usunięcie tablicy BarcodeSymbology

LEADTOOLS: Każde wywołanie do engine.Reader.ReadBarcodes() wymaga wyraźnego parametru BarcodeSymbology[]. BarCodes, których symbolika nie jest wymieniona w tablicy, nie zostaną wykryte, co może spowodować ciche pominięcia odczytów w przypadku wprowadzenia nowego typu BarCoda w dokumencie wejściowym.

Rozwiązanie: Usuń tablicę symboli. BarcodeReader.Read() automatycznie wykrywa wszystkie obsługiwane formaty. Jeśli konieczna jest optymalizacja wydajności dla znanego zestawu formatów, BarcodeReaderOptions dostarcza opcjonalnych wskazówek bez potrzeby wyczerpującego wyliczania:

// Optional: hint the reader for performance in format-known scenarios
var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("scan.png", options);
// Optional: hint the reader for performance in format-known scenarios
var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("scan.png", options);
Imports System

' Optional: hint the reader for performance in format-known scenarios
Dim options As New BarcodeReaderOptions With {
    .ExpectBarcodeTypes = BarcodeEncoding.Code128 Or BarcodeEncoding.QRCode
}
Dim results = BarcodeReader.Read("scan.png", options)
$vbLabelText   $csharpLabel

Lista kontrolna migracji kodów kreskowych LEADTOOLS

Zadania przed migracją

Przed wprowadzeniem jakichkolwiek zmian należy sprawdzić wszystkie użyciaLEADTOOLSw kodzie źródłowym:

grep -r "using Leadtools" --include="*.cs" .
grep -r "RasterSupport\|BarcodeEngine\|RasterCodecs" --include="*.cs" .
grep -r "BarcodeSymbology\|BarcodeData\|RasterImage" --include="*.cs" .
grep -r "LEADTOOLS.LIC\|SetLicense\|KernelExpired" --include="*.cs" .
grep -r "COPY LEADTOOLS.LIC\|LEADTOOLS_LICENSE_PATH" --include="*.dockerfile" --include="Dockerfile" .
grep -r "using Leadtools" --include="*.cs" .
grep -r "RasterSupport\|BarcodeEngine\|RasterCodecs" --include="*.cs" .
grep -r "BarcodeSymbology\|BarcodeData\|RasterImage" --include="*.cs" .
grep -r "LEADTOOLS.LIC\|SetLicense\|KernelExpired" --include="*.cs" .
grep -r "COPY LEADTOOLS.LIC\|LEADTOOLS_LICENSE_PATH" --include="*.dockerfile" --include="Dockerfile" .
SHELL

Przed rozpoczęciem wprowadzania zmian w kodzie należy udokumentować liczbę i lokalizację bloków inicjalizacyjnych, miejsc wywołań odczytu, miejsc wywołań zapisu oraz odwołań do pliku Dockerfile.

Zadania związane z aktualizacją kodu

  1. Usuń wszystkie pięć pakietówLEADTOOLSNuGet (oraz kodek PDF, jeśli jest obecny)
  2. Zainstaluj IronBarcode poprzez dotnet add package IronBarcode
  3. Zastąp wszystkie importy przestrzeni nazw using Leadtools.* przez using IronBarCode
  4. Zastąp cały blok inicjalizacji RasterSupport.SetLicense przez IronBarCode.License.LicenseKey = "key"
  5. Usuń wszystkie kontrole RasterSupport.KernelExpired
  6. Usuń wszystkie kontrole RasterSupport.IsLocked(RasterSupportType.*)
  7. Usuń wszystkie instancje new BarcodeEngine()
  8. Usuń wszystkie instancje new RasterCodecs() z ścieżek kodów kreskowych
  9. Zastąp codecs.Load(path) + engine.Reader.ReadBarcodes(image, ...) przez BarcodeReader.Read(path)
  10. Zastąp new BarcodeData(...) + new RasterImage(...) + FillCommand + WriteBarcode + codecs.Save() przez BarcodeWriter.CreateBarcode(...).SaveAsPng(path)
  11. Zastąp odniesienia BarcodeSymbology.* do wyliczeń przez BarcodeEncoding.* (uwaga: QR staje się QRCode)
  12. Usuń linie COPY LEADTOOLS.LIC z wszystkich plików Dockerfile
  13. Usuń deklaracje zmiennych środowiskowych LEADTOOLS_LICENSE_PATH i LEADTOOLS_DEVELOPER_KEY z Dockerfiles i konfiguracji wdrożenia
  14. Dodaj zmienną środowiskową IRONBARCODE_LICENSE do Dockerfiles i konfiguracji tajemnic
  15. Usuń instalację środowiska uruchomieniowego MSVC++ 2017 ze skryptów konfiguracyjnych systemu Windows

Testy po migracji

  • Zweryfikuj, że wszystkie operacje odczytu kodu kreskowego zwracają oczekiwane wartości dla wszystkich typów symboliki, które wcześniej obsługiwała tablica BarcodeSymbology[]
  • Kod Verify Code 128, kod QR i wszelkie inne generowane typy BARCODE-ów zapewniają prawidłowy, skanowalny wynik
  • Potwierdź, że ekstrakcja kodu kreskowego z PDF działa poprawnie bez Leadtools.Pdf
  • Zbuduj i uruchom obraz kontenerowy bez montowania jakiegokolwiek pliku .LIC i potwierdź, że aplikacja prawidłowo się inicjalizuje
  • Uruchom potok CI/CD bez kroku povizjonowania pliku .LIC i potwierdź, że wszystkie etapy kończą się sukcesem
  • Sprawdź, czy poprawiły się rozmiar opublikowanego pliku wyjściowego oraz czas pobierania obrazu kontenera

Kluczowe korzyści wynikające z migracji do IronBarcode

Uproszczona architektura wdrażania: Po migracji każde środowisko — programistyczne, CI, stagingowe, produkcyjne — otrzymuje licencję za pośrednictwem tego samego mechanizmu sekretów o wartości ciągu znaków, który jest używany dla kluczy API, haseł do baz danych i innych poświadczeń. Nie jest wymagane dostarczanie plików, obsługa artefaktów ani montowanie woluminów. Dodanie nowego środowiska wdrożeniowego jest operacją taką samą jak dodanie dowolnego innego sekretu.

Zmniejszona powierzchnia zależności: jeden pakiet NuGet zastępuje pięć, a wymóg środowiska uruchomieniowego MSVC++ 2017 został wyeliminowany. Publikowany wynik usługi BarCode zmniejsza się z około 148 MB do około 39 MB. Mniejsze obrazy oznaczają szybsze pobieranie kontenerów, niższe koszty przechowywania w rejestrach kontenerów oraz skrócony czas zimnego startu w środowiskach bezserwerowych i z automatycznym skalowaniem.

Usprawnione uruchamianie aplikacji: 20-wierszowa sekwencja inicjalizacjiLEADTOOLS— rozpoznawanie ścieżki pliku, weryfikacja ważności oraz trzy kontrole blokady dla poszczególnych funkcji — została zastąpiona jednym wierszem. Uruchamianie aplikacji przebiega szybciej, a ścieżka kodu inicjalizacji nie jest uzależniona od systemu plików, co mogłoby spowodować awarię w nowym środowisku.

Kompleksowe wykrywanie formatów:IronBarcode odczytuje wszystkie z ponad 50 obsługiwanych symboli bez konieczności określania oczekiwanych formatów przez użytkownika. Ryzyko wyciszonych pominiętych odczytów — spowodowane pominięciem symboliki z tablicy BarcodeSymbology[]LEADTOOLS— jest wyeliminowane. Gdy w dokumencie wejściowym pojawia się nowy typ kodu kreskowego,IronBarcode wykrywa go bez konieczności zmiany kodu.

Przewidywalny całkowity koszt: Zakup pojedynczej licencji wieczystej obejmuje rozwój, testowanie i nieograniczoną liczbę wdrożeń produkcyjnych bez śledzenia wdrożeń, bez wymogu corocznego odnawiania i bez konieczności uzyskiwania oddzielnej licencji produkcyjnej. Zespoły mogą potwierdzić całkowity koszt biblioteki przed rozpoczęciem prac programistycznych, bez konieczności prowadzenia rozmów handlowych.

Nowoczesny projekt API: BarcodeReader.Read() i BarcodeWriter.CreateBarcode() są statycznymi punktami wejścia, które akceptują ścieżki plików bezpośrednio. Wielowarstwowa konstrukcja obiektów wymagana do odczytu i zapisu wLEADTOOLS— instancje kodeków, instancje silników, alokacja obrazów, wypełnienie tła — jest obsługiwana wewnętrznie. Kod odczytujący i generujący BARCODES jest krótszy, łatwiejszy do przeglądu i łatwiejszy do testowania.

LEADTOOLS jest zarejestrowanym znakiem towarowym swojego właściciela. Ta strona nie jest powiązana, zatwierdzona ani sponsorowana przez LEAD Technologies. 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 LEADTOOLS 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 LEADTOOLS 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 LEADTOOLS 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 LEADTOOLS 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 LEADTOOLS 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 BarCodes po migracji z LEADTOOLS?

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