[PHP] Formato de Ticket Básico para impresoras de Tickets con FPDF

Este formato de ticket para impresora de tickets es esencial en sistemas de venta, de entrega, boletos de autobús, entre otras cosas, aquí les dejo el formato que uso para que lo aplique donde gusten.

Este artículo es parte de la Guía de para crear Reportes con FPDF, PHP y MySQL Aprende a generar reportes dinamicos para tus propios sistemas. Ver la Guía Completa →

La librería FPDF sirve para crear documentos PDF en diferentes tamaños, también tiene la opción de crear una hoja PDF con tamaño personalizado.

Link: Pagina de FPDF

Los tickets regularmente están entre los 5 y 10 cms o 50 y 100 mms (milímetros) ya que son las medidas en que imprimen las impresoras de este tipo.

Código

Ahora les dejo el código y se los explico en la parte de abajo.

<?php
include "fpdf/fpdf.php";
$pdf = new FPDF($orientation='P',$unit='mm', array(45,350));
$pdf->AddPage();
$pdf->SetFont('Arial','B',8); //Letra Arial, negrita (Bold), tam. 20
$textypos = 5;
$pdf->setY(2);
$pdf->setX(2);
$pdf->Cell(5,$textypos,"NOMBRE DE LA EMPRESA");
$pdf->SetFont('Arial','',5); //Letra Arial, negrita (Bold), tam. 20
$textypos+=6;
$pdf->setX(2);
$pdf->Cell(5,$textypos,'——————————————————————-');
$textypos+=6;
$pdf->setX(2);
$pdf->Cell(5,$textypos,'CANT. ARTICULO PRECIO TOTAL');
$total =0;
$off = $textypos+6;
$producto = array(
"q"=>1,
"name"=>"Computadora Lenovo i5",
"price"=>100
);
$productos = array($producto, $producto, $producto, $producto, $producto );
foreach($productos as $pro){
$pdf->setX(2);
$pdf->Cell(5,$off,$pro["q"]);
$pdf->setX(6);
$pdf->Cell(35,$off, strtoupper(substr($pro["name"], 0,12)) );
$pdf->setX(20);
$pdf->Cell(11,$off, "$".number_format($pro["price"],2,".",",") ,0,0,"R");
$pdf->setX(32);
$pdf->Cell(11,$off, "$ ".number_format($pro["q"]*$pro["price"],2,".",",") ,0,0,"R");
$total += $pro["q"]*$pro["price"];
$off+=6;
}
$textypos=$off+6;
$pdf->setX(2);
$pdf->Cell(5,$textypos,"TOTAL: " );
$pdf->setX(38);
$pdf->Cell(5,$textypos,"$ ".number_format($total,2,".",","),0,0,"R");
$pdf->setX(2);
$pdf->Cell(5,$textypos+6,'GRACIAS POR TU COMPRA ');
$pdf->output();

A continuación, desglosamos la lógica detrás del script para generar tickets térmicos. Esta estructura es ideal para sistemas de punto de venta (POS) que requieren una impresión continua y precisa.

1. Configuración del Lienzo y Formato de Impresión

  • Carga de Librería: En la línea 2 incluimos el núcleo de FPDF. Al final del artículo encontrarás el paquete de descarga con todos los archivos necesarios.
  • Dimensiones del Ticket: En la línea 4 definimos un formato personalizado de 45mm de ancho por 350mm de alto.Tip de Ingeniería: Configuramos una altura de 350mm para evitar que el contenido se corte o descuadre. Las impresoras térmicas son inteligentes: aunque el lienzo sea largo, solo imprimirán el área que contenga texto, ahorrando papel físico.

2. Estilos y Posicionamiento Dinámico

  • Tipografía: En la línea 6 establecemos la fuente Arial en negrita (B) con un tamaño de 8 puntos, ideal para la legibilidad en papel térmico.
  • Control de Coordenadas: Utilizamos la variable $textypos (línea 7) para gestionar la posición vertical. Esto nos permite un control milimétrico sobre el avance del papel. Iniciamos las posiciones X e Y en las líneas 8 y 9.

3. Diseño del Encabezado y Cuerpo

  • Identidad Corporativa: En la línea 10 insertamos el nombre de la empresa usando una posición X fija para mantener la alineación.
  • Separadores Visuales: Para dar orden al ticket, en la línea 14 generamos una línea divisoria mediante guiones, separando el encabezado del listado de productos.
  • Cabeceras de Tabla: La línea 17 define los títulos de las columnas: Cantidad, Precio y Total.

4. Lógica de Productos y Cálculos Totales

  • Gestión de Datos: Usamos un array de productos (líneas 21-26) para simular la venta.
  • Bucle de Impresión: En las líneas 27 a 39 recorremos los productos. Aquí aplicamos una regla crítica: limitamos la longitud del nombre del producto para evitar que el texto se encime sobre los precios y rompa el formato.
  • Cálculo de Venta: Definimos la variable $total en la línea 19, la cual se incrementa automáticamente con cada artículo. Al final (línea 45), mostramos el monto total formateado a 2 decimales.

5. Salida del Documento

Finalmente, en la línea 50, el script envía el archivo generado directamente al navegador para su visualización o impresión inmediata.

Resultado

Este es el resultado al ejecutar el script.

Descarga

A continuación el paquete de descarga con la librería FPDF y el código de ejemplo.

Link: https://drive.google.com/file/d/1K7-ou14pZEJvVwsfTy9AeDaZlUeBnPDX/view

No se olviden de comentar, compartir y suscribirse.

Saludos a todos 😉

4 Comments

  1. quera saber si lo que dijiste aquí
    “En la linea 4, creamos el documento, en este caso es de 45 (milímetros) de ancho y 350 (milímetros) de alto, es decir el ticket es muy largo, esto es así para que el ticket no se corte, si es muy chico se va a cortar y descuadrar, pero si es muy largo, la impresora solo va a imprimir hasta donde este el texto.”

    ¿funciona con todas las impresoras térmicas? es decir ellas solo imprimen hasta donde hay texto cuando el pdf es muy largo?? es que estoy usando mpdf y como estoy trabajando con facturas estas hacen un salto de pagina dependiendo del tamaño de hoja que le haya asignado pero si lo que dices es cierto solo tendria que darle un tamaño muy largo a la hoja para que me muestre todo lo que quiero y así cuando mande a imprimir solo imprima hasta donde hay texto.. es asi?? agradecería mucho tu respuesta

    • Asi es amigo, ya lo he comprobado con varios modelos de impresoras, por muy largo que este el ticket o la hoja, estas impresoras solo imprimen hasta donde este el ultimo carácter.

  2. Muy buen post 😉
    En PHP 5.5.12 funciona correctamente pero en PHP 7.1.18 da error

    Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; FPDF has a deprecated constructor in \ticket_fpdf\fpdf\fpdf.php on line 12
    FPDF error: Some data has already been output, can’t send PDF file

    ¿Cual seria la solución?

    Muchas gracias
    Saludos

    • Es un detalle de la libreria FPDF con el soporte de PHP 7, tal vez en el repositorio original de FPDf ya lo corrigieron, lo que pasa es que en PHP 7 ya no es posible que el constructor de la clase se llame de la misma manera de la clase, obligatoriamente el constructor debe llamarse __construct() y eso causa conflicto con muchas librerias mas.

Leave a Reply

Your email address will not be published. Required fields are marked *

Discover more from Evilnapsis

Subscribe now to keep reading and get access to the full archive.

Continue reading