RSS

Crear PDF desde PHP: Agregar datos de la BD (7/7)

30 Jun

Para lo conexión a la base de datos usaremos dos archivos: dbconfig.php donde estarán los datos de conexión a la base de datos y myDBC.php, que contendrá los métodos necesarios para realizar SELECT, INSERT etc., en este caso solo contendrá el método llamado seleccionar_persona(), éste nos facilitará obtener un array asociativo con los datos de la persona con la matrícula buscada.

En el archivo PDF.php se añadirán tres métodos:

  1. Cabecera($array) : Crea la parte fija de la tabla, es decir, la que tiene los títulos de las columnas. Para ello se le envía como parámetro un array de cadenas (los títulos) y el método se encarga de poner cada elemento del array en una celda hasta terminar con todos sus elementos.

  2. Datos($array) : Crea la parte dinámica de la tabla. En una variable se guardará el array asociativo que regresa el método seleccionar_persona() y le asigna una celda a cada elemento del mismo.

  3. Tabla($array, $array) : Integra en un método los 2 métodos anteriores.

Veamos el contenido de PDF.php

<?php
include_once('fpdf.php');
class PDF extends FPDF
{
	function Footer()
	{
    	$this->SetY(-15);
    	$this->SetFont('Arial','I',8);
    	$this->Cell(0,10,'Este es el pie de página creado con el método Footer() de la clase creada PDF que hereda de FPDF','T',0,'C');
	}

	function Header()
	{
		$this->SetFont('Arial','B',9);

		$this->Line(10,10,206,10);
		$this->Line(10,35.5,206,35.5);

		$this->Cell(30,25,'',0,0,'C',$this->Image('../img/logo.png', 152,12, 19));
		$this->Cell(111,25,'ALGÚN TÍTULO DE ALGÚN LUGAR :D',0,0,'C', $this->Image('../img/logoIzquierda.png',20,12,20));
    	$this->Cell(40,25,'',0,0,'C',$this->Image('../img/logoDerecha.png', 175, 12, 19));

    	$this->Ln(25);
	}

	function ImprimirTexto($file)
	{
       	$txt = file_get_contents($file);
    	$this->SetFont('Arial','',12);
    	$this->MultiCell(0,5,$txt);

	}

	function cabecera($cabecera){
		$this->SetXY(50,105);
		$this->SetFont('Arial','B',15);
		foreach($cabecera as $columna)
		{
	    	$this->Cell(40,7,$columna,1, 2 , 'L' ) ;
    	}
    }

    function datos($datos){

		$this->SetXY(90,105);
		$this->SetFont('Arial','',12);
		foreach ($datos as $columna)
		{
			$this->Cell(65,7,utf8_decode($columna['Nombre']),'TRB',2,'L' );
			$this->Cell(65,7,utf8_decode($columna['ApellidoPat']),'TRB',2,'L' );
			$this->Cell(65,7,utf8_decode($columna['ApellidoMat']),'TRB',2,'L' );
			$this->Cell(65,7,utf8_decode($columna['Matricula']),'TRB',2,'L' );
			$this->Cell(65,7,utf8_decode($columna['Puesto']),'TRB',2,'L' );
		}
    }

    //El método tabla integra a los métodos cabecera y datos
    function tabla($cabecera,$datos){
		$this->cabecera ($cabecera) ;
		$this->datos($datos);
    }

}//fin clase PDF
?>

El contenido final de creaPDF.php

<?php
include_once('PDF.php');
include_once('myDBC.php');

	$mat = $_POST['matricula'];

	//Recibimos dentro de una cadena la fecha
	$fecha="México D.F. a ".$_POST['dia']." de ". $_POST['mes']. " de ".$_POST['anio'];

	//Se crea un objeto de PDF
	//Para hacer uso de los métodos
	$pdf = new PDF();
	$pdf->AddPage('P', 'Letter');
	$pdf->SetFont('Arial','B',12);
	$pdf->Cell(0,10,$fecha,0,1,'R'); 

	$pdf->Cell(40,7,'P  R  E  S  E  N  T  E',0, 1 , ' L ');
	$pdf->Ln();

	$pdf->ImprimirTexto('textoFijo.txt'); //Texto fijo 

	//Creamos objeto de la clase myDBC
	//para hacer uso del método seleccionar_persona()
	$consultaPersona = new myDBC();

	//En una variable guardamos el array que regresa el método
	$datosPersona = $consultaPersona->seleccionar_persona($mat);

	//Array de cadenas para la cabecera
	$cabecera = array("Nombre","A Paterno","A Materno", "Matricula", "Puesto");
	$pdf->tabla($cabecera,$datosPersona); //Método que integra a cabecera y datos

	$pdf->Output(); //Salida al navegador del pdf
?>

dbconfig.php

<?php
    define("DB_SERVER", "localhost");
    define("DB_USER", "root");
    define("DB_PASS", "");
    define("DB_NAME", "empleado");
?>

El contenido de myDBC.php que tiene el método que trae los datos de un registro de la base de datos

<?php
class myDBC {

    public $mysqli = null;

    public function __construct() {

        include_once 'dbconfig.php';
        $this->mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASS, DB_NAME);

        if ($this->mysqli->connect_errno) {
            echo "Error MySQLi: ("&nbsp. $this->mysqli->connect_errno.") " . $this->mysqli->connect_error;
            exit();
        }
        $this->mysqli->set_charset("utf8");
    }

    public function __destruct() {
        $this->CloseDB();
    }

    public function runQuery($qry) {
        $result = $this->mysqli->query($qry);
        return $result;
    }

    public function CloseDB() {
        $this->mysqli->close();
    }

    public function clearText($text) {
        $text = trim($text);
        return $this->mysqli->real_escape_string($text);
    }

    public function seleccionar_persona($matricula)
    {
        $q = "select Nombre, ApellidoPat,
                     ApellidoMat, Matricula,
                     Puesto from persona
                     where
                     Matricula = '$matricula'";

        $result = $this->mysqli->query($q);
        //Array asociativo que contendrá los datos
        $valores = array();
                //Si no hay resultados
                //Se avisa al usuario y se redirige al index de la aplicación
        if( $result->num_rows == 0)
        {
            echo'<script type="text/javascript">
              alert("Ningun registro");
              window.location="http://localhost/pdfenphpupdate/index.php"
            </script>';
        }
          //En otro caso, se recibe la información y se
          //se regresa un array con los datos de la consulta
      else{
            while($row = mysqli_fetch_assoc($result))
            {
                //Se agrega cada valor en el array
                array_push($valores, $row);
            }
          }
        //Regresa array asociativo
        return $valores;
    }
}
?>

Una imagen de la base de datos:

Base de datos con algunos registros

Base de datos con algunos registros

Ahora una secuencia de uso:

Inicio (index.php)

Inicio (index.php

Llenar formulario (formulario_generar.php)

Llenar formulario (formulario_generar.php)

Documento completo

Documento completo

 

Así termina este mini-proyecto :D, espero que sea de utilidad en sus proyectos que ya será cuestión de que lo adapten a sus necesidades.

Si quieren el directorio de trabajo que usé en este ejemplo con la exportación de la tabla y el árbol de directorios con la librería fpdf, bootstrap.css y todos los archivos, lo pueden descargar directamente desde mi dropbox (solo salten la publicidad)

No olviden “jugar” con los parámetros de cada método y visitar el sitio oficial de la librería fpdf para ver más métodos, así como ejemplos que la misma comunidad comparte.

ringhugos@gmail.com || @huguidugui

 

 

 
33 comentarios

Publicado por en 30 junio, 2014 en FPDF, PHP

 

Etiquetas: , ,

33 Respuestas a “Crear PDF desde PHP: Agregar datos de la BD (7/7)

  1. ricarock espinosa

    14 julio, 2014 at 11:29

    tioooooooooooooooooooooo muchisisimas gracias me has ayudado bastante con este codigo, ya andaba en las ultimas, que bueno encontrar gente como tu,,,,, vere todos tus post ya que son muy buenos!! ¡¡¡¡¡¡¡lLIKE!!!!!!!!!!!!!!!!!

     
    • huguidugui

      17 julio, 2014 at 16:34

      Hombre, muchas gracias por tus palabras. Si tienes alguna sugerencia para otro mini-tuto sobre algo específico, adelante 😀

      De nuevo agradezco y vamos por más.

       
  2. ricarock espinosa

    15 julio, 2014 at 10:56

    amigo una pregunta que tu eres senior en esto,,,,,,,, tengo un codigo para exportar la bd desde php pero me la exporta toda, lo que yo quiero es exportar algunas filas para cuando exporte esoss datos importarlos al otro servidor, asi como lo hace phpmyadmin con el wampserver.. me podrias echar la mano o decirme que es lo que podria hacer .. es pero tu respuesta

     
  3. ottello

    23 julio, 2014 at 22:04

    Excelente oye como puedo imprimir el contenido como esta en la base de datos

     
    • huguidugui

      26 julio, 2014 at 06:55

      Otello, te refieres a reportes e imprimir en una tabla todos los registros??

      Acá tengo un ejemplo estático usando solo arreglos para hacer reportes y entender cómo funcionan los métodos y luego tengo este otro ejemplo que obtiene todos los datos de la BD http://wp.me/p24DD5-dd

      Gracias por escribir. Saludos

       
      • nellottello

        26 julio, 2014 at 08:12

        Bien me pareció excelente si todos los registros de forma horizontal y tienes aparte en vez de Gafetes credenciales hechos en fpdf estaría genial

         
      • huguidugui

        26 julio, 2014 at 13:22

        Hola nellottello, no comprendí tu duda :s Ojalá la puedas explicar más. Saludos

         
  4. Monserrat

    26 julio, 2014 at 14:05

    Tendras un ejemplo con medidas de credencial con base de datos de pvc,saludos

     
    • huguidugui

      26 julio, 2014 at 17:29

      Hola Monserrat, mmmm no había escuchado ese término de base de datos pvc. Pues, no, no tengo un ejemplo de ese tipo .__.

      Gracias por comentar 😀

       
  5. José

    20 octubre, 2014 at 13:41

    Amigo, estuve buscando algo así por semanas, nadie lo explicó como tu, saludos y muchas gracias.

     
  6. tyler

    22 octubre, 2014 at 14:15

    te la rifaste!!

    Era lo que andaba buscando, gracias por el aporte, y felicidades.

     
    • huguidugui

      22 octubre, 2014 at 18:06

      Muchas gracias por tu comentario tyler. Me alegra que te haya servido. Saludos

       
  7. Juan Esteban Cardenas Lopez

    19 noviembre, 2014 at 10:25

    .Buenas, por favor me puede indicar si hay alguna manera de que al ingresar la $q, yo debo tener varias consultas para ingresar en un mismo pdf, como puedo hacer varias consultas? gracias.

     
    • huguidugui

      21 noviembre, 2014 at 07:09

      Hola Juan, claro, sí se puede. Obvio ´se tiene que pensar la solución. Lo que yo haría sería (quizá) hacer otro(s) método(s) en myDBC.php, mandar a llamar los métodos en PDf.php y juntarlos en un array para luego imprimir solo ese array como lo muestro aquí.

      O se podría hacer las consultas necesarias en el mismo método, la verdad es que no tengo la solución “perfecta” o “correcta” pero cuando se me presenta hacer una nueva funcionalidad, pues se tiene que pensar en la solución con lo que tengas a la mano.

      De hecho, también tengo en el tintero hacer un tuto para esto que mencionas.

      Igual si quieres que te ayude más, envíame tu código y bd a ringhugos@gmail.com y explícame más sobre lo que quieres hacer.

      Saludos.

       
  8. LYS

    17 diciembre, 2014 at 17:49

    Hola!
    Primero q nada, gracias por el aporte!!!
    Es justo lo que necesitaba …
    Una pregunta, con ésta libreria se puede imprimir código HTML en el PDF?
    Ya que yo intente ésto:
    $html = ” codigo html “;
    $pdf->Cell(0,10,$html,0,1,’R’);
    Pero no obtuve el resultado deseado xD… me imprimio tal cual es “texto” y no la estructura
    Gracias desde ya

     
    • huguidugui

      18 diciembre, 2014 at 07:20

      Hola qué tal 😀
      Malas noticias 😛 FPDF no tiene esa funcionalidad pero la buena noticia es que existen otras librerías que sí lo hacen. Las más conocidas son una que se llama HTMLtoPDF y otra, DomPDF. busca información sobre ellas.
      FPDF se utiliza más para documentos sencillos.
      Saludos y gracias por leer el blog (Y)

       
      • LYS

        18 diciembre, 2014 at 09:31

        Oye muchas gracias por la respuesta tan pronta!
        Y gracias por presentar ésta otra opción para crear PDF!
        está genial..
        Y ahorita estoy teniendo broncas con HTML2PDF, por eso busqué otra opción…. checaré DomPDF…
        Nuevamente gracias!

         
      • huguidugui

        18 diciembre, 2014 at 13:40

        De nada 😀
        Por cierto, si quisieras (y pudieras), podrías escribir un ejemplo para el blog (obviamente te llevas todos los créditos).
        Digo, por si te interesa 😀

        Saludos.

         
  9. coficksote

    30 diciembre, 2014 at 12:00

    como inserto un texto (cadena) en todos las hojas de un pdf ya existente (en la misma posición) o solo en la ultima hoja ??

     
  10. Carlos Fernandez Ortega

    11 enero, 2015 at 06:06

    entre solo para darte las gracias de mil maneras, harto de buscar en tutoriales, aqui di con la forma de enviarlos sin problemas, logicamente modifique ciertas cosas, esta bueno para una tienda online, me tuve que calentar la cabeza pero ya llega el emnsaje con la cantidad total de la compra, muy bueno, saludos

     
    • huguidugui

      11 enero, 2015 at 17:53

      Enhorabuena 😀 Me alegra que te haya servido. Saludos

       
  11. Efren

    16 enero, 2015 at 17:37

    Buenas tardes.

    Muy buen tutorial, muchas gracias por compartir tus conocimientos, por otra parte te comento un problema que tengo espero puedas apoyarme.

    Al tratar de abrir el archivo PDF en IExplorer, simplemente no carga nada, no se si a ti te haya pasado lo mismo al hacer pruebas con este navegador. Espero puedas apoyarme.

    Nuevamente Muchas Gracias por este buenísimo tutorial.

    Saludos.

     
    • huguidugui

      16 enero, 2015 at 19:02

      La verdad es que desde mucho que no abro nada con IE pero haré algunas pruebas para ver si carga el PDF. Pero bueno, ojalá puedas cambiar de navegador (y los usuarios que estén usando tu aplicación que genera el PDF)

      Saludos y gracias por leer el blog 😀

       
  12. Pablo

    9 marzo, 2015 at 14:07

    Buenas tardes.

    Muy buen tutorial, muchas gracias por compartir tus conocimientos, por otra parte te comento un problema que tengo espero puedas ayudarme.

    Cuando le doy a generar el pdf
    FPDF error: Some data has already been output, can’t send PDF file (output started at C:\xampp\htdocs\pruebacrearpdf\php\PDF.php:66)

     
    • huguidugui

      9 marzo, 2015 at 19:46

      Este es un problema común. La causa más probable es que tienes espacios en blanco al principio del archivo PDF.php. Te ayudo a encontrar el error si me mandas tu archivo a ringhugos@gmail.com
      Saludos y gracias por leer el blog.

       
  13. Javier Pozo

    28 marzo, 2015 at 10:31

    Excelente trabajo con este tutorial. Me ha servido para aclarar muchas cosas.
    Gracias y Saludos!!

     
    • huguidugui

      28 marzo, 2015 at 13:35

      Y espera que salga todo este mismo tuto pero con la librería HTML2PDF 😀 es mucho más sencillo de usar y con más “libertad” para el diseño de las hojas del PDF. Está basado en FPDF.
      Pronto estarán disponibles los tutos, si quieres que te envíe un mail cuando estén listos, envíame un correo a ringhugos@gmail.com para agregarte.
      Saludos y gracias por leer el blog 😀

       
  14. Albert

    7 octubre, 2015 at 02:52

    Hola compañero, hace unos meses que estoy haciendo documentos en fpdf y voy siguiendo tu blog. Agradecerte el trabajo que hiciste porque me sirve mucho.
    Tengo una duda, en mi base de datos tengo imagenes guardadas como blob subtype1, querria saber como puedo, una vez obtenido el blob, sacarlo en fpdf. Soy capaz de mostrar la imagen con un echo de php pero no con image de fpdf.

    Gracias!

     
    • huguidugui

      11 octubre, 2015 at 10:28

      Hola Albert, me alegra que te haya servido. LA verdad es que con campos de tipo blob nunca he usado. Yo lo que hago es guardar la ruta de la imagen en la base de datos y después llamar esa ruta y ponerla en con la función image o Cell.

      Saludos. Por ahí tengo un ejemplo de cómo hacer esto.

      Saludos.

       
  15. EderEnriquez

    5 noviembre, 2015 at 08:25

    ¿Puedo rotar una sola celda de la tabla? busco hacer algo similar

     
    • huguidugui

      6 diciembre, 2015 at 18:36

      Qué tal Eder, para hacer documentos más complejos, te sugiero uses otra librería como HTML2PDF (que también tengo una serie de posts haciendo lo mismo con FPDF) DE igual forma, hay otra librería más potentes con las que puedes hacer documentos muy complejos en cuanto a diseño.

      Saludos y gracias por seguir el blog

       
  16. Javier Gutierrez

    26 enero, 2016 at 14:37

    puedo agregar a un pdf el nombre del cliente que se encuentra en la base de datos?

     
    • huguidugui

      28 enero, 2016 at 22:29

      Claro, sí se puede. El punto es que tienes que obtener el nombre del cliente de tu bd como sea que lo hagas, luego hay una opción para guadar el pdf generado con un nombre específico. En ese parámetro tendrás que poner el nombre que obtuvite de la base de datos.
      La función que guarda el pdf es Output (busca info de cómo usarla en el sitio oficial de fpdf->manual->Output) y sería algo más o menos como esto:
      Output(‘F’, $nombredelClientedesdeLaBD);
      En este caso F quiere decir que guardará el pdf en una carpeta local (que elija el usuario) con el nombre de archivo del segundo parámetro.
      Cuando se muestre la ventana de elegir la carpeta para guardar, aparecerá Chuchito Landa.pdf.

      Yo te aconsejaría que los nombres NO tengan acentos ni espacios ya eso te toca hacerlo con el código que creas conveniente.

      Saludos

       

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: