Saltar al pie de página
VIDEOS

Cómo Leer Códigos de Barras Desde Flujos en C#

Migrando del SDK barKoder a IronBarcode

Barkoder envía paquetes oficiales de .NET — Plugin.Maui.Barkoder y Barkoder.Xamarin — pero ambos son estrictamente componentes para escaneo con cámara móvil. Si evaluó barKoder por su algoritmo MatrixSight, modo DeBlur, detección de múltiples códigos de barras o soporte DPM y luego descubrió que necesita entrada de archivos, procesamiento de PDF, implementación del lado del servidor o generación de códigos de barras, nada de eso está disponible en barKoder en .NET. Esta guía muestra cómo IronBarcode cubre cada uno de esos requisitos, con código de trabajo para cada escenario.

Por qué Migrar del SDK barKoder

Los equipos que se trasladan de una evaluación de barKoder a IronBarcode informan sistemáticamente los mismos desencadenantes:

Solo para Superficie de Cámara Móvil: La huella de Barkoder en .NET es Plugin.Maui.Barkoder (v1.6.8, marzo de 2026) y Barkoder.Xamarin (v1.3.0). Ambos envuelven los SDKs nativos de iOS / Android y exponen un control de cámara BarkoderView. No hay una biblioteca Barkoder.NET de propósito general, no hay un destino para ASP.NET Core, ni para consola / trabajador / escritorio, y tampoco para servidor Linux.

Arquitectura de solo lectura: Barkoder es un SDK que solo permite el escaneo. Si su aplicación necesita generar códigos de barras (imprimir etiquetas de envío, crear códigos QR para embalaje, insertar códigos en documentos), Barkoder no ofrece ninguna solución. Los equipos que descubren un requisito de generación a mitad de proyecto necesitan una biblioteca que cubra ambos lados del flujo de trabajo.

Sin procesamiento de PDF: En las aplicaciones Enterprise .NET , los códigos de barras aparecen con frecuencia en los documentos PDF: facturas, manifiestos de envío, historiales médicos, documentos de cumplimiento normativo. Barkoder no tiene ni idea de este flujo de trabajo. Está diseñado para la entrada de vídeo en directo desde un dispositivo móvil y no puede procesar archivos PDF.

Sin implementación en el servidor: el modelo de procesamiento de Barkoder se basa en el escaneo móvil en el dispositivo. No se puede ejecutar en ASP.NET Core, Azure Functions, contenedores Docker ni AWS Lambda. Los equipos que desarrollan API de códigos de barras del lado del servidor, canalizaciones de procesamiento de documentos o funciones en la nube no tienen acceso a la implementación de Barkoder.

No hay Entrada de Archivo / Flujo: Incluso dentro de una aplicación MAUI, BarkoderView solo consume cuadros de cámara en vivo. No hay sobrecarga de ruta de archivo, arreglo de bytes, o Stream, por lo que procesar una imagen subida o una foto de galería requiere una biblioteca diferente.

El Límite Fundamental

La superficie MAUI de Barkoder está ligada a la cámara. Un desarrollador de .NET que usa Plugin.Maui.Barkoder escribe código que se ve así:

// 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}");
    }
}
// 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}");
    }
}
Imports Barkoder.Maui

Public Partial Class ScanPage
    Inherits ContentPage
    Implements IBarkoderDelegate

    Public Sub New()
        InitializeComponent()
        BarkoderView.SetFlashEnabled(False)
        BarkoderView.StartScanning(Me)
    End Sub

    Public Sub DidFinishScanning(result As BarcodeResult()) Implements IBarkoderDelegate.DidFinishScanning
        For Each r In result
            Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
        Next
    End Sub
End Class
$vbLabelText   $csharpLabel

IronBarcode proporciona un API de archivo / flujo / PDF para los mismos datos:

// 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}");
}
// 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}");
}
Imports IronBarCode

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

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.ExtremeDetail,
    .ExpectMultipleBarcodes = False
}

Dim results = BarcodeReader.Read("scanned-label.png", options)
For Each result In results
    Console.WriteLine($"Format: {result.Format} | Value: {result.Value}")
Next
$vbLabelText   $csharpLabel

IronBarcode vs SDK barKoder: Comparación de Funcionalidades

Característica SDK barKoder IronBarcode
API .NET / C# Interfaz de usuario de cámara MAUI / Xamarin solamente Superficie completa de .NET
Paquete NuGet Plugin.Maui.Barkoder, Barkoder.Xamarin BarCode
Recuperación de códigos de barras dañados MatrixSight / DeBlur ReadingSpeed.ExtremeDetail + ML
Detección de múltiples códigos de barras ExpectMultipleBarcodes = true
DataMatrix / DPM Sí (solo lectura) Sí, lee y genera
Código QR Sí (solo lectura) Sí, lee y genera
PDF417
azteca
Código128, Código39, EAN Sí, más de 50 formatos
Generación de códigos de barras None Completo — todos los formatos
Procesamiento de PDF None Nativo
Entrada de Archivo / Flujo / byte[] Ninguno — solo cuadros de cámara
ASP.NET Core None Completo
Docker / Linux None Completo
Azure Functions None Completo
AWS Lambda None Completo
Sin conexión / Aislado de la red En el dispositivo Totalmente local
Asíncrono / Await Basado en callback Completo
Inyección de dependencias None Inyección de dependencias completa .NET
iOS a través de MAUI Plugin.Maui.Barkoder (interfaz de usuario de cámara) Programático (archivo / flujo)
Android a través de MAUI Plugin.Maui.Barkoder (interfaz de usuario de cámara) Programático (archivo / flujo)
Precios Suscripción anual Desde $749 perpetuo

Inicio Rápido: Migración de SDK barKoder a IronBarcode

Paso 1: Sustituir el paquete NuGet

Instalar IronBarcode:

dotnet add package BarCode

Si su proyecto utiliza Plugin.Maui.Barkoder o Barkoder.Xamarin solo para flujos de trabajo no relacionados con cámaras (o se está moviendo completamente al procesamiento de archivo / PDF), elimínelo:

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

Si la aplicación aún necesita una interfaz de cámara en vivo, mantenga Plugin.Maui.Barkoder y agregue IronBarcode junto a él para el trabajo de archivo / PDF / generación.

Paso 2: Actualizar los espacios de nombres

Elimine el espacio de nombres de barKoder donde ya no es necesario, y agregue el espacio de nombres de IronBarcode:

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

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

// Add
using IronBarCode;
Imports IronBarCode
$vbLabelText   $csharpLabel

Paso 3: Inicializar licencia

Agregue la inicialización de la licencia al inicio de la aplicación — en Program.cs para ASP.NET Core, o antes de cualquier operación de código de barra en aplicaciones de consola o escritorio:

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

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

Ejemplos de migración de código

Lectura de códigos de barras a partir de imágenes

El escenario principal de lectura se mapea desde los cuadros de cámara en vivo de barKoder al API de archivo / flujo / byte[] de IronBarcode.

Enfoque MAUI barKoder:

// 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}");
        }
    }
}
// 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}");
        }
    }
}
Imports Barkoder.Maui

Public Partial Class ScanPage
    Inherits ContentPage
    Implements IBarkoderDelegate

    Public Sub New()
        InitializeComponent()
        BarkoderView.StartScanning(Me)
    End Sub

    Public Sub DidFinishScanning(result As BarcodeResult()) Implements IBarkoderDelegate.DidFinishScanning
        For Each r In result
            Console.WriteLine($"Barcode: {r.TextualData}")
            Console.WriteLine($"Type: {r.BarcodeTypeName}")
        Next
    End Sub
End Class
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

// 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}");
}
// 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}");
}
Imports IronBarCode

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

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

El BarcodeReader.Read() de IronBarcode detecta automáticamente el formato del código de barra sin requerir que se especifique un formato de antemano. La misma llamada funciona para imágenes capturadas por un dispositivo móvil y subidas a un servidor, imágenes cargadas desde un sistema de archivos o imágenes recibidas como matrices de bytes desde una transmisión. Para obtener documentación de lectura completa, consulte la guía de lectura de IronBarcode .

Recuperación de códigos de barras dañados (equivalente al modo DeBlur)

El modo DeBlur de Barkoder es una de sus funciones más destacadas. IronBarcode proporciona el equivalente para entrada de archivos a través de ReadingSpeed.ExtremeDetail.

Enfoque MAUI barKoder:

// 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}");
}
// 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}");
}
Imports Barkoder.Maui

' Live camera scanning with DeBlur enabled via configuration
BarkoderView.SetEnabledBarcodeTypes() ' configure formats
BarkoderView.StartScanning(Me)

Public Sub DidFinishScanning(result As BarcodeResult())
    For Each r In result
        Console.WriteLine($"Recovered: {r.TextualData}")
    Next
End Sub
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

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");
}
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");
}
Imports IronBarCode

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

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.ExtremeDetail,
    .ExpectMultipleBarcodes = False
}

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

If results.Any() Then
    Console.WriteLine($"Recovered barcode: {results.First().Value}")
Else
    Console.WriteLine("Could not decode — image quality too low")
End If
$vbLabelText   $csharpLabel

ReadingSpeed.ExtremeDetail ejecuta un pipeline de análisis de imagen basado en ML de múltiples pasadas, aplicando mejora de contraste, nitidez, corrección de rotación, y recuperación de daños antes de intentar decodificar. Para flujos de trabajo por lotes, use ReadingSpeed.Balanced como predeterminado y recurra a ExtremeDetail solo para imágenes que Balanced no logre decodificar.

Detección de múltiples códigos de barras

El escaneo de marcos de múltiples códigos de barras de Barkoder se asigna a la opción ExpectMultipleBarcodes de IronBarcode, que funciona tanto en imágenes como en PDFs.

Enfoque MAUI barKoder:

// 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}");
}
// 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}");
}
Imports Barkoder.Maui

BarkoderView.StartScanning(Me)

Public Sub DidFinishScanning(result As BarcodeResult())
    For Each r In result
        Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
    Next
End Sub
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

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}");
}
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}");
}
Imports IronBarCode

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

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

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

For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}")
Next
$vbLabelText   $csharpLabel

Se trata de una única llamada a un método. Sin extracción de páginas, sin múltiples solicitudes, sin sobrecarga de procesamiento por código de barras. El PDF se lee de forma nativa.

Generación y lectura de DataMatrix

Barkoder lee DataMatrix pero no puede generarlo. IronBarcode cubre ambos lados del flujo de trabajo, que es un requisito común en los sistemas de seguimiento industrial.

Enfoque MAUI barKoder:

// 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}");
}
// 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}");
}
Imports Barkoder.Maui

' Camera-only DataMatrix scanning; no generation available
BarkoderView.StartScanning(Me)

Public Sub DidFinishScanning(result As BarcodeResult())
    For Each r In result
        Console.WriteLine($"Part ID: {r.TextualData}")
    Next
End Sub
$vbLabelText   $csharpLabel

Enfoque de IronBarcode :

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}");
}
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}");
}
Imports 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
Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.ExtremeDetail,
    .ExpectMultipleBarcodes = False
}

Dim results = BarcodeReader.Read("etched-part-photo.png", options)
For Each result In results
    Console.WriteLine($"Part Serial: {result.Value}")
    Console.WriteLine($"Barcode Type: {result.Format}")
Next
$vbLabelText   $csharpLabel

Para obtener una lista completa de los formatos de codificación y las opciones de generación compatibles, consulte la documentación de generación de códigos de barras de IronBarcode .

Generación de códigos QR con personalización de marca

Barkoder no genera códigos de barras. IronBarcode genera códigos QR con logotipos integrados, lo cual es un requisito común en los flujos de trabajo de marketing, embalaje e identificación de productos.

Enfoque MAUI barKoder:

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

Enfoque de IronBarcode :

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

Punto final de la API de códigos de barras de ASP.NET Core

Barkoder no tiene un modelo de implementación del lado del servidor. El equivalente a un punto final de carga de escaneo móvil —que recibe una imagen de cualquier cliente y devuelve datos de código de barras— requiere una biblioteca .NET .

Enfoque barKoder:

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.

Enfoque de IronBarcode :

// 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(),
    }));
});
// 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(),
    }));
});
Imports IronBarCode

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

app.MapPost("/api/scan", Async Function(file As IFormFile) As Task(Of IResult)
    Using stream = file.OpenReadStream()
        Dim imageBytes(CInt(stream.Length) - 1) As Byte
        Await stream.ReadAsync(imageBytes, 0, imageBytes.Length)

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

        Dim results = BarcodeReader.Read(imageBytes, options)

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

Referencia de Mapeo del API SDK barKoder a IronBarcode

Esta tabla mapea la superficie MAUI / Xamarin de barKoder a la llamada equivalente de IronBarcode:

API de barKoder Equivalente de IronBarcode
Licencia configurada a través del portal / configuración de barKoder IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Configuración DeBlur en BarkoderView Speed = ReadingSpeed.ExtremeDetail
Configuración de escaneo múltiple en BarkoderView ExpectMultipleBarcodes = true
SetEnabledBarcodeTypes(...) BarcodeEncoding.<Format> (detectado automáticamente en lectura)
BarkoderView.StartScanning(IBarkoderDelegate) BarcodeReader.Read("image.png") — síncrono
BarcodeResult.TextualData result.Value
BarcodeResult.BarcodeTypeName result.Format
Recuperación de daños de MatrixSight ReadingSpeed.ExtremeDetail con preprocesamiento ML
Entrada de cuadro de cámara en vivo Entrada de ruta de archivo / Stream / byte[]
Procesamiento en el dispositivo Totalmente local: sin llamadas de red.
Sin soporte para la generación BarcodeWriter.CreateBarcode() / QRCodeWriter.CreateQrCode()
Sin soporte para PDF BarcodeReader.Read("document.pdf") — nativo
Sin despliegue de servidor Funciona en ASP.NET Core, Docker, Azure Functions, Lambda
Sin índice de página (N/A) result.PageNumber — disponible en lecturas de PDF

Problemas comunes de migración y soluciones

Problema 1: Nombres de Paquetes NuGet

SDK barKoder: Los paquetes oficiales de .NET son Plugin.Maui.Barkoder y Barkoder.Xamarin. Ninguno cubre escenarios no móviles.

Solution: Instalar IronBarcode:

dotnet add package BarCode

Si Plugin.Maui.Barkoder ya no es necesario (se está moviendo completamente al procesamiento de archivo / PDF / servidor), elimínelo:

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

Problema 2: Entrada de Cuadro de Cámara vs Entrada de Archivo

SDK barKoder: Toda la entrada llega como un cuadro de cámara en vivo: una transmisión continua de video procesada en el dispositivo. No hay modo de entrada de ruta de archivo.

Solución: IronBarcode acepta archivos, flujos de datos, matrices de bytes y objetos System.Drawing.Image. Para las imágenes subidas desde un cliente móvil, lea directamente el flujo de la solicitud:

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

Using stream = file.OpenReadStream()
    Dim imageBytes = New Byte(stream.Length - 1) {}
    Await stream.ReadAsync(imageBytes, 0, imageBytes.Length)
    Dim results = BarcodeReader.Read(imageBytes, options)
End Using
$vbLabelText   $csharpLabel

Problema 3: API basada en devolución de llamada frente a resultado síncrono

SDK barKoder: BarkoderView.StartScanning(IBarkoderDelegate) utiliza un patrón de delegado / callback — DidFinishScanning(BarcodeResult[]) se dispara asincrónicamente a medida que se detectan códigos de barras en el flujo de cámara.

Solución: El BarcodeReader.Read() de IronBarcode es síncrono y devuelve un IEnumerable<BarcodeResult> directamente. En contextos de ASP.NET Core donde se requiere async, envuelva en Task.Run():

var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
Dim results = Await Task.Run(Function() BarcodeReader.Read(imageBytes, options))
$vbLabelText   $csharpLabel

Problema 4: Configuración del modo DeBlur

SDK barKoder: DeBlur está habilitado en la configuración BarkoderView antes de que comience el escaneo y se aplica a todos los escaneos subsiguientes.

Solución: En IronBarcode, el equivalente es ReadingSpeed.ExtremeDetail configurado por lectura a través de BarcodeReaderOptions. Crea el objeto de opciones una sola vez y reutilízalo:

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

// Reuse across multiple reads
var results = BarcodeReader.Read("image.png", deepOptions);
var deepOptions = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

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

Dim deepOptions As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.ExtremeDetail,
    .ExpectMultipleBarcodes = False
}

' Reuse across multiple reads
Dim results = BarcodeReader.Read("image.png", deepOptions)
$vbLabelText   $csharpLabel

Problema 5: Falta de capacidad de generación

SDK barKoder: Barkoder es de solo lectura. No existe una API para generar códigos de barras o códigos QR.

Solución: IronBarcode cubre tanto la lectura como la generación. Use BarcodeWriter para formatos estándar y QRCodeWriter para códigos QR:

// 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();
// 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();
Imports System

' 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
Dim barcodeBytes As Byte() = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

Lista de Verificación de Migración SDK barKoder

Tareas previas a la migración

Audite su base de código para referencias de barKoder:

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

Documente los escenarios de códigos de barras actualmente implementados o planificados:

  • ¿Qué formatos de código de barras deben leerse (Code128, DataMatrix, QR, PDF417, etc.)?
  • Si se requiere la recuperación de códigos de barras dañados (ReadingSpeed.ExtremeDetail)
  • Si se requiere la detección de múltiples códigos de barras (ExpectMultipleBarcodes = true)
  • Si se requiere la generación de código de barras (BarcodeWriter, QRCodeWriter)
  • Si se requiere el procesamiento de PDF (BarcodeReader.Read("doc.pdf"))
  • Plataformas de implementación (ASP.NET Core, Azure Functions, Docker, Lambda, escritorio, MAUI)

Tareas de actualización de código

  1. Elimine Plugin.Maui.Barkoder o Barkoder.Xamarin de .csproj donde ya no sea necesario
  2. Instale el paquete NuGet BarCode
  3. Elimine using Barkoder.Maui; (o el equivalente para Xamarin) donde ya no sea necesario
  4. Agregue using IronBarCode; a todos los archivos de procesamiento de códigos de barras
  5. Agregue IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; al inicio de la aplicación
  6. Reemplace los callbacks BarkoderView.StartScanning / DidFinishScanning con BarcodeReader.Read(filePath, options)
  7. Asigne BarcodeResult.TextualData a result.Value
  8. Asigne BarcodeResult.BarcodeTypeName a result.Format
  9. Asigne la configuración DeBlur a Speed = ReadingSpeed.ExtremeDetail en BarcodeReaderOptions
  10. Asigne la configuración de escaneo múltiple a ExpectMultipleBarcodes = true en BarcodeReaderOptions
  11. Agregue llamadas BarcodeWriter.CreateBarcode() para cualquier requisito de generación
  12. Agregue llamadas QRCodeWriter.CreateQrCode() para requisitos de generación de códigos QR
  13. Reemplace cualquier código de preprocesamiento de PDF con BarcodeReader.Read("document.pdf")
  14. Envuelva las llamadas síncronas BarcodeReader.Read() en Task.Run() para endpoints asincrónicos de ASP.NET Core

Pruebas posteriores a la migración

Tras completar las actualizaciones del código, verifique lo siguiente:

  • Confirme que BarcodeReader.Read() devuelve resultados para todos los formatos de imagen usados (PNG, JPEG, TIFF, BMP)
  • Verifique que ReadingSpeed.ExtremeDetail recupere códigos de barras de las muestras de menor calidad en su conjunto de pruebas
  • Confirme que ExpectMultipleBarcodes = true devuelve el conteo correcto de códigos de barras de documentos con múltiples códigos de barras
  • Probar la lectura de archivos PDF con todas las versiones de PDF utilizadas en los flujos de trabajo de documentos de producción.
  • Verifique que la salida BarcodeWriter.CreateBarcode() sea escaneable por sus escáneres objetivo
  • Verifique que la salida QRCodeWriter.CreateQrCode() sea escaneable por los lectores de QR móviles
  • Pruebe el punto final de ASP.NET Core (si corresponde) con cargas de archivos desde clientes móviles.
  • Confirmar el funcionamiento correcto en los destinos de implementación de Docker, Azure o Lambda.
  • Ejecutar pruebas de extremo a extremo que abarquen todo el ciclo de lectura, procesamiento y generación, cuando corresponda.

Principales ventajas de migrar a IronBarcode

Una Plataforma Que Cubre .NET No Relacionado con Cámaras: IronBarcode se instala desde NuGet y se ejecuta en cualquier proyecto .NET — ASP.NET Core, Azure Functions, Lambda, Docker, consola, trabajador, WPF, WinForms, Avalonia, Blazor, y MAUI por igual. El Plugin.Maui.Barkoder de Barkoder solo cubre el interfaz de usuario de cámara dentro de un encabezado de aplicación móvil MAUI; IronBarcode cubre todo lo demás.

Lectura Tolerante a Daños Sin Cámara: Las capacidades que hicieron atractivo a Barkoder — DeBlur, MatrixSight, recuperación de daños — están presentes en IronBarcode a través de ReadingSpeed.ExtremeDetail y preprocesamiento de imagen basado en ML. IronBarcode logra las mismas mejoras de precisión que Barkoder consigue con la entrada de cámara en directo, también las consigue con archivos, documentos escaneados e imágenes subidas.

Flujo de trabajo completo de lectura y generación: Barkoder es de solo lectura. IronBarcode ofrece soluciones integrales para la lectura y generación de códigos de barras en más de 50 formatos, todo en un solo paquete. Los equipos que necesitan generar etiquetas de envío, crear códigos QR para embalaje o insertar códigos de barras en documentos no necesitan una segunda biblioteca.

Compatibilidad nativa con PDF: La lectura de códigos de barras en documentos PDF (facturas, manifiestos, historiales médicos, documentos de cumplimiento normativo) es una función de primera clase de IronBarcode . Sin extracción intermedia de imágenes, sin llamadas a la API por página y sin dependencias adicionales. Un PDF de varias páginas se procesa en una sola llamada BarcodeReader.Read().

Implementación completa en el servidor: IronBarcode se ejecuta en ASP.NET Core, Azure Functions, AWS Lambda, contenedores Docker y cualquier otro entorno de alojamiento .NET . Procesa códigos de barras localmente, sin llamadas a la red, sin necesidad de gestionar claves API y sin la latencia que añade un servicio remoto. Procesar un código de barras o un millón cuesta lo mismo: no hay cargos por solicitud.

Precios perpetuos predecibles: IronBarcode está disponible con una licencia perpetua de pago único a partir de 749 dólares para un solo desarrollador, sin cargos por solicitud, sin límites de volumen y sin renovaciones de suscripción. Para los equipos que desarrollan aplicaciones de producción que procesan códigos de barras a gran escala, el modelo de costes es sencillo y predecible.

Preguntas Frecuentes

¿Por qué debería migrar de Barkoder SDK a IronBarcode?

Entre las razones más comunes se incluyen la simplificación de licencias (eliminando la complejidad de SDK + clave de tiempo de ejecución), la eliminación de límites de rendimiento, la obtención de compatibilidad nativa con PDF, la mejora de la implementación de Docker/CI/CD y la reducción de la repetición de API en el código de producción.

¿Cómo puedo sustituir las llamadas a la API de Barkoder por IronBarcode?

Sustituya la creación de instancias y la repetición de licencias por IronBarCode.License.LicenseKey = "key". Sustituya las llamadas al lector por BarcodeReader.Read(path) y las llamadas al escritor por BarcodeWriter.CreateBarcode(data, encoding). Los métodos estáticos no requieren gestión de instancias.

¿Cuánto código cambia al migrar de Barkoder SDK a IronBarcode?

La mayoría de las migraciones se traducen en menos líneas de código. Se eliminan la repetición de licencias, los constructores de instancias y la configuración explícita de formatos. Las operaciones básicas de lectura/escritura se traducen a equivalentes IronBarcode más cortos con objetos de resultado más limpios.

¿Necesito tener instalados tanto Barkoder SDK como IronBarcode durante la migración?

No. La mayoría de las migraciones son sustituciones directas en lugar de operaciones paralelas. Migre una clase de servicio cada vez, sustituya la referencia NuGet y actualice los patrones de instanciación y llamada a la API antes de pasar a la siguiente clase.

¿Cuál es el nombre del paquete NuGet para IronBarcode?

El paquete es 'IronBarCode' (con B y C mayúsculas). Instálalo con 'Install-Package IronBarCode' o 'dotnet add package IronBarCode'. La directiva using en el código es 'using IronBarCode;'.

¿Cómo simplifica IronBarcode la implantación de Docker en comparación con Barkoder SDK?

IronBarcode es un paquete NuGet sin archivos SDK externos ni configuración de licencia montada. En Docker, establezca la variable de entorno IRONBARCODE_LICENSE_KEY y el paquete se encargará de la validación de la licencia al inicio.

¿IronBarcode detecta automáticamente todos los formatos de código de barras tras migrar desde Barkoder?

Sí, IronBarcode detecta automáticamente la simbología de todos los formatos compatibles. No es necesaria la enumeración explícita de BarcodeTypes. Si ya se conoce el formato y el rendimiento es importante, BarcodeReaderOptions permite restringir el espacio de búsqueda como optimización.

¿Puede IronBarcode leer códigos de barras de PDF sin una biblioteca independiente?

Sí. BarcodeReader.Read("document.pdf") procesa archivos PDF de forma nativa. Los resultados incluyen PageNumber, Format, Value y Confidence para cada código de barras encontrado. No es necesario ningún paso externo de procesamiento de PDF.

¿Cómo gestiona IronBarcode el procesamiento paralelo de códigos de barras?

Los métodos estáticos de IronBarcode no tienen estado y son seguros para los hilos. Utilice Parallel.ForEach directamente sobre listas de archivos sin gestión de instancias por subproceso. BarcodeReaderOptions.MaxParallelThreads controla el presupuesto interno de hilos.

¿Qué propiedades de los resultados cambian al migrar de Barkoder SDK a IronBarcode?

Cambios de nombre comunes: BarcodeValue se convierte en Value, BarcodeType se convierte en Format. Los resultados de IronBarcode también añaden Confidence y PageNumber. Una búsqueda y sustitución en toda la solución gestiona los cambios de nombre en el código de procesamiento de resultados existente.

¿Cómo configuro las licencias de IronBarcode en un proceso CI/CD?

Almacene IRONBARCODE_LICENSE_KEY como un secreto de canalización y asigne IronBarCode.License.LicenseKey en el código de inicio de la aplicación. Un secreto cubre todos los entornos, incluidos los de desarrollo, prueba, montaje y producción.

¿Admite IronBarcode la generación de códigos QR con estilos personalizados?

Sí. QRCodeWriter.CreateQrCode() admite colores personalizados mediante ChangeBarCodeColor(), incrustación de logotipos mediante AddBrandLogo(), niveles de corrección de errores configurables y múltiples formatos de salida, incluidos PNG, JPG, PDF y stream.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame