Saltar al pie de página
USANDO IRONQR

Código QR .NET Core: Leer y generar códigos QR en C#

Al crear aplicaciones web o Enterprise en .NET Core, la compatibilidad con códigos QR —para el seguimiento de inventario, flujos de pago o autenticación de dos factores— es un requisito frecuente. En España, la generación de códigos QR es además una obligación legal: todas las facturas emitidas bajo el sistema VeriFactu de la AEAT deben incluir un código QR de verificación, y los negocios del País Vasco (Bizkaia, Gipuzkoa, Araba) están obligados a incluir el QR TicketBAI en cada ticket de venta. Para estos casos de uso normativos, recurrir a una biblioteca dedicada que gestione todo el flujo de trabajo es esencial. IronQR ofrece una solución completa de códigos QR for .NET, que abarca desde la generación básica hasta la lectura basada en aprendizaje automático y la corrección avanzada de errores.

¿Listo para probarlo por ti mismo? Empieza hoy mismo tu prueba gratuita y comprueba lo rápido que puedes añadir la funcionalidad QR a tu proyecto.

NuGet Instalar con NuGet

PM >  Install-Package IronQR

Echa un vistazo a IronQR en NuGet para una instalación rápida. Con más de 10 millones de descargas, está transformando el desarrollo de PDF con C#. También puede descargar el DLL.

¿Cómo se instala la biblioteca de códigos QR?

La instalación de IronQR a través de NuGet se realiza en cuestión de segundos. Abre Visual Studio, ve a Herramientas > Administrador de paquetes NuGet > Administrar paquetes NuGet para la solución, busca IronQR y haz clic en Instalar. El paquete tiene unas dependencias mínimas y está preparado para funcionar en Windows, macOS y Linux desde el primer momento.

Install-Package IronQR

IronQR está destinado a .NET Core 6, 7, 8, 9 y 10, así como a .NET Framework 4.6.2 y versiones posteriores. Para proyectos multiplataforma, una integración de SkiaSharp se encarga del procesamiento de imágenes en entornos de ejecución que no sean Windows. La biblioteca funciona con aplicaciones web ASP.NET Core, aplicaciones de consola y soluciones de escritorio sin necesidad de configuración adicional del tiempo de ejecución. Una vez instalada, todos los métodos de extensión y tipos necesarios están disponibles de inmediato.

El contexto español: QR obligatorio en cada factura

Antes de explorar los aspectos técnicos, es fundamental entender por qué la generación de QR es prioritaria para cualquier empresa que opere en España:

VeriFactu (AEAT): Bajo el sistema VeriFactu, cada factura emitida en España debe incluir un código QR que codifica el hash de la factura y apunta a https://sede.agenciatributaria.gob.es/ para verificación. Este QR debe mostrar el texto VERI*FACTU (con asterisk obligatorio) o la leyenda alternativa Factura verificable en la sede electrónica de la AEAT. IronQR permite generar este QR con el nivel de corrección de errores adecuado para garantizar su legibilidad en documentos impresos.

TicketBAI (Bizkaia, Gipuzkoa, Araba): Las tres diputaciones forales del País Vasco exigen el sistema TicketBAI para todos los comercios y autónomos de la región. Cada ticket de venta debe incluir un QR XAdES-firmado con la cadena de referencia de la factura. El esquema BATUZ (Bizkaia) difiere ligeramente de los de Gipuzkoa y Araba, pero todos requieren generación programática de QR. IronQR proporciona las herramientas necesarias para generar estos QR con el nivel de corrección y las dimensiones adecuadas.

Crea y Crece: La Ley 18/2022 (Crea y Crece) establecerá la obligación de factura electrónica B2B, que incluirá QR de verificación para todas las facturas entre empresas, con plazos de implantación que afectarán a la mayoría de empresas españolas a partir de 2027-2028.

¿Cómo se lee un código QR básico a partir de una imagen?

La lectura de datos de códigos QR a partir de archivos de imagen solo requiere unas pocas líneas de código. La clase QrReader utiliza un modelo avanzado de aprendizaje automático que evalúa la calidad de la imagen y selecciona automáticamente el modo de segmento correcto, lo que le proporciona resultados precisos incluso cuando la imagen de entrada no es ideal.

using IronQr;
using IronSoftware.Drawing;

// Load image containing QR code
var inputBmp = AnyBitmap.FromFile("qr-sample.png");
// Create QrImageInput from the bitmap
QrImageInput imageInput = new QrImageInput(inputBmp);
// Initialize QR Reader with ML model
QrReader reader = new QrReader();
// Read and decode all QR codes in the image
IEnumerable<QrResult> results = reader.Read(imageInput);
// Output decoded text strings
foreach (var qrCode in results)
{
    Console.WriteLine($"QR Code Value: {qrCode.Value}");
    Console.WriteLine($"URL: {qrCode.Url}");
}
using IronQr;
using IronSoftware.Drawing;

// Load image containing QR code
var inputBmp = AnyBitmap.FromFile("qr-sample.png");
// Create QrImageInput from the bitmap
QrImageInput imageInput = new QrImageInput(inputBmp);
// Initialize QR Reader with ML model
QrReader reader = new QrReader();
// Read and decode all QR codes in the image
IEnumerable<QrResult> results = reader.Read(imageInput);
// Output decoded text strings
foreach (var qrCode in results)
{
    Console.WriteLine($"QR Code Value: {qrCode.Value}");
    Console.WriteLine($"URL: {qrCode.Url}");
}
Imports IronQr
Imports IronSoftware.Drawing

' Load image containing QR code
Dim inputBmp = AnyBitmap.FromFile("qr-sample.png")
' Create QrImageInput from the bitmap
Dim imageInput As New QrImageInput(inputBmp)
' Initialize QR Reader with ML model
Dim reader As New QrReader()
' Read and decode all QR codes in the image
Dim results As IEnumerable(Of QrResult) = reader.Read(imageInput)
' Output decoded text strings
For Each qrCode In results
    Console.WriteLine($"QR Code Value: {qrCode.Value}")
    Console.WriteLine($"URL: {qrCode.Url}")
Next
$vbLabelText   $csharpLabel

Introducir código QR

Generador de códigos QR .NET Core: Lee y genera códigos QR con solo unas pocas líneas de código: Imagen 1 - Introducción del código QR

Resultado

Generador de códigos QR .NET Core: Lee y genera códigos QR con solo unas pocas líneas de código: Imagen 2 - Ejemplo de resultado de escaneo de un código QR

El método QrReader.Read() procesa el QrImageInput y devuelve un IEnumerable<QrResult>, donde cada resultado contiene el texto descodificado, la URL si se ha codificado alguna, y la posición espacial del símbolo QR en la imagen. La biblioteca admite matrices de bytes, rutas de archivos y objetos AnyBitmap, lo que te ofrece flexibilidad para cualquier arquitectura de proyecto, ya sea que estés leyendo desde un disco, una base de datos o una transmisión de cámara en directo.

El modelo de aprendizaje automático en el que se basa el lector distingue a IronQR de las bibliotecas puramente algorítmicas. Gestiona imperfecciones del mundo real, como el desenfoque de movimiento, la oclusión parcial y la iluminación desigual, sin requerir un preprocesamiento manual ni el ajuste de umbrales. Esto es especialmente importante para la lectura de QR de verificación VeriFactu en facturas impresas, donde la calidad de la imagen puede variar según la impresora utilizada.

¿Cómo se extraen los datos de un código QR avanzado?

Más allá de la decodificación básica de valores, IronQR expone coordenadas, segmentos de datos sin procesar e información a nivel de módulo de cada símbolo escaneado. Esto es esencial para los flujos de trabajo de procesamiento de documentos en los que es necesario saber exactamente dónde aparece un código QR en la página, o para aplicaciones que deben gestionar varios códigos en una sola imagen.

using IronQr;
using IronSoftware.Drawing;

var inputBmp = AnyBitmap.FromFile("document-with-qr.png");
QrImageInput imageInput = new QrImageInput(inputBmp);
QrReader reader = new QrReader();
IEnumerable<QrResult> results = reader.Read(imageInput);
foreach (var qrCode in results)
{
    // Access decoded value
    Console.WriteLine($"Data: {qrCode.Value}");
    // Get corner coordinate positions
    foreach (PointF point in qrCode.Points)
    {
        Console.WriteLine($"Position: {point.X}, {point.Y}");
    }
}
using IronQr;
using IronSoftware.Drawing;

var inputBmp = AnyBitmap.FromFile("document-with-qr.png");
QrImageInput imageInput = new QrImageInput(inputBmp);
QrReader reader = new QrReader();
IEnumerable<QrResult> results = reader.Read(imageInput);
foreach (var qrCode in results)
{
    // Access decoded value
    Console.WriteLine($"Data: {qrCode.Value}");
    // Get corner coordinate positions
    foreach (PointF point in qrCode.Points)
    {
        Console.WriteLine($"Position: {point.X}, {point.Y}");
    }
}
Imports IronQr
Imports IronSoftware.Drawing

Dim inputBmp = AnyBitmap.FromFile("document-with-qr.png")
Dim imageInput As New QrImageInput(inputBmp)
Dim reader As New QrReader()
Dim results As IEnumerable(Of QrResult) = reader.Read(imageInput)

For Each qrCode In results
    ' Access decoded value
    Console.WriteLine($"Data: {qrCode.Value}")
    ' Get corner coordinate positions
    For Each point As PointF In qrCode.Points
        Console.WriteLine($"Position: {point.X}, {point.Y}")
    Next
Next
$vbLabelText   $csharpLabel

QR de entrada

Generador de códigos QR .NET Core: Lee y genera códigos QR con solo unas pocas líneas de código: Imagen 3 - Introducción del código QR

Resultados de la lectura avanzada de QR

Generador de códigos QR .NET Core: Lee y genera códigos QR con solo unas pocas líneas de código: Imagen 4 - Resultados de la extracción avanzada de datos de códigos QR

La colección QrResult.Points contiene las cuatro coordenadas de las esquinas del símbolo QR detectado en el espacio de píxeles. Su aplicación puede utilizarlas para superponer cuadros delimitadores sobre imágenes de documentos, recortar la región del código QR para su posterior procesamiento o pasar los datos de ubicación a un sistema posterior que asigne coordenadas físicas a posiciones lógicas en el documento.

IronQR procesa códigos que contienen logotipos incrustados personalizados, módulos dañados o entradas de baja resolución a través del mismo canal de ML. La biblioteca IronQR no requiere pasos de preprocesamiento separados: la detección y la decodificación se realizan en una sola llamada Read().

¿Cómo afectan los niveles de corrección de errores a la calidad de los códigos QR?

La corrección de errores es el mecanismo que permite a un escáner de códigos QR recuperar los datos originales incluso cuando parte del código está oculto, mal impreso o físicamente dañado. El estándar del código QR define cuatro niveles —Bajo (L), Medio (M), Cuartil (Q) y Alto (H)—, cada uno de los cuales equilibra la capacidad de almacenamiento con la tolerancia a daños.

Nivel Capacidad de recuperación Mejor uso
L ~7% Pantallas digitales nítidas, máxima densidad de datos
M ~15% Aplicaciones generales de impresión
Q ~25% Etiquetas industriales, se espera un desgaste moderado
H ~30% Logotipos incrustados, superficies exteriores o de alto desgaste

Para los QR de verificación VeriFactu y TicketBAI, se recomienda el nivel M o Q: M proporciona la densidad de datos suficiente para codificar el hash de la factura y la URL de verificación de la AEAT, mientras que Q ofrece mayor tolerancia para QR impresos en papel de baja calidad o escaneados con iluminación irregular. Para tickets de punto de venta con mayor densidad de datos, Q garantiza la legibilidad incluso con impresoras térmicas de resolución media.

Al generar códigos QR, especificar un nivel de corrección de errores más alto garantiza que el resultado se mantenga en condiciones reales de escaneo:

using IronQr;
using IronSoftware.Drawing;

// Configure QR options with high error correction
var qrOptions = new QrOptions(QrErrorCorrectionLevel.High, 20);
// Generate a QR code with specified error correction
QrCode myQr = QrWriter.Write("https://ironsoftware.com", qrOptions);
// Save as PNG image
AnyBitmap qrImage = myQr.Save();
qrImage.SaveAs("high-error-correction-qr.png");
using IronQr;
using IronSoftware.Drawing;

// Configure QR options with high error correction
var qrOptions = new QrOptions(QrErrorCorrectionLevel.High, 20);
// Generate a QR code with specified error correction
QrCode myQr = QrWriter.Write("https://ironsoftware.com", qrOptions);
// Save as PNG image
AnyBitmap qrImage = myQr.Save();
qrImage.SaveAs("high-error-correction-qr.png");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Resultado

Generador de códigos QR .NET Core: Lee y genera códigos QR con solo unas pocas líneas de código: Imagen 5 - Código QR generado con alto nivel de corrección de errores

El constructor QrOptions acepta el nivel de corrección de errores y un número de versión máximo. Los códigos de la versión 40 almacenan hasta 7089 caracteres numéricos, mientras que los de la versión 1 solo admiten 41. Establecer una versión máxima inferior limita el tamaño de la salida, lo cual resulta útil cuando se necesitan dimensiones físicas uniformes en todo un lote. Cuanto mayor es el nivel de corrección de errores, más módulos se reservan para la redundancia, lo que reduce la capacidad neta de datos en cualquier versión dada.

La función de tolerancia a fallos de IronQR se complementa con esta propiedad: al leer códigos generados con niveles de corrección más altos, la biblioteca recupera datos de códigos que fallarían por completo con un decodificador puramente algorítmico.

¿Cómo se generan códigos QR con caracteres internacionales?

IronQR es compatible con toda la gama de modos de codificación QR: numérico, alfanumérico, byte y kanji. Para el texto en japonés y otros contenidos Unicode, la biblioteca selecciona automáticamente la codificación que ocupa menos espacio:

using IronQr;
using IronSoftware.Drawing;

// Generate QR that encodes Japanese Unicode text
QrCode japaneseQr = QrWriter.Write("こんにちは世界");
// The library selects Kanji mode automatically
AnyBitmap qrImage = japaneseQr.Save();
qrImage.SaveAs("japanese-qr.png");
using IronQr;
using IronSoftware.Drawing;

// Generate QR that encodes Japanese Unicode text
QrCode japaneseQr = QrWriter.Write("こんにちは世界");
// The library selects Kanji mode automatically
AnyBitmap qrImage = japaneseQr.Save();
qrImage.SaveAs("japanese-qr.png");
Imports IronQr
Imports IronSoftware.Drawing

' Generate QR that encodes Japanese Unicode text
Dim japaneseQr As QrCode = QrWriter.Write("こんにちは世界")
' The library selects Kanji mode automatically
Dim qrImage As AnyBitmap = japaneseQr.Save()
qrImage.SaveAs("japanese-qr.png")
$vbLabelText   $csharpLabel

Salida de código QR

Generador de códigos QR .NET Core: Lee y genera códigos QR con solo unas pocas líneas de código: Imagen 6 - Código QR resultante

La codificación Kanji agrupa dos bytes por módulo en lugar de ocho bits, por lo que un código QR en japonés de la misma versión almacena un número significativamente mayor de caracteres que su equivalente en modo byte UTF-8. En el caso de contenido mixto —como una URL seguida de texto en japonés—, IronQR segmenta la entrada y codifica cada segmento en el modo óptimo. No es necesario especificar los límites de los segmentos ni llamar manualmente a los ayudantes de codificación; El proceso de codificación se encarga de esto por ti.

Esta selección automática también incluye marcadores de Interpretación de Canal Extendido (ECI), que indican a los escáneres que se están utilizando conjuntos de caracteres no estándar. Las aplicaciones dirigidas a mercados internacionales pueden pasar cualquier cadena Unicode directamente a QrWriter.Write() sin necesidad de una configuración adicional. En el contexto español, esto es relevante para aplicaciones que operan en España y otros mercados europeos, donde los caracteres con tilde y la ñ deben codificarse correctamente en los QR de facturas eIDAS y VeriFactu.

¿Cómo se utilizan los generadores de carga útil para datos QR estructurados?

Un código QR que codifica una URL simple sirve para compartir enlaces de forma sencilla, pero muchas aplicaciones necesitan codificar datos estructurados: credenciales de WiFi, tarjetas de contacto en formato vCard o datos de eventos. Formatear estos datos manualmente es propenso a errores; Un punto y coma que falte o un orden incorrecto de los campos hará que los escáneres malinterpreten los datos.

IronQR proporciona ayudantes de carga útil que construyen estas cadenas estructuradas correctamente:

using IronQr;
using IronSoftware.Drawing;

// Generate QR code with URL payload
var urlQrCode = QrWriter.Write("https://ironsoftware.com/csharp/qr/");
// Save QR as PNG image file
AnyBitmap qrImage = urlQrCode.Save();
qrImage.SaveAs("url-qr-code.png");
Console.WriteLine("QR code generated successfully.");
using IronQr;
using IronSoftware.Drawing;

// Generate QR code with URL payload
var urlQrCode = QrWriter.Write("https://ironsoftware.com/csharp/qr/");
// Save QR as PNG image file
AnyBitmap qrImage = urlQrCode.Save();
qrImage.SaveAs("url-qr-code.png");
Console.WriteLine("QR code generated successfully.");
Imports IronQr
Imports IronSoftware.Drawing

' Generate QR code with URL payload
Dim urlQrCode = QrWriter.Write("https://ironsoftware.com/csharp/qr/")
' Save QR as PNG image file
Dim qrImage As AnyBitmap = urlQrCode.Save()
qrImage.SaveAs("url-qr-code.png")
Console.WriteLine("QR code generated successfully.")
$vbLabelText   $csharpLabel

Código QR creado

Generador de códigos QR .NET Core: Lee y genera códigos QR con solo unas pocas líneas de código: Imagen 7 - Código QR creado a partir de una URL

El método QrWriter.Write() acepta tanto una cadena simple como un objeto de carga útil estructurado. Para el QR de verificación VeriFactu, la URL codificada sigue el formato definido por la AEAT: incluye el NIF del emisor, el número de factura, la fecha y el hash de la factura, todo concatenado según el esquema de la sede electrónica. Para redes WiFi, la carga útil codifica el SSID, la contraseña y el tipo de seguridad en el formato que reconocen los escáneres de Android e iOS. Para información de contacto, la salida sigue el estándar MeCard. La página de la función "Generar" documenta todos los tipos de carga útil compatibles y sus campos obligatorios.

La biblioteca genera imágenes con dimensiones en píxeles configurables. Para su uso en producción, generar códigos con un tamaño mínimo de 200 x 200 píxeles garantiza un escaneo fiable desde las distancias habituales de un smartphone. Los tamaños más grandes resultan ventajosos para aplicaciones en exteriores o impresas en las que la distancia de escaneo supera el metro.

¿Cómo se personaliza el aspecto de los códigos QR?

IronQR te permite controlar el aspecto visual de los códigos generados sin sacrificar la legibilidad. Puede cambiar los colores de primer plano y de fondo, aplicar una imagen de marca personalizada o insertar un logotipo en la zona libre del centro.

using IronQr;
using IronSoftware.Drawing;

// Define custom colors for the QR code
var darkColor = Color.FromArgb(30, 30, 120);   // Deep navy foreground
var lightColor = Color.White;

var options = new QrOptions(QrErrorCorrectionLevel.High, maxVersion: 20)
{
    BackgroundColor = lightColor,
    Color = darkColor,
    // Embed a logo image into the QR center
    Logo = AnyBitmap.FromFile("logo.png")
};

QrCode styledQr = QrWriter.Write("https://ironsoftware.com/csharp/qr/", options);
AnyBitmap output = styledQr.Save();
output.SaveAs("branded-qr.png");
using IronQr;
using IronSoftware.Drawing;

// Define custom colors for the QR code
var darkColor = Color.FromArgb(30, 30, 120);   // Deep navy foreground
var lightColor = Color.White;

var options = new QrOptions(QrErrorCorrectionLevel.High, maxVersion: 20)
{
    BackgroundColor = lightColor,
    Color = darkColor,
    // Embed a logo image into the QR center
    Logo = AnyBitmap.FromFile("logo.png")
};

QrCode styledQr = QrWriter.Write("https://ironsoftware.com/csharp/qr/", options);
AnyBitmap output = styledQr.Save();
output.SaveAs("branded-qr.png");
Imports IronQr
Imports IronSoftware.Drawing

' Define custom colors for the QR code
Dim darkColor As Color = Color.FromArgb(30, 30, 120) ' Deep navy foreground
Dim lightColor As Color = Color.White

Dim options As New QrOptions(QrErrorCorrectionLevel.High, maxVersion:=20) With {
    .BackgroundColor = lightColor,
    .Color = darkColor,
    ' Embed a logo image into the QR center
    .Logo = AnyBitmap.FromFile("logo.png")
}

Dim styledQr As QrCode = QrWriter.Write("https://ironsoftware.com/csharp/qr/", options)
Dim output As AnyBitmap = styledQr.Save()
output.SaveAs("branded-qr.png")
$vbLabelText   $csharpLabel

La inclusión de un logotipo reduce el área efectiva de datos, por lo que la biblioteca requiere un nivel de corrección de errores H cuando se proporciona un logotipo. La zona tranquila reservada en el centro ocupa aproximadamente el 30 % de la superficie del código, lo que se encuentra dentro de la capacidad de recuperación del nivel H. La biblioteca aplica esta restricción automáticamente: si se establece un nivel de corrección de errores más bajo junto con un logotipo, IronQR genera una excepción con un mensaje descriptivo en lugar de producir un código que se escanea de forma poco fiable.

Nota para QR VeriFactu y TicketBAI: Los QR de cumplimiento normativo no deben incluir logotipos incrustados, ya que las normativas de la AEAT y las diputaciones forales exigen máxima legibilidad. Reserve la personalización visual para QR de marketing y uso general.

Para aplicaciones ASP.NET Core, el tutorial del generador de códigos QR de .NET Core muestra cómo servir los códigos QR generados como respuestas de imagen desde una acción del controlador. El flujo de salida escribe directamente en la respuesta sin E/S de archivos intermedios, lo que mantiene baja la latencia para los puntos finales de alto tráfico.

¿Cómo se leen los códigos QR en una aplicación ASP.NET Core?

El escaneo de códigos QR del lado del servidor —a partir de imágenes cargadas, procesos de procesamiento de documentos o sistemas de inspección automatizados— es un caso de uso habitual de la API de lectura. En España, la verificación de facturas VeriFactu recibidas de proveedores puede automatizarse escaneando el QR de la factura y validando el hash contra la sede electrónica de la AEAT. La guía del escáner de códigos QR de ASP.NET cubre la configuración completa del controlador y del servicio, pero el patrón de lectura básico es el mismo que el de una aplicación de consola:

using IronQr;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/qr")]
public class QrScanController : ControllerBase
{
    [HttpPost("scan")]
    public IActionResult Scan(IFormFile imageFile)
    {
        using var stream = imageFile.OpenReadStream();
        var bitmap = AnyBitmap.FromStream(stream);
        var imageInput = new QrImageInput(bitmap);
        var reader = new QrReader();
        var results = reader.Read(imageInput);

        var decoded = results.Select(r => new { r.Value, r.Url }).ToList();
        return Ok(decoded);
    }
}
using IronQr;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/qr")]
public class QrScanController : ControllerBase
{
    [HttpPost("scan")]
    public IActionResult Scan(IFormFile imageFile)
    {
        using var stream = imageFile.OpenReadStream();
        var bitmap = AnyBitmap.FromStream(stream);
        var imageInput = new QrImageInput(bitmap);
        var reader = new QrReader();
        var results = reader.Read(imageInput);

        var decoded = results.Select(r => new { r.Value, r.Url }).ToList();
        return Ok(decoded);
    }
}
Imports IronQr
Imports IronSoftware.Drawing
Imports Microsoft.AspNetCore.Mvc

<ApiController>
<Route("api/qr")>
Public Class QrScanController
    Inherits ControllerBase

    <HttpPost("scan")>
    Public Function Scan(imageFile As IFormFile) As IActionResult
        Using stream = imageFile.OpenReadStream()
            Dim bitmap = AnyBitmap.FromStream(stream)
            Dim imageInput = New QrImageInput(bitmap)
            Dim reader = New QrReader()
            Dim results = reader.Read(imageInput)

            Dim decoded = results.Select(Function(r) New With {Key .Value = r.Value, Key .Url = r.Url}).ToList()
            Return Ok(decoded)
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

El método AnyBitmap.FromStream() acepta cualquier flujo legible, por lo que la misma ruta de código funciona para archivos cargados a través de un formulario, imágenes recuperadas del almacenamiento de blobs o fotogramas extraídos de un canal de vídeo. El controlador no escribe ningún archivo temporal en el disco, lo cual es importante para implementaciones en contenedores donde el sistema de archivos puede ser de solo lectura.

Para escenarios de alto rendimiento, instancie QrReader una vez por ciclo de vida de la aplicación como un singleton, ya que el coste de carga del modelo de ML se paga en la primera construcción. Las llamadas posteriores a Read() en la misma instancia son seguras para subprocesos y comparten el modelo cargado.

¿Cómo se generan códigos QR en una aplicación .NET MAUI?

El tutorial sobre códigos QR de .NET MAUI muestra la generación multiplataforma completa en iOS, Android, macOS y Windows. IronQR utiliza el backend de renderizado SkiaSharp cuando se ejecuta en plataformas que no sean Windows, lo que proporciona un resultado coherente en todos los destinos MAUI.

using IronQr;
using IronSoftware.Drawing;

// Generate QR and convert to a byte array for display in MAUI
QrCode qr = QrWriter.Write("https://ironsoftware.com/csharp/qr/");
AnyBitmap bitmap = qr.Save();
byte[] imageBytes = bitmap.ExportBytes();

// Bind imageBytes to an <Image Source> in your MAUI page
using IronQr;
using IronSoftware.Drawing;

// Generate QR and convert to a byte array for display in MAUI
QrCode qr = QrWriter.Write("https://ironsoftware.com/csharp/qr/");
AnyBitmap bitmap = qr.Save();
byte[] imageBytes = bitmap.ExportBytes();

// Bind imageBytes to an <Image Source> in your MAUI page
Imports IronQr
Imports IronSoftware.Drawing

' Generate QR and convert to a byte array for display in MAUI
Dim qr As QrCode = QrWriter.Write("https://ironsoftware.com/csharp/qr/")
Dim bitmap As AnyBitmap = qr.Save()
Dim imageBytes As Byte() = bitmap.ExportBytes()

' Bind imageBytes to an <Image Source> in your MAUI page
$vbLabelText   $csharpLabel

En dispositivos móviles, ExportBytes() devuelve una matriz de bytes PNG que se puede introducir directamente en un StreamImageSource o escribir en un ImageButton. El andamio MAUI no requiere rutas de código específicas para cada plataforma: la misma lógica de generación se ejecuta de forma idéntica en los cuatro destinos de MAUI.

