Skip to content

Commit

Permalink
Add create QR in csharp tutorial
Browse files Browse the repository at this point in the history
  • Loading branch information
ivanalemunioz committed Dec 11, 2024
1 parent 685511d commit a4c2cf3
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 0 deletions.
Binary file added public/images/blog/csharp-create-qr.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
108 changes: 108 additions & 0 deletions src/content/blog/crear-qr-de-afip-en-csharp.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
---
title: "Crear QR de AFIP en C#"
description: "Con pocas líneas de código"
pubDate: "Dec 11 2024"
cover: "/images/blog/csharp-create-qr.png"
category: ".NET"
---

Luego de [obtener el CAE](/blog/crear-factura-electronica-de-afip-en-csharp/) vamos a generar el QR de AFIP para nuestro comprobante.

## Preparamos el QR

Para generar el QR vamos a utilizar [SkiaSharp](https://www.nuget.org/packages/SkiaSharp/) y [Newtonsoft.Json](https://www.nuget.org/packages/Newtonsoft.Json/)


```bash
dotnet add package SkiaSharp
dotnet add package ZXing.Net
dotnet add package ZXing.Net.Bindings.SkiaSharp
dotnet add package Newtonsoft.Json
```

Y generamos el codigo QR

```csharp
using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using SkiaSharp;
using ZXing.SkiaSharp;

class Program
{
static void Main()
{
// Datos para el QR (Respetar los tipos string/numero)
var qrCodeData = new Dictionary<string, object>
{
{ "ver", 1 }, // Versión del formato de los datos (1 por defecto)
{ "fecha", "2017-10-25" }, // Fecha de emisión del comprobante
{ "cuit", 12345678912 }, // CUIT del Emisor del comprobante
{ "ptoVta", 1 }, // Punto de venta utilizado para emitir el comprobante
{ "tipoCmp", 6 }, // Tipo de comprobante
{ "nroCmp", 32 }, // Número de comprobante
{ "importe", 150 }, // Importe Total del comprobante (en la moneda en la que fue emitido)
{ "moneda", "ARS" }, // Moneda del comprobante
{ "ctz", 1 }, // Cotización en pesos argentinos de la moneda utilizada
{ "tipoDocRec", 80 }, // Código del Tipo de documento del receptor
{ "nroDocRec", 12345678912 }, // Número de documento del receptor
{ "tipoCodAut", "E" }, // “A” para comprobante autorizado por CAEA, “E” para comprobante autorizado por CAE
{ "codAut", 12345678912345 } // CAE o CAEA, según corresponda
};

// Convertimos los datos a JSON y luego a Base64
string jsonData = JsonConvert.SerializeObject(qrCodeData);
string base64Data = Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonData));

// Preparamos el texto para el QR
string qrCodeText = $"https://www.afip.gob.ar/fe/qr/?p={base64Data}";

// Generamos el QR con SkiaSharp
var qrCode = GenerateQrCode(qrCodeText, 200);

// Guardamos el QR como archivo PNG
string outputFilePath = "./qr-afip.png";
using (var stream = System.IO.File.OpenWrite(outputFilePath))
{
qrCode.Encode(stream, SKEncodedImageFormat.Png, 100);
}
Console.WriteLine($"QR guardado en {outputFilePath}");

// O convertimos el QR a Base64 para usar en un tag <img>
string base64Image = ConvertQrToBase64(qrCode);
Console.WriteLine($"data:image/png;base64,{base64Image}");
}

static SKBitmap GenerateQrCode(string text, int size)
{
// Generar el QR utilizando ZXing.Net
var writer = new ZXing.SkiaSharp.BarcodeWriter
{
Format = ZXing.BarcodeFormat.QR_CODE,
Options = new ZXing.Common.EncodingOptions
{
Height = size,
Width = size,
Margin = 1
}
};
return writer.Write(text);
}

static string ConvertQrToBase64(SKBitmap qrCode)
{
using (var image = SKImage.FromBitmap(qrCode))
using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
{
return Convert.ToBase64String(data.ToArray());
}
}
}
```

![QR de AFIP](/images/blog/qr-afip.png)


Ya tenemos el QR listo para nuestro comprobante.

0 comments on commit a4c2cf3

Please sign in to comment.