Zum Fußzeileninhalt springen
VIDEOS

Ein Vergleich von IronBarcode und der ZXing Net Bibliothek

Migrating from Scandit SDKto IronBarcode

Scandit SDK ist eine Kamera-Scanning-Plattform, die für die Echtzeit-Barcode-Erkennung auf Mobilgeräten entwickelt wurde. IronBarcode ist eine serverseitige und dateibasierte Barcode-Verarbeitungsbibliothek für .NET. Diese beiden Bibliotheken dienen unterschiedlichen primären Anwendungsfällen, und eine Migration von der einen zur anderen ist nur unter bestimmten Umständen relevant.

Dieser Leitfaden beschreibt den Migrationspfad für Teams, die die .NET Pakete von Scandit zur Verarbeitung von Dateien, PDFs oder serverseitigen Dokumentenströmen verwenden – Szenarien, in denen die Kamerapipeline-Architektur von Scandit eher Reibungsverluste als Nutzen erzeugt. Wenn Ihre Hauptanforderung darin besteht, eine mobile Kamera auf physische Objekte zu richten und Echtzeit-Feedback mit Augmented-Reality-Overlays zu erhalten, bleibt Scandit das geeignete Werkzeug und diese Anleitung ist nicht anwendbar. Wenn Sie Barcodes aus hochgeladenen Bildern lesen, Barcode-Daten aus PDF-Dokumenten extrahieren oder die Barcode-Erkennung in ASP.NET Core, Azure Functions, Docker-Containern oder Hintergrundverarbeitungsdiensten ausführen möchten, bietet Ihnen dieser Leitfaden einen vollständigen Migrationspfad.

Warum vom Scandit SDKmigrieren?

Kameraverarbeitungsoverhead: Jede Scandit-Integration beginnt mit der gleichen Initialisierungssequenz, unabhängig davon, ob eine Kamera in der Umgebung vorhanden ist: Konstruktion eines DataCaptureContext, Konfiguration BarcodeCaptureSettings, Aufzählung der zu aktivierenden Symbologien, Erwerb einer Camera-Instanz, Zuweisung als Frame-Quelle, Aktivierung der Kamera in einen aktiven Zustand versetzen und Barcode-Erfassung aktivieren. Diese Initialisierung ist notwendig, da Scandit Live-Videobilder verarbeitet. Für die serverseitige Dateiverarbeitung bietet die Sequenz keinen Vorteil und führt zu einer zustandsbehafteten Komplexität, die in der Zielumgebung kein Äquivalent hat – es gibt keine Kamera in einem Docker-Container und keine Frame-Quelle in einer Azure-Funktion.

Keine Preisangaben: Scandit veröffentlicht keine Preise. SparkScan, MatrixScan, ID Scanning, AR Overlays und Parser sind einzeln bepreiste Produkte, für die jeweils eine separate Verkaufsanfrage erforderlich ist. Ein Budgetvorschlag, ein Lieferantenvergleich oder eine Kosten-Nutzen-Analyse kann nicht abgeschlossen werden, ohne in einen Verkaufszyklus einzutreten. IronBarcode veröffentlicht seine Preise – 749 $, 1499 $ oder 2999 $ als einmaliger, dauerhafter Kauf – sodass die Zahl bereits auf der Seite steht, bevor eine Zeile Code geschrieben wird.

Obligatorische Symbologie-Deklaration: Scandit erfordert die explizite Aktivierung jedes Barcode-Formats vor Beginn einer Scan-Sitzung. Bei Echtzeit-Kamerascans handelt es sich um eine Leistungsoptimierung – die Einschränkung der Symbologien reduziert den Verarbeitungsaufwand pro Frame. Bei der dateibasierten Dokumentenverarbeitung, bei der eingehende Dokumente beliebige Barcode-Formate von beliebigen Lieferanten oder Partnern aufweisen können, wird die obligatorische Formatangabe zu einer Einschränkung. Die Aufzählung aller möglichen Symboliken beseitigt den Leistungsvorteil; Das Schreiben einer Logik zur Formatvorhersage zusätzlich zur Bibliothek verursacht zusätzlichen Entwicklungsaufwand.

Kein PDF-Support: Es gibt kein direktes Äquivalent zu BarcodeReader.Read("invoice.pdf") in der Scandit-API. Das Extrahieren von Barcodes aus einem PDF-Dokument erfordert das Rendern jeder Seite in ein Rasterbild mithilfe einer separaten Bibliothek und die anschließende Verarbeitung dieser gerenderten Bilder durch eine Kamerasimulationspipeline. Dieser Ansatz führt zu zusätzlichen Abhängigkeiten, zusätzlichen Lizenzen und einem erheblichen Entwicklungsaufwand für eine Aufgabe, die in Dokumentenverarbeitungs-Workflows routinemäßig anfällt.

Das grundsätzliche Problem

Scandit benötigt eine laufende Kamera, bevor mit der Barcode-Verarbeitung begonnen werden kann. IronBarcode benötigt lediglich einen Dateipfad:

// Scandit SDK: mandatory camera pipeline before first barcode read
var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");
var settings = BarcodeCaptureSettings.Create();
settings.EnableSymbologies(new HashSet<Symbology>
{
    Symbology.Ean13Upca,
    Symbology.Ean8,
    Symbology.Code128,
    Symbology.QrCode
});
var barcodeCapture = BarcodeCapture.Create(dataCaptureContext, settings);
var camera = Camera.GetDefaultCamera();
await dataCaptureContext.SetFrameSourceAsync(camera);
await camera.SwitchToDesiredStateAsync(FrameSourceState.On);
barcodeCapture.IsEnabled = true;
// Results arrive later via BarcodeScanned event callback
// Scandit SDK: mandatory camera pipeline before first barcode read
var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");
var settings = BarcodeCaptureSettings.Create();
settings.EnableSymbologies(new HashSet<Symbology>
{
    Symbology.Ean13Upca,
    Symbology.Ean8,
    Symbology.Code128,
    Symbology.QrCode
});
var barcodeCapture = BarcodeCapture.Create(dataCaptureContext, settings);
var camera = Camera.GetDefaultCamera();
await dataCaptureContext.SetFrameSourceAsync(camera);
await camera.SwitchToDesiredStateAsync(FrameSourceState.On);
barcodeCapture.IsEnabled = true;
// Results arrive later via BarcodeScanned event callback
Imports Scandit.DataCapture.Core
Imports Scandit.DataCapture.Barcode
Imports System.Collections.Generic

' Scandit SDK: mandatory camera pipeline before first barcode read
Dim dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE")
Dim settings = BarcodeCaptureSettings.Create()
settings.EnableSymbologies(New HashSet(Of Symbology) From {
    Symbology.Ean13Upca,
    Symbology.Ean8,
    Symbology.Code128,
    Symbology.QrCode
})
Dim barcodeCapture = BarcodeCapture.Create(dataCaptureContext, settings)
Dim camera = Camera.GetDefaultCamera()
Await dataCaptureContext.SetFrameSourceAsync(camera)
Await camera.SwitchToDesiredStateAsync(FrameSourceState.On)
barcodeCapture.IsEnabled = True
' Results arrive later via BarcodeScanned event callback
$vbLabelText   $csharpLabel
// IronBarcode: direct file reading
// NuGet: dotnet add package IronBarcode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
    Console.WriteLine($"{result.Value} ({result.Format})");
// IronBarcode: direct file reading
// NuGet: dotnet add package IronBarcode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
    Console.WriteLine($"{result.Value} ({result.Format})");
Imports IronBarCode

' IronBarcode: direct file reading
' NuGet: dotnet add package IronBarcode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
    Console.WriteLine($"{result.Value} ({result.Format})")
Next
$vbLabelText   $csharpLabel

Der gesamte Kamera-Pipeline-Block – Kontext-Erstellung, Einstellungen, Symbolisierungsaktivierung, Kameraerfassung, Frame-Quellen-Zuweisung, Zustandsübergang – wird durch eine Lizenzschlüsselzuweisung und einen einzigen Methodenaufruf ersetzt.

IronBarcode vs. Scandit SDK: Funktionsvergleich

Feature Scandit SDK IronBarcode
Primäre Bereitstellung Scannen mit der Handykamera Server-, Cloud- und Desktop-Dateiverarbeitung
Kamera erforderlich Ja Nein
Bilddatei lesen Nicht für diesen Zweck entwickelt Primärer Eingabetyp
PDF-Barcode-Extraktion Nicht unterstützt Native Unterstützung für mehrseitige Seiten
Eingabestrom / Byte-Array Nicht unterstützt Ja
Automatische Formaterkennung Nein (muss angegeben werden) Ja (Standardverhalten)
Ereignisgesteuerte Ergebnisse Ja (BarcodeScanned-Callback) Nein (synchrone Rückgabe)
ASP.NET Core / serverseitig Nicht für diesen Zweck entwickelt Vollständig unterstützt
Azure Functions / serverlos Nicht praktikabel Vollständig unterstützt
Docker / Linux Nicht unterstützt Vollständig unterstützt
Barcode-Generierung Nicht unterstützt Im Paket enthalten
Mehrfach-Barcode-Erkennung MatrixScan (separates Produkt) Im Paket enthalten
Preismodell Kontaktieren Sie den Vertrieb (pro Produkt) Veröffentlichte unbefristete Stufen
Gebühren pro Scan / pro Gerät Ja Nein

Schnellstart

Schritt 1: Ersetzen des NuGet-Pakets

Scandit-Pakete entfernen:

dotnet remove package Scandit.BarcodePicker
dotnet remove package Scandit.DataCapture.Core
dotnet remove package Scandit.DataCapture.Barcode
dotnet remove package Scandit.BarcodePicker
dotnet remove package Scandit.DataCapture.Core
dotnet remove package Scandit.DataCapture.Barcode
SHELL

IronBarcode installieren:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

Schritt 2: Namespaces aktualisieren

Ersetzen Sie Scandit-Namespace-Importe durch den IronBarcode-Namespace:

// Before (Scandit SDK)
using Scandit.DataCapture.Core;
using Scandit.DataCapture.Barcode;
using Scandit.DataCapture.Barcode.Data;

// After (IronBarcode)
using IronBarCode;
// Before (Scandit SDK)
using Scandit.DataCapture.Core;
using Scandit.DataCapture.Barcode;
using Scandit.DataCapture.Barcode.Data;

// After (IronBarcode)
using IronBarCode;
' Before (Scandit SDK)
Imports Scandit.DataCapture.Core
Imports Scandit.DataCapture.Barcode
Imports Scandit.DataCapture.Barcode.Data

' After (IronBarcode)
Imports IronBarCode
$vbLabelText   $csharpLabel

Schritt 3: Lizenz initialisieren

Fügen Sie die Lizenzinitialisierung beim Start der Anwendung hinzu, indem Sie den DataCaptureContext.ForLicenseKey-Aufruf ersetzen:

// Before (Scandit SDK)
var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");

// After (IronBarcode)
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Before (Scandit SDK)
var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");

// After (IronBarcode)
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Before (Scandit SDK)
Dim dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE")

' After (IronBarcode)
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Beispiele für die Code-Migration

Barcodes aus einer Bilddatei lesen

Die Verarbeitung einer statischen Bilddatei ist ein von IronBarcode standardmäßig unterstützter Anwendungsfall, während dies in Scandit ein nicht unterstützter Workflow ist. Das Scandit SDKverarbeitet Live-Kamerabilder; Das Lesen einer Datei erfordert die Anpassung der Aufnahmepipeline, um eine Bitmap als Framequelle zu behandeln, wofür es keine native Implementierung gibt.

Scandit SDK-Ansatz:

// Scandit SDKhas no direct file-read API.
// Reading a static image requires constructing a bitmap frame source
// and routing it through the capture pipeline — an unsupported workaround.
// The standard Scandit integration assumes a running camera at all times.
// Scandit SDKhas no direct file-read API.
// Reading a static image requires constructing a bitmap frame source
// and routing it through the capture pipeline — an unsupported workaround.
// The standard Scandit integration assumes a running camera at all times.
' Scandit SDK has no direct file-read API.
' Reading a static image requires constructing a bitmap frame source
' and routing it through the capture pipeline — an unsupported workaround.
' The standard Scandit integration assumes a running camera at all times.
$vbLabelText   $csharpLabel

IronBarcode -Ansatz:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

var results = BarcodeReader.Read("product-label.png");
foreach (var result in results)
{
    Console.WriteLine($"Value: {result.Value}");
    Console.WriteLine($"Format: {result.Format}");
    Console.WriteLine($"Confidence: {result.Confidence}%");
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

var results = BarcodeReader.Read("product-label.png");
foreach (var result in results)
{
    Console.WriteLine($"Value: {result.Value}");
    Console.WriteLine($"Format: {result.Format}");
    Console.WriteLine($"Confidence: {result.Confidence}%");
}
Imports IronBarCode

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

Dim results = BarcodeReader.Read("product-label.png")
For Each result In results
    Console.WriteLine($"Value: {result.Value}")
    Console.WriteLine($"Format: {result.Format}")
    Console.WriteLine($"Confidence: {result.Confidence}%")
Next
$vbLabelText   $csharpLabel

Das Einlesen von Barcodes aus Bildern mit IronBarcode erfordert keine Pipeline-Einrichtung. Die Ergebnissammlung steht unmittelbar nach Rückgabe der Methode zur Verfügung; ein Ereignisabonnement ist nicht erforderlich.

Barcodes aus einem PDF-Dokument extrahieren

Die Extraktion von PDF-Barcodes ist ein völlig neues Gebiet bei der Migration von Scandit, da Scandit keine PDF-Unterstützung bietet. IronBarcode liest PDF-Dokumente direkt und liefert Ergebnisse, die nach Seitenzahl indexiert sind.

Scandit SDK-Ansatz:

// Scandit SDK: no PDF support.
// Implementing PDF barcode extraction with Scandit requires:
// 1. A separate PDF rendering library to convert pages to raster images
// 2. Routing each rendered image through the camera simulation pipeline
// 3. Correlating results back to page numbers manually
// This is not a supported workflow and requires significant custom engineering.
// Scandit SDK: no PDF support.
// Implementing PDF barcode extraction with Scandit requires:
// 1. A separate PDF rendering library to convert pages to raster images
// 2. Routing each rendered image through the camera simulation pipeline
// 3. Correlating results back to page numbers manually
// This is not a supported workflow and requires significant custom engineering.
' Scandit SDK: no PDF support.
' Implementing PDF barcode extraction with Scandit requires:
' 1. A separate PDF rendering library to convert pages to raster images
' 2. Routing each rendered image through the camera simulation pipeline
' 3. Correlating results back to page numbers manually
' This is not a supported workflow and requires significant custom engineering.
$vbLabelText   $csharpLabel

IronBarcode -Ansatz:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

var results = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in results)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})");
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

var results = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in results)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})");
}
Imports IronBarCode

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

Dim results = BarcodeReader.Read("shipping-manifest.pdf")
For Each result In results
    Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})")
Next
$vbLabelText   $csharpLabel

Eine vollständige Anleitung zum Lesen von Barcodes aus PDF-Dokumenten , einschließlich der Auswahl von Seitenbereichen und der Verarbeitung mehrerer Barcodes, finden Sie in der IronBarcode Dokumentation, die das gesamte Spektrum der PDF-Verarbeitungsszenarien abdeckt. Es ist keine zusätzliche PDF-Bibliothek erforderlich.

Umwandlung von Ereignis-Callbacks in direkte Rückgabewerte

Scandit liefert Barcode-Ergebnisse durch das BarcodeScanned-Ereignis, weil die Echtzeit-Kamera-Scannung inhärent asynchron ist – Ergebnisse treffen ein, wenn die Kamera einen Barcode im aktuellen Frame erkennt. IronBarcode gibt Ergebnisse als typisierte Sammlung zurück, da das dateibasierte Lesen eine bekannte Abschlussgrenze hat. Dies ist eine der strukturell bedeutendsten Veränderungen in der Migration.

Scandit SDK-Ansatz:

// Scandit SDK: event-driven result delivery
barcodeCapture.BarcodeScanned += (sender, args) =>
{
    foreach (var barcode in args.Session.NewlyRecognizedBarcodes)
    {
        string value = barcode.Data;
        string symbology = barcode.Symbology.ToString();

        // Processing logic embedded inside event handler
        LogBarcodeResult(value, symbology);
        UpdateInventory(value);
    }
};

// Scan continues indefinitely until camera session is terminated
// Scandit SDK: event-driven result delivery
barcodeCapture.BarcodeScanned += (sender, args) =>
{
    foreach (var barcode in args.Session.NewlyRecognizedBarcodes)
    {
        string value = barcode.Data;
        string symbology = barcode.Symbology.ToString();

        // Processing logic embedded inside event handler
        LogBarcodeResult(value, symbology);
        UpdateInventory(value);
    }
};

// Scan continues indefinitely until camera session is terminated
Imports System

' Scandit SDK: event-driven result delivery
AddHandler barcodeCapture.BarcodeScanned, Sub(sender, args)
    For Each barcode In args.Session.NewlyRecognizedBarcodes
        Dim value As String = barcode.Data
        Dim symbology As String = barcode.Symbology.ToString()

        ' Processing logic embedded inside event handler
        LogBarcodeResult(value, symbology)
        UpdateInventory(value)
    Next
End Sub

' Scan continues indefinitely until camera session is terminated
$vbLabelText   $csharpLabel

IronBarcode -Ansatz:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

var results = BarcodeReader.Read("document.png");
foreach (var result in results)
{
    // Same processing logic, now in standard control flow
    LogBarcodeResult(result.Value, result.Format.ToString());
    UpdateInventory(result.Value);
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

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

var results = BarcodeReader.Read("document.png");
foreach (var result in results)
{
    // Same processing logic, now in standard control flow
    LogBarcodeResult(result.Value, result.Format.ToString());
    UpdateInventory(result.Value);
}
Imports IronBarCode

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

Dim results = BarcodeReader.Read("document.png")
For Each result In results
    ' Same processing logic, now in standard control flow
    LogBarcodeResult(result.Value, result.Format.ToString())
    UpdateInventory(result.Value)
Next
$vbLabelText   $csharpLabel

Die gesamte Verarbeitungslogik, die in Ereignisbehandlungs-Callbacks eingebettet war, wird in standardmäßigen sequenziellen Code verschoben. Fehlerbehandlung, Protokollierung und nachgelagerte Operationen können mithilfe gewöhnlicher Kontrollflussmuster anstatt Ereignisbehandlungsmuster strukturiert werden.

ASP.NET Core -Endpunkt für Datei-Upload

Ein zustandsloser Serverendpunkt, der Barcodes aus einer hochgeladenen Datei liest, stellt den primären serverseitigen Anwendungsfall für IronBarcode dar. Dieses Muster wird von der Kamera-Pipeline-Architektur von Scandit nicht unterstützt.

Scandit SDK-Ansatz:

// Scandit SDK: not applicable to ASP.NET Core file upload scenarios.
// The DataCaptureContext requires a camera hardware session.
// There is no mechanism to process an IFormFile through the Scandit pipeline
// without substantial custom camera-simulation infrastructure.
// Scandit SDK: not applicable to ASP.NET Core file upload scenarios.
// The DataCaptureContext requires a camera hardware session.
// There is no mechanism to process an IFormFile through the Scandit pipeline
// without substantial custom camera-simulation infrastructure.
' Scandit SDK: not applicable to ASP.NET Core file upload scenarios.
' The DataCaptureContext requires a camera hardware session.
' There is no mechanism to process an IFormFile through the Scandit pipeline
' without substantial custom camera-simulation infrastructure.
$vbLabelText   $csharpLabel

IronBarcode -Ansatz:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

[ApiController]
[Route("api/[controller]")]
public class BarcodeController : ControllerBase
{
    [HttpPost("scan")]
    public IActionResult ScanUploadedDocument(IFormFile file)
    {
        if (file == null || file.Length == 0)
            return BadRequest("No file provided");

        using var stream = file.OpenReadStream();
        var results = BarcodeReader.Read(stream);

        if (!results.Any())
            return NotFound("No barcodes detected");

        return Ok(results.Select(r => new
        {
            r.Value,
            Format = r.Format.ToString(),
            r.PageNumber
        }));
    }
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

[ApiController]
[Route("api/[controller]")]
public class BarcodeController : ControllerBase
{
    [HttpPost("scan")]
    public IActionResult ScanUploadedDocument(IFormFile file)
    {
        if (file == null || file.Length == 0)
            return BadRequest("No file provided");

        using var stream = file.OpenReadStream();
        var results = BarcodeReader.Read(stream);

        if (!results.Any())
            return NotFound("No barcodes detected");

        return Ok(results.Select(r => new
        {
            r.Value,
            Format = r.Format.ToString(),
            r.PageNumber
        }));
    }
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc

<ApiController>
<Route("api/[controller]")>
Public Class BarcodeController
    Inherits ControllerBase

    <HttpPost("scan")>
    Public Function ScanUploadedDocument(file As IFormFile) As IActionResult
        If file Is Nothing OrElse file.Length = 0 Then
            Return BadRequest("No file provided")
        End If

        Using stream = file.OpenReadStream()
            Dim results = BarcodeReader.Read(stream)

            If Not results.Any() Then
                Return NotFound("No barcodes detected")
            End If

            Return Ok(results.Select(Function(r) New With {
                .Value = r.Value,
                .Format = r.Format.ToString(),
                .PageNumber = r.PageNumber
            }))
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

Die BarcodeReader.Read-Methode akzeptiert ein Stream direkt von IFormFile.OpenReadStream(), ohne dass eine temporäre Datei erstellt werden muss. Die Ergebnisse werden synchron innerhalb des Anfrage-Antwort-Zyklus zurückgegeben, ohne asynchrone Kameraverwaltung.

Gleichzeitige Stapelverarbeitung mehrerer Dokumente

Bei der Verarbeitung großer Dokumentenmengen ist eine parallele Verarbeitung über mehrere Threads erforderlich. Da die API von IronBarcode zustandslos ist, ist sie von Natur aus thread-sicher und fügt sich direkt in Parallel.ForEach und asynchrone Aufgabenmuster ein.

Scandit SDK-Ansatz:

// Scandit SDK: no supported batch file processing pattern.
// The FrameSourceState model assumes a continuous camera session,
// not a queue of discrete documents. Batch processing would require
// one camera simulation pipeline per document or serialized processing
// through a shared pipeline — neither is a supported workflow.
// Scandit SDK: no supported batch file processing pattern.
// The FrameSourceState model assumes a continuous camera session,
// not a queue of discrete documents. Batch processing would require
// one camera simulation pipeline per document or serialized processing
// through a shared pipeline — neither is a supported workflow.
' Scandit SDK: no supported batch file processing pattern.
' The FrameSourceState model assumes a continuous camera session,
' not a queue of discrete documents. Batch processing would require
' one camera simulation pipeline per document or serialized processing
' through a shared pipeline — neither is a supported workflow.
$vbLabelText   $csharpLabel

IronBarcode -Ansatz:

// NuGet: dotnet add package IronBarcode
using IronBarCode;
using System.Collections.Concurrent;

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

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var files = Directory.GetFiles("./documents/", "*.pdf");
var allResults = new ConcurrentBag<(string File, BarcodeResult Result)>();

Parallel.ForEach(files, file =>
{
    var results = BarcodeReader.Read(file, options);
    foreach (var result in results)
        allResults.Add((file, result));
});

foreach (var (file, result) in allResults)
    Console.WriteLine($"{Path.GetFileName(file)}: {result.Value} ({result.Format})");
// NuGet: dotnet add package IronBarcode
using IronBarCode;
using System.Collections.Concurrent;

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

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var files = Directory.GetFiles("./documents/", "*.pdf");
var allResults = new ConcurrentBag<(string File, BarcodeResult Result)>();

Parallel.ForEach(files, file =>
{
    var results = BarcodeReader.Read(file, options);
    foreach (var result in results)
        allResults.Add((file, result));
});

foreach (var (file, result) in allResults)
    Console.WriteLine($"{Path.GetFileName(file)}: {result.Value} ({result.Format})");
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.IO
Imports System.Threading.Tasks

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

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True,
    .MaxParallelThreads = 4
}

Dim files = Directory.GetFiles("./documents/", "*.pdf")
Dim allResults As New ConcurrentBag(Of (File As String, Result As BarcodeResult))()

Parallel.ForEach(files, Sub(file)
    Dim results = BarcodeReader.Read(file, options)
    For Each result In results
        allResults.Add((file, result))
    Next
End Sub)

For Each item In allResults
    Console.WriteLine($"{Path.GetFileName(item.File)}: {item.Result.Value} ({item.Result.Format})")
Next
$vbLabelText   $csharpLabel

Für fortgeschrittene Muster, die das asynchrone und multithreadfähige Lesen von Barcodes abdecken, einschließlich Durchsatzoptimierung und Konfiguration der Threadanzahl, bietet die IronBarcode Dokumentation eine detaillierte Anleitung.

Scandit SDKAPI zu IronBarcode Mapping-Referenz

Scandit SDK IronBarcode Notizen
DataCaptureContext.ForLicenseKey("key") IronBarCode.License.LicenseKey = "key" Eine Aufgabe; kein Kontextobjekt
BarcodeCaptureSettings.Create() new BarcodeReaderOptions() Optional; nicht für die Grundlektüre erforderlich
settings.EnableSymbologies(Symbology.Code128, ...) (not needed) IronBarcode erkennt alle Formate automatisch.
Camera.GetDefaultCamera() (not applicable) Konzept ohne Kamera
dataCaptureContext.SetFrameSourceAsync(camera) (not applicable) Keine Framequelle
camera.SwitchToDesiredStateAsync(FrameSourceState.On) (not applicable) Keine Kamera-Zustandsmaschine
barcodeCapture.IsEnabled = true BarcodeReader.Read(path) Ein einzelner Anruf initiiert das Lesen
BarcodeScanned += Ereignishandler Standard foreach über Rückgabewert Kein Ereignissystem erforderlich
args.Session.NewlyRecognizedBarcodes Rückgabewert von BarcodeReader.Read() Direktabholung
barcode.Data result.Value Gleicher semantischer Inhalt
barcode.Symbology result.Format Aufzählung äquivalenter Formate
using Scandit.DataCapture.Core using IronBarCode Einzelner Namensraum
using Scandit.DataCapture.Barcode using IronBarCode Im selben Namensraum enthalten
SparkScan-Produkt BarcodeReader.Read(path) Kein separates Produkt erforderlich
MatrixScan-Produkt BarcodeReaderOptions { ExpectMultipleBarcodes = true } Im Basispaket enthalten

Gängige Migrationsprobleme und Lösungen

Problem 1: Der Kamera-Pipeline-Code hat keine direkte Übersetzung

Scandit SDK: Der DataCaptureContext, BarcodeCaptureSettings, Camera, und BarcodeCapture Einrichtungsblock umfasst 7–10 Zeilen Initialisierungscode mit asynchronen Zustandsübergängen.

Lösung: Dieser Block wird vollständig gelöscht. Es gibt kein Äquivalent zu IronBarcode , da die dateibasierte API von IronBarcode keine Sitzungsinitialisierung erfordert. Ersetzen Sie den gesamten Block durch:

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

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

Problem 2: Logik des Ereignishandlers für "Barcode gescannt"

Scandit SDK: Verarbeitungslogik ist in BarcodeScanned += Ereignishandler-Lambdas oder -Methoden eingebettet. Dieses Muster existiert nicht in IronBarcode.

Lösung: Verschieben Sie den Handlerkörper in den Standardcode nach dem BarcodeReader.Read-Aufruf:

// Before: event handler
barcodeCapture.BarcodeScanned += (s, args) =>
{
    foreach (var b in args.Session.NewlyRecognizedBarcodes)
        Console.WriteLine(b.Data);
};

// After: direct iteration
foreach (var result in BarcodeReader.Read("document.png"))
    Console.WriteLine(result.Value);
// Before: event handler
barcodeCapture.BarcodeScanned += (s, args) =>
{
    foreach (var b in args.Session.NewlyRecognizedBarcodes)
        Console.WriteLine(b.Data);
};

// After: direct iteration
foreach (var result in BarcodeReader.Read("document.png"))
    Console.WriteLine(result.Value);
Imports System

' Before: event handler
AddHandler barcodeCapture.BarcodeScanned, Sub(s, args)
    For Each b In args.Session.NewlyRecognizedBarcodes
        Console.WriteLine(b.Data)
    Next
End Sub

' After: direct iteration
For Each result In BarcodeReader.Read("document.png")
    Console.WriteLine(result.Value)
Next
$vbLabelText   $csharpLabel

Problem 3: Aufrufe von EnableSymbologies über den gesamten Quellcode verteilt

Scandit SDK: An mehreren Stellen im Code können settings.EnableSymbologies(...) mit unterschiedlichen Symbologie-Sets für unterschiedliche Scannkontexte aufgerufen werden.

Lösung: Entfernen Sie alle EnableSymbologies-Aufrufe. IronBarcode erkennt standardmäßig alle unterstützten Formate automatisch. Wenn eine Formatbeschränkung zur Leistungsoptimierung in bestimmten Szenarien erforderlich ist, verwenden Sie BarcodeReaderOptions.ExpectBarcodeTypes:

var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("document.png", options);
var options = new BarcodeReaderOptions
{
    ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode
};
var results = BarcodeReader.Read("document.png", options);
Imports System

Dim options As New BarcodeReaderOptions With {
    .ExpectBarcodeTypes = BarcodeEncoding.Code128 Or BarcodeEncoding.QRCode
}
Dim results = BarcodeReader.Read("document.png", options)
$vbLabelText   $csharpLabel

Problem 4: Keine PDF-Lesefunktion im bestehenden Quellcode

Scandit SDK: Wenn die bestehende Codebasis PDF-Seiten in Bilder umwandelt, bevor sie in die Scandit-Pipeline eingespeist werden, wird diese benutzerdefinierte Rendering-Infrastruktur nicht mehr benötigt.

Lösung: Den Schritt der PDF-zu-Bild-Konvertierung vollständig entfernen. Übergeben Sie den PDF-Pfad direkt an IronBarcode:

// Before: render PDF pages to images, then pass each image to Scandit pipeline
// (multiple steps, external PDF library dependency)

// After: pass PDF directly to IronBarcode
var results = BarcodeReader.Read("document.pdf");
// Results include PageNumber property for each detected barcode
// Before: render PDF pages to images, then pass each image to Scandit pipeline
// (multiple steps, external PDF library dependency)

// After: pass PDF directly to IronBarcode
var results = BarcodeReader.Read("document.pdf");
// Results include PageNumber property for each detected barcode
' Before: render PDF pages to images, then pass each image to Scandit pipeline
' (multiple steps, external PDF library dependency)

' After: pass PDF directly to IronBarcode
Dim results = BarcodeReader.Read("document.pdf")
' Results include PageNumber property for each detected barcode
$vbLabelText   $csharpLabel

Ausgabe 5: Muster für die asynchrone Kamerainitialisierung

Scandit SDK: Kamerainitialisierung verwendet await für SetFrameSourceAsync und SwitchToDesiredStateAsync. Wenn der aufrufende Code um diese asynchronen Operationen herum strukturiert ist, vereinfacht deren Entfernung die asynchrone Kette.

Lösung: Die asynchrone Kamerainitialisierung vollständig entfernen. BarcodeReader.Read ist synchron. Wenn eine asynchrone Ausführung zur Reaktionsfähigkeit in einer Benutzeroberflächen- oder Serverkontext erforderlich ist, wickeln Sie sie in Task.Run ein:

// Async wrapper for non-blocking execution
var results = await Task.Run(() => BarcodeReader.Read("document.png"));
// Async wrapper for non-blocking execution
var results = await Task.Run(() => BarcodeReader.Read("document.png"));
Imports System.Threading.Tasks

' Async wrapper for non-blocking execution
Dim results = Await Task.Run(Function() BarcodeReader.Read("document.png"))
$vbLabelText   $csharpLabel

Scandit SDKMigrations-Checkliste

Vor der Migration anfallende Aufgaben

Überprüfen Sie alle Scandit-Integrationspunkte im Quellcode:

grep -r "DataCaptureContext\|BarcodeCaptureSettings\|BarcodeCapture" --include="*.cs" .
grep -r "EnableSymbologies\|BarcodeScanned\|NewlyRecognizedBarcodes" --include="*.cs" .
grep -r "using Scandit" --include="*.cs" .
grep -r "barcode\.Data\|barcode\.Symbology\|FrameSourceState" --include="*.cs" .
grep -r "DataCaptureContext\|BarcodeCaptureSettings\|BarcodeCapture" --include="*.cs" .
grep -r "EnableSymbologies\|BarcodeScanned\|NewlyRecognizedBarcodes" --include="*.cs" .
grep -r "using Scandit" --include="*.cs" .
grep -r "barcode\.Data\|barcode\.Symbology\|FrameSourceState" --include="*.cs" .
SHELL

Dokumentieren Sie alle Scankontexte – identifizieren Sie, welche Codepfade das Echtzeit-Kamerascannen (bei Scandit) bzw. die Datei- oder Dokumentenverarbeitung (Migration zu IronBarcode) übernehmen. Beachten Sie alle Stellen, an denen PDF-Seiten vor der Scandit-Verarbeitung in Bilder umgewandelt werden, da dieser Rendering-Schritt entfällt.

Aufgaben der Code-Aktualisierung

  1. Entfernen Sie Scandit NuGet-Pakete (Scandit.BarcodePicker, Scandit.DataCapture.Core, Scandit.DataCapture.Barcode)
  2. Installieren Sie das IronBarcode NuGet-Paket
  3. Ersetzen Sie using Scandit.DataCapture.* Importe durch using IronBarCode
  4. Löschen Sie den DataCaptureContext Initialisierungsblock in seiner Gesamtheit
  5. Löschen Sie alle Camera.GetDefaultCamera() und SetFrameSourceAsync-Aufrufe
  6. Löschen Sie alle EnableSymbologies-Aufrufe
  7. Ersetzen Sie barcodeCapture.IsEnabled = true durch BarcodeReader.Read(filePath)
  8. Konvertieren Sie BarcodeScanned += Ereignishandler in foreach über BarcodeReader.Read()-Ergebnisse
  9. Ersetzen Sie barcode.Data durch result.Value
  10. Ersetzen Sie barcode.Symbology durch result.Format
  11. Entfernen Sie die PDF-zu-Bild-Rendering-Pipelines, da IronBarcode PDFs jetzt direkt liest.
  12. Fügen Sie IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY" beim Start der Anwendung hinzu

Post-Migrationstests

Bitte überprüfen Sie nach Abschluss der Codeaktualisierungen Folgendes:

  • Prüfen Sie, ob die von IronBarcode zurückgegebenen Barcode-Werte mit den Werten übereinstimmen, die Scandit zuvor für dieselben Eingabedokumente zurückgegeben hat.
  • Verifizieren Sie, dass alle unterstützten Barcode-Formate im Dokumentenset ohne ExpectBarcodeTypes-Konfiguration erkannt werden
  • Testen Sie, ob PDF-Extraktion korrekte PageNumber-Werte für Dokumente mit mehreren Seiten zurückgibt
  • Sicherstellen, dass die ASP.NET Core Endpunkte unter der erwarteten Last innerhalb akzeptabler Antwortzeiten Ergebnisse liefern.
  • Überprüfen Sie, ob Docker- oder containerisierte Bereitstellungen Barcode-Lesevorgänge auch ohne Kamerahardware erfolgreich abschließen.
  • Testen Sie, ob die gleichzeitige Batch-Verarbeitung mit Parallel.ForEach korrekte Ergebnisse ohne Rennbedingungen liefert
  • Stellen Sie sicher, dass die Anwendung mit dem IronBarcode -Lizenzschlüssel anstelle des Scandit-Kontexts korrekt startet und initialisiert wird.

Wichtigste Vorteile der Migration zu IronBarcode

Eliminierung des Kameraverarbeitungsoverheads: Durch Entfernen der DataCaptureContext-Initialisierungssequenz entfällt die zustandsbehaftete Kameraverwaltung, asynchrone Zustandsübergänge und plattformspezifische Kamera-APIs aus dem serverseitigen Code. Der resultierende Code ist einfacher, kürzer und unterliegt keinen Plattformbeschränkungen, die den Einsatz unter Linux, in Docker-Containern oder in serverlosen Rechenumgebungen verhindern würden.

Direkte PDF-Verarbeitung: Die native PDF-Barcode-Extraktion beseitigt die Abhängigkeit von einer separaten PDF-Rendering-Bibliothek, den technischen Aufwand der Seiten-zu-Bild-Pipeline und die zusätzlichen Lizenzkosten dieser Abhängigkeit. Mehrseitige PDF-Dokumente werden in einem einzigen Methodenaufruf verarbeitet, wobei die seitenindizierten Ergebnisse sofort verfügbar sind.

Synchrone zustandslose API: Das Modell mit direktem Rückgabewert ersetzt ereignisgesteuerte Callback-Muster durch standardmäßigen sequenziellen Code. Fehlerbehandlung, Protokollierung und nachgelagerte Verarbeitung integrieren sich nahtlos in die bestehende Anwendungsarchitektur, ohne dass eine Ereignisabonnementverwaltung oder eine Koordination asynchroner Zustandsmaschinen erforderlich ist.

Veröffentlichte transparente Preisgestaltung: Die öffentlich ausgewiesenen unbefristeten Lizenzstufen von 749 $, 1.499 $ und 2.999 $ ermöglichen es, Budgetvorschläge, Anbietervergleiche und Beschaffungsprozesse ohne Verkaufszyklus durchzuführen. Die Lizenzkosten lassen sich bestimmen, bevor auch nur eine Zeile Integrationscode geschrieben wird.

Volle Cloud- und Containerunterstützung: Die zustandslose, hardwareunabhängige API von IronBarcode läuft ohne Änderungen in Azure Functions, AWS Lambda, Docker-Containern unter Linux und jeder anderen Rechenumgebung, in der die .NET Laufzeitumgebung verfügbar ist. Für den Einsatz in diesen Umgebungen sind keine Kamerasimulationen, keine Umgehung von Hardwareabhängigkeiten und keine plattformspezifische Konfiguration erforderlich.

Automatische Format-Erkennung: Durch das Entfernen von EnableSymbologies-Deklarationen werden eingehende Dokumente mit unerwarteten Barcode-Formaten korrekt behandelt, ohne dass Codeänderungen erforderlich sind. Wenn sich die in den eingehenden Dokumenten vorhandenen Formate ändern – neue Lieferanten, neue Etikettenformate, neue Dokumenttypen – verarbeitet IronBarcode die neuen Formate automatisch.

Hinweis:Scandit ist eine eingetragene Marke des jeweiligen Eigentümers. Diese Seite ist weder mit Scandit verbunden noch von Scandit 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 Scandit SDK 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 Scandit-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 Scandit SDK 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.

Müssen sowohl Scandit SDK als auch IronBarcode während der Migration installiert bleiben?

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 zum Scandit SDK?

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 Scandit alle Barcodeformate 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 Scandit SDK 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