
Si dispones de algún ERP o POS y lo que quieres es crear ticket 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?

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. Puedes personalizarlo de la siguiente manera:
- 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..
- Vamos a crear un fichero php, lo vamos a llamar factura.php
- Descargamos la última versión que ofrece FPDF que es la versión 1.81.
- Enlazamos la librería con nuestro fichero mediante «require».
- (Opcional) Almacenamos en una constante el símbolo Euro.
- 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
- Orientación de la página:
- 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
NormalB
NegritaI
ItálicaU
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
Si0
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
1
es equivalente a poner0
y llamar a Ln () justo después. Hay 3 opciones:0
Derecha1
Al comienzo de la siguiente línea2
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 centroR
: Alinear texto a la derecha
- Opcional: Indica si el fondo de la celda debe estar pintado (
true
) o transparente (false
). - Opcional: URL del enlace.
- Anchura de la celda. Si es
- 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,'[email protected]',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,'');
- 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
Si0
No (Por defecto)- O una cadena que contiene algunos o todos los siguientes caracteres (en cualquier orden):
L
: IzquierdaT
: Parte superiorR
: DerechaB
: Parte inferior
- Opcional: Permite centrar o alinear el texto. Los valores posibles son:
L
: Alinear texto a la izquierdaC
: Alinear texto al centroR
: Alinear texto a la derechaJ
: Justificado (valor por defecto) - Opcional: Indica si el fondo de la celda debe estar pintado (
true
) o transparente (false
).
- Anchura de las celdas. Si es
// 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 en PDF
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
- Codificación del nombre del documento. Indica si el nombre del documento es codificado en ISO-8859-1 (
false
) ó UTF-8 (true
). Solo usa destinosI
yD
. El valor por defecto esfalse
.
- Destino del documento:
//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…
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,'[email protected]',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');
?>
Si añadimos 2 salidas del Output del ticket en pdf, en el segundo parámetro ponemos ‘f’ e ‘i’ en dos líneas, vamos a poder visualizar el ticket y lo almacena en el servidor. Esto lo colocaremos al final del código del generador de tickets en PDF, vamos a añadir debajo lo siguiente:
$pdf->Output('ticket.pdf','f');
$pdf->Output('ticket.pdf','i');
¡Ya tienes tu ticket 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.
Nuevo: Enviar ticket por email
Para enviar el ticket por email, vamos a utilizar el framework PHPMailer (en el siguiente enlace dejo cómo descargarlo, instalarlo y configurarlo). Lo colocamos junto a la invocación de la librería FPDF, lo primero que vamos a realizar es invocar la librería de PHPMailer, que muestre el ticket por pantalla y que lo almacene en el servidor.
require('phpmailer/PHPMailer.php');
require('phpmailer/SMTP.php');
require('phpmailer/Exception.php');
require('phpmailer/OAuth.php');
Ahora, vamos a integrar PHPMailer en nuestro ticket.Para ello copiamos este código y lo dejamos al final de nuestro fichero con la generación del ticket en PDF:
// Inicializamos PHPMailer
$mail = new PHPMailer\PHPMailer\PHPMailer();
try {
//Configuración de PHPMailer
$mail->isSMTP();
$mail->SMTPDebug = 0;
$mail->SMTPAuth = true;
$mail->SMTPSecure = 'tls';
$mail->Host = '(HOST SERVIDOR DE CORREO)';
$mail->Username = '(USUARIO DEL HOST DE CORREO)';
$mail->Password = '(CONTRASEÑA)';
$mail->Port = 587;
//Configurar remitentes y destinatarios
$mail->setFrom('[email protected]', 'Lacodigoteca.com');
$mail->addAddress('[email protected]', 'Lacodigoteca.com');
$mail->addReplyTo('[email protected]', 'Alfredo Lacodigoteca');
$mail->addBCC('[email protected]');
//Añadimos documentos adjuntos al correo
$mail->addAttachment('ticket.pdf');
//Cuerpo del correo electrónico
$mail->isHTML(true);
$mail->CharSet = "utf-8";
// Set email format to HTML
$mail->Subject = '[Lacodigoteca] - Factura simpl. XXXXX';
$mail->Body = 'Hola <b>Alfredo</b><br>Te enviamos el ticket de compra.<br> Un saludo.';
$mail->AltBody = 'Hola Alfredo. Te enviamos el ticket de compra.Un saludo.'; // Si no tienen habilitado el correo HTML
//Enviamos el correo
$mail->send();
//Eliminamos el ticket que hemos almacenado temporalmente en el servidor.
unlink($doc);
}catch (Exception $e) {
echo "No se ha podido enviar el mensaje. Mailer Error: {$mail->ErrorInfo}";
}
Si necesitas saber más información con profundidad, te invito a que pases al siguiente POST:
Cómo enviar correos con PHPMailer
¿Te ha gustado el articulo?
Te invitamos a que visites la sección de PHP ya que existen más utilidades para tu proyecto.
Palabras relacionadas:
fpdf ticket – ticket de venta – imprimir ticket – tickets imprimibles – pdf php