Crear un reporte con FPDF usando PHP y MySQL

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. 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"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.

<?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;$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';
$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);
}

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.
$pdf->Row(array('FECHA', 'MEDICO', 'CONSULTORIO', 'DIAGNOSTICO'));
// 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.

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; $iRow(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.

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.

A continuación les dejo el código y la base de datos para descargar. Descarga: Mediafire – reporte_clinicaMega – reporte_clinica.

código de respuesta al comentario de por que tantos echo:

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

99 comentarios en “Crear un reporte con FPDF usando PHP y MySQL”

  1. Roman Hernandez dice:

    Excelente ejemplo, muy sencillo y altamente funcional.
    gracias

    1. carlos espinoza dice:

      Hola muy buen aporte pero al checar tu codigo me tope con esta linea for ($i=0; $iRow(array($fila[‘fecha_consulta’], $fila[‘consultorio’], $fila[‘nombre_medico’], $fila[‘diagnostico’]));
      no logro comprender como es que funciona este for

      1. andrea dice:

        estoy mirandome el ejemplo y me pasa lo mismo que a ti, este for no me funciona:

        for ($i=0; $iRow(array($fila[‘fecha_consulta’], $fila[‘consultorio’], $fila[‘nombre_medico’], $fila[‘diagnostico’]));

  2. Emmanuel dice:

    Muchas gracias justo lo que andaba buscando super claro y funcionando!!!1

  3. ponzho dice:

    me marca varios errores de sintaxsis

    while($i$wmax)//error
    {
    if($sep==-1)
    {
    if($i==$j)
    $i++;
    }
    else
    $i=$sep+1;
    $sep=-1;
    $j=$i;
    $l=0;
    $nl++;
    }
    else //error
    $i++;
    }
    return $nl;
    }
    en el while falta hacer la comparacion creo que es mientras $i<$wmax y hay un else sin un if
    al final tres llaves que cierran, cuando solo hay dos que abren

    1. sun2012 dice:

      Hola, pues que yo vea todas están cerradas, puedes bajar el archivo y probarlo funciona perfectamente, saludos.

    2. sun2012 dice:

      HOla, si tienes razon en el post tiene unos errores, es que el script que pinta el code creo que los borro, pero el de descarga esta corecto.
      si no puedes checar en http://www.fpdf.org/en/script/script3.php esta el script original

    3. Mario dice:

      Buen trabajo, pero tengo una duda yo tengo la URL de mis imagenes de productos y estoy haciendo esto:
      $URimg= “../photos/”.$fila[‘imagen’];
      $imagen = ”;
      $pdf->Row(array($fila[‘Cantidad’], $fila[‘ItemDes’], $fila[‘ItemCod’], $fila[‘PrecioUnitario’], $fila[‘Importe’],$imagen));

      como observaras estoy adaptando tu ejemplo en uno propio, y lo que hago es agregarle la ruta completa a una variable para posteriormente imprimir en el array, pero no me muestra la imagen mas al contrario solo me muestra esto: por mencionar un ejemplo.
      gracias

      1. sun2012 dice:

        Hola, es que en fpdf existe al funcion Image(‘logo_pb.png’,10,8,33) para mostrar imagenes, saludos.

        1. Mario dice:

          Gracias Oscar por responder, mira si puedes agregarme al Skype mi cuenta es marioarroyovaca .
          mira yo quiero hacerlo dinamicamente es decir quiero realizar una proforma en la cual debo de mostrar las imagenes y fijate como le paso los datos:
          while($fila=mysql_fetch_assoc($SqlArchivo))
          {
          $URimg= “../photos/”.$fila[‘imagen’];
          $imagen = ”;
          $pdf->Row(array($fila[‘Cantidad’], $fila[‘ItemDes’], $fila[‘ItemCod’], $fila[‘PrecioUnitario’], $fila[‘Importe’], $imagen));

          }
          el PDF me genera bien pero solo que la parte donde estoy imprimiendo $imagen me imprime lo siguiente: es decir solo me imprime totalmente plano. y si te comento que estoy utilizando lo que me mencionas y me muestra bien por cierto el logo de la empresa.
          function Header()
          {
          $this->SetFont(‘Arial’,’B’,10);
          $this->Image(‘../CapaPresentacion/Imagenes/system_logo.png’,20,10,45,22);
          $this->Text(116,14,’PRESUPUESTO DE VENTA’,0,’C’, 0);
          $this->Image(‘../CapaPresentacion/Imagenes/system_logo.png’,224,10,35,18);
          $this->Ln(30);
          }

          1. sun2012 dice:

            en vez de $imagen seria Image(‘$image’,20,10,45,22); aun que necesitarías aumentar ala posicion segun el tamaño de tu tabla ya que los dos datos primeros son el eje x y y y lod emas el tamaño, jeje

    4. sun2012 dice:

      hola, pues si quieres ver el original de la class esta es el link http://www.fpdf.org/en/script/script16.php

  4. ponzho dice:

    ya descargue el ejemplo, ahi si esta correctamente el codigo y todo, muchas gracias funciona de maravilla y muy practico

  5. ezequiel dice:

    sencillo eso? Es código morse sobre todo las funciones. No quiero imaginarme un ejemplo avanzado, yo lo único que quiero es generar un reporte y parece q tenes que poner un código de 140 renglones.

    1. sun2012 dice:

      Pues es igual, solo es una class que ya esta definida

  6. Aida dice:

    Excelente ejemplo, funciona de maravilla.

  7. Alberto dice:

    Muy buen ejemplo, te agradesco mucho por haberlo compartido, lo he ejecutado y va de 10.

    Aprovechando me gustaría consultarte como puedo hacer para repetir las filas del titulo de la tabla (fecha, médico, consultorio y diagnóstico) en las siguientes hojas del historial médico, ya que cuando se generá el pdf que contiene más de 1 página la fila del título de la tabla (fecha, médico, consultorio y diagnóstico) ya no aparece, sino que solo en la primera.

    De antemano gracias

    1. sun2012 dice:

      Hola, pues si puedes seccionar el numero de registros por pagina, saludos.

      1. jaironman dice:

        hola no entendi del todo tu explicacion por favor puedes explicarla mejor, es que estoy utilizando esta herramienta para reportes que tienen varias paginas y me gustaria que los nombres de las tablas esten en cada pagina.. te agradezco de antemano

  8. jristokolev dice:

    Prueben esta libreria para generar reportes. Una de las mejores opciones que he visto. No esta del todo completa pero otra opcion para hacernos la vida mas facil.
    https://github.com/yordis/reportexpress

    1. sun2012 dice:

      hola, pues la verdad este post ya esta desactualizado la nueva versión de fpdf ya trae las funciones integradas y es como usar un datagrid, en breve loa actualizare, saludos.

    2. Yordis Prieto dice:

      nunca pense que alguien estubiera usando la libreria por eso me aparte de seguir actualizandola, se que este post es viejo pero la has usado?? como te ha ido? crees que le interese a alguien las actualizaciones??

  9. henry dice:

    excelente tuto, muchas gracias por compartirlo.

  10. Alex dice:

    tengo el siguente error

    ( ! ) Notice: Undefined index: id_paciente in C:\wamp\www\dcsystems\reporte_historialmed.php on line 127

    1. sun2012 dice:

      mándame tu código y base a omarchin2@hotmail.com para checarlo que tiene, saludos.

  11. Lexar dice:

    Hola abra la manera de insertar hora y fecha a un reporte que estoy generando?

    1. denker dice:

      Hola, para la fecha y la hora puedes ocupar la funcion time http://php.net/manual/es/function.time.php

  12. Andres dice:

    Como hago para mermar el tamaño de las celdas FECHA, MEDICO, CONSULTORIO y DIAGNOSTICO?? he intentado cambiar algunas cosas pero no me ha dado resultado. Muchas gracias!

  13. vale dice:

    Parse error: syntax error, unexpected ‘)’, expecting ‘;’ in C:\xampp\htdocs\Nueva carpeta\reporte_historial.php on line 21

    Me sale este error y no se como resolverlo cuando le doy clic al enlace VER MAS…en el diagnostico del paciente

    1. vale dice:

      for($i=0;$iNbLines($this->widths[$i],$data[$i])); en esta linea

  14. Kari Robledo dice:

    Muchas gracias, me sirvió mucho para un proyecto.

  15. Bryan dice:

    Excelente Esta Información Me Sirvió Bastante de guía.
    una preguntacomo hago para meter un dato que extraje de la base de datos en el header(Cabecera) de la pagina Gracias

    1. sun2012 dice:

      Hola, pues igual que como imprimes el reporte, haces tu consulta y lo imprimes.saludos.

  16. Oscar dice:

    como puedo hacer para repetir las filas del titulo de la tabla (fecha, médico, consultorio y diagnóstico) en las siguientes hojas del historial médico, ya que cuando se generá el pdf que contiene más de 1 página la fila del título de la tabla (fecha, médico, consultorio y diagnóstico) ya no aparece, sino que solo en la primera.

  17. sun2012 dice:

    los encabezados de tu tabla ponlos en al funcion header y listo, saludos.

    1. Oscar dice:

      Sos un genio , ya lo hice y funciona de mil maravillas!!!

      Muchisimas gracias !!

  18. mili dice:

    Hola esta muy bueno tu ejemplo pero tengo un problema cuando ejecuto reporte_historial.php muestra el pdf con la tabla pero mas no carga datos y eso es lo que necesito que genere con los datos que tenga en la tabla de la base de datos a imprimir lo muestra vacío, y así no me sirve para aplicarlo a mi proyecto me puedes ayudar por favor.??? gracias

    1. sun2012 dice:

      Hola, pues envíame un correo a omarchin2@hotmail.com con tus archivos y las tablas, saludos.

  19. giovanny orozco dice:

    hola, el ejemplo funciona bastante bien pero tengo una duda.
    si una de las celdas queda mas alta por que el texto no cabe en el ancho, las otras celdas de esa misma también crecen en el alto pero el color de fondo no no baja hasta el total del alto este se queda como estaba.

    si alguien puede ayudarme seria genial.
    gracias.

    1. sun2012 dice:

      en la function Row($data) esta la siguiente linea $this->Rect($x,$y,$w,$h); la debes sustituir por $this->Rect($x,$y,$w,$h, ‘F’ ); o $this->Rect($x,$y,$w,$h, ‘FD’); y pintara todo el cuadro, ya que con la funcion Rect no tenia ninguna propiedad asignada solo dibujaba el border y la funcion Multicell solo pintaba el contenido, al colocar las propiedades las hereda el rectángulo y también sera rellenado, saludos.

      Para mas información:
      http://www.fpdf.org/es/doc/rect.htm

  20. Mercedes dice:

    Hola, ya logre generar un reporte, es para una constancia de trabajo por ende necesito campos de varias tablas… Logro hacerlo obvio con la primera pero me podrias comentar como puedo agregar los datos de las otras 3 o 4 y si hay alguna forma de que el texto quede completamente justificado porque hasta ahora lo tengo descuadrado a pesar de colocar en el multicell justificado… Gracias si lo ves es urgente

    1. denker dice:

      Hola Mercedes.

      Para mostrar en el pdf datos de diferentes tablas solo tienes que crear tus consultas correspondientes y recorrer los resultados dependiendo de como quieras presentarlas. Para que tu texto aparezca justificado la opción la indicas en MultiCell.

      Saludos

  21. pedro dice:

    buen aporte me sirvió bastente.. gracias

  22. luigi dice:

    Super Agradecido con tu demostración, por fin he podido realizar las constancias que tanto
    trabajo me había llevado. Saludos desde Caracas-Venezuela

  23. jorge dice:

    oye muchas gracias por por los codigos, pero tengo un problema! que solo me sale esto:

    Pacientes
    NO. CLAVE NOMBRE HISTORIAL

    y no puedo ingresar datos, si me podrías orientar te lo agradecería porfa.

    1. denker dice:

      Hola Jorge. Te marca algun error?

    2. sun2012 dice:

      Hola, pues tienes que restaurar la base de datos, no existe un formulario que los registre hay que crearlo, saludos.

      1. jorge dice:

        Gracias denker Dios te continué bendiciendo.

  24. jorge dice:

    Amigo como puedo hacer una consulta o relacionar 2 tablas para que salga asi como la tienes en el codigo que cuando presione ver pueda ver el reporte, nose si me entiendes, es que soy nuevo en esto estas son las 2 tablas

    INSERT INTO `crediticio`.`beneficiario` (
    `cod_id` ,
    `cedula` ,
    `nombres` ,
    `apellidos` ,
    `fecha_nac` ,
    `sexo` ,
    `telafono` ,
    `celular` ,
    `direccion` ,
    `prestamo_id` ,
    `comuna_id` ,
    `estado_civil`
    )
    VALUES (
    ”, ”, ”, ”, ”, ”, ”, ”, ”, ”, ”, ”
    );

    y esta es la otra

    esto es lo que quiero que salga en el reporte

    INSERT INTO `crediticio`.`prestamo` (
    `beneficiario_id` ,
    `fecha` ,
    `tipo_prestamo` ,
    `cuota_id` ,
    `motivo`
    )
    VALUES (
    ”, ”, ”, ”, ”
    );

    si me puedes ayudar te lo agradecere mucho.

      1. jorge dice:

        muchas gracias hno pero en realidad soy nuevo en esto y necesito un poco más ayuda de como relacionarla, si me la podrias hacer con un ejemplo, te lo agradecere mucho.

  25. jorge dice:

    sun2012 eso se podria hacer con una sola tabla? la consulta asi como lo tienes en el codigo, que se muestre la informacion al principio y luego al presionar ver se vaya a la parte de reporte y asi con los demas usuarios que se vayan agregando? porfa necesito ayuda.

  26. drake bryan dice:

    me lo pueden descargar urgentemente y enviarmelo a mi correo porfavor lo necesito estoy en mi clase siii lo necesito gracias mi correo es brayaan_6_12@hotmail.com

  27. Yordis Prieto dice:

    Hola a todos aqui les dejo una libreria para generar reportes esta en su version beta aun me falta por adicionar varias cosas pero si quieren check y hagan pull request el concepto me gusta comentar el codigo y es bastante limpio. La idea original parte de iReport uno de los mejores programas para generar reportes. Solo envienme sus preguntas y me gustaria saber si les interesa

    https://github.com/yordis/reportexpress

  28. Marianela dice:

    Hola, uso el ejemplo y anda perfecto pero tengo un problemita, cuando descargo el pdf, y lo visualizo con el adobe reader 10.1.8, las tablas salen sin bordes, ni renglones, alguien sabria como solucionar eso??? Gracias!

  29. Marianela dice:

    Ya solucione! Saludos

  30. DavidHdez06 dice:

    Muy buen aporte, me sirvio de mucho gracias

  31. Victor dice:

    No sé si es el sitio más indicado, pero una consulta.
    ¿como hago para cargar imagenes dinámicamente en fpdf y que no me las corte?.
    Me explico: tengo una funcion que sube las imagenes manteniendo las proporciones (1488x2105px como máximo). Pero al pasear esa imagen a pdf en algunos casos me las corta.

    mi funcion para generar pdf es esta:

    AddPage();
    $size=190;
    $absx=(210-$size)/2;
    $pdf->Image($ruta,$absx,1,$size,’JPG’);
    $nombreImagen=basename($ruta, “.jpg”);
    $rutapdf=”../../ofertas/pdf/”.$nombreImagen.”.pdf”;
    $pdf->Output($rutapdf);
    ?>
    Gracias por vuestro tiempo

  32. Victor dice:

    Soy yo de nuevo, he modificado el codigo y de esta manera solo me lo deforma en imagenes alargadas verticales:
    $pdf=new FPDF();
    //Primera página
    $pdf->AddPage();
    //$size=190;

    if($miniatura_ancho == 1488){
    $pdf->Image($ruta,0,0,210,’JPG’);
    }else {
    $pdf->Image($ruta,0,0,210,297,’JPG’);
    }

    $nombreImagen=basename($ruta, “.jpg”);

    $rutapdf=”../../ofertas/pdf/”.$nombreImagen.”.pdf”;
    $pdf->Output($rutapdf);
    ?>

    Pero no se como hacer para que me recoja la proporcion en el else, ya el si en lugar de 210 lo dejo vacio me lo interpretará como que 297 es el ancho.

    No sé si me estoy explicando 🙁

    1. sun2012 dice:

      Hola, lo que no entiendo quieres que el pdf salga del tamaño de la imagen o que se ajuste al tamaño carta por ejemplo, saludos.

      1. Victor dice:

        Mi idea era que la imagen se ajuste al tamaño de la hoja (pdf), pero manteniendo las proporciones.

        Pensé que era un problema al trabajar con centímetros y píxeles e hice otro cambio en el código:

        $pdf=new FPDF(‘P’,’pt’,array(1488,2105));
        $pdf->AddPage();
        $x=$miniatura_ancho;
        $y=$miniatura_alto;
        if($miniatura_ancho == 1488){
        $pdf->Image($ruta,0,0,1488,$y,’JPG’);
        }else {
        $pdf->Image($ruta,0,0,$x,2105,’JPG’);
        }

        $nombreImagen=basename($ruta, “.jpg”);

        $rutapdf=”../../ofertas/pdf/”.$nombreImagen.”.pdf”;
        $pdf->Output($rutapdf);

        Pero solo me funciona con imagenes anchas. Cuando son más largas que la hoja me las deforma.

        Muchas gracias por el interés sun2012

  33. aNTONIO dice:

    Hola que tal disculpen tengo un error al agregar filas solamente me deja agregar 5 filas
    me dice que tengo un error en esta parte del codigo.

    function Row($data)
    {
    // calculando la altura de la fila
    $nb=0;
    for($i=0;$iNbLines($this->widths[$i],$data[$i]));
    $h=5*$nb;
    // publique una suspensión de la página primero si necesitado
    $this->CheckPageBreak($h);
    /// dibuje las celdas de la fila
    for($i=0;$iwidths[$i];
    $a=isset($this->aligns[$i]) ? $this->aligns[$i] : ‘L’;
    // guarda la posición actual

  34. gabriel dice:

    esta bueno valeeee..siga adelante

  35. Arturo dice:

    En mi caso uso XAMPP, y al intentar cargar desde la barra de direcciones dice:

    Pacientes
    [:(] Error al conectar a la base de datos

    me puede ayudar, soy novato….
    harturo_ramirez@hotmail.com

  36. Arturo dice:

    En mi caso uso XAMPP, y al intentar cargar desde la barra de direcciones dice:

    Pacientes
    [:(] Error al conectar a la base de datos

    me puede ayudar, soy novato….
    harturo_ramirez@hotmail.com

    1. sun2012 dice:

      hola,
      1.- puede ser por que no has creado la base de datos.
      2.- en el archivo de conexión hay que cambiar el usuario, clave y nombre de la base de datos.
      saludos.

  37. Ivan Aguirre dice:

    Hola que tal muy buen post, me agrado mucho, pero al momento que pasa para convertirlo o mostrarlo en PDF me sale este error:

    FPDF error: Some data has already been output, can’t send PDF file

    ¿Que podria ser?, o como se puede solucionar

  38. PAtY dice:

    a mi me funciono de maravilla!:.. de hecho me salvo este dia de trabajo!… MILLLLL GRACIAS!..

  39. rodrigo dice:

    hola como puedo hacer para imprimir directamente el pdf, es decir que se genere por código y directamente salga impreso?

    1. sun2012 dice:

      No se puede,sólo html puedes mandar a imprimir con javascript pero el PDF no se puede automáticamente

  40. Jason Todd dice:

    Hola, buen post y muy efectivo.
    Pero no se puede hacer de otra manera que no sea… echo, echo, echo, echo
    el html?

    Saludos.

    1. sun2012 dice:

      hola, pues cada quien lo hace como quiera, si quieres puedes cerra las etiquetas php y poner el código html sin el echo y ya solo cuando necesites imprimir las variables pues abres y cierras las etiquetas de php.

      al final del articulo pongo el ejemplo, saludos.

      1. Jason Todd dice:

        Entiendo, gracias. >:D

  41. gerry dice:

    Gran trabajo, Muchas gracias!!

  42. Martin dice:

    Hola me parece muy interesante tu código para generar pdf desde una base de datos el problema que yo tengo es que también se visualiza el código html incrustado tipo o y tampoco se ven las imágenes por ello me gustaría solucionar este problema.
    Gracias por anticipado.

    1. sun2012 dice:

      Hola en PHP existe una función que elimina las etiquetas html de tu cadena y con eso lo solucionas.

      1. Martin dice:

        Hola gracias por la respuesta tan rápida. La cuestión es que cuando visualizo la pagina se ve bien el problema es al pasarla a pdf que no me parsea el código html y supongo que habrá que agregar mas código al ya utilizado.

        1. sun2012 dice:

          O puedes usar dompdf convierte html a PDF sin ningún problema

          1. Martin dice:

            Gracias por la respuesta lo probare haber aunque este me funciona muy bien lo único es eso que se ve el código de P para párrafos, B para negrita etc, y se ve el código de las imágenes pero estas no.

          2. sun2012 dice:

            hola es que fpdf no trata una pagina como un todo es mas que nada para formatos con pocos valores por eso es muy bueno para reportes y una imagen la ubica por posiciones lo que tendrias que hacer es agregar varias funciones una para que elimine etiquetas html generales y otra que cuando encuentre un negrita la convierta a función de negritas del fpdf y cuando encuentre una imagen que elimine la etiqueta y solo obtenga la ruta, por eso es algo dificil, te recomiendo http://www.digitaljunkies.ca/dompdf lo unico que tienes que hacer es imprimir una variable con toda la información y automaticamente combierte todo a pdf sin preocuparte por el html ya que lo interpreta como el navegador. te dejo un link de como usarlo http://www.cesarcancino.com/noticias/detalle/videotutorial-21-del-curso-de-php-poo saludos

          3. Martin dice:

            Hola en primer lugar perdón por ser tan pesado pero de todos los programas que he probado este es el único que consigo hacer funcionar y es por eso que agradecería me pasarais el código completo con las funciones añadidas , si ello es posible, para no estropearlo si lo hago yo.
            Una vez mas gracias por adelantado.

  43. Rigoberto trinidad dice:

    Hola que tal buenos dias xD ya aqui es la 1:33 am, pero quiero una consulta y al generar el pdf me jala los datos de la base de datos, pero al querer ver otro pdf osea otra consulta a travez del id me sigue enviando el primer id:1 y asi con todos, no se si sea un error del codigo o no se que pase . saludos gracias-

    1. sun2012 dice:

      Ya cheque mi código y abre perfectamente otra es que este almacenando en cache el documento y no genere el nuevo.

    2. Arturo Ramírez dice:

      Sin dda un error en el código…

      1. sun2012 dice:

        Que error marca?

  44. Arturo Ramírez dice:

    Y lo ovidaba, no olvides borrar el historial de tu navegador.

  45. Miguel Angel dice:

    Buenas tardes este ejemplo me fue muy útil muchas gracias, pero quisiera pedirles un favor solamente estoy usando reporte_historial.php ya que la conexión y el index lo tengo para otro aplicativo solamente que a la hora de Exportar como PDF solo me muestra la interfaz mas no me muestra los datos les agradecería si me pueden colaborar.

    Aqui esta reporte_historial como lo deje.

    widths=$w;
    }

    function SetAligns($a)
    {
    //Colocar el conjunto de alineamientos de columna
    $this->aligns=$a;
    }

    function Row($data)
    {
    //Calcula la altura de la fila
    $nb=0;
    for($i=0;$iNbLines($this->widths[$i],$data[$i]));
    $h=5*$nb;
    //Emitir un salto de página en primer lugar si es necesario
    $this->CheckPageBreak($h);
    //Draw the cells of the row
    for($i=0;$iwidths[$i];
    $a=isset($this->aligns[$i]) ? $this->aligns[$i] : ‘L’;
    //Guardar la posición actual
    $x=$this->GetX();
    $y=$this->GetY();
    //Dibuje la frontera

    $this->Rect($x,$y,$w,$h);

    $this->MultiCell($w,5,$data[$i],0,$a,’true’);
    //Ponga la posición a la derecha de la celda
    $this->SetXY($x+$w,$y);
    }
    //Ir a la siguiente línea
    $this->Ln($h);
    }

    function CheckPageBreak($h)
    {
    //Si la altura h provocaría un desbordamiento, añadir una nueva página de inmediato
    if($this->GetY()+$h>$this->PageBreakTrigger)
    $this->AddPage($this->CurOrientation);
    }

    function NbLines($w,$txt)
    {
    //Calcula el número de líneas de un MultiCell de anchura w tomará
    $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’,”,13);
    $this->Text(20,14,’ Historial Total Ingresos A Enfermeria’,0,’C’, 0);
    $this->Ln(30);
    $this->Image(‘img/logo oficial.png’,10,12,30,0,”,’http://localhost:8080/SoftMedical-Boston/index.php?view=pacients’);
    }

    }

    //$pacient= $_GET[‘id’]; Me Aparece ERROR por eso la deje como mjs.
    $con = new DB;
    $pacient = $con->conectar();

    $strConsulta = “SELECT * from pacient where id = ‘$pacient'”;

    $pacient = mysql_query($strConsulta);

    $fila = mysql_fetch_array($pacient);

    $pdf=new PDF(‘L’,’mm’,’Letter’);
    //$pdf->Open(); Me Aparece ERROR por eso la deje como mjs.
    $pdf->AddPage();
    $pdf->SetMargins(20,20,20);
    $pdf->Ln(10);

    $pdf->SetFont(‘Arial’,”,11);
    $pdf->Cell(0,6,’Nombre De Paciente: ‘.$fila[‘name’].’ ‘.$fila[‘lastname’],0,1);
    $pdf->Cell(0,6,’Direccion: ‘.$fila[‘address’],0,1);
    $pdf->Cell(0,6,’Email: ‘.$fila[‘email’],0,1);
    $pdf->Cell(0,6,’Telefono: ‘.$fila[‘phone’],0,1);

    $pdf->Ln(10);

    $pdf->SetWidths(array(50, 50, 55, 55, 40,380));
    $pdf->SetFont(‘Arial’,’B’,10);
    $pdf->SetFillColor(85,107,47);
    $pdf->SetTextColor(255);

    for($i=0;$iRow(array(‘FECHA/HORA’, ‘MOTIVO DE CONSULTA’, ‘ATENCION PRESTADA’, ‘CLASE’, ‘HORA DE SALIDA’,));
    }

    $historial = $con->conectar();
    $strConsulta = “SELECT reservation.created_at, reservation.title, reservation.note, reservation.class, reservation.time_sa
    FROM reservation
    Inner Join pacient ON reservation.id = pacient.id
    #Inner Join medicos ON consultas_medicas.id_medico = medicos.id_medico
    WHERE pacient.id = ‘$pacient'”;

    $historial = mysql_query($strConsulta);
    $numfilas = mysql_num_rows($historial);

    for ($i=0; $iSetFont(‘Arial’,”,10);

    if($i%2 == 1)
    {
    $pdf->SetFillColor(153,255,153);
    $pdf->SetTextColor(0);
    $pdf->Row(array($fila[‘created_at’], $fila[‘title’], $fila[‘note’], $fila[‘class’],$fila[‘time_sa’]));
    }
    else
    {
    $pdf->SetFillColor(102,204,51);
    $pdf->SetTextColor(0);
    $pdf->Row(array($fila[‘created_at’], $fila[‘title’], $fila[‘note’], $fila[‘class’],$fila[‘time_sa’]));
    }
    }

    $pdf->Output();
    ?>

    GRACIAS (Y)

    1. sun2012 dice:

      Hola, pues checa tus datos de conexión o si esta bien tu consulta, y como estas mandando un reporte general que no tiene filtrado como en el ejemplo solo usaba el id del paciente por eso marca error puedes eliminarlo por completo si no lo usas.

  46. jose luzardo dice:

    saludos gracias por el aporte

  47. Saludos Como agrego mas columnas en el ejemplo

    1. Ya encontre 😀 muchas Gracias por el APORTE

  48. hola muchas gracias carnal ya tenia el ejemplo pero me sirvio mucho …. los header y foter
    ….
    ….
    ….
    dejo codigo algun dia le servira a alguien yo llevaba dos dias .

    …..
    …..
    ….
    widths=$w;
    }

    function SetAligns($a)
    {
    //Set the array of column alignments
    $this->aligns=$a;
    }

    function fill($f)
    {
    //juego de arreglos de relleno
    $this->fill=$f;
    }

    function Row($data)
    {
    //Calculate the height of the row
    $nb=0;
    for($i=0;$iNbLines($this->widths[$i],$data[$i]));
    $h=3*$nb;
    $h;
    //Issue a page break first if needed
    $this->CheckPageBreak($h);
    $this->SetX(10);
    //Draw the cells of the row
    for($i=0;$iwidths[$i];
    $a=isset($this->aligns[$i]) ? $this->aligns[$i] : ‘L’;
    //Save the current position
    $x=$this->GetX();
    $y=$this->GetY();
    //Draw the border
    $this->Rect($x,$y,$w,$h,$style);
    //Print the text
    $this->MultiCell($w,3,$data[$i],’LTR’,$a,$fill);
    //Put the position to the right of the cell
    $this->SetXY($x+$w,$y);
    }
    //Go to the next line
    $this->Ln($h);
    }

    function CheckPageBreak($h)
    {
    //If the height h would cause an overflow, add a new page immediately
    if($this->GetY()+$h>$this->PageBreakTrigger)
    $this->AddPage($this->CurOrientation);

    }

    function NbLines($w,$txt)
    {
    //Computes the number of lines a MultiCell of width w will take
    $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’,’B’,18,’Letter’);
    $this->SetFillColor(255,255,255);
    $this->Cell(0,5,”CUENTA PUBLICA MUNICIPAL”,0,1,’C’);
    //$this->Cell (0,5,utf8_decode(“nombreoficina2”),0,1,’C’);

    //$this->SetXY(15, 10);//(ANCHO,LARGO HACIA ABAJO)
    $this->Image(‘../patrimonio/imagenes/logoadmin.jpg’, 15, 10, 30, 20, “JPG”);
    //$this->SetXY(15, 280);//(ANCHO,LARGO HACIA ABAJO)
    $this->Image(‘../patrimonio/imagenes/glifojiutepec.jpg’, 320, 10, 20, 20, “JPG”);

    //
    //$this->SetFont(‘Arial’,”,10);
    //$this->Text(65,14,’Clinica el sol naciente’,0,’C’, 0);
    $this->Ln(30);
    }

    function Footer()
    {
    $this->SetFont(‘Arial’,”,7,’Letter’);

    $this->SetXY(25, 195);//(ANCHO,LARGO HACIA ABAJO)
    $this->Cell(80, 4, “__________________________________________________________”, 0 , 1,’C’); //Celda
    $this->SetXY(25, 198);//(ANCHO,LARGO HACIA ABAJO)
    $this->Cell(80, 4, utf8_decode(“nombreresguardante2”), 0 , 1,’C’); //Celda
    $this->SetXY(25, 201);//(ANCHO,LARGO HACIA ABAJO)
    $this->multiCell(80, 3, utf8_decode(“nombreoficina2”), 0 ,’C’, 1); //Celda
    /*$this->SetY(-15);
    $this->SetFont(‘Arial’,’B’,8);
    $this->Cell(100,10,’Historial medico’,0,0,’L’);*/
    $this->SetXY(260, 195);//(ANCHO,LARGO HACIA ABAJO)
    $this->Cell(80, 4, “__________________________________________________________”, 0 , 1,’C’); //Celda
    $this->SetXY(260, 198);//(ANCHO,LARGO HACIA ABAJO)

    $this->Cell(80, 4, utf8_decode(“nombreresguardantepatrimonio”), 0 , 1,’C’); //Celda
    $this->SetXY(260, 201);//(ANCHO,LARGO HACIA ABAJO)
    $this->multiCell(80, 3, utf8_decode(“nombreoficinapatrimonio”), 0,’C’ , 1); //Celda
    }
    }

    ?>

  49. Jose dice:

    Muy buen tutorial pero como puedo quitar o poner bordes a la tabla?ya he tratado pero solo me elimina el color de las celdas pero me deja unas celdas con borde y otras sin borde.

    Ayuda por favor

    1. sun2012 dice:

      hola en la función row existen estas lineas, lee el manual y las configuras a tu gusto, la primera linea es la que dibuja los borders y la segunda el relleno de la celda:
      $this->Rect($x,$y,$w,$h, ‘FD’);
      $this->MultiCell($w,5,$data[$i],0,$a);

  50. Jose dice:

    Mi problema es como puedo hacer que se vean los margenes completos, ya que por ejemplo si el texto que contiene un renglón, a ese renglón se hace mas delgados los margenes, como puedo hacer para que el texto este mas adentro de las celdas para que no afecte a los bordes

    1. sun2012 dice:

      hola, te dejo el script original para que lo cheques http://www.fpdf.org/en/script/script3.php

  51. Javier Perez dice:

    gracias infinitas por la publicación

Deja un comentario