Mini sistema de facturación - Generación del archivo PDF

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:

sistema de facturación en php