Saltar al pie de página
USO DE IRONBARCODE

Cómo Construir una API de Escáner de Códigos de Barras en C# Usando IronBarcode

Crear una API de escáner C# en .NET tradicionalmente ha requerido una integración compleja del SDK del escáner o bibliotecas de software limitadas. Con IronBarcode, los desarrolladores pueden crear una potente API de escáner de código de barras lista para producción en minutos. Estos pueden procesar datos de códigos de barras fácilmente desde imágenes, PDFs e incluso entradas de escaneo dañadas.

Este tutorial demuestra cómo construir una API de escáner RESTful usando ASP.NET Core en Windows, proporcionando una alternativa escalable a los dispositivos de escáner de hardware mientras mantiene un nivel de precisión empresarial. La API es capaz de manejar múltiples tipos de escáner, trabajar con datos binarios y extraer valores de código de barras desde cualquier formato de matriz o tabla compatible.

¿Cómo instalo y configuro IronBarcode?

Comenzar con IronBarcode es tan simple como instalar un solo paquete NuGet. Abre tu proyecto de ASP.NET Core y ejecuta este comando en la Consola del Administrador de Paquetes:

Install-Package BarCode

Después de la instalación, añade el espacio de nombres IronBarcode a tu controlador y prueba la biblioteca con este ejemplo de una línea:

using IronBarCode;
// Simple test to verify installation
var result = BarcodeReader.Read("test-barcode.png");
Console.WriteLine($"Scanned: {result.First().Value}");
using IronBarCode;
// Simple test to verify installation
var result = BarcodeReader.Read("test-barcode.png");
Console.WriteLine($"Scanned: {result.First().Value}");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Este código lee una imagen de código de barras y muestra su valor. El método BarcodeReader.Read() detecta automáticamente el formato del código de barras y devuelve una colección de resultados, haciendo increíblemente sencillo extraer datos de códigos de barras desde cualquier imagen compatible (jpeg, bmp, png, tiff) y trabajar con formatos de datos de array o binarios.

¿Cómo puedo crear un controlador API de escáner completo?

Crear una API de escáner con ASP.NET Core implica configurar un controlador con parámetros que acepten diversas fuentes de entrada. Aquí tienes una implementación completa:

using Microsoft.AspNetCore.Mvc;
using IronBarCode;
using System.Drawing;
namespace BarcodeScannerAPI.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class ScannerController : ControllerBase
    {
        // Model for API responses
        public class ScanResult
        {
            public bool Success { get; set; }
            public List<string> BarcodeValues { get; set; } = new List<string>();
            public string BarcodeFormat { get; set; }
            public string ErrorMessage { get; set; }
        }
        [HttpPost("scan-file")]
        public async Task<ActionResult<ScanResult>> ScanFile(IFormFile file)
        {
            if (file == null || file.Length == 0)
                return BadRequest(new ScanResult
                {
                    Success = false,
                    ErrorMessage = "No file uploaded"
                });
            try
            {
                using var stream = new MemoryStream();
                await file.CopyToAsync(stream);
                // Configure scanner options for better accuracy
                var options = new BarcodeReaderOptions
                {
                    Speed = ReadingSpeed.Balanced,
                    ExpectMultipleBarcodes = true,
                    ExpectBarcodeTypes = BarcodeEncoding.All
                };
                // Read barcodes from the uploaded file
                var results = BarcodeReader.Read(stream.ToArray(), options);
                if (results.Any())
                {
                    return Ok(new ScanResult
                    {
                        Success = true,
                        BarcodeValues = results.Select(r => r.Value).ToList(),
                        BarcodeFormat = results.First().BarcodeType.ToString()
                    });
                }
                return Ok(new ScanResult
                {
                    Success = false,
                    ErrorMessage = "No barcodes found"
                });
            }
            catch (Exception ex)
            {
                return StatusCode(500, new ScanResult
                {
                    Success = false,
                    ErrorMessage = $"Processing error: {ex.Message}"
                });
            }
        }
        [HttpPost("scan-base64")]
        public ActionResult<ScanResult> ScanBase64([FromBody] string base64Image)
        {
            try
            {
                // Convert Base64 string to byte array
                byte[] imageBytes = Convert.FromBase64String(base64Image);
                // Process with IronBarcode
                var results = BarcodeReader.Read(imageBytes);
                return ProcessResults(results);
            }
            catch (Exception ex)
            {
                return BadRequest(new ScanResult
                {
                    Success = false,
                    ErrorMessage = $"Invalid Base64 data: {ex.Message}"
                });
            }
        }
        private ScanResult ProcessResults(BarcodeResults results)
        {
            if (results.Any())
            {
                return new ScanResult
                {
                    Success = true,
                    BarcodeValues = results.Select(r => r.Value).ToList(),
                    BarcodeFormat = results.First().BarcodeType.ToString()
                };
            }
            return new ScanResult
            {
                Success = false,
                ErrorMessage = "No barcodes detected"
            };
        }
    }
}
using Microsoft.AspNetCore.Mvc;
using IronBarCode;
using System.Drawing;
namespace BarcodeScannerAPI.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class ScannerController : ControllerBase
    {
        // Model for API responses
        public class ScanResult
        {
            public bool Success { get; set; }
            public List<string> BarcodeValues { get; set; } = new List<string>();
            public string BarcodeFormat { get; set; }
            public string ErrorMessage { get; set; }
        }
        [HttpPost("scan-file")]
        public async Task<ActionResult<ScanResult>> ScanFile(IFormFile file)
        {
            if (file == null || file.Length == 0)
                return BadRequest(new ScanResult
                {
                    Success = false,
                    ErrorMessage = "No file uploaded"
                });
            try
            {
                using var stream = new MemoryStream();
                await file.CopyToAsync(stream);
                // Configure scanner options for better accuracy
                var options = new BarcodeReaderOptions
                {
                    Speed = ReadingSpeed.Balanced,
                    ExpectMultipleBarcodes = true,
                    ExpectBarcodeTypes = BarcodeEncoding.All
                };
                // Read barcodes from the uploaded file
                var results = BarcodeReader.Read(stream.ToArray(), options);
                if (results.Any())
                {
                    return Ok(new ScanResult
                    {
                        Success = true,
                        BarcodeValues = results.Select(r => r.Value).ToList(),
                        BarcodeFormat = results.First().BarcodeType.ToString()
                    });
                }
                return Ok(new ScanResult
                {
                    Success = false,
                    ErrorMessage = "No barcodes found"
                });
            }
            catch (Exception ex)
            {
                return StatusCode(500, new ScanResult
                {
                    Success = false,
                    ErrorMessage = $"Processing error: {ex.Message}"
                });
            }
        }
        [HttpPost("scan-base64")]
        public ActionResult<ScanResult> ScanBase64([FromBody] string base64Image)
        {
            try
            {
                // Convert Base64 string to byte array
                byte[] imageBytes = Convert.FromBase64String(base64Image);
                // Process with IronBarcode
                var results = BarcodeReader.Read(imageBytes);
                return ProcessResults(results);
            }
            catch (Exception ex)
            {
                return BadRequest(new ScanResult
                {
                    Success = false,
                    ErrorMessage = $"Invalid Base64 data: {ex.Message}"
                });
            }
        }
        private ScanResult ProcessResults(BarcodeResults results)
        {
            if (results.Any())
            {
                return new ScanResult
                {
                    Success = true,
                    BarcodeValues = results.Select(r => r.Value).ToList(),
                    BarcodeFormat = results.First().BarcodeType.ToString()
                };
            }
            return new ScanResult
            {
                Success = false,
                ErrorMessage = "No barcodes detected"
            };
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Este controlador proporciona dos puntos de acceso: uno para la carga de archivos y otro para imágenes codificadas en Base64. El punto de acceso ScanFile acepta datos de formulario multipart, siendo perfecto para aplicaciones web donde los usuarios suben imágenes directamente. El procesamiento de flujo asegura un uso eficiente de la memoria, mientras que la configuración de BarcodeReaderOptions encuentra un equilibrio entre velocidad y precisión.

El punto de acceso ScanBase64 maneja escenarios donde las imágenes se transmiten como cadenas Base64, estándar en aplicaciones móviles y comunicaciones de API a API. Es capaz de leer tanto códigos de barras 1D como 2D (matriz) desde imágenes cargadas o flujos de entrada.

Resultado

Primero, estamos usando Swagger para probar nuestros puntos de acceso. Aquí puedes ver los puntos de acceso de la API de escáner:

Cómo construir una API de escáner de código de barras en C# usando IronBarcode: Figura 1 - Swagger UI con nuestros puntos de acceso de API

Ahora, probémoslos y revisemos la salida. Para este ejemplo, usaré una imagen de código de barras de muestra que está codificada con un simple valor de cadena "Hello World". Como puedes ver aquí, nuestro programa ha escaneado correctamente el código de barras y recuperado los datos dentro de él.

Cómo construir una API de escáner de código de barras en C# usando IronBarcode: Figura 2 - Salida de escaneo simple de código de barras

¿Qué diferentes fuentes de entrada puede manejar el escáner?

La flexibilidad de IronBarcode brilla al procesar varios formatos de entrada. Más allá de las imágenes estándar, la API del escáner maneja PDFs, flujos de carga y múltiples formatos gráficos:

// Scanning PDFs with multiple pages
[HttpPost("scan-pdf")]
public async Task<ActionResult<ScanResult>> ScanPdf(IFormFile pdfFile
{
    using var stream = new MemoryStream();
    await pdfFile.CopyToAsync(stream);
    // ReadPdf method handles multi-page documents
    var results = BarcodeReader.ReadPdf(stream.ToArray());
    return ProcessResults(results);
}
// Processing from URL
[HttpPost("scan-url")]
public async Task<ActionResult<ScanResult>> ScanFromUrl([FromBody] string imageUrl)
{
    using var client = new HttpClient();
    var imageBytes = await client.GetByteArrayAsync(imageUrl);
    var results = BarcodeReader.Read(imageBytes);
    return ProcessResults(results);
}
// Scanning PDFs with multiple pages
[HttpPost("scan-pdf")]
public async Task<ActionResult<ScanResult>> ScanPdf(IFormFile pdfFile
{
    using var stream = new MemoryStream();
    await pdfFile.CopyToAsync(stream);
    // ReadPdf method handles multi-page documents
    var results = BarcodeReader.ReadPdf(stream.ToArray());
    return ProcessResults(results);
}
// Processing from URL
[HttpPost("scan-url")]
public async Task<ActionResult<ScanResult>> ScanFromUrl([FromBody] string imageUrl)
{
    using var client = new HttpClient();
    var imageBytes = await client.GetByteArrayAsync(imageUrl);
    var results = BarcodeReader.Read(imageBytes);
    return ProcessResults(results);
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

El método ReadPdf escanea automáticamente todas las páginas en un documento PDF, extrayendo códigos de barras de etiquetas de envío, facturas o informes de varias páginas. Para el escaneo basado en URL, la API obtiene imágenes remotas y las procesa sin requerir almacenamiento local, ideal para la integración con servicios de almacenamiento en la nube o el procesamiento de imágenes desde sistemas externos.

Ahora, podrás ver la interfaz de usuario de Swagger actualizada con nuestros nuevos puntos de acceso:

Cómo construir una API de escáner de código de barras en C# usando IronBarcode: Figura 3 - Interfaz de usuario de Swagger actualizada con las dos nuevos puntos de acceso

Para probar nuestros nuevos métodos, usé nuestro ejemplo PDF que contiene dos códigos de barras de muestra.

Cómo construir una API de escáner de código de barras en C# usando IronBarcode: Figura 4 - PDF de muestra

El primero es un código de barras básico con un URL, y el segundo es el código de barras codificado en cadena básica de nuestro último ejemplo. Aquí está la salida de ejecutar nuestro PDF a través del punto de acceso:

Cómo construir una API de escáner de código de barras en C# usando IronBarcode: Figura 5 - Salida de PDF escaneado con códigos de barras

Como puedes ver, ha detectado correctamente ambos códigos de barras y extraído los datos de los códigos de barras escaneados.

Optimización del escáner de código de barras para mejorar el rendimiento y la precisión

Ajustar el escáner para casos de uso específicos mejora drásticamente tanto la velocidad como la precisión:

var optimizedOptions = new BarcodeReaderOptions
{
    // Speed settings: Faster, Balanced, Detailed, ExtremeDetail
    Speed = ReadingSpeed.Detailed,
    // Specify expected barcode types to reduce processing time
    ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128,
    // Enable parallel processing for batch operations
    Multithreaded = true,
    MaxParallelThreads = 4,
    // Define scanning area to focus on specific regions
    CropArea = new Rectangle(100, 100, 400, 200), // Optional: define specific scanning area
    // Apply image corrections for damaged barcodes
    ImageFilters = new ImageFilterCollection() { 
        new SharpenFilter(),
        new ContrastFilter() 
    }
};
var optimizedOptions = new BarcodeReaderOptions
{
    // Speed settings: Faster, Balanced, Detailed, ExtremeDetail
    Speed = ReadingSpeed.Detailed,
    // Specify expected barcode types to reduce processing time
    ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128,
    // Enable parallel processing for batch operations
    Multithreaded = true,
    MaxParallelThreads = 4,
    // Define scanning area to focus on specific regions
    CropArea = new Rectangle(100, 100, 400, 200), // Optional: define specific scanning area
    // Apply image corrections for damaged barcodes
    ImageFilters = new ImageFilterCollection() { 
        new SharpenFilter(),
        new ContrastFilter() 
    }
};
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Nota: La propiedad CropArea permite al escáner enfocarse en una región específica de matriz o tabla dentro de la imagen. Sin embargo, algunos objetos o ubicaciones de códigos de barras pueden caer fuera del área definida, causando que el escáner falle. Si esto ocurre, simplemente elimina o comenta la propiedad CropArea. IronBarcode identificará y decodificará entonces todos los datos de código de barras en la imagen completa por defecto, asegurando que el escáner sea capaz de manejar cualquier escenario de tiempo de ejecución de Windows o Microsoft.

Usar opciones optimizadas para tipos de escáner conocidos reduce el tiempo de procesamiento. Los filtros de imagen embebidos mejoran la legibilidad de códigos de barras escaneados para entradas de baja calidad. Los desarrolladores pueden configurar el SDK del escáner, enumerar los escáneres disponibles e integrar componentes de interfaz de usuario o dispositivos de captura de video.

Resumen

Construir una API de escáner C# con IronBarcode transforma el complejo procesamiento de códigos de barras en sencillos puntos de acceso REST. La biblioteca maneja todo, desde códigos de barras digitales perfectos hasta capturas desafiantes del mundo real, proporcionando precisión de grado empresarial sin depender de hardware.

Con soporte para múltiples formatos de entrada, corrección avanzada de imágenes y configuraciones de rendimiento optimizadas, los desarrolladores pueden desplegar soluciones de escaneo listas para producción en minutos. Comienza con una prueba gratuita para implementar tu API de escáner hoy, o explora la documentación completa para características avanzadas como procesamiento por lotes y detección impulsada por aprendizaje automático.

Preguntas Frecuentes

¿Cuál es el principal beneficio de usar IronBarcode para construir una API de escáner en C#?

IronBarcode permite a los desarrolladores crear rápidamente una poderosa API de escáner de códigos de barras lista para producción con mínima complejidad. Simplifica el proceso eliminando la necesidad de integraciones complejas con SDK de escáner.

¿Puede IronBarcode manejar entradas de códigos de barras dañadas?

Sí, IronBarcode está diseñado para procesar datos de códigos de barras incluso de entradas de escaneo dañadas, asegurando alta fiabilidad en aplicaciones del mundo real.

¿Qué tipos de entradas puede IronBarcode procesar en una API de escáner en C#?

IronBarcode puede procesar datos de códigos de barras de varias entradas como imágenes y PDFs, ofreciendo soluciones versátiles para diferentes necesidades de escaneo.

¿Hay un tutorial disponible para construir una API de escáner de códigos de barras usando IronBarcode?

Sí, la página web proporciona un tutorial completo con ejemplos de código para guiar a los desarrolladores en la construcción de un punto final de escaneo de códigos de barras RESTful usando IronBarcode.

¿Qué tan rápido se puede configurar una API de escáner de códigos de barras usando IronBarcode?

Con IronBarcode, los desarrolladores pueden configurar una API de escáner de códigos de barras en minutos, optimizando el tiempo y esfuerzo de desarrollo.

¿Requiere IronBarcode alguna integración compleja de SDK?

No, IronBarcode elimina la necesidad de integraciones complejas con SDK de escáner, facilitando a los desarrolladores implementar la funcionalidad de escaneo de códigos de barras.

¿Qué lenguaje de programación se utiliza con IronBarcode para construir una API de escáner?

IronBarcode se utiliza con C# para construir una API de escáner, aprovechando el marco .NET para un rendimiento robusto.

Jordi Bardia
Ingeniero de Software
Jordi es más competente en Python, C# y C++. Cuando no está aprovechando sus habilidades en Iron Software, está programando juegos. Compartiendo responsabilidades para pruebas de productos, desarrollo de productos e investigación, Jordi agrega un valor inmenso a la mejora continua del producto. La experiencia variada lo mantiene ...
Leer más