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()
// 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")
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
Jeśli dodano kodek PDF do wyodrębniania BARCODE-ów z plików PDF:
dotnet remove package Leadtools.Pdf
dotnet remove package Leadtools.Pdf
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
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"
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
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
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
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")
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
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")
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
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
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}}
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) ...
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)
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" .
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
- Usuń wszystkie pięć pakietówLEADTOOLSNuGet (oraz kodek PDF, jeśli jest obecny)
- Zainstaluj
IronBarcodepoprzezdotnet add package IronBarcode - Zastąp wszystkie importy przestrzeni nazw
using Leadtools.*przezusing IronBarCode - Zastąp cały blok inicjalizacji
RasterSupport.SetLicenseprzezIronBarCode.License.LicenseKey = "key" - Usuń wszystkie kontrole
RasterSupport.KernelExpired - Usuń wszystkie kontrole
RasterSupport.IsLocked(RasterSupportType.*) - Usuń wszystkie instancje
new BarcodeEngine() - Usuń wszystkie instancje
new RasterCodecs()z ścieżek kodów kreskowych - Zastąp
codecs.Load(path)+engine.Reader.ReadBarcodes(image, ...)przezBarcodeReader.Read(path) - Zastąp
new BarcodeData(...)+new RasterImage(...)+FillCommand+WriteBarcode+codecs.Save()przezBarcodeWriter.CreateBarcode(...).SaveAsPng(path) - Zastąp odniesienia
BarcodeSymbology.*do wyliczeń przezBarcodeEncoding.*(uwaga:QRstaje sięQRCode) - Usuń linie
COPY LEADTOOLS.LICz wszystkich plików Dockerfile - Usuń deklaracje zmiennych środowiskowych
LEADTOOLS_LICENSE_PATHiLEADTOOLS_DEVELOPER_KEYz Dockerfiles i konfiguracji wdrożenia - Dodaj zmienną środowiskową
IRONBARCODE_LICENSEdo Dockerfiles i konfiguracji tajemnic - 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
.LICi potwierdź, że aplikacja prawidłowo się inicjalizuje - Uruchom potok CI/CD bez kroku povizjonowania pliku
.LICi 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ń.

