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
// 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
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
IronBarcode installieren:
dotnet add package IronBarcode
dotnet add package IronBarcode
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
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"
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.
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
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.
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
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
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
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.
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
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.
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
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"
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
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)
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
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"))
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" .
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
- Entfernen Sie Scandit NuGet-Pakete (
Scandit.BarcodePicker,Scandit.DataCapture.Core,Scandit.DataCapture.Barcode) - Installieren Sie das
IronBarcodeNuGet-Paket - Ersetzen Sie
using Scandit.DataCapture.*Importe durchusing IronBarCode - Löschen Sie den
DataCaptureContextInitialisierungsblock in seiner Gesamtheit - Löschen Sie alle
Camera.GetDefaultCamera()undSetFrameSourceAsync-Aufrufe - Löschen Sie alle
EnableSymbologies-Aufrufe - Ersetzen Sie
barcodeCapture.IsEnabled = truedurchBarcodeReader.Read(filePath) - Konvertieren Sie
BarcodeScanned +=Ereignishandler inforeachüberBarcodeReader.Read()-Ergebnisse - Ersetzen Sie
barcode.Datadurchresult.Value - Ersetzen Sie
barcode.Symbologydurchresult.Format - Entfernen Sie die PDF-zu-Bild-Rendering-Pipelines, da IronBarcode PDFs jetzt direkt liest.
- 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.ForEachkorrekte 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.
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.

