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 difíciles 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 instalación es muy fácil, 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 métodos necesarios para crear documentos PDF. También 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 línea: 1. include ('class.ezpdf.php');
Luego debemos crear una instancia de la clase Cezpdf, con la cual vamos a manejar la creación del archivo pdf. Para esto creamos un archivo llamado mipdf.php donde vamos a escribir el siguiente código php: 2. $pdf =& new Cezpdf('a4'); 3. $pdf->selectFont('../fonts/courier.afm'); 4. $pdf->ezSetCmMargins(1,1,1.5,1.5);
En la línea 2 seleccionamos el tamaño de hoja a utilizar, en la 3 seleccionamos el tipo de fuente que vamos a usar en el archivo pdf y en la línea 4 definimos los márgenes de las páginas 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 título, el arreglo de datos y las opciones de la tabla a generar. Para esto vamos a usar 3 matrices: una para los títulos 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 explicación, 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 más comunes, ya que esta clase es muy completa y tiene varias opciones más: „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‟=> orientación 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 configuración de la tabla debemos generar el pdf con toda la información que necesitamos. Vamos a incluir un titulo para el archivo y datos de fecha y hora para acompañar 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 función exTable es la que va a generar la tabla de datos. Lleva como parámetros: Datos,Encabezados,Titulo y Opciones (en el ejemplo no le indico un titulo a la tabla). La función exText permite ingresar un texto al archivo pdf con su respectivo tamaño de letra. Por último la función ezStream es la que genera el archivo pdf y lo muestra en el navegador.
//////////////////////////////////////////////////////////////////////////////////////////////
Para realizar esto utilizaremos: el lenguaje de programación PHP, el gestor de base de datos MySQL y la librería FPDF. Lo primero es realizar nuestra base de datos la cual llamaremos clínica, 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 médicos
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 parámetros 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
Servidor = "localhost"; $this->Usuario = "clinic"; $this->Clave = "clinica123"; }
var $Servidor;
var $Usuario;
v
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 envía 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
$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 ''; echo 'No. | CLAVE | NOMBRE | HISTORIAL |
'.$numlista.' | '; echo ''.$fila['clave'].' | '; echo ''.$fila['nombre'].' '.$fila['apellido_paterno'].' '.$fila['apellido_materno'].' | '; echo 'ver | '; } echo "
"; ?>
reporte_historial.php Realiza el reporte mediante la librería 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
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'];
1
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 tamaño $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 pequeño 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 tamaño // Cell esta formado por (posición 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 tamaño de letra $pdf->SetWidths(array(60, 60, 60, 60)); // Definimos el tamaño 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 función Row().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
$historial = $con->conectar(); // Creamos nuestra conexión 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 función 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 propósito y modificarla a su gusto para satisfacer sus necesidades.
FPDF tiene otras ventajas: funciones de alto nivel. Esta es una lista de sus principales características:
* Elección de la unidad de medida, formato de página y márgenes * Gestión de cabeceras y pies de página * Salto de página automático * Salto de línea y justificación del texto automáticos * Admisión de imágenes (JPEG, PNG y GIF) * Colores * Enlaces * Admisión de fuentes TrueType, Type1 y codificación * Compresión de página
La clase se puede descargar en la página 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 línea 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 línea 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 línea 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
// validación 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 página $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); //añadir 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 ?>