Para los proyectos VB.NET, la interfaz de la API es idéntica; solo difiere la sintaxis. La biblioteca se distribuye en un único paquete NuGet sin necesidad de un ensamblado VB.NET independiente.

¿Cuales son tus próximos pasos?

IronQR cubre el ciclo de vida completo de los códigos QR en .NET, desde la generación básica y la codificación estructurada de la carga útil hasta la lectura, basada en aprendizaje automático, de códigos dañados o con marca. Para empresas que operan en España, IronQR es la herramienta que permite cumplir con las obligaciones del sistema VeriFactu de la AEAT (QR en cada factura con leyenda VERI*FACTU), del TicketBAI en el País Vasco (Bizkaia, Gipuzkoa, Araba), y de la futura obligación B2B de Crea y Crece. La biblioteca gestiona la codificación de kanji, la configuración de la corrección de errores y la salida de imágenes multiplataforma, lo que te permite centrarte en la lógica específica de tu aplicación.

Para poner en práctica lo que has aprendido:

Preguntas Frecuentes

¿Por qué es obligatorio el código QR en las facturas españolas?

En España, el sistema VeriFactu de la AEAT exige que cada factura incluya un código QR que codifica el hash de la factura y apunta a https://sede.agenciatributaria.gob.es/ para verificación. Este QR debe mostrar la leyenda VERI*FACTU (con asterisco) o 'Factura verificable en la sede electrónica de la AEAT'. Además, los negocios del País Vasco deben incluir el QR TicketBAI. La ley Crea y Crece extenderá esta obligación a la facturación B2B.

¿Qué nivel de corrección de errores se recomienda para QR de facturas VeriFactu impresas?

Para QR de verificación VeriFactu en facturas impresas, se recomienda el nivel M (~15% de recuperación) para buena calidad de impresión, o el nivel Q (~25%) si se prevé impresión en papel de baja calidad o escaneo con iluminación irregular. No use logotipos incrustados en QR normativos AEAT o TicketBAI.

¿Cómo generar el QR de verificación VeriFactu en .NET Core?

Use QrWriter.Write() de IronQR con la URL de verificación de la AEAT codificada (incluyendo NIF, número de factura, fecha y hash según el esquema AEAT). Configure QrOptions con nivel M o Q y guarde la imagen en PNG a mínimo 200x200 píxeles para garantizar la legibilidad en impresión.

¿Qué versiones de .NET admite IronQR?

IronQR es compatible con .NET Core 6, 7, 8, 9 y 10, así como con .NET Framework 4.6.2 y versiones posteriores. También es compatible con .NET Standard 2.0 y versiones posteriores, incluyendo proyectos ASP.NET Core, .NET MAUI, Blazor y Xamarin.

¿IronQR soporta TicketBAI para el País Vasco?

Sí. IronQR permite generar los códigos QR requeridos por TicketBAI para las diputaciones forales de Bizkaia (BATUZ), Gipuzkoa y Araba. El esquema XAdES de cada territorio requiere codificar la cadena de referencia de la factura en el QR con el nivel de corrección adecuado.

¿Cómo leer un código QR de un archivo de imagen en C#?

Cargue la imagen con AnyBitmap.FromFile(), pásela a QrImageInput y llame a QrReader.Read(). El método devuelve un IEnumerable donde cada resultado contiene el valor decodificado (incluyendo la URL de verificación AEAT si es un QR VeriFactu), la URL y las coordenadas de las esquinas.

¿Puedo incrustar un logotipo en un QR de factura VeriFactu?

No. Los QR de cumplimiento normativo VeriFactu y TicketBAI no deben incluir logotipos incrustados, ya que la AEAT y las diputaciones forales exigen máxima legibilidad. Reserve la personalización visual (Color, Logo) de IronQR para QR de marketing y uso general.

¿IronQR es multiplataforma?

Sí. IronQR utiliza SkiaSharp en plataformas no-Windows, proporcionando generación y lectura consistente en macOS, Linux, iOS y Android a través de .NET MAUI, útil para aplicaciones de punto de venta TicketBAI en tablets y móviles.

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