Cómo crear ticket en PDF con PHP en 3 pasos

Alfredo
Sígueme!
Últimas entradas de Alfredo (ver todo)
Ticket con FPDF
ticket PDF con PHP

Si dispones de algún ERP o POS y lo que quieres es crear ticket en PDF o una factura simplificada, este es tu POST.

Existen varias librerías para poder generar ficheros PDF en PHP, pero vamos a usar la librería FPDF.

¿Qué es FPDF?

Generar pdf con FPDF
FPDF es una librería para generar PDF con PHP.

FPDF es una clase PHP que permite generar ficheros PDF con PHP (no utiliza la biblioteca PDFlib). Es gratuito: puedes usarlo y modificarlo para cualquier tipo de uso.

FPDF tiene son:

  • Selección de unidad de medida, formato de página y márgenes.
  • Encabezado de página y gestión de pie de página.
  • Salto de página automático.
  • Salto de línea automático y justificación de texto.
  • Soporte de imágenes (JPEG, PNG y GIF).
  • Colores.
  • Enlaces.
  • TrueType, Type1 y soporte de codificación.
  • Compresión de página.

FPDF no requiere extensión (excepto Zlib para habilitar la compresión y GD para soporte GIF). La última versión requiere al menos PHP 5.1.

Empezamos..

  1. Vamos a crear un fichero php, lo vamos a llamar factura.php
  2. Descargamos la última versión que ofrece FPDF que es la versión 1.81.
  3. Enlazamos la librería con nuestro fichero mediante “require”.
  4. (Opcional) Almacenamos en una constante el símbolo Euro.
  5. Llamamos a la función FPDF y tenemos que pasar 3 parámetros:
    • Orientación de la página:
      • (P) Vertical
      • (L) Horizontal
    • Unidad de medida:
      • (pt) Punto
      • (mm) Milímetro
      • (cm) Centímetro
      • (in) Pulgada
    • Tamaño de la Página:
      • A3
      • A4 (Por defecto)
      • A5
      • Carta
      • Documento legal
      • Personalizado ► array(x,y) ► El ancho del ticket es de 80mm y de largo añadimos 150mm
  6. Añadimos la página del PDF.

Este sería el resultado:

// CONFIGURACIÓN PREVIA
require('fpdf181/fpdf.php');
define('EURO',chr(128)); // Constante con el símbolo Euro.
$pdf = new FPDF('P','mm',array(80,150)); // Tamaño tickt 80mm x 150 mm (largo aprox)
$pdf->AddPage();

Preparamos la cabecera del ticket en PDF

En la cabecera vamos a poner los datos de la empresa, CIF, dirección, teléfono y página web. Las funciones que nos vamos a encontrar en el siguiente código son:

  • SetFont. Deberemos de rellenar los siguientes parámetros:
    • Fuente (Escribimos el nombre de la fuente)
    • Estilo:
      • Vacío Normal
      • B Negrita
      • I Itálica
      • U Subrayado
    • Tamaño (valor en pt)
  • Cell. Imprime una celda con bordes, color de fondo y un string. La posición inicial se ubica arriba a la izquierda. El texto puede estar alineado o centrado. (Opcional) existe la posibilidad de añadir un enlace al string. Estos son los parámetros que hay que rellenar:
    • Anchura de la celda. Si es 0, la celda se extiende hasta el margen derecho.
    • Altura de la celda. Por defecto es 0
    • La cadena o el string a imprimir.
    • Borde en la celda:
      • 1 Si
      • 0 No (Por defecto)
      • O una cadena que contiene algunos o todos los siguientes caracteres (en cualquier orden):
        • L: Izquierda
        • T: Parte superior
        • R: Derecha
        • B: Parte inferior
    • Indica en qué posición debe de ir la celda después de la llamada. Poner 1es equivalente a poner 0y llamar a Ln () justo después. Hay 3 opciones:
      • 0Derecha
      • 1 Al comienzo de la siguiente línea
      • 2 Abajo
    • Permite centrar o alinear el texto. Los valores posibles son:
      • L (o vacío) Alinear texto a la izquierda (valor predeterminado)
      • C: Alinear texto al centro
      • R: Alinear texto a la derecha
    • Opcional: Indica si el fondo de la celda debe estar pintado ( true) o transparente ( false).
    • Opcional: URL del enlace.
  • Ln. Realiza uno o varios saltos de línea. Vuelve al márgen izquierdo y según la cantidad pasada como parámetro, se sitúa más abajo.

// CABECERA
$pdf->SetFont('Helvetica','',12);
$pdf->Cell(60,4,'Lacodigoteca.com',0,1,'C');
$pdf->SetFont('Helvetica','',8);
$pdf->Cell(60,4,'C.I.F.: 01234567A',0,1,'C');
$pdf->Cell(60,4,'C/ Arturo Soria, 1',0,1,'C');
$pdf->Cell(60,4,'C.P.: 28028 Madrid (Madrid)',0,1,'C');
$pdf->Cell(60,4,'999 888 777',0,1,'C');
$pdf->Cell(60,4,'alfredo@lacodigoteca.com',0,1,'C');

// DATOS FACTURA        
$pdf->Ln(5);
$pdf->Cell(60,4,'Factura Simpl.: F2019-000001',0,1,'');
$pdf->Cell(60,4,'Fecha: 28/10/2019',0,1,'');
$pdf->Cell(60,4,'Metodo de pago: Tarjeta',0,1,'');

Ahora añadimos el listado de los productos.A la hora de repetir las celdas de los productos, lo más sencillo sería utilizar un WHILEcon una sentencia de SQL. Otra función que nos vamos a encontrar en el siguiente código es:

  • Multicell. A diferencia de Cell, permite imprimir texto con saltos de línea automáticos. También se puede hacer un salto de línea manual (con el carácter \n). Crea tantas celdas como sean necesarias son creadas, uno debajo de otra.
    El texto puede ser alineado, centrado o justificado. El bloque de celda puede ser enmarcado y el fondo impreso.
    Los siguientes parámetros son:
    • Anchura de las celdas. Si es 0, las celdas se extiende hasta el margen derecho.
    • Altura de las celdas. Por defecto es 0
    • La cadena o el string a imprimir.
    • Opcional: Borde en las celdas:
      • 1 Si
      • 0 No (Por defecto)
      • O una cadena que contiene algunos o todos los siguientes caracteres (en cualquier orden):
        • L: Izquierda
        • T: Parte superior
        • R: Derecha
        • B: Parte inferior
    • Opcional: Permite centrar o alinear el texto. Los valores posibles son:
      L: Alinear texto a la izquierda
      C: Alinear texto al centro
      R: Alinear texto a la derecha
      J: Justificado (valor por defecto)
    • Opcional: Indica si el fondo de la celda debe estar pintado (true) o transparente (false).

// COLUMNAS
$pdf->SetFont('Helvetica', 'B', 7);
$pdf->Cell(30, 10, 'Articulo', 0);
$pdf->Cell(5, 10, 'Ud',0,0,'R');
$pdf->Cell(10, 10, 'Precio',0,0,'R');
$pdf->Cell(15, 10, 'Total',0,0,'R');
$pdf->Ln(8);
$pdf->Cell(60,0,'','T');
$pdf->Ln(0);

// PRODUCTOS
$pdf->SetFont('Helvetica', '', 7);
$pdf->MultiCell(30,4,'Manzana golden 1Kg',0,'L'); 
$pdf->Cell(35, -5, '2',0,0,'R');
$pdf->Cell(10, -5, number_format(round(3,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Cell(15, -5, number_format(round(2*3,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);
$pdf->MultiCell(30,4,'Malla naranjas 3Kg',0,'L'); 
$pdf->Cell(35, -5, '1',0,0,'R');
$pdf->Cell(10, -5, number_format(round(1.25,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Cell(15, -5, number_format(round(1.25,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);
$pdf->MultiCell(30,4,'Uvas',0,'L'); 
$pdf->Cell(35, -5, '5',0,0,'R');
$pdf->Cell(10, -5, number_format(round(1,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Cell(15, -5, number_format(round(1*5,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);

Ahora el pie de pagina del ticket

Ya casi estamos acabando nuestro ticket en PDF. En el pie de página vamos a poner la suma de los precios de los artículos,descuentos,total sin IVA,incremento del IVA, el total del IVA y para finalizar, poner el periodo de devoluciones o simplemente poner el típico mensaje como “Gracias por su compra”.

Tip: Si quieres ver como se formatea un número para los precios, totales del IVA, lee el siguiente POST.

Por último: Debemos indicar cómo queremos que interactúe nuestro ticket en PDF. Para ello vamos a utilizar el parámetro:

  • Output. Cierra y envía el documento a un destino. Los parámetros a enviar son:
    • Destino del documento:
      • I (Por defecto) : Muestra el documento en el navegador web.
      • D: Muestra el documento en el navegador web y fuerza al usuario a descargar el PDF.
      • F: Guarda el documento en el servidor web.
      • S: Devuelve el documento como una cadena.
    • Nombre del documento
    • Códificación del nombre del documento. Indica si el nombre del documento es codificado en ISO-8859-1 (false) ó UTF-8 (true). Solo usa destinos I y D. El valor por defecto es false.

// SUMATORIO DE LOS PRODUCTOS Y EL IVA
$pdf->Ln(6);
$pdf->Cell(60,0,'','T');
$pdf->Ln(2);    
$pdf->Cell(25, 10, 'TOTAL SIN I.V.A.', 0);    
$pdf->Cell(20, 10, '', 0);
$pdf->Cell(15, 10, number_format(round((round(12.25,2)/1.21),2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);    
$pdf->Cell(25, 10, 'I.V.A. 21%', 0);    
$pdf->Cell(20, 10, '', 0);
$pdf->Cell(15, 10, number_format(round((round(12.25,2)),2)-round((round(2*3,2)/1.21),2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);    
$pdf->Cell(25, 10, 'TOTAL', 0);    
$pdf->Cell(20, 10, '', 0);
$pdf->Cell(15, 10, number_format(round(12.25,2), 2, ',', ' ').EURO,0,0,'R');

// PIE DE PAGINA
$pdf->Ln(10);
$pdf->Cell(60,0,'EL PERIODO DE DEVOLUCIONES',0,1,'C');
$pdf->Ln(3);
$pdf->Cell(60,0,'CADUCA EL DIA  01/11/2019',0,1,'C');

$pdf->Output('ticket.pdf','i');

Ahora todo junto…

<?php
// CONFIGURACIÓN PREVIA
require('fpdf181/fpdf.php');
define('EURO',chr(128));
$pdf = new FPDF('P','mm',array(80,150));
$pdf->AddPage();

// CABECERA
$pdf->SetFont('Helvetica','',12);
$pdf->Cell(60,4,'Lacodigoteca.com',0,1,'C');
$pdf->SetFont('Helvetica','',8);
$pdf->Cell(60,4,'C.I.F.: 01234567A',0,1,'C');
$pdf->Cell(60,4,'C/ Arturo Soria, 1',0,1,'C');
$pdf->Cell(60,4,'C.P.: 28028 Madrid (Madrid)',0,1,'C');
$pdf->Cell(60,4,'999 888 777',0,1,'C');
$pdf->Cell(60,4,'alfredo@lacodigoteca.com',0,1,'C');

// DATOS FACTURA        
$pdf->Ln(5);
$pdf->Cell(60,4,'Factura Simpl.: F2019-000001',0,1,'');
$pdf->Cell(60,4,'Fecha: 28/10/2019',0,1,'');
$pdf->Cell(60,4,'Metodo de pago: Tarjeta',0,1,'');

// COLUMNAS
$pdf->SetFont('Helvetica', 'B', 7);
$pdf->Cell(30, 10, 'Articulo', 0);
$pdf->Cell(5, 10, 'Ud',0,0,'R');
$pdf->Cell(10, 10, 'Precio',0,0,'R');
$pdf->Cell(15, 10, 'Total',0,0,'R');
$pdf->Ln(8);
$pdf->Cell(60,0,'','T');
$pdf->Ln(0);

// PRODUCTOS
$pdf->SetFont('Helvetica', '', 7);
$pdf->MultiCell(30,4,'Manzana golden 1Kg',0,'L'); 
$pdf->Cell(35, -5, '2',0,0,'R');
$pdf->Cell(10, -5, number_format(round(3,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Cell(15, -5, number_format(round(2*3,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);
$pdf->MultiCell(30,4,'Malla naranjas 3Kg',0,'L'); 
$pdf->Cell(35, -5, '1',0,0,'R');
$pdf->Cell(10, -5, number_format(round(1.25,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Cell(15, -5, number_format(round(1.25,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);
$pdf->MultiCell(30,4,'Uvas',0,'L'); 
$pdf->Cell(35, -5, '5',0,0,'R');
$pdf->Cell(10, -5, number_format(round(1,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Cell(15, -5, number_format(round(1*5,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);

// SUMATORIO DE LOS PRODUCTOS Y EL IVA
$pdf->Ln(6);
$pdf->Cell(60,0,'','T');
$pdf->Ln(2);    
$pdf->Cell(25, 10, 'TOTAL SIN I.V.A.', 0);    
$pdf->Cell(20, 10, '', 0);
$pdf->Cell(15, 10, number_format(round((round(12.25,2)/1.21),2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);    
$pdf->Cell(25, 10, 'I.V.A. 21%', 0);    
$pdf->Cell(20, 10, '', 0);
$pdf->Cell(15, 10, number_format(round((round(12.25,2)),2)-round((round(2*3,2)/1.21),2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);    
$pdf->Cell(25, 10, 'TOTAL', 0);    
$pdf->Cell(20, 10, '', 0);
$pdf->Cell(15, 10, number_format(round(12.25,2), 2, ',', ' ').EURO,0,0,'R');

// PIE DE PAGINA
$pdf->Ln(10);
$pdf->Cell(60,0,'EL PERIODO DE DEVOLUCIONES',0,1,'C');
$pdf->Ln(3);
$pdf->Cell(60,0,'CADUCA EL DIA  01/11/2019',0,1,'C');

$pdf->Output('ticket.pdf','i');
?>

¡Ya tienes tu ticket en PDF con PHP!

ticket en PDF
ticket PDF con PHP

Si necesitas más parámetros puedes verlos aquí o si quieres probar con otras librerías, aquí te mostramos las 5 librerías para generar PDF en PHP.

Alfredo

Desarrollador web de profesión (.NET, jQuery, JavaScript y SQL Server). Amante del fútbol y los videojuegos. Escribo en este blog sobre temas de programación que me parecen interesantes y que quiero compartir con todo el mundo.

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies