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

LEADTOOLS Barcode vs IronBarcode: Porównanie bibliotek kodów kreskowych C#

Aby korzystać z LEADTOOLS BarCode w Dockerze, należy zamontować plik licencji w kontenerze w określonej ścieżce. Plik ten musi być dołączany do każdego wdrożenia. Zmienne środowiskowe to za mało. Każde wdrożenie LEADTOOLS wiąże się z problemem zarządzania plikami.

Nie jest to krytyka inżynierii LEADTOOLS — odzwierciedla to 30-letnią architekturę licencyjną zaprojektowaną przed pojawieniem się kontenerów. Jednak w 2026 r., gdy potok CI/CD będzie musiał skompilować i wdrożyć obraz kontenera, albo wbudujesz plik .LIC w obraz, albo zamontujesz go jako wolumin w czasie wykonywania. Tak czy inaczej, biblioteka BARCODE wymaga dostępu do systemu plików przed zainicjowaniem. To właśnie jest podstawowy kompromis, który analizuje to porównanie.

Zrozumienie BarCode LEADTOOLS

LEADTOOLS BarCode jest częścią kompleksowego zestawu SDK do przetwarzania obrazów dokumentów firmy LEAD Technologies, który jest stale rozwijany od 1990 roku. Moduł kodów kreskowych obsługuje ponad 40 symboli i ściśle integruje się z szerszym ekosystemem LEADTOOLS do OCR, przetwarzania formularzy, manipulacji plikami PDF i przeglądania obrazów. Taka integracja ekosystemu jest naprawdę cenna, gdy aplikacja wymaga wszystkich tych możliwości od jednego dostawcy. Gdy wymagańe jest skanowanie kodów kreskowych w samodzielnej mikrousłudze lub wyspecjalizowanej aplikacji, ta sama integracja stanowi obciążenie, które należy uwzględnić przy każdym wdrożeniu.

Architektura biblioteki odzwierciedla jej wiek. LEADTOOLS zostało zaprojektowane w erze jawnego zarządzania zasobami, ręcznej konfiguracji i licencjonowania opartego na systemie plików. Każda z tych decyzji projektowych miała sens w swoim kontekście. We współczesnym programowaniu w środowisku .NET — obciążenia kontenerowe, potoki CI/CD, systemy zarządzania sekretami — te same decyzje powodują tarcia, które zespoły muszą aktywnie omijać.

Wdrożenie LEADTOOLS BARCODE wymaga co najmniej pięciu pakietów NuGet. Wyodrębnianie kodów kreskowych z plików PDF wymaga dodania szóstego. W systemie Windows na hoście musi być zainstalowane środowisko uruchomieniowe MSVC++ 2017. Opublikowany wynik działania aplikacji do obsługi kodów kreskowych LEADTOOLS zajmuje około 148 MB.

Kluczowe cechy architektury LEADTOOLS BarCode:

  • Architektura licencji oparta na plikach: Wymaga fizycznej obecności pliku .LIC na dysku w znanej ścieżce oraz ciągu znaków klucza programisty. Oba muszą być dostępne w czasie wykonywania, aby biblioteka mogła się zainicjować.
  • Model licencji dwupoziomowej: Licencje na rozwój i licencje na wdrożenie są wyceniane i nabywane oddzielnie. W celu uzyskania wyceny wdrożenia produkcyjnego prosimy o kontakt z działem sprzedaży LEADTOOLS.
  • Instalacja wielopakietowa: Minimalna instalacja obsługująca BarCodes wymaga Leadtools.Barcode, Leadtools, Leadtools.Codecs, Leadtools.Codecs.Png oraz Leadtools.Codecs.Jpeg. Każdy dodatkowy format obrazu wymaga własnego pakietu kodeków.
  • Natywna zależność środowiska uruchomieniowego: Wdrożenia w systemie Windows wymagają środowiska uruchomieniowego MSVC++ 2017 oprócz środowiska uruchomieniowego .NET.
  • Wyraźna deklaracja symboliki: Odczyt BarCode wymaga przekazania tablicy wartości wyliczeniowych BarcodeSymbology określających formaty, które mają być skanowane. Pominięte formaty nie zostaną wykryte.
  • Sekwencja inicjalizacji warstwowej: Po załadowaniu pliku licencji aplikacja musi sprawdzić, czy licencja nie wygasła oraz czy każda wymagańa funkcja — odczyt 1D, odczyt 2D, zapis — jest indywidualnie odblokowana przed utworzeniem BarcodeEngine.
  • Ponad 40 obsługiwanych symboli: szeroki zakres formatów BARCODE'ów 1D i 2D w ramach kompleksowej platformy obrazówania.

Architektura licencji oparta na plikach

