Generar imagen de código QR con PHP
Ya vimos cómo generar códigos de barras con PHP, ahora vamos a ver cómo crear códigos QR con PHP. Me parece que los códigos QR o QR codes pueden llevar más datos y metadatos, y que son legibles por la mayoría de dispositivos inteligentes (de hecho ya programamos un lector de códigos QR con Android).
Veamos entonces cómo generar estos códigos QR en forma de imagen, darles color de fondo, tamaño, calidad y muchas cosas más con una librería llamada qr code que puedes encontrar aquí.
Nota: recuerda que ya hicimos esto con AngularJS.
Composer y la librería qr code
Si no tienes composer, mira aquí cómo instalarlo. En caso de que no quieras usar Composer, te invito a ver las ventajas de usarlo y una introducción al mismo.
Por otro lado, si ya tienes un proyecto de PHP y quieres adaptarlo a Composer, mira este artículo.
Luego de que composer esté instalado y listo para ser llamado, instala qr code con:
composer require endroid/qr-code
Espera a que se instale, incluye el autoload en donde sea necesario y ya podemos comenzar a generar códigos QR.
Primer código QR generado con PHP
Veamos un primer acercamiento al generador de códigos QR. En este caso vamos a generar una imagen con el código QR y la vamos a mostrar en el navegador.
<?php
/**
* Ejemplo 1 para generar códigos QR
* con PHP
*
* @author parzibyte
*/
# Cargar autoload de Composer
require_once "vendor/autoload.php";
# Indicar que usaremos el namespace de QRCode
use Endroid\QrCode\QrCode;
# El texto que pondremos
$texto = "Generando códigos QR con PHP desde parzibyte.me";
$codigoQR = new QrCode($texto);
header('Content-Type: ' . $codigoQR->getContentType());
echo $codigoQR->writeString();
Declaramos que vamos a usar la clase QrCode de Endroid\QrCode y luego creamos una instancia de la misma pasándole el texto o mensaje que queremos guardar en el código QR.
Finalmente, para mostrarlo en el navegador enviamos un encabezado especial y luego imprimimos el código QR, generando así una imagen.
La salida es esta:
Con eso hemos generado nuestro primer código QR. Veamos más ejemplos.
Forzar descarga de código QR con PHP
En este ejemplo vamos a hacer que el código QR sea descargado en lugar de ser mostrado. El código PHP queda así:
<?php
/**
* Ejemplo 2 para generar códigos QR
* con PHP y forzar la descarga
*
* @author parzibyte
*/
# Cargar autoload de Composer
require_once "vendor/autoload.php";
# Indicar que usaremos el namespace de QRCode
use Endroid\QrCode\QrCode;
# El texto que pondremos
$texto = "Generando códigos QR con PHP desde parzibyte.me";
$codigoQR = new QrCode($texto);
# Sugerir nombre de código al guardar
$nombreArchivo = "codigo_qr.png";
header('Content-Type: ' . $codigoQR->getContentType());
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=$nombreArchivo");
echo $codigoQR->writeString();
Recomiendo ver cómo forzar la descarga de un archivo con PHP. Lo que se hace es agregar dos encabezados extra para indicar al navegador que debe descargarlo en lugar de intentar mostrarlo.
Si visitamos el ejemplo, se descargará el código QR.
Guardar código QR en el disco duro
Tal vez en algún momento se necesite guardar el código QR en lugar de mostrarlo o forzar su descarga. Para ello, el creador de la librería ha creado el método writeFile
de la clase QrCode que acepta la ruta absoluta.
Vamos a ver un ejemplo en donde generamos el código QR y lo guardamos en el sistema de archivos.
<?php
/**
* Ejemplo 3 para generar códigos QR
* con PHP y guardar el resultado en
* un archivo
*
* @author parzibyte
*/
# Cargar autoload de Composer
require_once "vendor/autoload.php";
# Indicar que usaremos el namespace de QRCode
use Endroid\QrCode\QrCode;
# El texto que pondremos
$texto = "Generando códigos QR con PHP desde parzibyte.me";
$codigoQR = new QrCode($texto);
# La ruta en donde se guardará el código
$nombreArchivoParaGuardar = "codigo_qr.png";
# Escribir archivo
$codigoQR->writeFile($nombreArchivoParaGuardar);
Si todo va bien, entonces tendremos una imagen en la ruta en donde el script fue ejecutado.
Personalizar códigos QR
Ya vimos cómo guardar, mostrar o descargar los códigos QR pero no hemos visto otras importantes cosas que podemos hacer. Vamos a ver algunas cosas que podemos cambiar del código, como el tamaño, color, etiqueta y otras cosas.
Recuerda que puedes ver todas las opciones en el repositorio. Abajo explicaré algunas personalizaciones más importantes y al final pondré el código PHP necesario así como el código QR generado.
Tamaño del código QR
Esto es especificado en pixeles, el argumento que se pasa debe ser entero y eso definirá tanto la anchura como la altura del código QR, pues es un cuadrado.
El método es setSize
.
Márgenes del código QR
Igual se puede agregar un margen al código, que va desde 0 hasta el número que quieras (respetará el tamaño del código QR, es decir, es independiente). Llama a la función setMargin
para configurarlo.
Codificación
Al menos yo hablo español, y con el español tenemos letras ñ, acentos y todas esas cosas. Así que el UTF 8 viene a salvarnos en muchos casos. Por ello es que si vas a usar unas de estas cosas pongas la codificación del código QR con setEncoding
.
Logotipo
En el centro del código QR podemos agregar otra imagen que será el logotipo o logo. Para alcanzar esto se llama a setLogoPath
, pasando la ruta de la imagen.
Si quieres modificar el tamaño (este no debe ser cuadrado) llama a setLogoSize($anchura, $altura)
.
Colores
Los colores se definen con un arreglo que tiene las claves r, g, b y a. Las tres primeras letras son de los niveles rojo, verde y azul. La última es del alpha, va del 0 al 127 y entre mayor alpha obtienes más transparencia.
No recomiendo dejar la transparencia en un valor alto, pues tal vez haya problemas con la lectura.
Pero bueno, una vez definidos los colores, llamamos a setBackgroundColor
para el color de fondo y setForegroundColor
para el color del primer plano.
Etiqueta
En el pie del código QR podemos agregar una etiqueta o mensaje llamando a setLabel($texto, $tamanioDeLaFuente, $rutaDeLaFuente, $alineacion)
.
El texto es una cadena, el tamaño de la fuente es el tamaño en pixeles que se va a usar para escribir el mensaje.
La ruta de la fuente es la ubicación de la fuente con extensión otf, y finalmente la alineación puede ser a la izquierda, en el centro o a la derecha.
Código QR generado al final
Bueno, este es el resultado final. Que quede claro que fue para mostrar la personalización y no espero que sea legible o agradable.
El código de PHP que ocupé fue este:
<?php
/**
* Ejemplo 4 para generar códigos QR
* con PHP y personalizar el resultado
*
* @author parzibyte
*/
# Cargar autoload de Composer
require_once "vendor/autoload.php";
# Indicar que usaremos el namespace de QRCode
use Endroid\QrCode\LabelAlignment;
# Esto es para las constantes de la alineación de la etiqueta
use Endroid\QrCode\QrCode;
# El texto que pondremos
$texto = "Generando códigos QR con PHP desde parzibyte.me";
$codigoQR = new QrCode($texto);
/**
* ============================================================
* | De aquí en adelante todo es personalización |
* ============================================================
*/
# Tamaño del código en pixeles (recuerda que es cuadrado),
# mayor tamaño requiere más tiempo de generación
$codigoQR->setSize(400);
# El margen, comienza desde 0 y
# puede ser incluso mayor que el tamaño del código
$codigoQR->setMargin(0);
# Codificación, útil cuando ponemos acentos o
# caracteres especiales
$codigoQR->setEncoding("UTF-8");
# Si queremos, podemos agregar un logotipo
$rutaDelLogotipo = "logotipo.jpg";
$codigoQR->setLogoPath($rutaDelLogotipo);
# Tamaño del logo. Anchura, altura en pixeles
$codigoQR->setLogoSize(50, 50);
# Color de fondo. La a es de alpha, va de 0 a 127
# Mayor alfa es mayor transparencia
$colorDeFondo = ['r' => 39, 'g' => 40, 'b' => 34, 'a' => 0];
$codigoQR->setBackgroundColor($colorDeFondo);
# Color del primer plano
# Lo de la a de alpha aplica igual que el del color de fondo
$colorPrimerPlano = ['r' => 166, 'g' => 226, 'b' => 46, 'a' => 0];
$codigoQR->setForegroundColor($colorPrimerPlano);
# También podemos poner una etiqueta
$textoEtiqueta = "Escanea este fabuloso código QR [parzibyte.me]";
$tamanioTextoEtiqueta = 10; # En pixeles
$rutaFuenteParaEtiqueta = "MontserratAlternates-Regular.otf";
# La alineación puede ser LEFT, CENTER y RIGHT
$alineacion = LabelAlignment::CENTER;
$codigoQR->setLabel($textoEtiqueta, $tamanioTextoEtiqueta, $rutaFuenteParaEtiqueta, $alineacion);
# Para ejemplos de simplicidad, mostramos en código en el navegador
header('Content-Type: ' . $codigoQR->getContentType());
echo $codigoQR->writeString();
Y así es como terminamos por hoy. Lee más sobre PHP aquí.
Amigo puedes dejar la descarga de la liberia ya instalada con el Composer . Gracias
Hola, muchas gracias por como lo explicas! te hago una consulta he visto en la libreria phpqrcode que podes configurar la calidad del codigo qr, como puedo tambien modificar la calidad o no se puede?
Hola. Según la documentación oficial (https://github.com/endroid/qr-code), entre más tamaño tenga el código, más calidad tendrá. Para cambiar el tamaño puede invocar a setSize
Saludos 🙂
parzibyte
Quisiera saber si has utilizado la libreria de phoword para la creacion de tablas en word
He utilizado PHPSpreadSheet (https://parzibyte.me/blog/2018/11/08/crear-archivo-excel-php-phpspreadsheet/) para trabajar con hojas de cálculo, pero con PHPWord todavía no, aunque en un futuro muy próximo voy a traer tutoriales sobre el mismo