IRONSOFTWAREHOME
MIGRATION GUIDES

Migrating from barKoder SDK to IronBarcode

Curtis Chau
Curtis Chau
Updated: August 1, 2026

Barkoder ships official .NET packages - Plugin.Maui.Barkoder and Barkoder.Xamarin - but both are strictly mobile camera-scanning components. If you evaluated barKoder for its MatrixSight algorithm, DeBlur mode, multi-barcode detection, or DPM support and then discovered you need file input, PDF processing, server-side deployment, or barcode generation, none of that is available from barKoder on .NET. This guide shows how IronBarcode covers each of those requirements, with working code for every scenario.

Why Migrate from barKoder SDK

Teams moving from a barKoder evaluation to IronBarcode consistently report the same triggers:

Mobile Camera Surface Only: Barkoder's .NET footprint is Plugin.Maui.Barkoder (v1.6.8, March 2026) and Barkoder.Xamarin (v1.3.0). Both wrap the native iOS / Android SDKs and expose a BarkoderView camera control. There is no general-purpose Barkoder.NET library, no ASP.NET Core target, no console / worker / desktop target, and no Linux server target.

Read-Only Architecture: Barkoder is a scanning-only SDK. If your application needs to generate barcodes - print shipping labels, create QR codes for packaging, embed codes in documents - Barkoder provides nothing. Teams that discover a generation requirement mid-project need a library that covers both sides of the workflow.

No PDF Processing: In .NET enterprise applications, barcodes frequently appear in PDF documents - invoices, shipping manifests, medical records, compliance documents. Barkoder has no concept of this workflow. It is designed for live camera input on a mobile device and cannot process a PDF file.

No Server-Side Deployment: Barkoder's processing model is on-device mobile scanning. It cannot run in ASP.NET Core, Azure Functions, Docker containers, or AWS Lambda. Teams building server-side barcode APIs, document processing pipelines, or cloud functions have no path to Barkoder deployment.

No File / Stream Input: Even inside a MAUI app, BarkoderView only consumes live camera frames. There is no file-path, byte-array, or Stream overload, so processing an uploaded image or a gallery photo requires a different library.

The Fundamental Boundary

Barkoder's MAUI surface is camera-bound. A .NET developer using Plugin.Maui.Barkoder writes code that looks like this:

// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;

public partial class ScanPage : ContentPage, IBarkoderDelegate
{
    public ScanPage()
    {
        InitializeComponent();
        BarkoderView.SetFlashEnabled(false);
        BarkoderView.StartScanning(this);
    }

    public void DidFinishScanning(BarcodeResult[] result)
    {
        foreach (var r in result)
            Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
    }
}

IronBarcode provides a file / stream / PDF API for the same data:

// dotnet add package BarCode
using IronBarCode;

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

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

var results = BarcodeReader.Read("scanned-label.png", options);
foreach (var result in results)
{
    Console.WriteLine($"Format: {result.Format} | Value: {result.Value}");
}

IronBarcode vs barKoder SDK: Feature Comparison

FeaturebarKoder SDKIronBarcode
.NET / C# APIMAUI / Xamarin camera UI onlyFull .NET surface
NuGet PackagePlugin.Maui.Barkoder, Barkoder.XamarinBarCode
Damaged Barcode RecoveryMatrixSight / DeBlurReadingSpeed.ExtremeDetail + ML
Multi-Barcode DetectionYesExpectMultipleBarcodes = true
DataMatrix / DPMYes (read only)Yes - read and generate
QR CodeYes (read only)Yes - read and generate
PDF417YesYes
AztecYesYes
Code128, Code39, EANYesYes - 50+ formats
Barcode GenerationNoneFull - all formats
PDF ProcessingNoneNative
File / Stream / byte[] InputNone - camera frames onlyYes
ASP.NET CoreNoneFull
Docker / LinuxNoneFull
Azure FunctionsNoneFull
AWS LambdaNoneFull
Offline / Air-GappedOn-deviceFully local
Async / AwaitCallback-basedFull
Dependency InjectionNoneFull .NET DI
iOS via MAUIPlugin.Maui.Barkoder (camera UI)Programmatic (file / stream)
Android via MAUIPlugin.Maui.Barkoder (camera UI)Programmatic (file / stream)
PricingAnnual subscriptionFrom $999 perpetual

Quick Start: barKoder SDK to IronBarcode Migration

Step 1: Replace NuGet Package

Install IronBarcode:

dotnet add package BarCode

If your project uses Plugin.Maui.Barkoder or Barkoder.Xamarin only for non-camera workflows (or you're moving entirely to file / PDF processing), remove it:

dotnet remove package Plugin.Maui.Barkoder
SHELL

If the app still needs a live camera UI, keep Plugin.Maui.Barkoder and add IronBarcode alongside it for the file / PDF / generation work.

Step 2: Update Namespaces

Remove the barKoder namespace where it is no longer needed, and add the IronBarcode namespace:

// Remove (if no longer needed)
// using Barkoder.Maui;

// Add
using IronBarCode;

Step 3: Initialize License

Add license initialization at application startup - in Program.cs for ASP.NET Core, or before any barcode operation in console or desktop apps:

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

Code Migration Examples

Reading Barcodes from Images

The core reading scenario maps from barKoder's live camera frames to IronBarcode's file / stream / byte[] API.

barKoder MAUI Approach:

// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;

public partial class ScanPage : ContentPage, IBarkoderDelegate
{
    public ScanPage()
    {
        InitializeComponent();
        BarkoderView.StartScanning(this);
    }

    public void DidFinishScanning(BarcodeResult[] result)
    {
        foreach (var r in result)
        {
            Console.WriteLine($"Barcode: {r.TextualData}");
            Console.WriteLine($"Type: {r.BarcodeTypeName}");
        }
    }
}

IronBarcode Approach:

// dotnet add package BarCode
using IronBarCode;

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

var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
{
    Console.WriteLine($"Format: {result.Format}");
    Console.WriteLine($"Value: {result.Value}");
}

IronBarcode's BarcodeReader.Read() auto-detects the barcode format without requiring a format to be specified in advance. The same call works for images captured by a mobile device and uploaded to a server, images loaded from a file system, or images received as byte arrays from a stream. For comprehensive reading documentation, see the IronBarcode reading guide.

Damaged Barcode Recovery (DeBlur Mode Equivalent)

Barkoder's DeBlur mode is one of its most cited capabilities. IronBarcode provides the equivalent for file input through ReadingSpeed.ExtremeDetail.

barKoder MAUI Approach:

// Live camera scanning with DeBlur enabled via configuration
using Barkoder.Maui;

BarkoderView.SetEnabledBarcodeTypes(/* configure formats */);
BarkoderView.StartScanning(this);

public void DidFinishScanning(BarcodeResult[] result)
{
    foreach (var r in result)
        Console.WriteLine($"Recovered: {r.TextualData}");
}

IronBarcode Approach:

using IronBarCode;

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

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

var results = BarcodeReader.Read("worn-shipping-label.png", options);

if (results.Any())
{
    Console.WriteLine($"Recovered barcode: {results.First().Value}");
}
else
{
    Console.WriteLine("Could not decode — image quality too low");
}

ReadingSpeed.ExtremeDetail runs a multi-pass ML-based image analysis pipeline, applying contrast enhancement, sharpening, rotation correction, and damage recovery before attempting to decode. For batch workflows, use ReadingSpeed.Balanced as the default and fall back to ExtremeDetail only for images that Balanced fails to decode.

Multi-Barcode Detection

Barkoder's multi-barcode frame scanning maps to IronBarcode's ExpectMultipleBarcodes option, which works on images and PDFs alike.

barKoder MAUI Approach:

// Live camera frame returns BarcodeResult[]; multi-scan configured on the view
using Barkoder.Maui;

BarkoderView.StartScanning(this);

public void DidFinishScanning(BarcodeResult[] result)
{
    foreach (var r in result)
        Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}

IronBarcode Approach:

using IronBarCode;

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

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

// Works identically on images and PDFs
var results = BarcodeReader.Read("shipping-manifest.pdf", options);

foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}");
}

This is a single method call. No page extraction, no multiple requests, no per-barcode processing overhead. The PDF is read natively.

DataMatrix Generation and Reading

Barkoder reads DataMatrix but cannot generate it. IronBarcode covers both sides of the workflow, which is the common requirement in industrial tracking systems.

barKoder MAUI Approach:

// Camera-only DataMatrix scanning; no generation available
using Barkoder.Maui;

BarkoderView.StartScanning(this);

public void DidFinishScanning(BarcodeResult[] result)
{
    foreach (var r in result)
        Console.WriteLine($"Part ID: {r.TextualData}");
}

IronBarcode Approach:

using IronBarCode;

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

// Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix)
    .SaveAsPng("part-label.png");

// Read DataMatrix from a scanned industrial part image
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

var results = BarcodeReader.Read("etched-part-photo.png", options);
foreach (var result in results)
{
    Console.WriteLine($"Part Serial: {result.Value}");
    Console.WriteLine($"Barcode Type: {result.Format}");
}

For a full list of supported encoding formats and generation options, see the IronBarcode barcode generation documentation.

QR Code Generation with Branding

Barkoder does not generate barcodes. IronBarcode generates QR codes with embedded logos, which is a common requirement for marketing, packaging, and product identification workflows.

barKoder MAUI Approach:

Not available — Plugin.Maui.Barkoder is a reader-only SDK with no
generation API on any platform.
Text

IronBarcode Approach:

using IronBarCode;

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

// QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500)
    .AddBrandLogo("company-logo.png")
    .SaveAsPng("branded-qr.png");

ASP.NET Core Barcode API Endpoint

Barkoder has no server-side deployment model. The equivalent of a mobile scanning upload endpoint - receiving an image from any client and returning barcode data - requires a .NET library.

barKoder Approach:

Not available — Plugin.Maui.Barkoder runs only inside a MAUI app head
against a live camera. There is no ASP.NET Core integration and no
server-side execution model.
Text

IronBarcode Approach:

// In Program.cs
using IronBarCode;

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

app.MapPost("/api/scan", async (IFormFile file) =>
{
    using var stream = file.OpenReadStream();
    var imageBytes = new byte[stream.Length];
    await stream.ReadAsync(imageBytes);

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

    var results = BarcodeReader.Read(imageBytes, options);

    return Results.Ok(results.Select(r => new
    {
        Value = r.Value,
        Format = r.Format.ToString(),
    }));
});

barKoder SDK API to IronBarcode Mapping Reference

This table maps barKoder's MAUI / Xamarin surface to the equivalent IronBarcode call:

barKoder APIIronBarcode Equivalent
License set via barKoder portal / configIronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
DeBlur configuration on BarkoderViewSpeed = ReadingSpeed.ExtremeDetail
Multi-scan configuration on BarkoderViewExpectMultipleBarcodes = true
SetEnabledBarcodeTypes(...)BarcodeEncoding.<Format> (auto-detected on read)
BarkoderView.StartScanning(IBarkoderDelegate)BarcodeReader.Read("image.png") - synchronous
BarcodeResult.TextualDataresult.Value
BarcodeResult.BarcodeTypeNameresult.Format
MatrixSight damage recoveryReadingSpeed.ExtremeDetail with ML preprocessing
Live camera frame inputFile path / Stream / byte[] input
On-device processingFully local - no network calls
No generation supportBarcodeWriter.CreateBarcode() / QRCodeWriter.CreateQrCode()
No PDF supportBarcodeReader.Read("document.pdf") - native
No server deploymentWorks in ASP.NET Core, Docker, Azure Functions, Lambda
No page index (N/A)result.PageNumber - available on PDF reads

Common Migration Issues and Solutions

Issue 1: NuGet Package Names

barKoder SDK: The official .NET packages are Plugin.Maui.Barkoder and Barkoder.Xamarin. Neither covers non-mobile scenarios.

Solution: Install IronBarcode:

dotnet add package BarCode

If Plugin.Maui.Barkoder is no longer needed (you're moving entirely to file / PDF / server processing), remove it:

dotnet remove package Plugin.Maui.Barkoder
dotnet add package BarCode
SHELL

Issue 2: Camera Frame Input vs File Input

barKoder SDK: All input arrives as a live camera frame - a continuous video feed processed on-device. There is no file path input mode.

Solution: IronBarcode accepts files, streams, byte arrays, and System.Drawing.Image objects. For images uploaded from a mobile client, read the request stream directly:

using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var results = BarcodeReader.Read(imageBytes, options);

Issue 3: Callback-Based API vs Synchronous Result

barKoder SDK: BarkoderView.StartScanning(IBarkoderDelegate) uses a delegate / callback pattern - DidFinishScanning(BarcodeResult[]) fires asynchronously as barcodes are detected in the camera feed.

Solution: IronBarcode's BarcodeReader.Read() is synchronous and returns an IEnumerable<BarcodeResult> directly. In ASP.NET Core contexts where async is required, wrap in Task.Run():

var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));

Issue 4: DeBlur Mode Configuration

barKoder SDK: DeBlur is enabled on the BarkoderView configuration before scanning begins and applies to all subsequent scans.

Solution: In IronBarcode, the equivalent is ReadingSpeed.ExtremeDetail set per-read through BarcodeReaderOptions. Create the options object once and reuse it:

var deepOptions = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

// Reuse across multiple reads
var results = BarcodeReader.Read("image.png", deepOptions);

Issue 5: Missing Generation Capability

barKoder SDK: Barkoder is read-only. There is no API for generating barcodes or QR codes.

Solution: IronBarcode covers both reading and generation. Use BarcodeWriter for standard formats and QRCodeWriter for QR codes:

// Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");

// QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500)
    .SaveAsPng("product-qr.png");

// Get as bytes for embedding in API response or PDF
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128)
    .ToPngBinaryData();

barKoder SDK Migration Checklist

Pre-Migration Tasks

Audit your codebase for barKoder references:

grep -r "Barkoder\|BarkoderView\|IBarkoderDelegate\|BarcodeResult" --include="*.cs" .
grep -r "Plugin.Maui.Barkoder\|Barkoder.Xamarin" --include="*.csproj" .
grep -r "Barkoder" --include="*.xaml" .
SHELL

Document the barcode scenarios currently implemented or planned:

  • Which barcode formats need to be read (Code128, DataMatrix, QR, PDF417, etc.)
  • Whether damaged barcode recovery is required (ReadingSpeed.ExtremeDetail)
  • Whether multi-barcode detection is required (ExpectMultipleBarcodes = true)
  • Whether barcode generation is required (BarcodeWriter, QRCodeWriter)
  • Whether PDF processing is required (BarcodeReader.Read("doc.pdf"))
  • Deployment targets (ASP.NET Core, Azure Functions, Docker, Lambda, desktop, MAUI)

Code Update Tasks

  1. Remove Plugin.Maui.Barkoder or Barkoder.Xamarin from .csproj where it is no longer needed
  2. Install the BarCode NuGet package
  3. Remove using Barkoder.Maui; (or the Xamarin equivalent) where no longer needed
  4. Add using IronBarCode; to all barcode processing files
  5. Add IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; at application startup
  6. Replace BarkoderView.StartScanning / DidFinishScanning callbacks with BarcodeReader.Read(filePath, options)
  7. Map BarcodeResult.TextualData to result.Value
  8. Map BarcodeResult.BarcodeTypeName to result.Format
  9. Map DeBlur configuration to Speed = ReadingSpeed.ExtremeDetail in BarcodeReaderOptions
  10. Map multi-scan configuration to ExpectMultipleBarcodes = true in BarcodeReaderOptions
  11. Add BarcodeWriter.CreateBarcode() calls for any generation requirements
  12. Add QRCodeWriter.CreateQrCode() calls for QR code generation requirements
  13. Replace any PDF pre-processing code with BarcodeReader.Read("document.pdf")
  14. Wrap synchronous BarcodeReader.Read() calls in Task.Run() for async ASP.NET Core endpoints

Post-Migration Testing

After completing the code updates, verify the following:

  • Confirm BarcodeReader.Read() returns results for all image formats used (PNG, JPEG, TIFF, BMP)
  • Verify that ReadingSpeed.ExtremeDetail recovers barcodes from the lowest-quality samples in your test set
  • Confirm ExpectMultipleBarcodes = true returns the correct count of barcodes from multi-barcode documents
  • Test PDF reading against all PDF versions used in production document workflows
  • Verify BarcodeWriter.CreateBarcode() output is scannable by your target scanners
  • Verify QRCodeWriter.CreateQrCode() output is scannable by mobile QR readers
  • Test the ASP.NET Core endpoint (if applicable) with file uploads from mobile clients
  • Confirm correct operation in Docker, Azure, or Lambda deployment targets
  • Run end-to-end tests covering the full read-process-generate cycle where applicable

Key Benefits of Migrating to IronBarcode

A Platform That Covers Non-Camera .NET: IronBarcode installs from NuGet and runs in any .NET project - ASP.NET Core, Azure Functions, Lambda, Docker, console, worker, WPF, WinForms, Avalonia, Blazor, and MAUI alike. Barkoder's Plugin.Maui.Barkoder covers only the camera UI inside a MAUI mobile app head; IronBarcode covers everything else.

Damage-Tolerant Reading Without a Camera: The capabilities that made Barkoder compelling - DeBlur, MatrixSight, damage recovery - are present in IronBarcode through ReadingSpeed.ExtremeDetail and ML-based image preprocessing. The same accuracy improvements that Barkoder achieves on live camera input, IronBarcode achieves on files, scanned documents, and uploaded images.

Complete Read and Generate Workflow: Barkoder is read-only. IronBarcode covers both barcode reading and generation across 50+ formats from a single package. Teams that need to generate shipping labels, create QR codes for packaging, or embed barcodes in documents do not need a second library.

Native PDF Support: Reading barcodes from PDF documents - invoices, manifests, medical records, compliance documents - is a first-class IronBarcode capability. No intermediate image extraction, no per-page API calls, and no additional dependencies. A multi-page PDF is processed in a single BarcodeReader.Read() call.

Full Server-Side Deployment: IronBarcode runs in ASP.NET Core, Azure Functions, AWS Lambda, Docker containers, and any other .NET hosting environment. It processes barcodes locally with no network calls, no API keys to manage, and no latency added by a remote service. Processing one barcode or one million costs the same - there are no per-request charges.

Predictable Perpetual Pricing: IronBarcode is available on a one-time perpetual license starting at $999 for a single developer, with no per-request charges, no volume limits, and no subscription renewals. For teams building production applications that process barcodes at scale, the cost model is simple and predictable.

Curtis Chau
Technical Writer

Curtis Chau holds a Bachelor’s degree in Computer Science (Carleton University) and specializes in front-end development with expertise in Node.js, TypeScript, JavaScript, and React. Passionate about crafting intuitive and aesthetically pleasing user interfaces, Curtis enjoys working with modern frameworks and creating well-structured, visually appealing manuals.

...
Read More

Related Articles

Key in blue circle

Get your free 30-day Trial Key instantly.

Your trial license will be sent to your email address

No limitations. 100% unlocked. No credit card.

bullet_checkedNo credit card or account creation requiredNo limitations. 100% unlocked. No credit card.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Book your free Live Demo
Booking Badge

Trusted by Millions of Engineers Worldwide

Iron Software's customer logos
Get Your No-Obligation Consult
Complete the form below or email sales@ironsoftware.com
Your details will always be kept confidential.
Trusted by Millions of Engineers Worldwide
Iron Software's customer logos
Get your free 30-day Trial Key instantly.
No credit card or account creation required