Compartir   
27 Ago 2010, 00:20 ]

Cómo crear un reporte con PDF usando PHP y MySQL

 
 
Categoría:  Scripts PHP   |   Autor: velabrus   |   Visto: 3407   |   Comentarios (3)

En este post realizaremos un historial clínico de un paciente, en el cual contendrá los datos generales del paciente y un listado de las consultas médicas que realizo, el historial estará en formato PDF.

 

 

Por: Alfredo VELA I.

  Licencia Pública General de GNU

 

 

Cómo crear un reporte con PDF usando PHP y MySQL

Imagen: 01 Al comento de ejecutar el script php y mysql

 

Cómo crear un reporte con PDF usando PHP y MySQL

Imagen: 02 Reporte en PDF.

 

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

 

 

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

 

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

 

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.

 

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

function conectar() {
if(!($con=@mysql_connect($this->Servidor,$this->Usuario,$this->Clave))){
echo"<h1>Error al conectar a la base de datos</h1>";
exit();
}
if (!@mysql_select_db($this->BaseDatos,$con)){
echo "<h1>Error al seleccionar la base de datos</h1>";
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.

 

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

$con = new DB;
$pacientes = $con->conectar();
$strConsulta = "SELECT id_paciente, clave, nombre, apellido_paterno, apellido_materno from 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></thead>';
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 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.

 

 

 

<?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 página oficial de la librería FPDF. Ya que la función multiCell no permite ordenarse por tablas y la función Cell solo funciona en un solo renglón y no mostraría cuando hay muchos más caracteres.

 

class PDF extends FPDF
{
var $widths;
var $aligns;

function SetWidths($w)
{
$this->widths=$w;
}

function SetAligns($a)
{
$this->aligns=$a;
}

function Row($data)
{
$nb=0;
for($i=0;$i<count($data);$i++)
$nb=max($nb,$this->NbLines($this->widths[$i],$data[$i]));
$h=4*$nb;
$this->CheckPageBreak($h);
for($i=0;$i<count($data);$i++)
{
$w=$this->widths[$i];
$a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';
$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<$nb)
{
$c=$s[$i];
if($c=="\n")
{
$i++;
$sep=-1;
$j=$i;
$l=0;
$nl++;
continue;
}
if($c==' ')
$sep=$i;
$l+=$cw[$c];
if($l>$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);
}

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.

 

 

// 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 milimetros
$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 pacientes
$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, posición del 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:

 

// 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 milimetros, ya que nuestra hoja esta en milimetros.

// creamos nuestra fila con las columnas fecha(fecha de la visita al medico), medico(nombre del medico que nos atendio), consultorio
// y el diagnostico en esa visita.

$pdf->Row(array('FECHA', 'MEDICO', 'CONSULTORIO', 'DIAGNOSTICO'));

 

 

 

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().

 

$historial = $con->conectar(); // Creamos nuestra conexión a la base de datos
// Realizamos nuestra consulta
$strConsulta = "SELECT consultas_medicas.fecha_consulta, consultas_medicas.consultorio, consultas_medicas.diagnostico, 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; $i<$numfilas; $i++)
{
$fila = mysql_fetch_array($historial);
// los mostramos con la función Row
$pdf->Row(array($fila['fecha_consulta'], $fila['consultorio'], $fila['nombre_medico'], $fila['diagnostico']));
}
//La ultima linea $pdf->Output(); lo que hace es cerrar el archivo y enviarlo al navegador.
$pdf->Output();

 

 

A continuación les dejo el código y la base de datos para descargar.

 

 

Atención! Usted no tiene permiso para ver este texto.... Primero debes Registrate!


 

 


Etiquetas clave: crear, reporte, fpdf, php, mysql, script, codigo, pdf

 (votos: 0)

 
Estimado visitante, usted ha ingresado al sitio como usuario no registrado. Le animamos a registrarse o entrar al sitio usando su usuario.

Artículos relacionados:


Comenario #3 Autor: robertino   |   8 Feb 2011, 19:29   |
   
 



Grupo: Usuario
Publicaciones: 0
Comentarios: 1
Puntos: 91
1er Comentario, algo basico pero muy buen tuto
 
Comenario #2 Autor: carlitos40402   |   11 Oct 2010, 12:48   |
   
 



Grupo: Usuario
Publicaciones: 0
Comentarios: 1
Puntos: 93
si ayuda por que me gustaria cambiar el formato de hoja y como coloco una imgen me urge!!!!wassat  y por cierto muchas gracias por este ejemplo
 
Comenario #1 Autor: frank Luigi   |   16 Set 2010, 07:56   |
   
 



Grupo: Usuario
Publicaciones: 0
Comentarios: 1
Puntos: 85

como aria para cambiar el formato del pdf de vertical a horizontal y como pongo una imagen en el pdf 

 
Información
 
Usuarios que están en este grupo no pueden dejar comentarios en la página
 
Acceso Usuarios
Usuario:
Contraseña:

¿Recordar Contraseña?
Regístrate y Publica tus Scripts!

Categorias
   




Artículos Populares

SUSCRIBETE
15

Suscritos en feed

 
Seguir en Twitter

Aquí­ Donaciones
Si piensas que te hemos ayudado
y merecemos tu apoyo económico por
favor colabora con un granito de Arena...
»

ESTADÍSTICAS

Publicar Artículos | Estadísticas | Contactar  | Reglas | Venta Hosting | Venta Dominios

Términos de Uso - Privacidad de Datos