-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
685511d
commit a4c2cf3
Showing
2 changed files
with
108 additions
and
0 deletions.
There are no files selected for viewing
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |