Sie sind auf Seite 1von 13

En este tutorial aprendermos a crear reportes de datos de nuestra base de datos MySQL en PDF, con la libreria TCPDF, y PHP.

Conexion: Sera nuestro archivo conexion.php que nos conectar a la base de datos, en este caso la llamar personas, que contiene la tabla usuarios con los campos: codigo, nombres, apellidos, telefono y ciudad. Modelo:

Es donde se encuentran nuestra clase consulta con su funciones: registrarUsuario y reportePdfUsuarios, la primera funcion, nos registrar los datos que ingresemos en el formulario a nuestra base de datos y el segundo, consultar esos datos, ya con la libreria TCPDF, podremos visualizarlos pero en formato pdf, en nuestro navegador.
Control:

En esta carpeta se encuentra el archivo controlador.php, que recibir los datos que ingresemos en el formulario para registrar un usuario, aqui invocamos al la funcion registrarUsuario(), de la clase consulta del archivo consulta.php, y le pasamos como parametro los datos recibidos del formulario.
Vista: Sera el archivo que visualizaremos en nuestro navegador, el cual contiene el formulario de regisytro y desde donde podremos generar el reporte. tcpdf: En esta carpeta estan todos los archivos necesarios para poder generar el reporte, creado por tcpdf.org, es una libreria util y muy completa. data_base: Aqui tenemos el script de nuestra tabla usuarios. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Generar reportes en PDF con PHP y MySql


PHP tiene funciones especificar para trabajar con pdf, pero son muy difciles de usar. Luego de googlear un poco encontr R&OS Pdf class, una clase para PHP que tiene una serie de funciones muy sencillas de usar y muy potentes. La instalacin es muy fcil, solo hay que bajar los archivos desde la web de R&OS y descomprimirlos en nuestro web server.

En esta clase vienen 2 archivos: class.ezpdf.php y class.pdf.php los cuales contienen todas las propiedades y mtodos necesarios para crear documentos PDF. Tambin vamos a encontrar una carpeta fonts, en la cual vienen varias fuentes para utilizar con esta clase. El primer paso para comenzar a generar un archivo pdf es incluir la clase con esta lnea:
1. include ('class.ezpdf.php');

Luego debemos crear una instancia de la clase Cezpdf, con la cual vamos a manejar la creacin del archivo pdf. Para esto creamos un archivo llamado mipdf.php donde vamos a escribir el siguiente cdigo php:
2. $pdf =& new Cezpdf('a4'); 3. $pdf->selectFont('../fonts/courier.afm'); 4. $pdf->ezSetCmMargins(1,1,1.5,1.5);

En la lnea 2 seleccionamos el tamao de hoja a utilizar, en la 3 seleccionamos el tipo de fuente que vamos a usar en el archivo pdf y en la lnea 4 definimos los mrgenes de las pginas generadas en el pdf. OBTENER LOS DATOS DE MYSQL PARA GENERAR UNA TABLA Ahora vamos a obtener los datos a mostrar desde una base de datos. En este ejemplo estoy utilizando MySql para obtener los datos de los productos:
5. $conexion = mysql_connect("localhost", "usuario", "clave"); 6. mysql_select_db("demo", $conexion); 7. $result=mysql_query("SELECT idProducto,descrip,desc_tec FROM Productos",$conexion)or die(mysql_error());

CREANDO EL TITULO, ARRAY DE DATOS Y OPCIONES: Una vez que tenemos los datos de la base de datos tenemos que generar el ttulo, el arreglo de datos y las opciones de la tabla a generar. Para esto vamos a usar 3 matrices: una para los ttulos de los campos, otra para los datos y otra para las opciones de la tabla:
8. while($datatmp = mysql_fetch_assoc($result)) { 9. $data[] = $datatmp; 10. } 11. $titles = array( 12. 'idProducto'=>'ID', 13. 'descrip'=>'Descripcion', 14. 'desc_tec'=>'Desc. Tecnica' 15. ); 16. $options = array( 17. 'showHeadings'=>1, 18. 'shadeCol'=>array(0.9,0.9,0.9), 19. 'xOrientation'=>'center', 20. 'width'=>500 21. );

La matriz data no requiere mucha explicacin, solamente acumulamos los datos uno por uno en esa matriz. En la matriz titles asignamos los nombres de cada columna de datos. En cuanto a la matriz options solo voy a explicar las opciones ms comunes, ya que esta clase es muy completa y tiene varias opciones ms: showHeadings=> permite mostrar los nombres de las columnas (encabezados) 1 muestra, 0 oculta. shadeCol=> color de celdas, se ingresa el color en formato RGB. xOrientation=> orientacin del texto dentro de las celdas de la tabla. width=> asigna el ancho de la tabla.

IMPRIMIR LOS RESULTADOS: Una vez que tenemos los nombres de las columnas, los datos y la configuracin de la tabla debemos generar el pdf con toda la informacin que necesitamos. Vamos a incluir un titulo para el archivo y datos de fecha y hora para acompaar a la tabla:
22. 23. 24. 25. 26. 27. 28. $txttitle = "LISTADO DE PRODUCTOS "."\n\n\n"; $pdf->ezText($txttitle, 12); $pdf->ezTable($data,$titles, '', $options); $pdf->ezText("\n\n\n", 10); $pdf->ezText("Fecha: ".date("d/m/Y")."\n", 10); $pdf->ezText("Hora: ".date("H:i:s")."\n\n", 10); $pdf->ezStream();

La funcin exTable es la que va a generar la tabla de datos. Lleva como parmetros: Datos,Encabezados,Titulo y Opciones (en el ejemplo no le indico un titulo a la tabla). La funcin exText permite ingresar un texto al archivo pdf con su respectivo tamao de letra. Por ltimo la funcin ezStream es la que genera el archivo pdf y lo muestra en el navegador.

//////////////////////////////////////////////////////////////////////////////////////////////

Para realizar esto utilizaremos: el lenguaje de programacin PHP, el gestor de base de datos MySQL y la librera FPDF. Lo primero es realizar nuestra base de datos la cual llamaremos clnica, en donde contendr las siguientes tablas y la siguiente estructura. Tabla pacientes

1 2 3 4 5 6 7 8 9 10

CREATE TABLE IF NOT EXISTS `pacientes` ( `id_paciente` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `clave` varchar(10) NOT NULL, `nombre` varchar(80) NOT NULL, `apellido_paterno` varchar(80) NOT NULL, `apellido_materno` varchar(80) NOT NULL, `sexo` varchar(2) NOT NULL, `domicilio` text NOT NULL, PRIMARY KEY (`id_paciente`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Tabla mdicos

1 2 3 4 5 6

CREATE TABLE IF NOT EXISTS `medicos` ( `id_medico` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `cedula` varchar(10) NOT NULL, `nombre_medico` varchar(200) NOT NULL, PRIMARY KEY (`id_medico`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Tabla consultas_medicas

1 2 3 4 5 6 7 8 9

CREATE TABLE IF NOT EXISTS `consultas_medicas` ( `id_consulta` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `fecha_consulta` date NOT NULL, `id_paciente` int(5) NOT NULL, `id_medico` int(5) NOT NULL, `consultorio` varchar(20) NOT NULL, `diagnostico` text NOT NULL, PRIMARY KEY (`id_consulta`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; Des pues creamos los siguientes archivos: conexion.php Contiene los parmetros para conectarse a la base de datos y realiza las conexiones.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

<php class DB{ var $conect; var $BaseDatos; = "clinica"; $this->Servidor = "localhost"; $this->Usuario = "clinic"; $this->Clave = "clinica123"; }

var $Servidor;

var $Usuario;

function conectar() { if(!($con=@mysql_connect($this->Servidor,$this->Usuario,$this->Clave))){ echo"Error al conectar a la base de datos"; exit(); } if (!@mysql_select_db($this->BaseDatos,$con)){ echo "Error al seleccionar la base de datos"; exit(); } $this->conect=$con; return true; } } ?>

index.php Realiza el listado de los pacientes en la base de datos y enva la orden de generar el archivo PDF, para ello manda el identificador del paciente por medio de la url y lo recibe el archivo reporte_historial.php por $_GET.

1 2 3 4 5

<?php include_once("conexion.php");

$con = new DB; $pacientes = $con->conectar(); $strConsulta = "SELECT id_paciente, clave, nombre, apellido_paterno, apellido_ma

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

pacientes"; $pacientes = mysql_query($strConsulta); $numfilas = mysql_num_rows($pacientes);

echo '<table cellpadding="0" cellspacing="0" width="100%">'; echo '<thead><tr><td>No.</td><td>CLAVE</td><td>NOMBRE</td><td>HISTORIAL</td></tr for ($i=0; $i<$numfilas; $i++) { $fila = mysql_fetch_array($pacientes); $numlista = $i + 1; echo '<tr><td>'.$numlista.'</td>'; echo '<td>'.$fila['clave'].'</td>'; echo '<td>'.$fila['nombre'].' '.$fila['apellido_paterno'].' '.$fila['apellido_materno'].'</td>'; echo '<td><a href="reporte_historial.php?id='.$fila['id_paciente'].'">ver</a></td></tr>'; } echo "</table>"; ?>

reporte_historial.php Realiza el reporte mediante la librera FPDF. 1. En la primera parte llamamos a la libreria fpdf y al archivo conexion para conectar php con la base de datos.

1 2 3 4

<?php // incluimos la libreria fpdf require('fpdf/fpdf.php'); // incluimos la conexion a la base de datos require('conexion.php'); 2. Le insertamos una clase que tiene las siguientes funciones: crear tablas, encabezado y pie. Esta clase fue tomada de los tutoriales de la pgina oficial de la librera FPDF. Ya que la funcin multiCell no permite ordenarse por tablas y la funcin Cell solo funciona en un solo rengln y no mostrara cuando hay muchos ms caracteres.

1 2 3 4 5 6 7 8 9 10 11 12 13 14

class PDF extends FPDF { var $widths; var $aligns; function SetWidths($w) { >widths=$w; } function SetAligns($a) { $this->aligns=$a; } function Row($data) { $nb=0; for($i=0;$iNbLines($this->widths[$i],$data[$i])); $h=4*$nb; $this->CheckPageBreak($h); for($i=0;$iwidths[$i]; $a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';

$this-

15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

$x=$this->GetX(); $y=$this->GetY(); $this->Rect($x,$y,$w,$h); $this->MultiCell($w,4,$data[$i],0,$a); $this->SetXY($x+$w,$y); } $this->Ln($h); } function CheckPageBreak($h) { if($this->GetY()+$h>$this->PageBreakTrigger) $this->AddPage($this->CurOrientation); } function NbLines($w,$txt) { $cw=&$this->CurrentFont['cw']; if($w==0) $w=$this->w-$this->rMargin-$this->x; $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; $s=str_replace("\r",'',$txt); $nb=strlen($s); if($nb>0 and $s[$nb-1]=="\n") $nb--; $sep=-1; $i=0; $j=0; $l=0; $nl=1; while($i$wmax) { if($sep==-1) { if($i==$j) $i++; } else $i=$sep+1; $sep=-1; $j=$i; $l=0; $nl++; } else $i++; } return $nl; } function Header() { $this->SetFont('Arial','',10); $this->Text(65,14,'Clinica el sol naciente',0,'C', 0); $this->Ln(30); }

62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80

function Footer() { $this->SetY(-15); $this->SetFont('Arial','B',8); $this->Cell(100,10,'Historial medico',0,0,'L'); } }

3. Recibir el id del paciente, para ello lo obtenemos mediante $_GET.

$paciente= $_GET['id']; 4. Mostrar los datos del paciente.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

// creamos el objeto FPDF $pdf=new PDF('L','mm','Letter'); // vertical, milimetros y tamao $pdf->Open(); $pdf->AddPage(); // agregamos la pagina $pdf->SetMargins(20,20,20); // definimos los margenes en este caso estan en milimetr $pdf->Ln(10); // dejamos un pequeo espacio de 10 milimetros // Realizamos la consulta $con = new DB; $pacientes = $con->conectar(); // $paciente contiene el id del paciente a consultar, obtiene los datos de la tabla $strConsulta = "SELECT * from pacientes where id_paciente = '$paciente'"; $pacientes = mysql_query($strConsulta); $fila = mysql_fetch_array($pacientes); // listamos los datos con Cell $pdf->SetFont('Arial','',12); // definimos el tipo de letra y el tamao // Cell esta formado por (posicin de inicio, ancho, texto, borde, cambio de linea, texto) $pdf->Cell(0,6,'Clave: '.$fila['clave'],0,1); $pdf->Cell(0,6,'Nombre: '.$fila['nombre'].' '.$fila['apellido_paterno'].' '.$fila['apellido_materno'],0,1); $pdf->Cell(0,6,'Sexo: '.$fila['sexo'],0,1); $pdf->Cell(0,6,'Domicilio: '.$fila['domicilio'],0,1); $pdf->Ln(10);

5. Listar el historial del paciente Para listar el historial medico en forma de tablas llamaremos a las funciones antes declaradas de la siguientes forma, primero creamos el encabezado de nuestra tabla de la siguiente manera:

1 2 3 4 5 6 7

// Para realizar esto utilizaremos la funcion Row() $pdf->SetFont('Arial','',10); // tipo y tamao de letra $pdf->SetWidths(array(60, 60, 60, 60)); // Definimos el tamao de las columnas, tomando en cuenta que las declaramos en milim $pdf->Row(array('FECHA', 'MEDICO', 'CONSULTORIO', 'DIAGNOSTICO')); // creamos nuestra fila con las columnas fecha(fecha de la visita al medico), medico( diagnostico en esa visita. Despues de crear el encabezado de nuestra tabla obtendremos el historial desde la base de datos y lo mostraremos en nuestro archivo pdf creado, seguiremos utilizando la funcin Row().

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

$historial = $con->conectar(); // Creamos nuestra conexin a la base de datos // Realizamos nuestra consulta $strConsulta = "SELECT consultas_medicas.fecha_consulta, consultas_medicas.consultor medicos.nombre_medico FROM consultas_medicas Inner Join pacientes ON consultas_medicas.id_paciente = pacientes.id_paciente Inner Join medicos ON consultas_medicas.id_medico = medicos.id_medico WHERE pacientes.id_paciente = '$paciente'"; // ejecutamos la consulta $historial = mysql_query($strConsulta); // listamos la tabla de historial de visitas de cada paciente $numfilas = mysql_num_rows($historial); for ($i=0; $iRow(array($fila['fecha_consulta'], $fila['consultorio'], $fila['nombre_ } //La ultima linea $pdf->Output(); lo que hace es cerrar el archivo y enviarlo al navegador.

Actualizacones: Se colorean la filas de titulo y las de datos en el historial en pdf, para realizar esto se le agrego el valor true al parametro fill dentro de la funcin MultiCell que es la que permite heredar de SetFillColor el color de fondo en formato rgb.

/////////////////////////////////////////////////////////////////////////////////////////////////////

REPORTES PDF CON LA CLASE FPDF, PHP Y MYSQL


Qu es FPDF?

FPDF es una clase escrita en PHP que permite generar documentos PDF directamente desde PHP, es decir, sin usar la biblioteca PDFlib. La F de FPDF significa Free (gratis y libre): puede usted usarla para cualquier propsito y modificarla a su gusto para satisfacer sus necesidades.

FPDF tiene otras ventajas: funciones de alto nivel. Esta es una lista de sus principales caractersticas:

* Eleccin de la unidad de medida, formato de pgina y mrgenes * Gestin de cabeceras y pies de pgina * Salto de pgina automtico * Salto de lnea y justificacin del texto automticos * Admisin de imgenes (JPEG, PNG y GIF) * Colores * Enlaces * Admisin de fuentes TrueType, Type1 y codificacin * Compresin de pgina

La clase se puede descargar en la pgina oficial http://www.fpdf.org/

Una vez que la incluyas dentro de tu carpeta de proyectos web, puedes crear un pdf como lo desees.. Aqu mi ejemplo particular, ara adaptarlo puedes configurar tu clave usuario, y base de datos a usar, modificas las consultas a conveniencia, en este caso hay dos tablas dos funciones y dos consultas..

SetFillColor(62,102,60); // fondo de celda $this->SetTextColor(255); // color del texto $this->SetDrawColor(0,0,0); // color de linea $this->SetLineWidth(.3); // ancho de linea

$this->SetFont('Arial','', 7); $w=array(20,100,15,10,15,15,15); // en este arreglo definiremos el ancho de cada columna for($i=0;$iCell($w[$i],4,$header[$i],1,0,'C',1); //por cada encabezado existente, crea una celda $this->Ln(); //Colores, ancho de lnea y fuente en negrita de CONTENIDO $this->SetFillColor(244,244,244); // $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,'L',$fill); $this->Cell($w[3],6,$columna[3],'LR',0,'L',$fill); $this->Cell($w[4],6,$columna[4],'LR',0,'L',$fill); $this->Cell($w[5],6,$columna[5],'LR',0,'L',$fill); $this->Cell($w[6],6,$columna[6],'LR',0,'L',$fill); $this->Ln(); $fill=!$fill; //se alterna el valor del boolean $fill para cambiar relleno } $this->Cell(array_sum($w),0,'','T'); } function tabla1($header1,$data1) { //Colores, ancho de lnea y fuente en negrita de CABECERA $this->SetFillColor(62,102,60); // fondo de celda $this->SetTextColor(255); // color del texto $this->SetDrawColor(0,0,0); // color de linea $this->SetLineWidth(.3); // ancho de linea

$this->SetFont('Arial','', 6); // negrita $w=array(70); // en este arreglo definiremos el ancho de cada columna for($i=0;$iCell($w[$i],4,$header1[$i],1,0,'C',1); //por cada encabezado existente, crea una celda $this->Ln(); //Colores, ancho de lnea y fuente en negrita de CONTENIDO $this->SetFillColor(244,244,244); // $this->SetTextColor(0); $this->SetFont(''); //Datos $fill=false; // variable para alternar relleno foreach($data1 as $row) { $columna = explode(";",$row); //separar los datos en posiciones de arreglo

// validacin a mano para que respete el limite de la celda

if ($columna[0]>$w[0]){ $this->Cell($w[0],20,$columna[0],'LR',1,'L',$fill); //celda(ancho,alto,salto de linea,border,alineacion,relleno) } else{ $this->Cell($w[0],5,substr($columna[0],0, 45),'LR',1,'L',$fill); $this->Cell($w[0],5,substr($columna[0],45,53),'LR',1,'L',$fill); $this->Cell($w[0],5,substr($columna[0],99,150),'LR',1,'L',$fill); $this->Ln(0); } $fill=!$fill; //se alterna el valor del boolean $fill para cambiar relleno } $this->Cell(array_sum($w),0,'','T'); } function Footer() {

//Pie de pgina $this->SetY(-15); $this->SetFont('Arial','I',10); $this->SetTextColor(128); $this->Cell(0,10,'Pagina '.$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 $sql1 = "SELECT informacion FROM empresa"; $modificar11 = mysql_query($sql1, $conex) or die(mysql_error()); $head1 = array("VENEZOLANA DE RIEGO, C.A"); // cabecera $i=0; while ($fila=mysql_fetch_array($modificar11)){ //llenar variable dat con los campos de una fila unidos por ; $dat1[$i]=$fila[0]; //concatenar para luego ser separado por explode() $i++; } $sql = "SELECT codigo, descripcion, unidad, cantidad, precio_uni, descuento, total FROM orden_articulos where orden='10733'"; $modificar1 = mysql_query($sql, $conex) or die(mysql_error()); $head = array("Codigo","Descripcion","Unidad","Cant","Precio","Dcto","Total"); // cabecera $i=0; while ($fila=mysql_fetch_array($modificar1)){ //llenar variable dat con los campos de una fila unidos por ; $dat[$i]=$fila[0].";".($fila[1]).";".$fila[2].";".$fila[3].";".$fila[4].";".$fila[5].";".$fila[6]; //concatenar para luego ser separado por explode() $i++; } $pdf->AddPage(); //crear documento $pdf->Image('images/logo.jpg',10,8,30,30); //aadir imagen $pdf->Cell(50);

$pdf->SetFont('Arial','',12); $pdf->Cell(120,15,"ORDEN DE COMPRA",0,0,'C'); $pdf->Ln(35); $pdf->SetFont('Arial','',12); $pdf->Ln(10); $pdf->tabla1($head1,$dat1); $pdf->Ln(30); $pdf->tabla($head,$dat); $pdf->Output(); //el resto es historia ?>

Das könnte Ihnen auch gefallen