Inicjalizacja LEADTOOLS wymaga około 20 linii kodu, zanim będzie można wykonać pierwszą operację związaną z BarCode. Sekwencja obejmuje rozpoznawanie ścieżki pliku, weryfikację wygaśnięcia oraz sprawdzanie blokady poszczególnych funkcji:

// LEADTOOLS: Ponad 20 wierszy before the first barcode operation
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: Ponad 20 wierszy before the first barcode operation
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

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

Ten blok inicjalizacyjny musi zostać pomyślnie wykonany, zanim jakakolwiek operacja odczytu lub zapisu BARCODE będzie działać. Jeśli plik .LIC nie istnieje, ścieżka jest nieprawidłowa lub uprawnienia do pliku są nieprawidłowe, LEADTOOLS nie zainicjuje się — nie w trybie cichym, ale z błędem, który zatrzymuje działanie.

Zrozumienie IronBarcode

IronBarcode to specjalistyczna biblioteka kodów kreskowych .NET stworzona specjalnie do odczytu i generowania kodów kreskowych w aplikacjach .NET. IronBarcode nie jest jednym z modułów większego pakietu SDK do przetwarzania obrazów, ale skupia się przede wszystkim na obsłudze kodów kreskowych. Biblioteka jest dystrybuowana jako pojedynczy pakiet NuGet, który obejmuje obsługę wszystkich formatów obrazów, natywne wyodrębnianie BarCode'ów z plików PDF oraz korekcję błędów opartą na uczeniu maszynowym, bez konieczności stosowania dodatkowych pakietów kodeków lub natywnych zależności środowiska uruchomieniowego.

IronBarcode wykorzystuje statyczny projekt API. Operacje odczytu i zapisu są dostępne jako wywołania metod statycznych w BarcodeReader i BarcodeWriter bez konieczności tworzenia instancji lub inicjalizacji obiektów. Aktywacja licencji to przypisanie pojedynczego ciągu znaków. Biblioteka automatycznie wykrywa formaty BARCODE spośród ponad 50 obsługiwanych symboli, eliminując konieczność wyliczania oczekiwanych formatów przed każdą operacją odczytu.

Biblioteka jest przeznaczona dla .NET Standard 2.0 i nowszych wersji, zapewniając kompatybilność z .NET Framework 4.6.2+, .NET 5, .NET 6, .NET 7, .NET 8 i .NET 9. Na żadnym z obsługiwanych systemów operacyjnych nie jest wymagańe natywne środowisko uruchomieniowe specyficzne dla danej platformy.

Kluczowe cechy IronBarcode:

  • Licencjonowanie kluczem łańcuchowym: Aktywacja licencji wymaga przypisania pojedynczego łańcucha znaków. Klucz może pochodzić ze zmiennej środowiskowej, pliku konfiguracyjnego, menedżera sekretów lub dowolnego źródła, które dostarcza wartość ciągu znaków.
  • Pojedynczy pakiet NuGet: Obsługa wszystkich formatów obrazów, wyodrębnianie plików PDF oraz funkcje związane z BARCODE są zawarte w IronBarcode. Nie są wymagańe żadne dodatkowe pakiety kodeków.
  • Statyczne API Fluent: BarcodeReader.Read() i BarcodeWriter.CreateBarcode() to statyczne punkty wejścia. Nie ma potrzeby tworzenia instancji silnika ani obiektów kodeków.
  • Automatyczne wykrywanie formatów: Odczytuje wszystkie z ponad 50 obsługiwanych symboli bez konieczności określania oczekiwanych formatów przez użytkownika.
  • Wbudowana obsługa plików PDF: Wyodrębnianie BarCode-ów z plików PDF jest zawarte w pakiecie podstawowym i nie wymaga dodatkowej instalacji.
  • Ponad 50 obsługiwanych symboli: Obejmuje wszystkie główne formaty BARCODE 1D i 2D, w tym Code 128, Code 39, QR Code, Data Matrix, PDF417, EAN-13 i UPC-A.
  • Korekcja błędów ML: Korekcja obrazów oparta na uczeniu maszynowym poprawia dokładność odczytu uszkodzonych lub niskiej jakości obrazów BARCODE.

Porównanie funkcji

Poniższa tabela przedstawia podstawowe różnice między LEADTOOLS BarCode a IronBarcode:

Funkcja LEADTOOLS BarCode IronBarcode
Model licencji Plik + klucz (dwupoziomowy) Tylko klucz (jednopoziomowe)
Zajmowana przestrzeń przez SDK Ponad 5 pakietów + natywne środowisko uruchomieniowe 1 pakiet
Kod inicjalizacyjny Ponad 20 wierszy 1 wiersz
Wdrożenie Docker Wymagane zamontowanie pliku Zmienna środowiskowa
Pobieranie kodów kreskowych z plików PDF Oddzielny pakiet Wbudowane
Automatyczne wykrywanie formatu Ograniczone Tak
Całkowita liczba symboli 40+ 50+
Korekta błędów ML Nie Tak

Szczegółowe porównanie funkcji

Funkcja LEADTOOLS BarCode IronBarcode
Licencjonowanie
Model licencji Plik + klucz programisty Tylko klucz ciągu znaków
Poziomy licencji Rozwój + wdrożenie (osobno) Pojedyncza Licencja wieczysta
Ceny wdrożenia Skontaktuj się z działem sprzedaży Opublikowane ceny
Licencja w zmiennej środowiskowej Częściowe (tylko klucz, plik nadal wymagańy) Tak
Licencja w menedżerze sekretów Plik nadal wymagańy Tak (tylko ciąg znaków)
Instalacja
Wymagane pakiety NuGet 5+ 1
Natywna zależność środowiska uruchomieniowego MSVC++ 2017 (Windows) None
Pakiet wsparcia PDF Oddziel (Leadtools.Codecs.Pdf) W zestawie
Rozmiar opublikowanego pliku ~148 MB ~39 MB
Czytanie
Symbole 1D 25+ 30+
Symbole 2D 15+ 15+
Automatyczne wykrywanie formatu Ograniczone Tak
Wymagana jest wyraźna deklaracja symboliki Tak Nie
Pobieranie kodów kreskowych z plików PDF Tak (oddzielny pakiet) Tak (wbudowane)
Korekta błędów ML Nie Tak
Wykrywanie wielu kodów BarCode Tak Tak
Generacja
Generowanie kodu 128 Tak Tak
Generowanie kodów QR Tak Tak
Logo z kodem QR Nie Tak
API generowania płynnego Nie Tak
Formaty wyjściowe PNG, JPEG, BMP PNG, JPEG, BMP, SVG, HTML, PDF
Projektowanie API
Styl API Graf obiektów starszego typu Static fluent
Wiersze inicjalizacyjne 20+ 1
Warstwa ładowania obrazów RasterCodecs (osobno) Automatyczne
Platforma
Wielopłatformowe Częściowe (natywne zależności) Pełna wersja (.NET Standard)
Obsługa Docker / kontenerów Wymagane zamontowanie pliku Zmienna środowiskowa
.NET Standard 2.0 Tak Tak
.NET 8 / .NET 9 Tak Tak

Architektura licencji

Architektura licencji jest najważniejszą różnicą między tymi dwiema bibliotekami dla zespołów wdrażających rozwiązania w nowoczesnej infrastrukturze.

Podejście LEADTOOLS

Licencjonowanie LEADTOOLS wymaga fizycznej obecności pliku .LIC w systemie plików w znanej ścieżce oraz podania ciągu znaków klucza programisty do RasterSupport.SetLicense. Po wywołaniu SetLicense aplikacja musi sprawdzić, czy licencja nie wygasła i czy każda funkcja BARCODE'a jest odblokowana indywidualnie. Dopiero po pozytywnym przejściu wszystkich kontroli można utworzyć BarcodeEngine:

// LEADTOOLS: Ponad 20 wierszy before the first barcode operation
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: Ponad 20 wierszy before the first barcode operation
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

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

Ten model oparty na plikach powstał przed pojawieniem się nowoczesnych systemów zarządzania sekretami. Plik .LIC musi być udostępniony w każdym środowisku, w którym działa aplikacja: na komputerach programistów, agentach kompilacji CI, serwerach stagingowych i hostach produkcyjnych.

Podejście IronBarcode

Inicjalizacja licencji IronBarcode to jedna linijka:

// IronBarcode: done
IronBarCode.License.LicenseKey = "YOUR-KEY";
// IronBarcode: done
IronBarCode.License.LicenseKey = "YOUR-KEY";
$vbLabelText   $csharpLabel

Klucz ten może pochodzić ze zmiennej środowiskowej, pliku konfiguracyjnego lub menedżera sekretów — z dowolnego miejsca, z którego może pochodzić ciąg znaków. Nie ma pliku do zlokalizowania, nie ma potrzeby pisania kodu sprawdzającego datę ważności ani weryfikacji blokady funkcji. Jeśli chodzi o konfigurację licencji i opcje wdrażania, dokumentacja obejmuje wszystkie wzorce: zmienne środowiskowe, appsettings.json, Azure Key Vault i inne.

Docker i wdrażanie kontenerów

Różnica w architekturze licencji staje się widoczna podczas pisania pliku Dockerfile.

Podejście LEADTOOLS

Wdrożenie LEADTOOLS w Dockerze wymaga skopiowania pliku .LIC do obrazu kontenera lub zamontowania go jako woluminu w czasie wykonywania:

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

WORKDIR /app
COPY publish/ .

# The license file must be physically present in the container
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"]

Takie podejście wiąże się z pewnymi komplikacjami na dalszych etapach. Rotacja lub unieważnienie klucza licencyjnego wymaga odbudowy obrazu lub ponownego zamontowania woluminu. Pipeline CI/CD musi albo zatwierdzić plik .LIC, albo zdekodować go z tajnego klucza zakodowanego w base64 w czasie kompilacji. Tajne klucze Kubernetes zaprojektowane dla par klucz-wartość typu string muszą teraz przechowywać zawartość plików. Zespoły korzystające z kontenerów efemerycznych muszą rozwiązać problem udostępniania plików na każdym nowym węźle.

Podejście IronBarcode

IronBarcode nie wymaga żadnego pliku w kontenerze:

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

WORKDIR /app
COPY publish/ .

ENV IRONBARCODE_LICENSE=your-license-key

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

Model zmiennych środowiskowych współpracuje natywnie z sekretami Docker, sekretami Kubernetes, AWS Secrets Manager, Azure Key Vault i HashiCorp Vault — każdym systemem, który może wstrzyknąć ciąg znaków do środowiska kontenera. Dostępny jest pełny przewodnik wdrożeniowy dla Docker i Linux, obejmujący obrazy bazowe zarówno Alpine, jak i Debian.

Odczytywanie BarCode

Podejście LEADTOOLS

Odczytanie pliku przez LEADTOOLS wymaga utworzenia instancji RasterCodecs w celu załadowania obrazu, instancji BarcodeEngine w celu jego skanowania oraz jawnej tablicy wartości BarcodeSymbology określającej formaty, których należy szukać. Pominięcie symboliki w tablicy oznacza, że LEADTOOLS nie wykryje BARCODE-ów tego typu:

// LEADTOOLS: codec, engine, explicit symbology list
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

using var codecs = new RasterCodecs();
using var image = codecs.Load(imagePath);
var engine = new BarcodeEngine();

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

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

return barcodes.Select(b => b.Value).ToArray();
// LEADTOOLS: codec, engine, explicit symbology list
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

using var codecs = new RasterCodecs();
using var image = codecs.Load(imagePath);
var engine = new BarcodeEngine();

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

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

return barcodes.Select(b => b.Value).ToArray();
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs

Dim barcodes As IEnumerable(Of BarcodeData)
Using codecs As New RasterCodecs()
    Using image As RasterImage = codecs.Load(imagePath)
        Dim engine As New BarcodeEngine()

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

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

Return barcodes.Select(Function(b) b.Value).ToArray()
$vbLabelText   $csharpLabel

Podejście IronBarcode

IronBarcode automatycznie wykrywa formaty we wszystkich ponad 50 obsługiwanych symbolikach. Ścieżka do pliku jest przekazywana bezpośrednio; nie jest wymagańa warstwa ładowania obrazów ani tablica symboli:

// IronBarcode: auto-detect, no object setup
using IronBarCode;

var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value).ToArray();
// IronBarcode: auto-detect, no object setup
using IronBarCode;

var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value).ToArray();
Imports IronBarCode

Dim results = BarcodeReader.Read(imagePath)
Return results.Select(Function(r) r.Value).ToArray()
$vbLabelText   $csharpLabel

Więcej szczegółów na temat opcji odczytu, równoważenia szybkości i dokładności oraz obsługi trudnych obrazów można znaleźć w przewodniku dotyczącym odczytu BarCODE-ów z obrazów, który obejmuje pełny zakres API.

Generowanie kodów kreskowych

Podejście LEADTOOLS

Generowanie BARCODE-ów w LEADTOOLS wymaga utworzenia obiektu BarcodeData z symbolem, wartością i granicami — następnie utworzenia pustego RasterImage z wyraźnymi wymiarami w pikselach, głębią bitową, kolejnością bajtów i perspektywą widoku — następnie wypełnienie go białym tłem za pomocą FillCommand — następnie wywołanie engine.Writer.WriteBarcode() — a na koniec zapisanie za pomocą RasterCodecs. To pięć odrębnych operacji na wielu typach obiektów:

// LEADTOOLS: 5 operations, 25+ lines
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

var engine = new BarcodeEngine();

var barcodeData = new BarcodeData(BarcodeSymbology.Code128)
{
    Value = data,
    Bounds = new LeadRect(0, 0, 400, 100)
};

using var image = new RasterImage(
    RasterMemoryFlags.Conventional,
    400, 100, 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, outputPath, RasterImageFormat.Png, 0);
// LEADTOOLS: 5 operations, 25+ lines
using Leadtools;
using Leadtools.Barcode;
using Leadtools.Codecs;

var engine = new BarcodeEngine();

var barcodeData = new BarcodeData(BarcodeSymbology.Code128)
{
    Value = data,
    Bounds = new LeadRect(0, 0, 400, 100)
};

using var image = new RasterImage(
    RasterMemoryFlags.Conventional,
    400, 100, 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, outputPath, RasterImageFormat.Png, 0);
Imports Leadtools
Imports Leadtools.Barcode
Imports Leadtools.Codecs

Dim engine As New BarcodeEngine()

Dim barcodeData As New BarcodeData(BarcodeSymbology.Code128) With {
    .Value = data,
    .Bounds = New LeadRect(0, 0, 400, 100)
}

Using image As New RasterImage(
    RasterMemoryFlags.Conventional,
    400, 100, 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, outputPath, RasterImageFormat.Png, 0)
    End Using
End Using
$vbLabelText   $csharpLabel

Podejście IronBarcode

IronBarcode wewnętrznie obsługuje tworzenie obrazów, wypełnianie tła i kodowanie:

// IronBarcode: one method chain
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng(outputPath);
// IronBarcode: one method chain
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng(outputPath);
Imports IronBarcode

BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
    .ResizeTo(400, 100) _
    .SaveAsPng(outputPath)
$vbLabelText   $csharpLabel

W celu tworzenia obrazów kodów kreskowych interfejs API IronBarcode udostępnia funkcje stylizacji, marginesów, obracania i konwersji formatów za pomocą płynnego łańcucha, a nie serii imperatywnych obiektów konfiguracyjnych.

Przewodnik po mapowaniu API

LEADTOOLS BarCode IronBarcode Uwagi
RasterSupport.SetLicense(path, key) IronBarCode.License.LicenseKey = "key" Tylko klucz — bez pliku
RasterSupport.KernelExpired (removed) Nie jest wymagańa 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, rect, 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(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
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

Kiedy zespoły rozważają przejście z LEADTOOLS BarCode na IronBarcode

Wdrażanie w kontenerach i chmurze

Zespoły przenoszące obciążenia do środowisk Docker, Kubernetes lub bezserwerowych napotykają model licencjonowania oparty na plikach jako konkretny problem operacyjny. Każda nowa instancja kontenera, każdy nowy region chmury i każde nowe Środowisko muszą mieć plik .LIC przygotowany i dostępny przed uruchomieniem aplikacji. Systemy zarządzania sekretami zaprojektowane dla sekretów o wartości łańcuchowej nie obsługują w sposób przejrzysty artefaktów opartych na plikach. Zespoły, które ujednoliciły proces konfiguracji poprzez wstrzykiwanie zmiennych środowiskowych, zauważają, że LEADTOOLS wymaga oddzielnego etapu przydzielania zasobów, który wykracza poza ich standardowy proces zarządzania sekretami. Wraz ze wzrostem liczby wdrożeń — automatyczne skalowanie, wdrożenie typu blue-green, replikacja w wielu regionach — rosną również koszty operacyjne związane z udostępnianiem plików.

Zajmowana przestrzeń przez SDK i zarządzanie zależnościami

Gdy odczyt lub generowanie kodów kreskowych jest głównym lub jedynym wymaganiem usługi, instalacja LEADTOOLS składająca się z pięciu pakietów oraz zależność od środowiska uruchomieniowego MSVC++ 2017 stanowią obciążenie, które wpływa na rozmiar obrazu kontenera, opóźnienie przy zimnym starcie w funkcjach bezserwerowych oraz czas kompilacji w potokach CI/CD. Zespoły tworzące lekkie mikrousługi lub funkcje w stylu Lambda uważają, że wdrażanie pełnego zestawu SDK do przetwarzania obrazów w celu zaspokojenia konkretnych potrzeb związanych z kodami BarCode powoduje powstanie powierzchni zależności, którą trudno uzasadnić podczas przeglądów kodu i architektury. Gdy przyszła aktualizacja platformy wymaga przetestowania zmiany natywnej zależności środowiska uruchomieniowego, zadanie to spoczywa na zespole odpowiedziąlnym za utrzymanie usługi.

Przejrzystość cen

Zespoły programistyczne, które muszą oszacować budżet projektu przed rozpoczęciem prac, nie są w stanie uzyskać pełnego obrazu kosztów na podstawie cennika opublikowanego przez LEADTOOLS. Ceny licencji deweloperskich wynoszą od 1295 do 1469 USD rocznie na programistę, ale ceny licencji na wdrożenie produkcyjne aplikacji serwerowych są wyceniane osobno przez dział sprzedaży. Zespół pięciu programistów obsługujący trzy serwery produkcyjne musi uzyskać indywidualną wycenę, zanim będzie mógł potwierdzić, że LEADTOOLS mieści się w ich budżecie. Zespoły, które wolą podejmować decyzje dotyczące zakupów w oparciu o opublikowane ceny — porównując opcje, uzyskując wewnętrzną zgodę lub planując wieloletnie budżety — uważają, że ten model wymaga rozmowy handlowej przed zakończeniem oceny.

Wymagania dotyczące wyłącznie BarCode

Aplikacje, które muszą odczytywać lub generować kody kreskowe bez konieczności korzystania z funkcji OCR, obrazówania DICOM, adnotacji dokumentów lub innych funkcji Suite LEADTOOLS, płacą za platformę o szerszym zakresie niż wymagają tego ich potrzeby. Wartość integracyjna LEADTOOLS — możliwość przekazywania danych między modułami OCR, BARCODE i przetwarzania dokumentów — jest rzeczywista, ale ma zastosowanie tylko wtedy, gdy aktywnie wykorzystuje się wiele funkcji z tej Suite. Gdy wymagania ograniczają się do skanowania kodów kreskowych w interfejsie API lub generowania ich w procesie przetwarzania dokumentów, wyspecjalizowana biblioteka kodów kreskowych bezpośrednio spełnia te wymagania, nie obciążając systemu kompleksową platformą obrazówania.

Typowe kwestie związane z migracją

Zastąpienie inicjalizacji licencji

Cały blok inicjalizacji LEADTOOLS — ścieżka do pliku, sprawdzanie ważności i weryfikacja blokady poszczególnych funkcji — został zastąpiony jedną linią. Klucz licencyjny IronBarcode można przechowywać w dowolnym systemie zarządzania sekretami, który obsługuje ciągi znaków:

// Replace the entire LEADTOOLS initialization block with:
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
// Replace the entire LEADTOOLS initialization block with:
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
' Replace the entire LEADTOOLS initialization block with:
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
$vbLabelText   $csharpLabel

Wzorzec zmiennej środowiskowej Docker

Wiersz COPY LEADTOOLS.LIC w każdym pliku Dockerfile zostaje całkowicie usunięty. Licencja jest udostępniana poprzez zmienną środowiskową w czasie wykonywania, która współpracuje ze wszystkimi standardowymi mechanizmami wstrzykiwania sekretów:

# Remove: COPY LEADTOOLS.LIC /app/license/LEADTOOLS.LIC
# Remove: ENV LEADTOOLS_LICENSE_PATH=/app/license/LEADTOOLS.LIC
# Add:
ENV IRONBARCODE_LICENSE=your-license-key

Usuwanie pakietów

Pięć pakietów LEADTOOLS — oraz opcjonalny kodek PDF — zostało usuniętych i zastąpionych jednym pakietem:

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
# If added:
dotnet remove package Leadtools.Codecs.Pdf

dotnet add package IronBarcode
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
# If added:
dotnet remove package Leadtools.Codecs.Pdf

dotnet add package IronBarcode
SHELL

Dodatkowe możliwości IronBarcode

Oprócz możliwości omówionych w powyższych sekcjach, IronBarcode oferuje następujące funkcje przydatne w typowych scenariuszach związanych z kodami kreskowymi w środowisku .NET:

  • Wyodrębnianie BarCodes z plików PDF: Odczytuj BarCodes z wielostronicowych dokumentów PDF z automatyczną iteracją stron i raportowaniem PageNumber każdego wyniku — bez konieczności pętli stron.
  • Korekcja błędów oparta na uczeniu maszynowym: Przetwarzanie wstępne obrazów z wykorzystaniem uczenia maszynowego poprawia dokładność odczytu uszkodzonych, o niskim kontraście lub obróconych obrazów BARCODE bez konieczności dodatkowej konfiguracji.
  • Asynchroniczne przetwarzanie wsadowe: BarcodeReader.ReadAsync() obsługuje odczyt asynchroniczny, umożliwiając przetwarzanie wsadowe o dużej przepustowości bez blokowania wątków.
  • Branding logo w kodzie QR: QRCodeWriter umożliwia osadzenie obrazu logo w środku kodu QR za pomocą jednego wywołania metody, wykorzystując wbudowaną korekcję błędów w celu zachowania skanowalności.
  • Wyjście SVG i HTML: BarcodeWriter może generować BARCODE jako skalowalne pliki SVG lub jako elementy HTML wbudowane w kod, oprócz formatów obrazów rastrowych.
  • Dostosowanie opcji BarCodeReaderOptions: prędkość odczytu, wskazówki dotyczące oczekiwanej symboliki, wykrywanie wielu kodów kreskowych oraz przetwarzanie wstępne obrazu można konfigurować dla każdego odczytu bez wpływu na stan globalny.

Zgodność z platformą .NET i gotowość na przyszłość

IronBarcode jest przeznaczony dla .NET Standard 2.0, zapewniając kompatybilność z .NET Framework 4.6.2 i nowszymi wersjami, .NET 5, .NET 6, .NET 7, .NET 8 oraz .NET 9. Biblioteka IronBarcode nie ma żadnych wymagań dotyczących natywnego środowiska uruchomieniowego specyficznego dla platformy, co umożliwia wdrożenie na systemach Windows, Linux i macOS bez dodatkowych czynności konfiguracyjnych. W miarę postępującego wdrażania platformy .NET 10 do 2026 r. regularne wydania IronBarcode zapewniają kompatybilność z obecnymi i przyszłymi wersjami .NET. Statyczny projekt API i model dystrybucji w postaci pojedynczego pakietu pozostają niezmienne w kolejnych wersjach, więc aktualizacje wersji nie wymagają zmian w kodzie inicjalizacyjnym aplikacji ani w konfiguracji wdrożenia.

Wnioski

LEADTOOLS BarCode i IronBarcode reprezentują różne punkty w przestrzeni projektowej bibliotek kodów kreskowych dla platformy .NET. LEADTOOLS to moduł w ramach kompleksowego zestawu SDK do przetwarzania obrazów, istniejącego od 30 lat, charakteryzującego się architekturą licencji opartą na plikach, instalacją wielopakietową oraz starszym projektem API, odzwierciedlającym normy inżynieryjne epoki, w której został stworzony. IronBarcode to specjalnie zaprojektowana biblioteka kodów kreskowych dla nowoczesnego środowiska .NET, oferująca instalację w jednym pakiecie, licencjonowanie oparte na kluczu łańcuchowym oraz statyczny interfejs API, który nie wymaga obiektów inicjalizacyjnych.

LEADTOOLS BarCode to właściwy wybór, gdy aplikacja już korzysta z LEADTOOLS w celu realizacji innych funkcji — OCR, przetwarzania obrazów DICOM, adnotacji dokumentów lub rozpoznawania formularzy. W tych kontekstach dodanie funkcji kodów kreskowych za pomocą tego samego zestawu SDK pozwala rozszerzyć istniejącą inwestycję bez wprowadzania nowego dostawcy lub nowych relacji licencyjnych. Organizacje posiadające istniejące umowy licencyjne LEADTOOLS mogą uzyskać dostęp do funkcji kodów kreskowych przy niskich kosztach krańcowych. W przypadku aplikacji, które naprawdę potrzebują szerokiego zakresu możliwości platformy obrazówania LEADTOOLS, wartość integracji między modułami jest realna.

IronBarcode to właściwy wybór, gdy odczyt lub generowanie kodów kreskowych jest głównym lub jedynym wymaganiem usługi, gdy aplikacja jest wdrażana w kontenerach lub infrastrukturze natywnej dla chmury, lub gdy zespół potrzebuje przewidywalnych cen przed rozpoczęciem prac programistycznych. Instalacja w jednym pakiecie oraz model licencjonowania oparty na zmiennych środowiskowych są zgodne ze sposobem konfiguracji, wdrażania i skalowania nowoczesnych usług .NET. Płynny statyczny interfejs API zmniejsza ilość kodu inicjalizacyjnego i operacyjnego wymagańego do działania funkcji BarCode.

Praktyczna różnica między tymi dwiema bibliotekami jest najbardziej widoczna w scenariuszach wdrożeniowych. Gdy zespół dodaje nowe środowisko, rozszerza skalę na nowy region chmury lub zmienia poświadczenia licencji, IronBarcode wymaga aktualizacji ciągu znaków w menedżerze sekretów. LEADTOOLS wymaga przygotowania pliku. To rozróżnienie nie jest krytyką inżynierii LEADTOOLS — jest to opis wymagań każdej architektury. Zespoły dokonujące rzetelnej oceny powinny odnieść ten opis bezpośrednio do swojego modelu wdrożenia i zdecydować, który z nich jest odpowiedni.

Często Zadawane Pytania

Czym jest LEADTOOLS Barcode?

LEADTOOLS Barcode to biblioteka kodów kreskowych .NET do generowania i odczytywania kodów kreskowych w aplikacjach C#. Jest jedną z kilku alternatyw, które programiści oceniają przy wyborze rozwiązania kodów kreskowych dla projektów .NET.

Jakie są główne różnice między LEADTOOLS Barcode a IronBarcode?

IronBarcode używa statycznego, bezstanowego API niewymagającego zarządzania instancjami, podczas gdy LEADTOOLS Barcode zazwyczaj wymaga utworzenia i skonfigurowania instancji przed użyciem. IronBarcode oferuje również natywne wsparcie dla PDF, automatyczne wykrywanie formatu i jednokrotne licencjonowanie we wszystkich środowiskach.

Czy IronBarcode jest łatwiejszy do licencjonowania niż LEADTOOLS Barcode?

IronBarcode wykorzystuje pojedynczy klucz licencyjny obejmujący zarówno wdrożenia deweloperskie, jak i produkcyjne. Upraszcza to procesy CI/CD oraz konfiguracje Docker w porównaniu z systemami licencyjnymi, które oddzielają klucze SDK od kluczy środowiska uruchomieniowego.

Czy IronBarcode obsługuje wszystkie formaty kodów kreskowych, które obsługuje LEADTOOLS Barcode?

IronBarcode obsługuje ponad 30 symboli kodów kreskowych, w tym QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 i wiele innych. Automatyczne wykrywanie formatu oznacza, że nie jest wymagane jawne wyliczanie formatów.

Czy IronBarcode obsługuje natywne odczytywanie kodów kreskowych z plików PDF?

Tak. IronBarcode odczytuje kody kreskowe bezpośrednio z plików PDF za pomocą BarcodeReader.Read("document.pdf") bez konieczności korzystania z oddzielnej biblioteki do renderowania plików PDF. Wyniki dla każdej strony obejmują numer strony, format kodu kreskowego, wartość oraz wskaźnik pewności.

Jak IronBarcode radzi sobie z przetwarzaniem wsadowym w porównaniu do LEADTOOLS Barcode?

Metody statyczne IronBarcode są bezstanowe i z natury bezpieczne dla wątków, co umożliwia bezpośrednie użycie Parallel.ForEach bez zarządzania instancjami dla poszczególnych wątków. Nie ma ograniczeń przepustowości w żadnym przedziale cenowym.

Jakie wersje .NET obsługuje IronBarcode?

IronBarcode obsługuje .NET Framework 4.6.2+, .NET Core 3.1 oraz .NET 5, 6, 7, 8 i 9 w jednym pakiecie NuGet. Obsługiwane platformy to Windows x64/x86, Linux x64 oraz macOS x64/ARM.

Jak zainstalować IronBarcode w projekcie .NET?

Zainstaluj IronBarcode za pomocą NuGet: uruchom polecenie „Install-Package IronBarCode” w konsoli menedżera pakietów lub „dotnet add package IronBarCode” w interfejsie CLI. Nie są wymagane żadne dodatkowe instalatory SDK ani pliki uruchomieniowe.

Czy mogę ocenić IronBarcode przed zakupem, w przeciwieństwie do LEADTOOLS?

Tak. Tryb próbny IronBarcode zwraca pełne, zdekodowane wartości BarCode — tylko wygenerowane obrazy wyjściowe są opatrzone znakiem wodnym. Przed podjęciem decyzji o zakupie można sprawdzić dokładność odczytu na własnych dokumentach.

Jaka jest różnica cenowa między LEADTOOLS Barcode a IronBarcode?

Cena IronBarcode zaczyna się od 749 USD za Licencję wieczystą dla jednego programisty, obejmującą etapy rozwoju i produkcji. Szczegóły dotyczące cen i opcji zakupu hurtowego są dostępne na stronie licencyjnej IronBarcode. Nie ma wymogu posiadania oddzielnej licencji na środowisko uruchomieniowe.

Czy przejście z LEADTOOLS Barcode na IronBarcode jest proste?

Migracja z LEADTOOLS Barcode na IronBarcode polega głównie na zastąpieniu wywołań API opartych na instancji metodami statycznymi IronBarcode, usunięciu zbędnych fragmentów związanych z licencjonowaniem oraz aktualizacji nazw właściwości wyników. Większość migracji polega na redukcji kodu, zamiast jego dodawania.

Czy IronBarcode generuje kody QR z logo?

Tak. Funkcja QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") osadza obraz marki w kodzie QR w sposób natywny z konfigurowalną korekcją błędów. Kolorowe kody QR są również obsługiwane za pomocą funkcji ChangeBarCodeColor().

Jordi Bardia
Inżynier oprogramowania
Jordi jest najbardziej biegły w Pythonie, C# i C++. Kiedy nie wykorzystuje swoich umiejętności w Iron Software, programuje gry. Dzieląc odpowiedzialność za testowanie produktów, rozwój produktów i badania, Jordi wnosi ogromną wartość do ciągłej poprawy produktów. Różnorodne doświadczenia ...
Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie