Wie man Barcodes aus Daten in C# erstellt
Migrating from LEADTOOLSBarCodeto IronBarcode
Dieser Leitfaden beschreibt die vollständige Migration von LEADTOOLSBarCodezu IronBarcode for .NET Entwickler. Es beschäftigt sich mit der Entfernung von LEADTOOLSNuGet-Paketen und einer nativen Laufzeitanforderung, dem Ersatz der dateibasierten LEADTOOLS-Lizenzinitialisierungssequenz durch einen Zeichenfolgenschlüssel und der Übersetzung der Lese- und Schreibmuster von LEADTOOLSin die statische, ausdrucksstarke API von IronBarcode. Für jedes wichtige Migrationsszenario werden Codebeispiele bereitgestellt, zusammen mit einer API-Zuordnungstabelle, einer strukturierten Checkliste und Hinweisen zu Problemen, die während der Umstellung auftreten können.
Warum von LEADTOOLSBarCodemigrieren?
Dateibasierte Lizenzbereitstellung: LEADTOOLS-Lizenzierung erfordert, dass eine .LIC-Datei physisch auf der Festplatte an einem bekannten Pfad auf jedem Computer vorhanden ist, auf dem die Anwendung läuft. Entwickler-Workstations, CI-Build-Agents, Staging-Server und Produktionscontainer benötigen jeweils die Bereitstellung der Datei vor der Initialisierung der Anwendung. Dies ist ein grundlegend anderes Betriebsmodell als bei zeichenkettenbasierten Geheimnissen, die sich nahtlos in Umgebungsvariablen, Geheimnismanager und die Konfiguration von CI/CD-Pipelines integrieren lassen. Jede neue Umgebung, die einer Bereitstellungstopologie hinzugefügt wird – eine neue Cloud-Region, ein neuer Kubernetes-Knotenpool, ein neuer Entwickler-Onboarding-Prozess – erfordert einen Dateibereitstellungsschritt, der bei der zeichenkettenbasierten Lizenzierung nicht erforderlich ist.
SDK-Abdruck: LEADTOOLSBarcode-Installation erfordert das Leadtools.Barcode NuGet-Paket (das Leadtools, Leadtools.Codecs und verwandte Abhängigkeiten einbezieht). PDF-Barcode-Extraktion fügt Leadtools.Pdf hinzu. Unter Windows ist die MSVC++ 2017 Runtime eine separate native Abhängigkeit. Die veröffentlichte Ausgabe einer LEADTOOLS-Barcode-Anwendung beträgt ungefähr 148 MB. Anwendungen, die lediglich Barcodes lesen oder generieren müssen, tragen die volle Last einer umfassenden Bildverarbeitungsplattform – OCR-Infrastruktur, Formatcodec-Architektur und Dokumentenanzeigefunktionen – unabhängig davon, ob diese Funktionen genutzt werden oder nicht.
Legacy-API-Design: LEADTOOLS-Barcode-Operationen erfordern die Erstellung mehrerer Objekte in einer bestimmten Reihenfolge, bevor überhaupt eine Operation durchgeführt werden kann. Das Lesen eines Barcodes erfordert eine RasterCodecs Instanz, um das Bild zu laden, und eine BarcodeEngine Instanz, um es zu scannen, mit einem expliziten BarcodeSymbology Array, das angibt, welche Formate zu suchen sind. Das Erzeugen eines Barcodes erfordert den Aufbau eines BarcodeData Objekts, das Erstellen eines leeren RasterImage mit expliziten Pixelparametern, das Auffüllen mit einer Hintergrundfarbe mittels FillCommand, das Schreiben des Barcodes darauf und das Speichern mit RasterCodecs. Diese API spiegelt die Designmuster ihrer Zeit wider. IronBarcode führt die gleichen Operationen über statische Methodenaufrufe durch, die Dateipfade direkt akzeptieren.
Preistransparenz: LEADTOOLS-Einsatzlizenzen für Produktionsserver werden separat über LEADTOOLS-Vertrieb angeboten und sind nicht auf ihrer Website veröffentlicht. Teams, die ein vollständiges Kostenbild benötigen, bevor sie mit der Entwicklung beginnen, müssen mit dem Vertrieb in Kontakt treten, bevor sie bestätigen können, dass LEADTOOLSin ihr Budget passt. IronBarcode bietet eine unbefristete Einmallizenz, die die Entwicklung und den Einsatz zusammen abdeckt, ohne dass eine separate Produktionslizenz erforderlich ist.
Das grundsätzliche Problem
Die Initialisierungssequenz von LEADTOOLSerfordert über 20 Zeilen und vier Verifikationsschritte, bevor eine BarcodeEngine erstellt werden kann. IronBarcode ersetzt die gesamte Sequenz durch eine einzige Zuweisung:
// 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 vs. LEADTOOLSBarcode: Funktionsvergleich
| Feature | LEADTOOLSBarCode | IronBarcode |
|---|---|---|
| Lizenzmodell | Datei + Entwicklerschlüssel | Nur Zeichenkettenschlüssel |
| Erforderliche NuGet Pakete | 5+ | 1 |
| Native Laufzeitabhängigkeit | MSVC++ 2017 (Windows) | None |
| Veröffentlichte Ausgabegröße | ~148 MB | ~39 MB |
| Unterstützte Symboliken | 40+ | 50+ |
| Automatische Barcode-Erkennung | Beschränkt | Ja |
| PDF-Barcode-Extraktion | Separates Paket erforderlich | Eingebaut |
| ML-Fehlerkorrektur | Nein | Ja |
| QR-Code-Logo-Branding | Nein | Ja |
| Docker-Einsatz | Datei muss eingebunden werden | Umgebungsvariable |
| Initialisierungscode | 20+ Zeilen | 1 Zeile |
| API-Stil | Legacy-Objektgraph | Statisch fließend |
| Plattformübergreifend | Teilweise (native Abhängigkeiten) | Vollversion (.NET Standard) |
| Preisgestaltung für Bereitstellungslizenzen | Kontakt Vertrieb (nicht veröffentlicht) | Im Dauerkauf enthalten |
Schnellstart: LEADTOOLSBarcode-zu- IronBarcode -Migration
Schritt 1: LEADTOOLS-Pakete entfernen
Entfernen Sie alle LEADTOOLS-Pakete aus dem Projekt:
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
Wenn der PDF-Codec zur Barcode-Extraktion aus PDF-Dateien hinzugefügt wurde:
dotnet remove package Leadtools.Pdf
dotnet remove package Leadtools.Pdf
Bei Windows Server-Bereitstellungen kann die MSVC++ 2017 Runtime nach Abschluss der Migration aus den Bereitstellungsskripten entfernt werden. IronBarcode hat auf keiner Plattform native Laufzeitabhängigkeiten.
Schritt 2: IronBarcode installieren
dotnet add package IronBarcode
dotnet add package IronBarcode
Dieses Einzelpaket beinhaltet die Unterstützung aller Bildformate, die native PDF-Barcode-Extraktion, die ML-Fehlerkorrektur und alle über 50 unterstützten Symbologien. Es werden keine zusätzlichen Codec-Pakete benötigt.
Schritt 3: Lizenz initialisieren
Ersetzen Sie den gesamten LEADTOOLS-Initialisierungsblock durch eine einzige Zeile. Finden Sie jeden Aufruf von RasterSupport.SetLicense in der Codebasis — in der Regel gibt es genau einen, beim Anwendungsstart — und ersetzen Sie die gesamte umliegende Initialisierungssequenz:
// Before: entire LEADTOOLSinitialization block (20+ lines)
// After:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Before: entire LEADTOOLSinitialization block (20+ lines)
// After:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Der Lizenzschlüssel kann aus jedem stringfähigen Konfigurationsmechanismus bezogen werden: eine Umgebungsvariable, appsettings.json, Azure Key Vault, AWS Secrets Manager oder ein Kubernetes-Geheimnis. Informationen zur umgebungsbasierten Lizenzkonfiguration, zu Docker-Bereitstellungsmustern und zu allen unterstützten Konfigurationsansätzen finden Sie in der Dokumentation zur Lizenzschlüssel-Einrichtung .
Beispiele für die Code-Migration
Barcodes aus Bildern lesen
LEADTOOLS trennt das Laden von Bildern vom Scannen von Barcodes in zwei separate Objektebenen. Eine RasterCodecs Instanz lädt die Bilddatei in ein RasterImage, und eine BarcodeEngine Instanz scannt sie. Der Anrufer muss auch ein explizites Array von BarcodeSymbology-Werten angeben; Formate, die nicht im Array aufgeführt sind, werden nicht erkannt.
LEADTOOLS-Ansatz:
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
IronBarcode -Ansatz:
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 akzeptiert den Dateipfad direkt, lädt das Bild intern und erkennt automatisch Formate aller über 50 unterstützten Symbologien, ohne dass der Aufrufer die erwarteten Typen angeben muss. Erweiterte Konfigurationseinstellungen – wie die Optimierung der Lesegeschwindigkeit, die Erkennung mehrerer Barcodes und die Verarbeitung von Bildern mit geringer Qualität – finden Sie im Leitfaden zum Lesen von Barcodes aus Bildern .
Generieren eines Code-128-Barcodes
Die Erzeugung von LEADTOOLSerfordert den Aufbau eines BarcodeData Objekts, die Zuweisung eines leeren RasterImage mit expliziten Speicherflags, Pixeltiefe und Byte-Reihenfolge, das Bild mit einer Hintergrundfarbe zu füllen, den Barcode darauf zu schreiben und dann mit RasterCodecs zu speichern. IronBarcode führt all diese Schritte über eine einzige flüssige Methodenkette aus.
LEADTOOLS-Ansatz:
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
IronBarcode -Ansatz:
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")
Eine vollständige Anleitung zu Größenanpassung, Formatierung, Randsteuerung und unterstützten Ausgabeformaten finden Sie unter Erstellen von Barcode-Bildern .
Erstellen eines QR-Codes mit Logo-Branding
LEADTOOLS QR-Code-Erzeugung folgt demselben mehrstufigen RasterImage-Konstruktionsmuster wie andere Barcodetypen. IronBarcode bietet QRCodeWriter mit einer speziellen AddBrandLogo Methode zum Einbetten eines Logos in die Mitte eines QR-Codes.
LEADTOOLS-Ansatz:
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
IronBarcode -Ansatz:
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")
Barcodes aus PDF-Dokumenten extrahieren
LEADTOOLS PDF-Barcode-Extraktion erfordert das separate Leadtools.Pdf Paket, explizite PDF-Ladekonfiguration, eine manuelle Anfrage zur Seitenzählung und eine Schleife über jede Seite. Jede Seite muss individuell als RasterImage geladen werden, bevor gescannt wird. IronBarcode beinhaltet PDF-Unterstützung im Basispaket und übernimmt die Seiteniteration intern.
LEADTOOLS-Ansatz:
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
IronBarcode -Ansatz:
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
Docker-Bereitstellung
Die Dateiverwaltungsanforderung, die jede LEADTOOLSDocker-Bereitstellung kennzeichnet, entfällt bei der Migration zu IronBarcode vollständig.
LEADTOOLS-Ansatz:
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"]
IronBarcode -Ansatz:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY publish/ .
ENV IRONBARCODE_LICENSE=your-license-key
ENTRYPOINT ["dotnet", "YourApp.dll"]
Der Lizenzschlüssel wird zur Laufzeit des Containers über Docker Secrets, Kubernetes Secrets oder einen beliebigen Mechanismus mit Umgebungsvariablen eingebunden. Es ist kein Dateibereitstellungsschritt erforderlich. Der Docker- und Linux-Bereitstellungsleitfaden behandelt Alpine- und Debian-Basis-Images, mehrstufige Builds und Kubernetes-Bereitstellungsmuster.
LEADTOOLSBarcode-API zu IronBarcode -Mapping-Referenz
| LEADTOOLS | IronBarcode | Notizen |
|---|---|---|
RasterSupport.SetLicense(path, key) |
IronBarCode.License.LicenseKey = "key" |
Nur Schlüssel – keine Datei |
RasterSupport.KernelExpired |
(removed) | Keine Ablaufprüfung erforderlich |
RasterSupport.IsLocked(RasterSupportType.Barcode1DRead) |
(removed) | Alle Funktionen enthalten |
RasterSupport.IsLocked(RasterSupportType.Barcode2DRead) |
(removed) | Alle Funktionen enthalten |
RasterSupport.IsLocked(RasterSupportType.BarcodeWrite) |
(removed) | Alle Funktionen enthalten |
new BarcodeEngine() |
Statisch – keine Instanz | BarcodeReader, BarcodeWriter sind statisch |
new RasterCodecs() |
(removed) | Dateipfad direkt übergeben |
codecs.Load(imagePath) |
(removed) | Dateipfad direkt übergeben |
engine.Reader.ReadBarcodes(image, LogicalRectangle.Empty, 0, symbologies) |
BarcodeReader.Read(imagePath) |
Automatische Symbolerkennung |
BarcodeData.Value |
result.Value |
Gleicher Eigenschaftsname |
BarcodeData.Symbology |
result.Format |
Immobilie umbenannt |
new BarcodeData() { Symbology = BarcodeSymbology.Code128 } |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) |
Flüssige Erstellung |
BarcodeSymbology.Code128 |
BarcodeEncoding.Code128 |
Namensraumänderung |
BarcodeSymbology.QR |
BarcodeEncoding.QRCode |
Namensänderung |
BarcodeSymbology.DataMatrix |
BarcodeEncoding.DataMatrix |
Gleicher Name |
BarcodeSymbology.PDF417 |
BarcodeEncoding.PDF417 |
Gleicher Name |
BarcodeSymbology.EAN13 |
BarcodeEncoding.EAN13 |
Gleicher Name |
BarcodeSymbology.UPCA |
BarcodeEncoding.UPCA |
Gleicher Name |
BarcodeSymbology.Interleaved2of5 |
BarcodeEncoding.Interleaved2of5 |
Gleicher Name |
BarcodeSymbology.Codabar |
BarcodeEncoding.Codabar |
Gleicher Name |
engine.Writer.WriteBarcode(image, data, null) + codecs.Save(...) |
.SaveAsPng(path) |
Eine Methodenkette |
new RasterImage(...) + new FillCommand(RasterColor.White).Run(image) |
(removed) | Intern bei IronBarcode |
Gängige Migrationsprobleme und Lösungen
Problem 1: Verweise auf .LIC-Dateien in CI/CD
LEADTOOLS: CI/CD-Pipelines, die LEADTOOLS-Anwendungen aufbauen oder bereitstellen, müssen die .LIC-Datei bereitstellen — entweder indem sie in die Versionskontrolle eingecheckt wird, aus einem Base64-Geheimnis dekodiert oder als Volumenartefakt eingebunden wird. Jede Pipeline-Stufe, die die Anwendung ausführt, benötigt Zugriff auf die Datei.
Lösung: Entfernen Sie alle .LIC Datei-Handling aus der Pipeline. Ersetzen Sie es durch ein String-Geheimnis:
# Example: GitHub Actions environment variable
env:
IRONBARCODE_LICENSE: ${{secrets.IRONBARCODE_LICENSE}}
# Example: GitHub Actions environment variable
env:
IRONBARCODE_LICENSE: ${{secrets.IRONBARCODE_LICENSE}}
Der Zeichenkettenwert wird im CI/CD-Geheimnisspeicher zusammen mit anderen Zeichenketten-Anmeldeinformationen gespeichert. Keine Dateidekodierung, keine Artefaktbereitstellung, keine Volumenkonfiguration erforderlich.
Problem 2: MSVC++-Laufzeitabhängigkeit unter Windows
LEADTOOLS: Für die Bereitstellung von Windows Server muss die MSVC++ 2017-Runtime auf dem Host installiert sein. Bereitstellungsskripte, Container-Basisabbilder und Windows-AMIs, die für LEADTOOLS-Bereitstellungen verwendet werden, enthalten in der Regel einen Schritt zur Installation dieser Runtime.
Lösung: Entfernen Sie den Installationsschritt für die MSVC++ 2017-Laufzeitumgebung aus allen Windows-Bereitstellungsskripten und Containerabbildern. IronBarcode hat keine nativen Laufzeitabhängigkeiten. Das dotnet/aspnet Basisabbild ist ohne zusätzliche Laufzeitpakete ausreichend.
Problem 3: Überprüfung der RasterSupportType-Funktionssperre
LEADTOOLS: Die Initialisierungssequenz beinhaltet RasterSupport.IsLocked()-Überprüfungen für jede Barcode-Funktion — Barcodes1D, Barcodes2D und BarcodeWrite. Diese Prüfungen sind defensiver Code, der von der LEADTOOLS-Architektur benötigt wird, um zu überprüfen, ob die Lizenzdatei alle erforderlichen Funktionen abdeckt.
Lösung: Entfernen Sie alle RasterSupport.IsLocked()-Aufrufe. IronBarcode beinhaltet alle Lese- und Schreibfunktionen in einer einzigen Lizenz. Es gibt keine Sperrzustände für einzelne Funktionen und es ist kein Funktionsverifizierungsschritt erforderlich:
// 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) ...
Ausgabe 4: Entfernung des Barcode-Symbologie-Arrays
LEADTOOLS: Jeder Aufruf von engine.Reader.ReadBarcodes() erfordert einen expliziten BarcodeSymbology[] Parameter. Barcodes, deren Symbologie nicht im Array aufgeführt ist, werden nicht erkannt, was zu stillen Lesefehlern führen kann, wenn ein neuer Barcode-Typ in ein Eingabedokument eingeführt wird.
Lösung: Entfernen Sie das Symbolisierungsarray. BarcodeReader.Read() erkennt alle unterstützten Formate automatisch. Wenn eine Leistungsoptimierung für ein bekanntes Formatsatz erforderlich ist, bietet BarcodeReaderOptions optionale Hinweise, ohne eine erschöpfende Aufzählung zu erfordern:
// 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)
LEADTOOLSBarcode-Migrations-Checkliste
Vor der Migration anfallende Aufgaben
Prüfen Sie vor jeglichen Änderungen alle LEADTOOLS-Nutzungen im Quellcode:
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" .
Dokumentieren Sie die Anzahl und Position von Initialisierungsblöcken, Leseaufrufstellen, Schreibaufrufstellen und Dockerfile-Referenzen, bevor Sie mit den Codeänderungen beginnen.
Aufgaben der Code-Aktualisierung
- Entfernen Sie alle fünf LEADTOOLSNuGet Pakete (und den PDF-Codec, falls vorhanden).
- Installieren Sie
IronBarcodeüberdotnet add package IronBarcode - Ersetzen Sie alle
using Leadtools.*Namespace-Importe durchusing IronBarCode - Ersetzen Sie den gesamten
RasterSupport.SetLicenseInitialisierungsblock durchIronBarCode.License.LicenseKey = "key" - Entfernen Sie alle
RasterSupport.KernelExpiredÜberprüfungen - Entfernen Sie alle
RasterSupport.IsLocked(RasterSupportType.*)Überprüfungen - Entfernen Sie alle
new BarcodeEngine()Instanziierungen - Entfernen Sie alle
new RasterCodecs()Instanziierungen aus Barcode-Codepfaden - Ersetzen Sie
codecs.Load(path)+engine.Reader.ReadBarcodes(image, ...)durchBarcodeReader.Read(path) - Ersetzen Sie
new BarcodeData(...)+new RasterImage(...)+FillCommand+WriteBarcode+codecs.Save()durchBarcodeWriter.CreateBarcode(...).SaveAsPng(path) - Ersetzen Sie
BarcodeSymbology.*-Enum-Verweise durchBarcodeEncoding.*(Hinweis:QRwird zuQRCode) - Entfernen Sie
COPY LEADTOOLS.LIC-Zeilen aus allen Dockerfiles - Entfernen Sie
LEADTOOLS_LICENSE_PATHundLEADTOOLS_DEVELOPER_KEYUmgebungsvariablen-Deklarationen aus Dockerfiles und Bereitstellungskonfiguration - Fügen Sie die
IRONBARCODE_LICENSEUmgebungsvariable zu Dockerfiles und Geheimniskonfiguration hinzu - Entfernen Sie die Installation der MSVC++ 2017-Laufzeitumgebung aus den Windows-Bereitstellungsskripten.
Post-Migrationstests
- Überprüfen Sie, ob alle Barcode-Leseoperationen erwartete Werte für alle durch das
BarcodeSymbology[]Array zuvor abgedeckten Symbologien zurückgeben - Überprüfen Sie, ob Code 128, QR-Code und alle anderen generierten Barcode-Typen gültige, scannbare Ausgaben erzeugen.
- Bestätigen Sie, dass die PDF-Barcode-Extraktion ohne
Leadtools.Pdfkorrekt funktioniert - Bauen und starten Sie das Containerabbild, ohne eine
.LICDatei einzubinden, und bestätigen Sie, dass die Anwendung korrekt initialisiert - Führen Sie die CI/CD-Pipeline ohne den
.LICDatei-Bereitstellungsschritt aus und bestätigen Sie, dass alle Stufen erfolgreich abgeschlossen werden - Überprüfen Sie, ob sich die Größe der veröffentlichten Ausgabedatei und die Abrufzeit des Container-Images verbessert haben.
Wichtigste Vorteile der Migration zu IronBarcode
Vereinfachte Bereitstellungsarchitektur: Nach der Migration erhält jede Umgebung – Entwicklung, CI, Staging, Produktion – die Lizenz über denselben Mechanismus mit Zeichenketten-basierten Geheimnissen, der auch für API-Schlüssel, Datenbankpasswörter und andere Anmeldeinformationen verwendet wird. Es ist keine Dateibereitstellung, keine Artefaktverarbeitung und keine Volume-Mounts erforderlich. Das Hinzufügen einer neuen Bereitstellungsumgebung ist der gleiche Vorgang wie das Hinzufügen eines beliebigen anderen Geheimnisses.
Reduzierte Abhängigkeitsfläche: Ein NuGet Paket ersetzt fünf, und die MSVC++ 2017 Runtime-Anforderung entfällt. Die veröffentlichte Ausgabemenge eines Barcode-Dienstes sinkt von etwa 148 MB auf etwa 39 MB. Kleinere Images bedeuten schnellere Container-Pulls, geringere Speicherkosten in Container-Registries und kürzere Kaltstartzeiten in serverlosen und Auto-Scaling-Umgebungen.
Optimierter Anwendungsstart: Die 20-zeilige Initialisierungssequenz von LEADTOOLS– Dateipfadauflösung, Ablaufprüfung und drei Sperrprüfungen pro Funktion – wurde durch eine einzige Zeile ersetzt. Der Anwendungsstart erfolgt schneller, und der Initialisierungscode ist unabhängig vom Dateisystem und könnte in einer neuen Umgebung nicht fehlschlagen.
Umfassende Formaterkennung: IronBarcode liest alle über 50 unterstützten Symbologien, ohne dass der Aufrufer die erwarteten Formate angeben muss. Das Risiko stiller verpasster Lesevorgänge — verursacht durch das Auslassen einer Symbologie aus dem LEADTOOLSBarcodeSymbology[] Array — wird beseitigt. Wenn in einem Eingabedokument ein neuer Barcode-Typ auftaucht, erkennt IronBarcode diesen, ohne dass eine Codeänderung erforderlich ist.
Vorhersehbare Gesamtkosten: Mit dem Kauf einer einzigen unbefristeten Lizenz sind Entwicklung, Tests und unbegrenzte Produktionsbereitstellungen abgedeckt – ohne Bereitstellungsnachverfolgung, ohne jährliche Verlängerungspflicht und ohne separate Produktionslizenz. Teams können die Gesamtkosten der Bibliothek vor Beginn der Entwicklung ohne Verkaufsgespräch bestätigen.
Modernes API-Design: BarcodeReader.Read() und BarcodeWriter.CreateBarcode() sind statische Einstiegspunkte, die Dateipfade direkt akzeptieren. Die mehrschichtige Objektkonstruktion, die LEADTOOLSzum Lesen und Schreiben benötigt – Codec-Instanzen, Engine-Instanzen, Bildzuordnung, Hintergrundfüllung – wird intern gehandhabt. Code, der Barcodes liest und generiert, ist kürzer, leichter zu überprüfen und einfacher zu testen.
Häufig gestellte Fragen
Warum sollte ich von LEADTOOLS BarCode auf IronBarcode umsteigen?
Zu den häufigsten Gründen gehören die Vereinfachung der Lizenzierung (Beseitigung der Komplexität von SDK und Laufzeitschlüsseln), die Beseitigung von Durchsatzbeschränkungen, die Verbesserung der nativen PDF-Unterstützung, die Verbesserung der Docker/CI/CD-Bereitstellung und die Verringerung von API-Boilerplate im Produktionscode.
Wie kann ich LEADTOOLS API-Aufrufe durch IronBarcode ersetzen?
Ersetzen Sie Instanzerstellung und Lizenzierung durch IronBarCode.License.LicenseKey = "key". Ersetzen Sie die Leseaufrufe durch BarcodeReader.Read(path) und die Schreibaufrufe durch BarcodeWriter.CreateBarcode(data, encoding). Statische Methoden erfordern keine Instanzverwaltung.
Wie viel Code ändert sich bei der Migration von LEADTOOLS BarCode zu IronBarcode?
Die meisten Migrationen führen zu weniger Codezeilen. Lizenzierungs-Boilerplate, Instanzkonstruktoren und explizite Formatkonfiguration werden entfernt. Zentrale Lese-/Schreibvorgänge werden auf kürzere IronBarcode-Äquivalente mit saubereren Ergebnisobjekten abgebildet.
Muss ich während der Migration sowohl LEADTOOLS Barcode als auch IronBarcode installiert lassen?
Nein. Die meisten Migrationen sind direkte Ersetzungen und keine Paralleloperationen. Migrieren Sie eine Serviceklasse nach der anderen, ersetzen Sie die NuGet-Referenz und aktualisieren Sie die Instanzierungs- und API-Aufrufmuster, bevor Sie zur nächsten Klasse übergehen.
Wie lautet der NuGet-Paketname für IronBarcode?
Das Paket ist 'IronBarCode' (mit großem B und C). Installieren Sie es mit 'Install-Package IronBarCode' oder 'dotnet add package IronBarCode'. Die using-Anweisung im Code lautet 'using IronBarCode;'.
Wie vereinfacht IronBarcode die Docker-Bereitstellung im Vergleich zu LEADTOOLS BarCode?
IronBarcode ist ein NuGet-Paket, für das keine externen SDK-Dateien oder Lizenzkonfigurationen erforderlich sind. In Docker setzen Sie die Umgebungsvariable IRONBARCODE_LICENSE_KEY und das Paket übernimmt die Lizenzvalidierung beim Start.
Erkennt IronBarcode nach der Migration von LEADTOOLS alle Barcode-Formate automatisch?
Ja, IronBarcode erkennt automatisch die Symbologie aller unterstützten Formate. Eine explizite Aufzählung von BarcodeTypes ist nicht erforderlich. Wenn das Format bereits bekannt ist und die Leistung eine Rolle spielt, ermöglicht BarcodeReaderOptions die Einschränkung des Suchraums als eine Optimierung.
Kann IronBarcode Barcodes aus PDFs ohne eine separate Bibliothek lesen?
Ja, BarcodeReader.Read("document.pdf") verarbeitet PDF-Dateien nativ. Die Ergebnisse enthalten PageNumber, Format, Value und Confidence für jeden gefundenen Barcode. Es ist kein externer PDF-Rendering-Schritt erforderlich.
Wie handhabt IronBarcode die parallele Verarbeitung von Barcodes?
Die statischen Methoden von IronBarcode sind zustandslos und thread-sicher. Verwenden Sie Parallel.ForEach direkt über Dateilisten ohne Instanzmanagement pro Thread. BarcodeReaderOptions.MaxParallelThreads steuert das interne Thread-Budget.
Welche Ergebniseigenschaften ändern sich bei der Migration von LEADTOOLS BarCode zu IronBarcode?
Übliche Umbenennungen: BarcodeValue wird zu Value, BarcodeType wird zu Format. IronBarcode-Ergebnisse fügen auch Confidence und PageNumber hinzu. Eine lösungsweite Such- und Ersetzungsfunktion übernimmt die Umbenennungen im bestehenden Ergebnisverarbeitungscode.
Wie kann ich die IronBarcode-Lizenzierung in einer CI/CD-Pipeline einrichten?
Speichern Sie IRONBARCODE_LICENSE_KEY als Pipeline-Geheimnis und weisen Sie IronBarCode.License.LicenseKey im Startup-Code der Anwendung zu. Ein Geheimnis deckt alle Umgebungen ab, einschließlich Entwicklung, Test, Staging und Produktion.
Unterstützt IronBarcode die Generierung von QR-Codes mit benutzerdefiniertem Styling?
Ja. QRCodeWriter.CreateQrCode() unterstützt benutzerdefinierte Farben über ChangeBarCodeColor(), das Einbetten von Logos über AddBrandLogo(), konfigurierbare Fehlerkorrekturstufen und mehrere Ausgabeformate einschließlich PNG, JPG, PDF und Stream.

