5 may 2010

PDF + PHP. Hazlo fácil con FPDF

Con esta librería se hace fácil crear reportes dinámicos para páginas en PHP que generan un documento PDF que puede ser fácilmente leído en el navegador (si contamos con el plugin de Adobe) o descargado a la máquina del cliente. Les dejo un ejemplo con una base de datos ORACLE y su salida por pantalla, cualquier duda o sugerencia, no dudes en comentar. La librería se descarga de su sitio oficial.

 


$userbd = "NOMBRE_DE_USUARIO";
$clave = "CLAVE_BD";
$bd = "base_De_Datos"; // NOMBRE DE LA BASE DE DATOS
$conn = oci_connect($userbd, $clave,$bd); 
$sql = "SELECT COD_SOFTWARE,DESC_SOFTWARE,VERS_SOFTWARE,TIPO_SOFTWARE FROM SOFTWARE ORDER BY DESC_SOFTWARE";
$stid = oci_parse($conn, $sql); // Prepara la sentencia para su ejecucion, devuelve un id de sentencia
$result = oci_execute($stid);

require_once('fpdf/fpdf.php'); //incluimos la libreria.

class PDF extends FPDF {
function tabla($header,$data)
{
    //Colores, ancho de línea y fuente en negrita de CABECERA
    $this->SetFillColor(255,0,0);   // fondo de celda
    $this->SetTextColor(255);       // color del texto
    $this->SetDrawColor(128,0,0);   // color de linea
    $this->SetLineWidth(.3);        // ancho de linea
    $this->SetFont('','B');         // negrita
    $w=array(20,120,30,20);   // en este arreglo definiremos el ancho de cada columna
    for($i=0;$i<count($header);$i++)
        $this->Cell($w[$i],7,$header[$i],1,0,'C',1); //por cada encabezado existente, crea una celda
    $this->Ln();
    //Colores, ancho de línea y fuente en negrita de CONTENIDO
    $this->SetFillColor(224,235,255); //
    $this->SetTextColor(0);
    $this->SetFont('');
    //Datos
    $fill=false; // variable para alternar relleno
    foreach($data as $row)
    {
  $columna = explode(";",$row); //separar los datos en posiciones de arreglo
        $this->Cell($w[0],6,$columna[0],'LR',0,'L',$fill); //celda(ancho,alto,salto de linea,border,alineacion,relleno)
        $this->Cell($w[1],6,$columna[1],'LR',0,'L',$fill);
        $this->Cell($w[2],6,$columna[2],'LR',0,'R',$fill);
  $this->Cell($w[3],6,$columna[3],'LR',0,'R',$fill);
        $this->Ln();
        $fill=!$fill; //se alterna el valor del boolean $fill para cambiar relleno
    }
    $this->Cell(array_sum($w),0,'','T');
}

function Footer()
{
    //Pie de página
    $this->SetY(-15);
    $this->SetFont('Arial','I',8);
    $this->SetTextColor(128);
    $this->Cell(0,10,'Página '.$this->PageNo().' de {nb}',0,0,'C'); // el parametro {nb} es generado por una funcion llamada AliasNbPages
}

}
$pdf = new PDF(); 
$pdf->AliasNbPages(); //funcion que calcula el numero de paginas
$head = array("CODIGO","NOMBRE","VERSION","TIPO"); // cabecera
$i=0;
while ($fila=oci_fetch_array($stid)){  //llenar variable dat con los campos de una fila unidos por ;
 $dat[$i]=$fila[0].";".($fila[1]).";".$fila[2].";".$fila[3]; //concatenar para luego ser separado por explode()
$i++;
}

$pdf->AddPage(); //crear documento
$pdf->Image('php.gif',10,8,30,30); //añadir imagen
$pdf->Cell(40);
$pdf->SetFont('Arial','',32);
$pdf->Cell(140,30,"Listado de Software",0,0,'C');
$pdf->Ln(35);
$pdf->SetFont('Arial','',12);
$pdf->Cell(50,1,"Fecha: ".date("j-m-y"),0,0,'L');
$pdf->Ln(7);
$pdf->tabla($head,$dat); 
$pdf->Output(); //el resto es historia

6 comentarios:

Anónimo dijo...

MUY BUENO

Farid Colmenarez dijo...

Gracias por tu comentario!

Anónimo dijo...

Hermano soy novato en programación, pero me parecio muy bueno tu diseño, lo modifique para que funcionara en SQL Server pero cuando el texto pasa de cierta cantidad de caracteres el contenido de las columnas se une. ¿Eso es editable?

Farid Colmenarez dijo...

Bueno lo que puedes hacer es poner la columna mas ancha para que quepa el texto.

Anónimo dijo...

hola farid oye kisiera saber si
los datos de cabecera se podrian acomodar de
forma que fuern filas por ejemplo
____________________
codigo |314
____________________
descrpcion|3d-pinball
____________________
version |5.0

Farid Colmenarez dijo...

claro, en el método tabla, en vez de hacer 2 'for' haces uno solo y en cada fila antes de meter los $columna metes un $header. Espero que me entiendas xD

Publicar un comentario

Soluciones Informáticas

Sigueme en Twitter