Saltar al pie de página
COMPARAR CON OTROS COMPONENTES

Spire.Barcode vs IronBarcode: Comparación de bibliotecas de códigos de barras C#

ZXing.Net.MAUI vs IronBarcode: Comparación de códigos de barras en C# MAUI 2026

ZXing.Net.Maui.Controls v0.7.4. Estable en NuGet pero aún pre-1.0. No se admite el escaneo en MAUI de Windows(solo generación). Se documentó que el enfoque automático de iPhone 15 Pro está afectado (problema #260). Fuga de recursos de cámara sin Dispose() (problema #164). Esta es la biblioteca a la que recurren en primer lugar la mayoría de los desarrolladores de .NET MAUI , y la que con mayor frecuencia pone de manifiesto problemas de producción antes del lanzamiento de un proyecto.

Comprender ZXing .NET.MAUI

ZXing .NET.MAUI es una versión para .NET MAUI, mantenida por la comunidad, de la biblioteca de códigos de barras ZXing .NET , desarrollada y publicada por Jon Dick (GitHub: Redth) bajo la licencia MIT. Proporciona un control de cámara XAML, CameraBarcodeReaderView, que incrusta un visor de escaneo de códigos de barras en vivo en las páginas de MAUI. Los desarrolladores conectan un evento BarcodesDetected para recibir los resultados del escaneo a medida que la cámara captura los fotogramas. La biblioteca hereda el motor de formato de código de barras completo de ZXing.Net, incluyendo su enumeración BarcodeFormats y el modelo de configuración BarcodeReaderOptions.

El paquete ZXing.Net.Maui.Controls se registra en MauiProgram.cs a través de builder.UseBarcodeReader() y está diseñado en torno a la tubería de cámara móvil para iOS y Android. La biblioteca no cuenta con el respaldo de ninguna organización comercial, no tiene un acuerdo de nivel de servicio (SLA) y no ofrece ningún nivel de soporte de pago. Su versión v0.7.4 es un lanzamiento estable de NuGet pero sigue siendo pre-1.0 bajo versionado semántico.

Características arquitectónicas clave de ZXing .NET.MAUI:

  • Estado pre-1.0: El paquete NuGet está en v0.7.4 — estable, pero aún pre-1.0. Los cambios de API de versiones menores son posibles antes de 1.0, el ritmo de corrección de errores depende del mantenedor de la comunidad, y no hay contrato de soporte comercial.
  • Escaneo en iOS y Android: La biblioteca está construida en torno a las APIs de cámara de la plataforma para iOS y Android. MAUI de Windowsadmite solo generación — no se ha implementado el escaneo con cámara. Mac Catalyst está incluido en la lista de frameworks objetivo pero el escaneo no está documentado oficialmente.
  • Visor de cámara continua: CameraBarcodeReaderView es un control de cámara en vivo que se ejecuta continuamente mientras la página es visible. Ocupa espacio en la pantalla y requiere la gestión del ciclo de vida de la página.
  • No implementación de Dispose(): El control no implementa IDisposable. Los recursos de la cámara no se liberan formalmente en la navegación de página, lo que requiere una solución manual IsDetecting = false en OnDisappearing() (problema de GitHub #164).
  • Problema de enfoque automático del iPhone 15 Pro: El problema de GitHub #260 documenta que los dispositivos iPhone 15 Pro y Pro Max (identificadores de hardware iPhone16,1 y iPhone16,2) no logran un enfoque confiable para la detección de códigos de barras. Actualmente no hay una solución programática disponible.
  • Problema de compatibilidad con la cámara Android: El problema de GitHub #275 rastrea fallos de construcción debido a conflictos de compatibilidad con AndroidX Camera 1.5.0, con una solución alternativa de fijar los paquetes de cámara a 1.4.x o aumentar el minSdkVersion del proyecto.
  • Hereda la especificación de formato de ZXing.Net: Cada sesión de escaneo requiere declaración explícita de qué valores BarcodeFormats escanear. Los formatos que no están listados en BarcodeReaderOptions.Formats son ignorados silenciosamente incluso cuando son visibles en el cuadro de la cámara.
  • Arquitectura solo para cámara: La biblioteca no tiene API de entrada de archivos, ni API de lectura de flujo, ni capacidad de extracción de códigos de barras PDF. Todo el escaneo debe realizarse a través del visor de la cámara en tiempo real.

Arquitectura CameraBarcodeReaderView

El control CameraBarcodeReaderView es el componente central de ZXing.Net.MAUI. Se declara en XAML y se configura mediante una vinculación BarcodeReaderOptions. Cada página que lo use debe implementar OnAppearing y las anulaciones de OnDisappearing para gestionar el estado de IsDetecting:


<ContentPage xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;assembly=ZXing.Net.MAUI.Controls">
    <zxing:CameraBarcodeReaderView
        x:Name="CameraView"
        Options="{Binding ReaderOptions}"
        BarcodesDetected="OnBarcodesDetected" />
</ContentPage>

<ContentPage xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;assembly=ZXing.Net.MAUI.Controls">
    <zxing:CameraBarcodeReaderView
        x:Name="CameraView"
        Options="{Binding ReaderOptions}"
        BarcodesDetected="OnBarcodesDetected" />
</ContentPage>
XML
// Toggling IsDetecting in lifecycle overrides is the documented pattern
protected override void OnDisappearing()
{
    base.OnDisappearing();
    if (CameraView != null)
        CameraView.IsDetecting = false;  // No IDisposable on the control
}

protected override void OnAppearing()
{
    base.OnAppearing();
    if (CameraView != null)
        CameraView.IsDetecting = true;
}
// Toggling IsDetecting in lifecycle overrides is the documented pattern
protected override void OnDisappearing()
{
    base.OnDisappearing();
    if (CameraView != null)
        CameraView.IsDetecting = false;  // No IDisposable on the control
}

protected override void OnAppearing()
{
    base.OnAppearing();
    if (CameraView != null)
        CameraView.IsDetecting = true;
}
' Toggling IsDetecting in lifecycle overrides is the documented pattern
Protected Overrides Sub OnDisappearing()
    MyBase.OnDisappearing()
    If CameraView IsNot Nothing Then
        CameraView.IsDetecting = False ' No IDisposable on the control
    End If
End Sub

Protected Overrides Sub OnAppearing()
    MyBase.OnAppearing()
    If CameraView IsNot Nothing Then
        CameraView.IsDetecting = True
    End If
End Sub
$vbLabelText   $csharpLabel

Cada página de escaneo en una aplicación ZXing .NET.MAUI contiene este código estándar del ciclo de vida. La ausencia de IDisposable significa que el estado de la cámara debe ser gestionado manualmente a través del indicador IsDetecting en lugar del patrón estándar Dispose.

Entendiendo IronBarcode

IronBarcode es una biblioteca de códigos de barras .NET con soporte comercial desarrollada por Iron Software. Proporciona tanto la lectura como la generación de códigos de barras a través de una API estática, BarcodeReader.Read(), que acepta bytes de imagen, rutas de archivos, flujos y documentos PDF. En un contexto MAUI, IronBarcode se combina con el MediaPicker incorporado de MAUI para capturar imágenes a través de la cámara del sistema, luego procesa la imagen resultante después de la captura en lugar de procesar un flujo continuo de cámara.

La biblioteca está diseñada para todas las plataformas MAUI (iOS, Android, Windows y macOS) a través del mismo paquete y las mismas rutas de código. No se requiere registro de servicio específico de la plataforma en MauiProgram.cs, no se incrusta ningún control de visualización de cámara en XAML, y no es necesario gestionar el ciclo de vida porque IronBarcode no mantiene el estado de la cámara en ejecución.

Características clave de IronBarcode:

  • Versión comercial estable: Publicada como un paquete NuGet listo para producción con soporte comercial, SLA y un ciclo de lanzamiento regular.
  • Todas las plataformas MAUI: Admite objetivos MAUI para iOS, Android, Windows y macOS desde un único paquete y un único patrón de código.
  • API sin estado: BarcodeReader.Read() es una llamada a método estático. No se ejecutan procesos en segundo plano entre los escaneos, no se requieren ganchos de ciclo de vida y no se acumulan recursos de la cámara al navegar entre páginas.
  • Detección automática de todos los formatos: Detecta automáticamente más de 50 formatos de código de barras sin necesidad de una lista de especificaciones de formato. No se requiere ninguna configuración para escanear un formato desconocido.
  • Lectura de archivos y PDF: Lee códigos de barras desde rutas de archivo, matrices de bytes, flujos y documentos PDF de forma nativa, cubriendo escenarios que las bibliotecas de cámaras en directo no pueden abordar.
  • Recuperación de códigos de barras dañados mediante aprendizaje automático: Aplica modelos de aprendizaje automático para recuperar códigos de barras a partir de imágenes dañadas, parcialmente ocultas o de baja calidad, más allá de lo que pueden lograr los algoritmos de umbral.
  • Generación de códigos de barras: Genera todos los formatos principales de códigos de barras 1D y 2D como imágenes con tamaño, color y margen configurables.
  • Implementación cruzada: El mismo paquete se ejecuta en ASP.NET Core, WPF, WinForms, aplicaciones de consola, Azure Functions y contenedores Docker junto con MAUI.

Comparación de características

La siguiente tabla destaca las principales diferencias entre ZXing .NET.MAUI e IronBarcode:

Característica ZXing.Net.MAUI IronBarcode
Estado de publicación Estable pero pre-1.0 (v0.7.4) Lanzamiento comercial estable
Soporte de Plataforma Escaneo en iOS, Android (generación solo en Windows) iOS, Android, Windows, macOS, servidor
Se requiere especificación de formato. No (autodetección)
Gestión de recursos de la cámara Manual (IsDetecting) No aplicable — apátrida
Extracción de códigos de barras PDF No disponible
Licencia MIT (gratuito, comunitario) Comercial
Soporte técnico comercial None

Comparación detallada de características

Característica ZXing.Net.MAUI IronBarcode
Plataforma
iOS MAUI Sí (problema de enfoque en iPhone 15 Pro #260)
Android MAUI Sí (problema de compilación de Camera 1.5.0 #275)
MAUI de Windows Sólo generación — no se ha implementado el escaneo
macOS MAUI Objetivo Mac Catalyst; escaneo no documentado oficialmente
ASP.NET Core / Servidor No
WPF / WinForms No
Azure Functions / Docker No
.NET Framework 4.6.2 o superior No
Lectura
Detección automática de formato No, debe especificar los formatos. Sí (más de 50 formatos)
Ruta de archivo ingresada Solo mediante ZXing .NET Core
Entrada de flujo Solo mediante ZXing .NET Core
Extracción de códigos de barras PDF No
Recuperación de códigos de barras dañados Solo esfuérzate más Sí (con tecnología de aprendizaje automático)
Integración de la cámara
Control del visor en directo No (Interfaz de usuario del sistema MediaPicker)
Se requiere gestión del ciclo de vida Sí (Está detectando) No
Implementación de Dispose() No No procede
Enfoque automático del iPhone 15 Pro Afectado (problema de GitHub #260) No procede
Generación
Generación de códigos de barras Sí (a través de ZXing .NET)
Mantenimiento
Estado de publicación Estable pero pre-1.0 (v0.7.4) Listo para producción
Apoyo comercial None
Garantía de estabilidad de la API Pre-1.0 — posibles cambios de versión menor
Licencia MIT (gratuito) Comercial

Soporte de plataforma

La compatibilidad con plataformas es una diferencia estructural entre ZXing .NET.MAUI e IronBarcode , ya que ambas bibliotecas se basan en supuestos fundamentalmente diferentes sobre dónde se ejecutan las aplicaciones .NET MAUI .

Enfoque ZXing .NET.MAUI

ZXing.Net.MAUI está diseñado en torno a las APIs de cámara de la plataforma para iOS y Android. MAUI de Windowsadmite solo la generación de códigos de barras — el escaneo con cámara no se ha implementado y no está en una hoja de ruta pública. Esto refleja la elección arquitectónica de construir la biblioteca alrededor de un control de visor de cámara en vivo cuyas implementaciones de plataforma se escribieron solo para sistemas operativos móviles.

Un proyecto MAUI que tenga como objetivo net8.0-windows10.0.19041.0 no obtendrá funcionalidad de escaneo de códigos de barras de ZXing.Net.MAUI. Mac Catalyst está presente en la lista de frameworks objetivo, pero el escaneo en ese objetivo no está documentado oficialmente. Los equipos que inician un proyecto con objetivos solo móviles y luego añaden un requisito de Windows o macOS encontrarán que ZXing.Net.MAUI no puede cubrir el escaneo en esos objetivos. El propio soporte de iOS lleva un aviso: El problema de GitHub #260 documenta que los dispositivos iPhone 15 Pro y Pro Max se ven afectados por un problema de enfoque automático que impide una detección confiable.

Enfoque IronBarcode

IronBarcode es compatible con todos los frameworks de destino de MAUI (iOS, Android, Windows y macOS) desde el mismo paquete y con el mismo patrón de código. El enfoque MediaPicker + BarcodeReader.Read() se mapea naturalmente a cada plataforma: en móvil, MediaPicker.CapturePhotoAsync() invoca la cámara del dispositivo; En Windows, se corresponde con el selector de archivos, lo cual es un comportamiento apropiado para un entorno de escritorio. No se requiere código específico de la plataforma, compilación condicional ni registro en los servicios de la plataforma.

El patrón de código de barras de escritorio de MAUI para Windows y macOS está cubierto por el mismo paquete que gestiona el escaneo en dispositivos móviles. La misma llamada BarcodeReader.Read() que se ejecuta en un dispositivo Android también se ejecuta en un punto de conexión ASP.NET Core, una aplicación de escritorio WinForms o una Azure Function: el objetivo de despliegue no afecta la API.

Integración y ciclo de vida de la cámara

Las dos bibliotecas adoptan posturas arquitectónicas opuestas sobre cómo funciona el acceso a la cámara en una aplicación MAUI.

Enfoque ZXing .NET.MAUI

CameraBarcodeReaderView es un control de cámara persistente incrustado en la página XAML. Comienza a procesar los fotogramas de la cámara cuando IsDetecting está configurado en true y se detiene cuando está configurado en false. La ausencia de una implementación de Dispose() significa que los recursos de la cámara no se liberan a través del patrón estándar IDisposable cuando el usuario navega lejos. La mitigación documentada es configurar IsDetecting = false en OnDisappearing() y restaurarlo en OnAppearing():

// ZXing.Net.MAUI: toggle IsDetecting in page lifecycle overrides
protected override void OnDisappearing()
{
    base.OnDisappearing();
    CameraView.IsDetecting = false;
}

protected override void OnAppearing()
{
    base.OnAppearing();
    CameraView.IsDetecting = true;
}
// ZXing.Net.MAUI: toggle IsDetecting in page lifecycle overrides
protected override void OnDisappearing()
{
    base.OnDisappearing();
    CameraView.IsDetecting = false;
}

protected override void OnAppearing()
{
    base.OnAppearing();
    CameraView.IsDetecting = true;
}
' ZXing.Net.MAUI: toggle IsDetecting in page lifecycle overrides
Protected Overrides Sub OnDisappearing()
    MyBase.OnDisappearing()
    CameraView.IsDetecting = False
End Sub

Protected Overrides Sub OnAppearing()
    MyBase.OnAppearing()
    CameraView.IsDetecting = True
End Sub
$vbLabelText   $csharpLabel

Este patrón debe repetirse en cada página que contenga un escáner. Las aplicaciones que navegan frecuentemente hacia y desde páginas de escaneo pueden acumular recursos de cámara que no se han liberado completamente, lo que se rastrea en el problema de GitHub #164 junto con informes de crecimiento de memoria e inicialización intermitente de la cámara al regresar. El problema de enfoque automático del iPhone 15 Pro (problema de GitHub #260) es una preocupación separada dentro de la capa de integración de la cámara: la vista de la cámara representa claramente el código de barras, pero el sistema de enfoque automático no se bloquea con suficiente nitidez para la detección en el hardware iPhone16,1 y iPhone16,2. La solución documentada es instruir al usuario para que ajuste manualmente la distancia entre el dispositivo y el código de barras.

Enfoque IronBarcode

IronBarcode no incluye un control de cámara en el diseño XAML. En su lugar, la llamada MediaPicker.CapturePhotoAsync() abre la interfaz de usuario de la cámara del sistema cuando el usuario toca un botón. La cámara del sistema gestiona el enfoque, la exposición y el autoenfoque de forma independiente. Cuando el usuario confirma la captura, la imagen resultante se pasa a BarcodeReader.Read() como una matriz de bytes:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

private async void ScanButton_Clicked(object sender, EventArgs e)
{
    var photo = await MediaPicker.CapturePhotoAsync();
    if (photo == null) return;

    using var stream = await photo.OpenReadAsync();
    using var ms = new MemoryStream();
    await stream.CopyToAsync(ms);

    var results = BarcodeReader.Read(ms.ToArray());
    foreach (var barcode in results)
        Console.WriteLine($"{barcode.Format}: {barcode.Value}");
}

// No OnAppearing or OnDisappearing needed — no camera state to manage
// NuGet: dotnet add package IronBarcode
using IronBarCode;

private async void ScanButton_Clicked(object sender, EventArgs e)
{
    var photo = await MediaPicker.CapturePhotoAsync();
    if (photo == null) return;

    using var stream = await photo.OpenReadAsync();
    using var ms = new MemoryStream();
    await stream.CopyToAsync(ms);

    var results = BarcodeReader.Read(ms.ToArray());
    foreach (var barcode in results)
        Console.WriteLine($"{barcode.Format}: {barcode.Value}");
}

// No OnAppearing or OnDisappearing needed — no camera state to manage
Imports IronBarCode
Imports System.IO
Imports System.Threading.Tasks

Private Async Sub ScanButton_Clicked(sender As Object, e As EventArgs)
    Dim photo = Await MediaPicker.CapturePhotoAsync()
    If photo Is Nothing Then Return

    Using stream = Await photo.OpenReadAsync()
        Using ms As New MemoryStream()
            Await stream.CopyToAsync(ms)

            Dim results = BarcodeReader.Read(ms.ToArray())
            For Each barcode In results
                Console.WriteLine($"{barcode.Format}: {barcode.Value}")
            Next
        End Using
    End Using
End Sub

' No OnAppearing or OnDisappearing needed — no camera state to manage
$vbLabelText   $csharpLabel

El tutorial del escáner de códigos de barras .NET MAUI cubre la configuración completa del proyecto para este patrón, incluida la configuración de permisos tanto para iOS como para Android. Dado que no existe una vista de cámara persistente, no hay recursos que liberar, ni estados que alternar, ni código repetitivo del ciclo de vida que mantener en todas las páginas.

Especificación de formato

La forma en que una biblioteca gestiona la detección del formato de código de barras tiene consecuencias directas para la fiabilidad del escaneo en implementaciones reales.

Enfoque ZXing .NET.MAUI

ZXing .NET.MAUI hereda el requisito de especificación de formato de ZXing .NET . Antes de que comience el escaneo, el desarrollador debe poblar BarcodeReaderOptions.Formats con una máscara de bits de los valores de la enumeración BarcodeFormats que deberían ser detectados. Los formatos no incluidos en esta lista no serán detectados, de forma silenciosa, sin error ni advertencia:

// ZXing.Net.MAUI: formats must be declared explicitly
// Formats not listed here are not detected
ReaderOptions = new BarcodeReaderOptions
{
    Formats = BarcodeFormats.QRCode |
              BarcodeFormats.Code128 |
              BarcodeFormats.Ean13 |
              BarcodeFormats.UpcA,
    TryHarder = true,
    AutoRotate = true
};
// ZXing.Net.MAUI: formats must be declared explicitly
// Formats not listed here are not detected
ReaderOptions = new BarcodeReaderOptions
{
    Formats = BarcodeFormats.QRCode |
              BarcodeFormats.Code128 |
              BarcodeFormats.Ean13 |
              BarcodeFormats.UpcA,
    TryHarder = true,
    AutoRotate = true
};
' ZXing.Net.MAUI: formats must be declared explicitly
' Formats not listed here are not detected
ReaderOptions = New BarcodeReaderOptions With {
    .Formats = BarcodeFormats.QRCode Or
               BarcodeFormats.Code128 Or
               BarcodeFormats.Ean13 Or
               BarcodeFormats.UpcA,
    .TryHarder = True,
    .AutoRotate = True
}
$vbLabelText   $csharpLabel

Si un usuario apunta la cámara a un GS1 DataBar, un código Aztec, un MaxiCode o cualquier formato que no esté declarado en las opciones, la exploración no devuelve resultados sin generar un error. La cámara representa el código de barras y no se devuelve ningún resultado a la aplicación. En un entorno controlado, como un almacén donde cada artículo lleva una etiqueta con el código 128, esto es manejable. En despliegues donde los formatos de códigos de barras son determinados por proveedores externos, clientes o sistemas de terceros, la ausencia de una ruta de respaldo se convierte en un problema de soporte recurrente.

Enfoque IronBarcode

IronBarcode realiza la detección automática de formatos en todos los formatos compatibles sin necesidad de configuración previa. BarcodeReader.Read() analiza la imagen y devuelve resultados para cada código de barras que identifica, independientemente del formato. No se requiere una lista BarcodeReaderOptions:

// IronBarcode: no format specification needed
// All 50+ formats detected automatically
var results = BarcodeReader.Read(imageBytes);
foreach (var barcode in results)
    Console.WriteLine($"{barcode.Format}: {barcode.Value}");
// IronBarcode: no format specification needed
// All 50+ formats detected automatically
var results = BarcodeReader.Read(imageBytes);
foreach (var barcode in results)
    Console.WriteLine($"{barcode.Format}: {barcode.Value}");
Imports IronBarcode

' IronBarcode: no format specification needed
' All 50+ formats detected automatically
Dim results = BarcodeReader.Read(imageBytes)
For Each barcode In results
    Console.WriteLine($"{barcode.Format}: {barcode.Value}")
Next
$vbLabelText   $csharpLabel

Si se requiere optimizar el rendimiento en un escenario controlado donde solo se espera un formato, se pueden pasar sugerencias de formato de forma opcional, pero nunca son necesarias para una detección correcta. Un código de barras con un formato no previsto por el desarrollador será detectado y devuelto.

Procesamiento de archivos y PDF

Además del escaneo en tiempo real mediante cámara, muchos flujos de trabajo de códigos de barras en producción implican la lectura de documentos almacenados: facturas de envío, entradas digitales, imágenes cargadas y archivos PDF adjuntos.

Enfoque ZXing .NET.MAUI

ZXing .NET.MAUI es una biblioteca de control de cámara. No dispone de una API para leer códigos de barras desde rutas de archivo, matrices de bytes pasadas directamente desde el almacenamiento o documentos PDF. El control CameraBarcodeReaderView requiere una alimentación de cámara en vivo; No existe ningún método estático que acepte una ruta de archivo y devuelva resultados de código de barras. Los equipos que necesiten leer códigos de barras de archivos PDF cargados, sistemas de gestión documental o colas de procesamiento de imágenes por lotes no pueden usar ZXing .NET.MAUI para esos escenarios y deben introducir una biblioteca independiente.

Enfoque IronBarcode

IronBarcode lee códigos de barras de cualquier fuente a través del mismo método BarcodeReader.Read(). Admite rutas de archivo, matrices de bytes, flujos de datos y documentos PDF. El análisis de PDF es nativo: IronBarcode procesa las páginas PDF directamente sin un paso de rasterización intermedio:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Read barcodes from a PDF file
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}");

// Read from a user-selected file using MAUI FilePicker
var file = await FilePicker.PickAsync();
if (file != null)
{
    var fileResults = BarcodeReader.Read(file.FullPath);
    foreach (var result in fileResults)
        ResultLabel.Text += $"\n{result.Format}: {result.Value}";
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Read barcodes from a PDF file
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}");

// Read from a user-selected file using MAUI FilePicker
var file = await FilePicker.PickAsync();
if (file != null)
{
    var fileResults = BarcodeReader.Read(file.FullPath);
    foreach (var result in fileResults)
        ResultLabel.Text += $"\n{result.Format}: {result.Value}";
}
Imports IronBarCode
Imports Microsoft.Maui.Storage

' Read barcodes from a PDF file
Dim results = BarcodeReader.Read("invoice.pdf")
For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}")
Next

' Read from a user-selected file using MAUI FilePicker
Dim file = Await FilePicker.PickAsync()
If file IsNot Nothing Then
    Dim fileResults = BarcodeReader.Read(file.FullPath)
    For Each result In fileResults
        ResultLabel.Text &= $"\n{result.Format}: {result.Value}"
    Next
End If
$vbLabelText   $csharpLabel

El flujo de trabajo completo para la lectura de códigos de barras en PDF, incluidos los documentos de varias páginas y los formatos de códigos de barras mixtos en diferentes páginas, está documentado en la guía "Leer códigos de barras desde PDF" . Esto abarca facturas de envío, billetes digitales, flujos de trabajo de gestión de documentos y escenarios de procesamiento por lotes que la arquitectura exclusiva para cámara de ZXing .NET.MAUI no puede abordar.

Referencia de mapeo de API

ZXing.Net.MAUI IronBarcode Notas
builder.UseBarcodeReader() No es necesario Eliminar de MauiProgram.cs
xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;..." No es necesario Eliminar la declaración del espacio de nombres XAML
<zxing:CameraBarcodeReaderView> Reemplazar con <Button> + MediaPicker Cambio arquitectónico
Options="{Binding ReaderOptions}" No es necesario No se necesita ningún objeto de opciones
BarcodesDetected="OnBarcodesDetected" BarcodeReader.Read() valor de retorno Evento → método de retorno
new BarcodeReaderOptions { Formats = BarcodeFormats.X \| ... } No es necesario La autodetección reemplaza esto
BarcodeDetectionEventArgs e IEnumerable<BarcodeResult> Modelo de entrega de resultados diferente
e.Results Valor de retorno de BarcodeReader.Read()
barcode.Value result.Value Mismo nombre de propiedad
barcode.Format result.Format Mismo nombre de propiedad
BarcodeFormats.QRCode BarcodeEncoding.QRCode Renombrar enumeración
BarcodeFormats.Code128 BarcodeEncoding.Code128 Renombrar enumeración
BarcodeFormats.Ean13 BarcodeEncoding.EAN13 Renombrar enumeración
CameraView.IsDetecting = false (OnDisappearing) No es necesario: elimine el método. IronBarcode no tiene estado.
CameraView.IsDetecting = true (OnAppearing) No es necesario: elimine el método. IronBarcode no tiene estado.
API sin entrada de archivos BarcodeReader.Read("path/to/file.png") Nueva capacidad
Sin API de PDF BarcodeReader.Read("document.pdf") Nueva capacidad

Cuando los equipos consideran migrar de ZXing .NET.MAUI a IronBarcode

Diversos escenarios concretos justifican la decisión de evaluar IronBarcode como sustituto de ZXing .NET.MAUI. Se trata de condiciones a nivel de proyecto y de producto, no de preferencias de implementación.

Requisitos de Windows MAUI

El factor desencadenante más común para una reevaluación es la adición de un destino MAUI para Windows a un proyecto que comenzó siendo solo para iOS y Android. Los equipos de MAUI suelen comenzar con compilaciones diseñadas primero para dispositivos móviles y luego las amplían a plataformas de escritorio a medida que evolucionan los requisitos. Cuando se produzca esa expansión, ZXing .NET.MAUI no ofrece ninguna solución viable: la plataforma Windows no está implementada ni figura en la hoja de ruta pública. El equipo deberá aceptar que el escaneo de códigos de barras no estará disponible en Windows o bien reemplazar la biblioteca. Dado que la sustitución implica un cambio estructural en el patrón de escaneo, los equipos suelen realizar el cambio en todas las plataformas al mismo tiempo.

Compatibilidad con hardware de última generación

El problema de enfoque automático de iPhone 15 Pro (problema de GitHub #260) es una consideración real para cualquier equipo que entregue un escáner de código de barras en producción a usuarios de iOS. El iPhone 15 Pro y Pro Max son comunes en el segmento de consumidores que espera una experiencia de aplicación pulida, y una solución temporal que pide a los usuarios ajustar su distancia de un código de barras es una regresión visible de UX en comparación con el hardware de iPhone más antiguo. Los equipos que detectan este problema en QA, o reciben informes de soporte de usuarios de iPhone 15 Pro, enfrentan una elección entre permanecer en una biblioteca donde actualmente no hay una solución disponible o migrar a un enfoque que no se ve afectado por el modelo de enfoque de la vista de cámara.

Procesamiento de archivos y documentos

Los requisitos de escaneo de códigos de barras rara vez se limitan a la captura de vídeo en directo. Las aplicaciones que comienzan como escáneres de inventario con frecuencia se amplían para incluir la lectura de códigos de barras de archivos PDF cargados, el procesamiento de facturas de envío o la gestión de billetes digitales desde archivos adjuntos de correo electrónico. ZXing .NET.MAUI no tiene una API para ninguno de estos escenarios. Cuando se añade a la lista de tareas pendientes un requisito de producto que implica leer un código de barras de un archivo o documento, los equipos que utilizan ZXing .NET.MAUI deben introducir una biblioteca independiente para gestionarlo. Si el equipo ya utiliza IronBarcode para alguno de esos escenarios basados ​​en archivos, consolidar el escaneo de la cámara MAUI en la misma biblioteca se convierte en el siguiente paso lógico.

Requisitos de estabilidad de la producción

La designación pre-1.0 en v0.7.4 — mientras el paquete en sí es un lanzamiento estable de NuGet — tiene implicaciones para los equipos sujetos a análisis de composición de software, auditorías de dependencia, o procesos de aprobación interna. Algunos entornos empresariales requieren que las dependencias de producción lleven un lanzamiento estable 1.0+, un contrato de soporte comercial, o ambos. ZXing.Net.MAUI está mantenido por la comunidad y es pre-1.0, lo que encaja en herramientas internas y prototipos pero añade etapas de revisión en aplicaciones orientadas al cliente donde el escáner de código de barras es un flujo de trabajo principal. La ausencia de un nivel de soporte pagado significa que cualquier error crítico depende de la disponibilidad del mantenedor de la comunidad.

Consideraciones comunes sobre la migración

El cambio estructural de ZXing .NET.MAUI a IronBarcode implica tres sustituciones técnicas específicas que afectan a todos los archivos del código fuente que participan en el escaneo de códigos de barras.

Patrón de CameraBarcodeReaderView a MediaPicker

El control XAML CameraBarcodeReaderView y su declaración de espacio de nombres xmlns:zxing se eliminan por completo. En cada archivo XAML que contenía una vista de escáner, el reemplazo es un control Button que invoca MediaPicker.CapturePhotoAsync() en su controlador Clicked. El modelo impulsado por eventos, donde los resultados llegan a través de BarcodesDetected, se reemplaza leyendo el valor de retorno de BarcodeReader.Read() directamente en el controlador asíncrono.

¿Detección de eliminación del ciclo de vida?

Cada OnAppearing y anulación de OnDisappearing que existe únicamente para alternar CameraView.IsDetecting puede ser eliminada. Si esas anulaciones contienen otra lógica del ciclo de vida de la página, las líneas de IsDetecting se eliminan y se conserva la lógica restante. No hay un equivalente de IronBarcode a IsDetecting porque no hay estado de cámara persistente que gestionar entre navegaciones de página.

Eliminación del registro mediante UseBarcodeReader()

ZXing.Net.MAUI requiere una llamada builder.UseBarcodeReader() única en MauiProgram.cs para registrar sus servicios de cámara de plataforma. IronBarcode no requiere ningún registro de MauiProgram.cs. Se elimina la línea UseBarcodeReader(), y la importación del espacio de nombres using ZXing.Net.Maui; que la admite se elimina junto con la desinstalación del paquete.

Funcionalidades adicionales de IronBarcode

Más allá de los escenarios cubiertos en esta comparación, IronBarcode proporciona una funcionalidad de código de barras que va mucho más allá de lo que puede ofrecer un control MAUI basado en cámara:

  • Escaneo de códigos de barras en iOS: Soporte completo de iOS MAUIutilizando el mismo patrón MediaPicker + BarcodeReader.Read(): no gestión de cámara específica de plataforma, no listas de formatos, y sin código boilerplate de ciclo de vida.
  • Escaneo de códigos de barras en Android : Escaneo de MAUI en Android a través de la misma API unificada, sin los problemas de fijación de dependencias de Camera 1.5.0 presentes en ZXing .NET.MAUI.
  • Generación de códigos de barras: Genera códigos QR, Code128, EAN-13, PDF417, Data Matrix y todos los formatos principales como imágenes con tamaño, color, zona silenciosa y nivel de corrección de errores configurables.
  • Procesamiento por lotes: Lee todos los códigos de barras de todas las páginas de un PDF de varias páginas o de un directorio de imágenes en una sola llamada, devolviendo metadatos del número de página con cada resultado.
  • Despliegue en el lado del servidor: El mismo paquete NuGet y la misma llamada BarcodeReader.Read() se ejecutan en puntos de conexión ASP.NET Core, Azure Functions y contenedores Docker: un paquete cubre tanto el cliente móvil como el backend del servidor.
  • Recuperación de códigos de barras dañados: Los modelos de aprendizaje automático recuperan códigos de barras de etiquetas físicamente dañadas, impresiones de bajo contraste e imágenes capturadas en ángulos subóptimos que los decodificadores estándar basados ​​en umbrales no pueden procesar.
  • Generación de códigos de barras con estilo: Genera códigos de barras con colores personalizados, logotipos incrustados, esquinas redondeadas y texto de anotación, más allá de la salida monocromática simple disponible a través de ZXing .NET.

Compatibilidad con .NET y preparación para el futuro

IronBarcode mantiene un desarrollo activo con actualizaciones periódicas dirigidas a las versiones actuales de .NET . La biblioteca es compatible con .NET 8, .NET 9, y sigue las versiones posteriores de .NET. También es compatible con .NET Framework 4.6.2 y versiones posteriores para entornos de aplicaciones heredadas. ZXing.Net.MAUI, como un paquete mantenido por la comunidad y pre-1.0, no tiene compromisos formales sobre los cronogramas de soporte de versión .NET. Para los proyectos MAUI, que están vinculados al ciclo de lanzamiento de .NET , la disponibilidad de una biblioteca con mantenimiento activo y soporte comercial que realice un seguimiento de cada versión de .NET es relevante para la planificación a largo plazo.

Conclusión

ZXing .NET.MAUI e IronBarcode representan soluciones diferentes al mismo problema —la lectura de códigos de barras en una aplicación .NET MAUI , pero parten de premisas arquitectónicas diferentes. ZXing .NET.MAUI integra un visor de cámara en tiempo real directamente en la página XAML, funcionando como un control de cámara persistente que genera eventos a medida que se analizan los fotogramas. IronBarcode trata la cámara como un dispositivo de captura accedido a través del MediaPicker del sistema, procesando una imagen estática después de la captura en lugar de un flujo continuo. Esta diferencia de enfoque determina prácticamente todo lo demás: la cobertura de la plataforma, la complejidad del ciclo de vida, el manejo del formato y el alcance de la implementación.

ZXing.Net.MAUI es realmente apropiado para perfiles de proyectos específicos: aplicaciones iOS y Android, prototipos y herramientas internas, equipos que conocen sus formatos de código de barras con anticipación, proyectos sin requisito de escaneo MAUI en Windows, y situaciones donde la licencia MIT sin costo es el factor decisivo. Para un escáner de inventario de almacén en un conjunto fijo de dispositivos Android que escanean etiquetas Code128, ZXing .NET.MAUI funcionará correctamente. El estado pre-1.0, el problema del iPhone 15 Pro, y el código boilerplate del ciclo de vida son compromisos reales que vale la pena aceptar en el contexto correcto.

IronBarcode es apropiado cuando el alcance del proyecto es más amplio: objetivos MAUI para Windows o macOS, formatos de código de barras desconocidos o variables de sistemas externos, requisitos que incluyen la lectura de códigos de barras de archivos PDF o archivos cargados, necesidades de estabilidad de nivel de producción o procesamiento de códigos de barras del lado del servidor además del escaneo móvil. La licencia comercial es una inversión que cubre el soporte, el mantenimiento y las actualizaciones de compatibilidad en todas las versiones de .NET . La API sin estado elimina una categoría de errores —fugas de recursos de la cámara, errores de estado del ciclo de vida— que ZXing .NET.MAUI obliga a los desarrolladores a prevenir manualmente.

La valoración honesta es que ninguna de las dos bibliotecas es universalmente correcta. ZXing .NET.MAUI se ha ganado su posición como la primera biblioteca que prueban la mayoría de los desarrolladores de MAUI porque es gratuita, familiar y rápida de integrar. Los problemas que conlleva son reales, pero solo importan en determinadas condiciones del proyecto. Cuando se dan esas condiciones (un requisito de Windows, hardware de iPhone de última generación, escaneo basado en archivos o estándares de estabilidad de producción), IronBarcode las aborda todas. La elección depende de si las restricciones específicas del proyecto lo sitúan dentro o fuera de los escenarios en los que las limitaciones conocidas de ZXing .NET.MAUI se convierten en obstáculos.

Preguntas Frecuentes

¿Qué es ZXing.Net.MAUI?

ZXing.Net.MAUI es una biblioteca de códigos de barras .NET para generar y leer códigos de barras en aplicaciones C#. Es una de las varias alternativas que los desarrolladores evalúan cuando seleccionan una solución de código de barras para proyectos .NET.

¿Cuáles son las principales diferencias entre ZXing.Net.MAUI e IronBarcode?

IronBarcode utiliza una API estática y sin estado que no requiere gestión de instancias, mientras que ZXing.Net.MAUI suele requerir la creación y configuración de instancias antes de su uso. IronBarcode también ofrece compatibilidad nativa con PDF, detección automática de formatos y licencia de clave única en todos los entornos.

¿Es IronBarcode más fácil de licenciar que ZXing.Net.MAUI?

IronBarcode utiliza una única clave de licencia que cubre tanto el desarrollo como los despliegues de producción. Esto simplifica las canalizaciones de CI/CD y las configuraciones de Docker en comparación con los sistemas de licencias que separan las claves de SDK de las claves de tiempo de ejecución.

¿Es IronBarcode compatible con todos los formatos de código de barras que admite ZXing.Net.MAUI?

IronBarcode es compatible con más de 30 simbologías de códigos de barras, incluidos QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 y muchos más. La autodetección de formatos significa que no se requiere una enumeración explícita de formatos.

¿Es IronBarcode compatible con la lectura nativa de códigos de barras en PDF?

Sí. IronBarcode lee códigos de barras directamente desde archivos PDF utilizando BarcodeReader.Read("document.pdf") sin necesidad de una biblioteca de renderizado de PDF independiente. Los resultados por página incluyen el número de página, el formato del código de barras, el valor y la puntuación de confianza.

¿Cómo gestiona IronBarcode el procesamiento por lotes en comparación con ZXing.Net.MAUI?

Los métodos estáticos de IronBarcode no tienen estado y son naturalmente seguros para subprocesos, lo que permite el uso directo de Parallel.ForEach sin gestión de instancias por subproceso. No hay límite de rendimiento en ningún nivel de precios.

¿Qué versiones de .NET admite IronBarcode ?

IronBarcode es compatible con .NET Framework 4.6.2+, .NET Core 3.1 y .NET 5, 6, 7, 8 y 9 en un único paquete NuGet. Las plataformas de destino incluyen Windows x64/x86, Linux x64 y macOS x64/ARM.

¿Cómo instalo IronBarcode en un proyecto .NET?

Instale IronBarcode a través de NuGet: ejecute 'Install-Package IronBarCode' en la consola del gestor de paquetes, o 'dotnet add package IronBarCode' en la CLI. No se necesitan instaladores SDK ni archivos de ejecución adicionales.

¿Puedo evaluar IronBarcode antes de comprarlo, a diferencia de ZXing.Net.MAUI?

Sí. El modo de prueba de IronBarcode devuelve los valores completos de los códigos de barras descodificados; sólo las imágenes de salida generadas reciben una marca de agua. Puede comprobar la precisión de la lectura en sus propios documentos antes de comprometerse con la compra.

¿Cuál es la diferencia de precio entre ZXing.Net.MAUI e IronBarcode?

IronBarcode cuesta a partir de 749 dólares por una licencia perpetua de desarrollador único que cubre el desarrollo y la producción. Los detalles de precios y opciones de volumen están disponibles en la página de licencias de IronBarcode. No se requiere una licencia de ejecución por separado.

¿Es sencillo migrar de ZXing.Net.MAUI a IronBarcode?

La migración de ZXing.Net.MAUI a IronBarcode consiste principalmente en sustituir las llamadas a la API basadas en instancias por métodos estáticos de IronBarcode, eliminar la repetición de licencias y actualizar los nombres de las propiedades de los resultados. La mayoría de las migraciones implican reducir código en lugar de añadirlo.

¿IronBarcode genera códigos QR con logotipos?

Sí. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") incrusta una imagen de marca en un código QR de forma nativa con corrección de errores configurable. Los códigos QR coloreados también son compatibles con ChangeBarCodeColor().

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