Subscribe:

viernes, 22 de julio de 2011

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
?>

22 comentarios:

Luis E. Rivero M. dijo...

Buenos dias Elba muy chevere tu blog sencillo y directo sin mucho adorno. Solo me gustaría agregar que si por alguna casualidad el código no logra realizar el enlace con el mysql prueben colocando el punto y coma en el query
$sql1 = "SELECT informacion FROM empresa;";
adentro de las comillas. Gracias y éxitos.

Giovanny Fabricio dijo...

QUE TAL AMIGA. TE AGRADESCO EL CODIGO PERO MIRA YA LE HE REALIZADO CON ESA LIBRERIA Y VA BIEN PERO NECESITO UTILIZAR POR LO MENOS 40 CAMPOS DISTRIBUIDOS EN FORMA DE REPORTE DIFERENTE EN UN DOCUMENTO, LA CEDULA A LA DERECHA, EL NOMBRE AL CENTRO, LA DIRECCION A LA DERECHA Y ASI SUCESIVAMENTE, EN UNA TABLA...
MIL GRACIAS POR TU AYUDA

Unknown dijo...

Hola soy totalmente nuevo en programacion web pero tambien lei esta pagina me parece buena al igual que esta saludos..

http://www.desarrolloweb.com/articulos/tablas-fpdf.html

Unknown dijo...

Hola amiga buenas noches no logro comprender, como hacer para imprimir variables en la misma linea pero en distinta posicion, con la funcion _Cell

y como hacer para que cambie de linea..

Saludos espero me apoyes, o alguien más

Unknown dijo...

Buen dia, estoy haciendo unas pruebas con Joomla y deseo hacer un reporte en PDF con los datos de registro de nuevos usuario. El modulo de usuarios por defecto del joomla, lo he reemplazado por el com_profiler de la extension Community Builder. Quisiera poder generar una planilla en PDF con todos esos datos, como hago para hacer la conexion sql? agradezco ayuda!

Unknown dijo...

Buenos dias, el codigo me parece muy bueno pero quisiera todo ya que cuando lo ejecuto me dice que la primera funcion no existe, solo nececito las primeras lineas desde <?php hasta setfillcolor, gracias, eduardo gamarra

Unknown dijo...

ayudaaaaa estoy comenzando a programar y necesito alguien que me explique que tenga mucha paciencia

Unknown dijo...

mi correo es gealdine.bracho@hotmail.com graciiasss..

Unknown dijo...

Muy buen aporte, disculpa una pregunta porque al generar mi reporte en un servidor local lo hace correctamente, pero al generarlo dentro de un archivo remoto no lo hace y me manda un error de que el archivo es corrupto o inválido?, como puedo solucionarlo

twitter @elbasysteming dijo...

es porque el servidor web tiene que estar en linux, y si esta en windows el archivo lo genera corrupto, hasta ahora no se por que... si quieres enviame tu correo para enviarte un mejor ejemplo de reportes!

Anónimo dijo...

Hola, esta bien Pero si quiero solo un Reporte, como seria el Código.

jaironman dijo...

hola estoy desarrollando ya app web y tengo que imprimir facturas que he modelado con fpdf, el problema es que no se como limitar las impresiones y es que solo se deben hacer 2; una para el cliente y otra para la empresa...se puede hacer eso?????

franknieto_ dijo...

mi correo es franknietocollado@gmail.com Si no fuer mucha molestia me podrias enviar el codigo, estoy recien empesando por generar reportes en php porfas :) (y)

JAIRO ELIEL FUENTES RIVERA dijo...

hola que tal necesito ayuda para generar una orden de compra de productos no se como hacerla por favor ayuenme

Unknown dijo...

$this->Ln();

por que me da error aqui

Unknown dijo...

$this->Ln();

por que me da error aqui

juan carlos zapata dijo...

$this->Ln();

me da error aqui

juan carlos zapata dijo...

$this->Ln();

me da error aqui

Joan C. dijo...

Si estàs dentro de la cabecera se utilitza
$this->Ln();

Si estas en el cuerpo del informe tienes que utilizar
$pdf->Ln();

Unknown dijo...

Buenas, he tenido cierto inconveniente para poder crear un reporte para constancias de residencia, me podrias asesorar.

twitter @elbasysteming dijo...

Hola he decidido crear un nuevo blog www.elbasysteming.com.ve por ahi me puedes ubicar

Ismael dijo...

Hola una consulta. después de tener como resultado final este PDF que se genero desde php y mysql. Como lo puedo mandar a imprimir a la impresora sin el cuadro de dialogo de la impresora.

Quedo en espera de tus comentarios.

Saludos.

Publicar un comentario