Migrating from Scandit SDK to IronBarcode
Scandit SDK is a camera scanning platform built for real-time mobile barcode detection. IronBarcode is a server-side and file-based barcode processing library for .NET. These two libraries serve different primary use cases, and migrating from one to the other is relevant only in specific circumstances.
This guide covers the migration path for teams using Scandit's .NET packages to process files, PDFs, or server-side document streams — scenarios where Scandit's camera pipeline architecture creates friction rather than value. If your core requirement is pointing a mobile camera at physical objects and receiving real-time feedback with augmented reality overlays, Scandit remains the appropriate tool and this guide does not apply. If your requirement is reading barcodes from uploaded images, extracting barcode data from PDF documents, or running barcode detection in ASP.NET Core, Azure Functions, Docker containers, or background processing services, this guide provides a complete migration path.
Why Migrate from Scandit SDK
Camera Pipeline Overhead: Every Scandit integration begins with the same initialization sequence regardless of whether a camera is present in the deployment environment: construct a DataCaptureContext, configure BarcodeCaptureSettings, enumerate the symbologies to enable, acquire a Camera instance, assign it as the frame source, transition the camera to an active state, and enable barcode capture. This initialization exists because Scandit processes live video frames. For server-side file processing, the sequence provides no benefit and introduces stateful complexity that has no equivalent in the target environment — there is no camera in a Docker container and no frame source in an Azure Function.
No Public Pricing: Scandit does not publish pricing. SparkScan, MatrixScan, ID Scanning, AR Overlays, and Parser are individually priced products that each require a separate sales inquiry. A budget proposal, vendor comparison, or cost-benefit analysis cannot be completed without entering a sales cycle that may span days or weeks. IronBarcode lists its pricing publicly — $999, $1,499, or $2,999 as a one-time perpetual purchase — so the number is on the page before a line of code is written.
Mandatory Symbology Declaration: Scandit requires explicit enablement of each barcode format before a scanning session begins. In real-time camera scanning, this is a performance optimization — restricting symbologies reduces per-frame processing overhead. In file-based document processing, where incoming documents may carry any barcode format from any supplier or partner, mandatory format declaration becomes a constraint. Enumerating every possible symbology removes the performance benefit; writing format-guessing logic on top of the library adds engineering overhead.
No PDF Support: There is no direct equivalent to BarcodeReader.Read("invoice.pdf") in Scandit's API. Extracting barcodes from a PDF document requires rendering each page to a raster image using a separate library, then feeding those rendered images through a camera-simulation pipeline. This approach introduces additional dependencies, additional licensing, and substantial engineering effort for a task that is routine in document processing workflows.
The Fundamental Problem
Scandit requires a running camera before any barcode work can begin. IronBarcode requires only a file path:
// 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-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-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-KEY"
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
Console.WriteLine($"{result.Value} ({result.Format})")
Next
The entire camera pipeline block — context creation, settings, symbology enablement, camera acquisition, frame source assignment, state transition — is replaced by a license key assignment and a single method call.
IronBarcode vs Scandit SDK: Feature Comparison
| Feature | Scandit SDK | IronBarcode |
|---|---|---|
| Primary deployment | Mobile camera scanning | Server, cloud, desktop file processing |
| Camera required | Yes | No |
| Image file reading | Not designed for | Primary input type |
| PDF barcode extraction | Not supported | Native multi-page support |
| Stream / byte array input | Not supported | Yes |
| Automatic format detection | No (must specify) | Yes (default behavior) |
| Event-driven results | Yes (BarcodeScanned callback) | No (synchronous return) |
| ASP.NET Core / server-side | Not designed for | Fully supported |
| Azure Functions / serverless | Not practical | Fully supported |
| Docker / Linux | Not supported | Fully supported |
| Barcode generation | Not supported | Included in package |
| Multi-barcode detection | MatrixScan (separate product) | Included in package |
| Pricing model | Contact sales (per product) | Published perpetual tiers |
| Per-scan / per-device fees | Yes | No |
Quick Start
Step 1: Replace NuGet Package
Remove Scandit packages:
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
Install IronBarcode:
dotnet add package IronBarcode
dotnet add package IronBarcode
Step 2: Update Namespaces
Replace Scandit namespace imports with the 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
Step 3: Initialize License
Add license initialization at application startup, replacing the DataCaptureContext.ForLicenseKey call:
// Before (Scandit SDK)
var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");
// After (IronBarcode)
IronBarCode.License.LicenseKey = "YOUR-IRONBARCODE-KEY";
// Before (Scandit SDK)
var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");
// After (IronBarcode)
IronBarCode.License.LicenseKey = "YOUR-IRONBARCODE-KEY";
' Before (Scandit SDK)
Dim dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE")
' After (IronBarcode)
IronBarCode.License.LicenseKey = "YOUR-IRONBARCODE-KEY"
Code Migration Examples
Reading Barcodes from an Image File
Processing a static image file is a core supported scenario in IronBarcode and an unsupported workflow in Scandit. The Scandit SDK processes live camera frames; reading a file requires adapting the capture pipeline to treat a bitmap as a frame source, which has no native implementation.
Scandit SDK Approach:
// 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.
// 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.
' 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 Approach:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-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($"Image Region: {result.ImageRegion}");
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-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($"Image Region: {result.ImageRegion}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-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($"Image Region: {result.ImageRegion}")
Next
Reading barcodes from images with IronBarcode requires no pipeline setup. The result collection is available immediately after the method returns, with no event subscription required.
Extracting Barcodes from a PDF Document
PDF barcode extraction is entirely new territory when migrating from Scandit, which has no PDF support. IronBarcode reads PDF documents directly, returning results indexed by page number.
Scandit SDK Approach:
// 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 Approach:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-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-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-KEY"
Dim results = BarcodeReader.Read("shipping-manifest.pdf")
For Each result In results
Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})")
Next
For complete guidance on reading barcodes from PDF documents, including page range selection and multi-barcode handling, the IronBarcode documentation covers the full range of PDF processing scenarios. No additional PDF library dependency is required.
Converting Event Callbacks to Direct Return Values
Scandit delivers barcode results through the BarcodeScanned event because live camera scanning is inherently asynchronous — results arrive when the camera detects a barcode in the current frame. IronBarcode returns results as a typed collection because file-based reading has a known completion boundary. This is one of the most structurally significant changes in the migration.
Scandit SDK Approach:
// 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 Approach:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-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-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-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
All processing logic that was embedded in event handler callbacks moves into standard sequential code. Error handling, logging, and downstream operations can be structured using ordinary control flow rather than event handler patterns.
ASP.NET Core Endpoint for File Upload
A stateless server endpoint reading barcodes from an uploaded file represents the primary server-side use case for IronBarcode. This pattern is not supported by Scandit's camera-pipeline architecture.
Scandit SDK Approach:
// 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 Approach:
// 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
The BarcodeReader.Read method accepts a Stream directly from IFormFile.OpenReadStream(), requiring no temporary file creation. Results are returned synchronously within the request-response cycle with no async camera management.
Concurrent Batch Processing Across Multiple Documents
High-volume document queues require parallel processing across multiple threads. Because IronBarcode's API is stateless, it is inherently thread-safe and composes directly with Parallel.ForEach and async task patterns.
Scandit SDK Approach:
// 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 Approach:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
using System.Collections.Concurrent;
IronBarCode.License.LicenseKey = "YOUR-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-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-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
Dim file = item.File
Dim result = item.Result
Console.WriteLine($"{Path.GetFileName(file)}: {result.Value} ({result.Format})")
Next
For advanced patterns covering async and multithreaded barcode reading, including throughput tuning and thread count configuration, the IronBarcode documentation provides detailed guidance.
Scandit SDK API to IronBarcode Mapping Reference
| Scandit SDK | IronBarcode | Notes |
|---|---|---|
DataCaptureContext.ForLicenseKey("key") |
IronBarCode.License.LicenseKey = "key" |
One assignment; no context object |
BarcodeCaptureSettings.Create() |
new BarcodeReaderOptions() |
Optional; not required for basic reading |
settings.EnableSymbologies(Symbology.Code128, ...) |
(not needed) | IronBarcode auto-detects all formats |
Camera.GetDefaultCamera() |
(not applicable) | No camera concept |
dataCaptureContext.SetFrameSourceAsync(camera) |
(not applicable) | No frame source |
camera.SwitchToDesiredStateAsync(FrameSourceState.On) |
(not applicable) | No camera state machine |
barcodeCapture.IsEnabled = true |
BarcodeReader.Read(path) |
Single call initiates reading |
BarcodeScanned += event handler |
Standard foreach over return value |
No event system needed |
args.Session.NewlyRecognizedBarcodes |
Return value of BarcodeReader.Read() |
Direct collection |
barcode.Data |
result.Value |
Same semantic content |
barcode.Symbology |
result.Format |
Equivalent format enumeration |
using Scandit.DataCapture.Core |
using IronBarCode |
Single namespace |
using Scandit.DataCapture.Barcode |
using IronBarCode |
Included in same namespace |
| SparkScan product | BarcodeReader.Read(path) |
No separate product required |
| MatrixScan product | BarcodeReaderOptions { ExpectMultipleBarcodes = true } |
Included in base package |
Common Migration Issues and Solutions
Issue 1: Camera Pipeline Code Has No Direct Translation
Scandit SDK: The DataCaptureContext, BarcodeCaptureSettings, Camera, and BarcodeCapture setup block spans 7–10 lines of initialization code with async state transitions.
Solution: This block is deleted entirely. It has no IronBarcode equivalent because IronBarcode's file-based API requires no session initialization. Replace the entire block with:
IronBarCode.License.LicenseKey = "YOUR-KEY";
IronBarCode.License.LicenseKey = "YOUR-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-KEY"
Issue 2: BarcodeScanned Event Handler Logic
Scandit SDK: Processing logic is embedded inside BarcodeScanned += event handler lambdas or methods. This pattern does not exist in IronBarcode.
Solution: Move the handler body into standard code following the BarcodeReader.Read call:
// 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
Issue 3: EnableSymbologies Calls Scattered Across Codebase
Scandit SDK: Multiple places in the codebase may call settings.EnableSymbologies(...) with different symbology sets for different scanning contexts.
Solution: Remove all EnableSymbologies calls. IronBarcode auto-detects all supported formats by default. If format restriction is needed for performance in specific scenarios, use 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)
Issue 4: No PDF Reading in Existing Codebase
Scandit SDK: If the existing codebase converts PDF pages to images before feeding them into the Scandit pipeline, this custom rendering infrastructure is no longer needed.
Solution: Remove the PDF-to-image rendering step entirely. Pass the PDF path directly to 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
Issue 5: Async Camera Initialization Patterns
Scandit SDK: Camera initialization uses await for SetFrameSourceAsync and SwitchToDesiredStateAsync. If the calling code is structured around these async operations, removing them simplifies the async chain.
Solution: Remove the async camera initialization entirely. BarcodeReader.Read is synchronous. If async execution is needed for responsiveness in a UI or server context, wrap it in Task.Run:
// 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 SDK Migration Checklist
Pre-Migration Tasks
Audit all Scandit integration points in the codebase:
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" .
Document all scanning contexts — identify which code paths handle real-time camera scanning (staying on Scandit) versus file or document processing (migrating to IronBarcode). Note all places where PDF pages are rendered to images before Scandit processing, as this rendering step will be eliminated.
Code Update Tasks
- Remove Scandit NuGet packages (
Scandit.BarcodePicker,Scandit.DataCapture.Core,Scandit.DataCapture.Barcode) - Install
IronBarcodeNuGet package - Replace
using Scandit.DataCapture.*imports withusing IronBarCode - Delete the
DataCaptureContextinitialization block in its entirety - Delete all
Camera.GetDefaultCamera()andSetFrameSourceAsynccalls - Delete all
EnableSymbologiescalls - Replace
barcodeCapture.IsEnabled = truewithBarcodeReader.Read(filePath) - Convert
BarcodeScanned +=event handlers toforeachoverBarcodeReader.Read()results - Replace
barcode.Datawithresult.Value - Replace
barcode.Symbologywithresult.Format - Remove PDF-to-image rendering pipelines where IronBarcode now reads PDFs directly
- Add
IronBarCode.License.LicenseKey = "YOUR-KEY"at application startup
Post-Migration Testing
Verify the following after completing code updates:
- Confirm barcode values returned by IronBarcode match values previously returned by Scandit for the same input documents
- Verify that all supported barcode formats in the document set are detected without
ExpectBarcodeTypesconfiguration - Test PDF extraction returns correct
PageNumbervalues for multi-page documents - Confirm ASP.NET Core endpoints return results within acceptable response times under expected load
- Verify Docker or containerized deployments complete barcode reads successfully without camera hardware
- Test concurrent batch processing with
Parallel.ForEachproduces correct results without race conditions - Confirm the application starts and initializes correctly with the IronBarcode license key in place of the Scandit context
Key Benefits of Migrating to IronBarcode
Elimination of Camera Pipeline Overhead: Removing the DataCaptureContext initialization sequence eliminates stateful camera management, async state transitions, and platform-specific camera APIs from server-side code. The resulting code is simpler, shorter, and does not carry platform constraints that prevent deployment on Linux, in Docker containers, or in serverless compute environments.
Direct PDF Processing: Native PDF barcode extraction removes the dependency on a separate PDF rendering library, the engineering overhead of the page-to-image pipeline, and the additional licensing cost of that dependency. Multi-page PDF documents are processed in a single method call with page-indexed results available immediately.
Synchronous Stateless API: The direct return value model replaces event-driven callback patterns with standard sequential code. Error handling, logging, and downstream processing integrate naturally with existing application architecture without requiring event subscription management or async state machine coordination.
Published Transparent Pricing: Perpetual license tiers listed publicly at $999, $1,499, and $2,999 enable budget proposals, vendor comparisons, and procurement processes to proceed without a sales cycle. The license cost is determinable before writing a line of integration code.
Full Cloud and Container Support: IronBarcode's stateless, hardware-independent API runs without modification in Azure Functions, AWS Lambda, Docker containers on Linux, and any other compute environment where the .NET runtime is available. No camera simulation, no hardware dependency workarounds, and no platform-specific configuration is required to deploy in these environments.
Automatic Format Detection: Removing EnableSymbologies declarations means incoming documents carrying unexpected barcode formats are handled correctly without code changes. When the set of formats present in incoming documents changes — new suppliers, new label formats, new document types — IronBarcode handles the new formats automatically.
Frequently Asked Questions
Why should I migrate from Scandit SDK to IronBarcode?
Common reasons include simplifying licensing (removing SDK + runtime key complexity), eliminating throughput limits, gaining native PDF support, improving Docker/CI/CD deployment, and reducing API boilerplate in production code.
How do I replace Scandit API calls with IronBarcode?
Replace instance creation and licensing boilerplate with IronBarCode.License.LicenseKey = "key". Replace reader calls with BarcodeReader.Read(path) and writer calls with BarcodeWriter.CreateBarcode(data, encoding). Static methods require no instance management.
How much code changes when migrating from Scandit SDK to IronBarcode?
Most migrations result in fewer lines of code. Licensing boilerplate, instance constructors, and explicit format configuration are removed. Core read/write operations map to shorter IronBarcode equivalents with cleaner result objects.
Do I need to keep both Scandit SDK and IronBarcode installed during migration?
No. Most migrations are direct replacements rather than parallel operation. Migrate one service class at a time, replace the NuGet reference, and update the instantiation and API call patterns before moving to the next class.
What is the NuGet package name for IronBarcode?
The package is 'IronBarCode' (with capital B and C). Install it with 'Install-Package IronBarCode' or 'dotnet add package IronBarCode'. The using directive in code is 'using IronBarCode;'.
How does IronBarcode simplify Docker deployment compared to Scandit SDK?
IronBarcode is a NuGet package with no external SDK files or mounted license configuration. In Docker, set the IRONBARCODE_LICENSE_KEY environment variable and the package handles license validation at startup.
Does IronBarcode detect all barcode formats automatically after migrating from Scandit?
Yes. IronBarcode auto-detects symbology across all supported formats. Explicit BarcodeTypes enumeration is not required. If format is already known and performance matters, BarcodeReaderOptions allows restricting the search space as an optimization.
Can IronBarcode read barcodes from PDFs without a separate library?
Yes. BarcodeReader.Read("document.pdf") processes PDF files natively. Results include PageNumber, Format, Value, and Confidence for each barcode found. No external PDF rendering step is required.
How does IronBarcode handle parallel barcode processing?
IronBarcode's static methods are stateless and thread-safe. Use Parallel.ForEach directly over file lists without per-thread instance management. BarcodeReaderOptions.MaxParallelThreads controls the internal thread budget.
What result properties change when migrating from Scandit SDK to IronBarcode?
Common renames: BarcodeValue becomes Value, BarcodeType becomes Format. IronBarcode results also add Confidence and PageNumber. A solution-wide search-and-replace handles the renames in existing result-processing code.
How do I set up IronBarcode licensing in a CI/CD pipeline?
Store IRONBARCODE_LICENSE_KEY as a pipeline secret and assign IronBarCode.License.LicenseKey in application startup code. One secret covers all environments including development, test, staging, and production.
Does IronBarcode support QR code generation with custom styling?
Yes. QRCodeWriter.CreateQrCode() supports custom colors via ChangeBarCodeColor(), logo embedding via AddBrandLogo(), configurable error correction levels, and multiple output formats including PNG, JPG, PDF, and stream.

