La página responsable de generar el archivo PDF de la factura es:
pdffactura.php
<?php
require('fpdf/fpdf.php');
require("conexion.php");
$conexion = retornarConexion();
$fpdf = new FPDF('P', 'mm', 'letter', true);
$fpdf->AddPage('portrait', 'letter');
$fpdf->SetMargins(10, 30, 20, 20);
cabecera($fpdf, $conexion);
piedepagina($fpdf);
titulosdetalle($fpdf);
imprimirdetalle($fpdf, $conexion);
$fpdf->OutPut();
function cabecera($fpdf, $conexion)
{
$fpdf->SetFillColor(116, 92, 151);
$fpdf->Rect(0, 0, 220, 50, 'F');
$fpdf->SetFont('Arial', 'B', 15);
$fpdf->SetTextColor(255, 255, 255);
$fpdf->Image('imagenes/logo.png', 10, 1);
$datos = mysqli_query($conexion, "select nombre,
date_format(fecha,'%d/%m/%Y') as fecha
from facturas as fact
join clientes as cli on cli.codigo=fact.codigocliente
where fact.codigo=$_GET[codigofactura]") or die(mysqli_error($conexion));
$resultado = mysqli_fetch_array($datos);
$fpdf->SetFont('Arial', 'B', 10);
$fpdf->SetY(5);
$fpdf->SetX(100);
$fpdf->Cell(0, 5, "Cliente : ".$resultado['nombre'], 0, 0, 'L', 1);
$fpdf->SetY(10);
$fpdf->SetX(100);
$fpdf->Cell(0, 5, "Fecha de emisión : ".$resultado['fecha'], 0, 0, 'L', 1);
}
function piedepagina($fpdf)
{
$fpdf->SetFillColor(116, 92, 151);
$fpdf->Rect(0, 250, 220, 50, 'F');
$fpdf->SetY(-28);
$fpdf->SetFont('Arial', '', 12);
$fpdf->SetTextColor(0, 0, 0);
$fpdf->SetX(120);
$fpdf->Write(5, 'Gracias por su compra.');
}
function titulosdetalle($fpdf)
{
$fpdf->SetY(60);
$fpdf->SetTextColor(255, 255, 255);
$fpdf->SetFillColor(79, 78, 77);
$fpdf->Cell(30, 10, 'Código', 0, 0, 'C', 1);
$fpdf->Cell(70, 10, 'Descripción', 0, 0, 'L', 1);
$fpdf->Cell(20, 10, 'Cantidad', 0, 0, 'C', 1);
$fpdf->Cell(40, 10, 'Precio', 0, 0, 'R', 1);
$fpdf->Cell(30, 10, 'Total', 0, 0, 'R', 1);
}
function imprimirdetalle($fpdf, $conexion)
{
$datos = mysqli_query($conexion, "select pro.codigo as codigo,
descripcion,
round(deta.precio,2) as precio,
cantidad,
round(deta.precio*cantidad,2) as preciototal,
deta.codigo as coddetalle
from detallefactura as deta
join productos as pro on pro.codigo=deta.codigoproducto
where codigofactura=$_GET[codigofactura]") or die(mysqli_error($conexion));
$resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
$fpdf->SetTextColor(0, 0, 0);
$fpdf->SetFillColor(255, 255, 255);
$fpdf->SetFont('times', '', 12);
$fpdf->SetY(70);
$fpdf->SetLineWidth(0.2);
$pago=0;
$item=0;
foreach ($resultado as $fila) {
$fpdf->Cell(30, 10, $fila['codigo'], 1, 0, 'C', 1);
$fpdf->Cell(70, 10, $fila['descripcion'], 1, 0, 'L', 1);
$fpdf->Cell(20, 10, $fila['cantidad'], 1, 0, 'R', 1);
$fpdf->Cell(40, 10, '$'.number_format($fila['precio'],2,',','.'), 1, 0, 'R', 1);
$fpdf->Cell(30, 10, '$'.number_format($fila['preciototal'],2,',','.'), 1, 0, 'R', 1);
$fpdf->Ln();
$pago=$pago+$fila['preciototal'];
$item++;
if ($item==16) {
$fpdf->AddPage('portrait', 'letter');
$fpdf->SetMargins(10, 30, 20, 20);
cabecera($fpdf, $conexion);
piedepagina($fpdf);
titulosdetalle($fpdf);
$fpdf->SetTextColor(0, 0, 0);
$fpdf->SetFillColor(255, 255, 255);
$fpdf->SetFont('Arial', '', 12);
$fpdf->SetY(70);
$fpdf->SetLineWidth(0.2);
$item=0;
}
}
$fpdf->SetFont('Arial', 'B', 15);
$fpdf->Cell(190, 20, "Importe Total : $".number_format($pago,2,',','.'), 1, 0, 'R', 1);
}
Debemos importar el archivo 'fpdf.php' la que nos permite generar documentos PDF directamente desde PHP:
require('fpdf/fpdf.php');
La librería 'fpdf' se encuentra codificada con lenguaje orientado a objetos.
Debemos crear un objeto de la clase 'FPDF' y pasar al contructor una serie de valores que nos permiten definir el tamaño y orientación de las páginas:
$fpdf = new FPDF('P', 'mm', 'letter', true);
Creamos la primer página y definimos sus margenes:
$fpdf->AddPage('portrait', 'letter');
$fpdf->SetMargins(10, 30, 20, 20);
El algoritmo para generar la cabecera de la página lo hemos codificado en la función 'cabecera':
cabecera($fpdf, $conexion);
En la función cabecera recuperamos el nombre del cliente y la fecha de emisión de la factura, luego los mostramos dentro del archivo pdf:
function cabecera($fpdf, $conexion)
{
$fpdf->SetFillColor(116, 92, 151);
$fpdf->Rect(0, 0, 220, 50, 'F');
$fpdf->SetFont('Arial', 'B', 15);
$fpdf->SetTextColor(255, 255, 255);
$fpdf->Image('imagenes/logo.png', 10, 1);
$datos = mysqli_query($conexion, "select nombre,
date_format(fecha,'%d/%m/%Y') as fecha
from facturas as fact
join clientes as cli on cli.codigo=fact.codigocliente
where fact.codigo=$_GET[codigofactura]") or die(mysqli_error($conexion));
$resultado = mysqli_fetch_array($datos);
$fpdf->SetFont('Arial', 'B', 10);
$fpdf->SetY(5);
$fpdf->SetX(100);
$fpdf->Cell(0, 5, "Cliente : ".$resultado['nombre'], 0, 0, 'L', 1);
$fpdf->SetY(10);
$fpdf->SetX(100);
$fpdf->Cell(0, 5, "Fecha de emisión : ".$resultado['fecha'], 0, 0, 'L', 1);
}
Cada uno de los métodos de la clase FPDF los podemos consultar en su documentación.
En forma similar hemos planteado una función para mostrar la parte inferior de la factura:
piedepagina($fpdf);
Para imprimir los títulos del detalle y los productos tenemos las funciones:
titulosdetalle($fpdf); imprimirdetalle($fpdf, $conexion);
Finalmente generamos el archivo PDF llamando al método OutPut:
$fpdf->OutPut();
El resultado de ejecutar la pagina es:
