Zum Fußzeileninhalt springen
VIDEOS

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()
$vbLabelText   $csharpLabel
// IronBarcode: one line, no file required
using IronBarCode;

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

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

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

IronBarcode 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
SHELL

Wenn der PDF-Codec zur Barcode-Extraktion aus PDF-Dateien hinzugefügt wurde:

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

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
SHELL

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

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

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

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

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

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

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

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

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

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}}
YAML

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

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

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

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

  1. Entfernen Sie alle fünf LEADTOOLSNuGet Pakete (und den PDF-Codec, falls vorhanden).
  2. Installieren Sie IronBarcode über dotnet add package IronBarcode
  3. Ersetzen Sie alle using Leadtools.* Namespace-Importe durch using IronBarCode
  4. Ersetzen Sie den gesamten RasterSupport.SetLicense Initialisierungsblock durch IronBarCode.License.LicenseKey = "key"
  5. Entfernen Sie alle RasterSupport.KernelExpired Überprüfungen
  6. Entfernen Sie alle RasterSupport.IsLocked(RasterSupportType.*) Überprüfungen
  7. Entfernen Sie alle new BarcodeEngine() Instanziierungen
  8. Entfernen Sie alle new RasterCodecs() Instanziierungen aus Barcode-Codepfaden
  9. Ersetzen Sie codecs.Load(path) + engine.Reader.ReadBarcodes(image, ...) durch BarcodeReader.Read(path)
  10. Ersetzen Sie new BarcodeData(...) + new RasterImage(...) + FillCommand + WriteBarcode + codecs.Save() durch BarcodeWriter.CreateBarcode(...).SaveAsPng(path)
  11. Ersetzen Sie BarcodeSymbology.*-Enum-Verweise durch BarcodeEncoding.* (Hinweis: QR wird zu QRCode)
  12. Entfernen Sie COPY LEADTOOLS.LIC-Zeilen aus allen Dockerfiles
  13. Entfernen Sie LEADTOOLS_LICENSE_PATH und LEADTOOLS_DEVELOPER_KEY Umgebungsvariablen-Deklarationen aus Dockerfiles und Bereitstellungskonfiguration
  14. Fügen Sie die IRONBARCODE_LICENSE Umgebungsvariable zu Dockerfiles und Geheimniskonfiguration hinzu
  15. 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.Pdf korrekt funktioniert
  • Bauen und starten Sie das Containerabbild, ohne eine .LIC Datei einzubinden, und bestätigen Sie, dass die Anwendung korrekt initialisiert
  • Führen Sie die CI/CD-Pipeline ohne den .LIC Datei-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.

Hinweis:LEADTOOLS ist eine eingetragene Marke des jeweiligen Eigentümers. Diese Seite ist nicht mit LEAD Technologies verbunden, wird nicht von ihr unterstützt oder gesponsert. Alle Produktnamen, Logos und Marken sind Eigentum ihrer jeweiligen Eigentümer. Vergleiche dienen nur zu Informationszwecken und spiegeln öffentlich zugängliche Informationen zum Zeitpunkt des Schreibens wider.

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.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen

Iron-Support-Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an