RSS

FPDF: Ajustar texto en celdas

26 Nov

Ahora bien, ¿qué pasa si en la cabecera, un título tiene más caracteres o uno de nuestros datos y por lo tanto no quepan en el ancho de celda que escogimos? pasa esto:

Datos que sobrepasan la celda

Datos que sobrepasan la celda

Para solucionar esto, colocaremos en nuestra clase de PDF.php una serie de métodos que ajustan el texto a la celda. Este código es proporcionado por la propia comunidad de fpdf.org en la opción de su página principal llamada “Scripts”.

Al final de los métodos que ya tenemos, colocaremos este código. El método que usaremos se llama CellFitSpace( ) el cual sustituirá a Cell( ). El código de PDF.php es el siguiente:

<?php
require('fpdf/fpdf.php');

class PDF extends FPDF
{
    function cabeceraHorizontal($cabecera)
    {
		$this->SetXY(10, 10);
		$this->SetFont('Arial','B',10);
		$this->SetFillColor(2,157,116);//Fondo verde de celda
		$this->SetTextColor(240, 255, 240); //Letra color blanco
		foreach($cabecera as $fila)
		{

	    	$this->CellFitSpace(30,7, utf8_decode($fila),1, 0 , 'L', true);

    	}
    }

    function datosHorizontal($datos)
    {
		$this->SetXY(10,17);
		$this->SetFont('Arial','',10);
		$this->SetFillColor(229, 229, 229); //Gris tenue de cada fila
		$this->SetTextColor(3, 3, 3); //Color del texto: Negro
		$bandera = false; //Para alternar el relleno
		foreach($datos as $fila)
		{
			//Usaremos CellFitSpace en lugar de Cell
			$this->CellFitSpace(30,7, utf8_decode($fila['nombre']),1, 0 , 'L', $bandera );
			$this->CellFitSpace(30,7, utf8_decode($fila['apellido']),1, 0 , 'L', $bandera );
			$this->CellFitSpace(30,7, utf8_decode($fila['matricula']),1, 0 , 'L', $bandera );
			$this->Ln();//Salto de línea para generar otra fila
			$bandera = !$bandera;//Alterna el valor de la bandera
    	}
    }

    function tablaHorizontal($cabeceraHorizontal, $datosHorizontal)
    {
		$this->cabeceraHorizontal($cabeceraHorizontal);
		$this->datosHorizontal($datosHorizontal);
	}

	//***** Aquí comienza código para ajustar texto *************
    //***********************************************************
	function CellFit($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='', $scale=false, $force=true)
    {
        //Get string width
        $str_width=$this->GetStringWidth($txt);

        //Calculate ratio to fit cell
        if($w==0)
            $w = $this->w-$this->rMargin-$this->x;
        $ratio = ($w-$this->cMargin*2)/$str_width;

        $fit = ($ratio < 1 || ($ratio > 1 && $force));
        if ($fit)
        {
            if ($scale)
            {
                //Calculate horizontal scaling
                $horiz_scale=$ratio*100.0;
                //Set horizontal scaling
                $this->_out(sprintf('BT %.2F Tz ET',$horiz_scale));
            }
            else
            {
                //Calculate character spacing in points
                $char_space=($w-$this->cMargin*2-$str_width)/max($this->MBGetStringLength($txt)-1,1)*$this->k;
                //Set character spacing
                $this->_out(sprintf('BT %.2F Tc ET',$char_space));
            }
            //Override user alignment (since text will fill up cell)
            $align='';
        }

        //Pass on to Cell method
        $this->Cell($w,$h,$txt,$border,$ln,$align,$fill,$link);

        //Reset character spacing/horizontal scaling
        if ($fit)
            $this->_out('BT '.($scale ? '100 Tz' : '0 Tc').' ET');
    }

    function CellFitSpace($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='')
    {
        $this->CellFit($w,$h,$txt,$border,$ln,$align,$fill,$link,false,false);
    }

    //Patch to also work with CJK double-byte text
    function MBGetStringLength($s)
    {
        if($this->CurrentFont['type']=='Type0')
        {
            $len = 0;
            $nbbytes = strlen($s);
            for ($i = 0; $i < $nbbytes; $i++)
            {
                if (ord($s[$i])<128)
                    $len++;
                else
                {
                    $len++;
                    $i++;
                }
            }
            return $len;
        }
        else
            return strlen($s);
    }
//************** Fin del código para ajustar texto *****************
//******************************************************************
} // FIN Class PDF
?>

index.php

<?php
include_once('PDF.php');
$pdf = new PDF();

$pdf->AddPage();

$miCabecera = array('Nombre de campo', 'Apellido', 'Matrícula campo');

$misDatos = array(
			array('nombre' => 'Esperbeneplatoledo', 'apellido' => 'Martínez', 'matricula' => '20420423'),
			array('nombre' => 'Araceli', 'apellido' => 'Morales', 'matricula' =>  '204909'),
			array('nombre' => 'Georginadavabulus', 'apellido' => 'Galindo', 'matricula' =>  '2043442'),
			array('nombre' => 'Luis', 'apellido' => 'Dolores', 'matricula' => '20411122'),
			array('nombre' => 'Mario', 'apellido' => 'Linares', 'matricula' => '2049990'),
			array('nombre' => 'Viridianapaliragama', 'apellido' => 'Badillo', 'matricula' => '20418855'),
			array('nombre' => 'Yadiramentoladosor', 'apellido' => 'García', 'matricula' => '20443335')
			);

$pdf->tablaHorizontal($miCabecera, $misDatos);

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

Y acá la salida:

Texto ajustado a las celdas

Texto ajustado a las celdas

Este ejemplo es uno de los que más me ayudaron a solucionar el ajuste en celdas y con ello generar las tablas y reportes se hace más legible 😉

Estilo de celda <— Anterior || Siguiente –> Celdas redondeadas

@huguidugui || ringhugos@gmail.com

Anuncios
 
13 comentarios

Publicado por en 26 noviembre, 2013 en FPDF, PHP

 

Etiquetas: , ,

13 Respuestas a “FPDF: Ajustar texto en celdas

  1. Azael

    28 marzo, 2014 at 07:15

    Amigo quiero crear una tabla con filas dinamicas a partir de una consulta en mysql, ya probe tu ejemplo pero me hace todo en una sola fila 😦

     
  2. david

    19 mayo, 2014 at 17:44

    amigo solo achoca las letras, queda horrible 😦

     
    • huguidugui

      20 mayo, 2014 at 01:58

      Has intentado hacer la celda más grande. Es que si es mucho texto no queda bien.

       
  3. David Dejoy

    5 agosto, 2014 at 11:13

    No funciona. si se coloca mas largo el texto se ve mal

     
  4. Rom1990ken

    9 octubre, 2014 at 18:09

    Hola huguidugui fijate que estoy con el mismo problema que David Dejoy, seria que el texto se ajustara al ancho de la celda tipo como Excel que continua abajo

     
    • huguidugui

      10 octubre, 2014 at 06:14

      Hola Rom 😀

      Bueno, por el momento no he podido hacer un ejemplo de lo que mencionas.
      Pero seguramente en el menú de “scripts” en el sitio oficial de la librería fpdf.org, ha de venir un ejemplo del que me comentas.
      En cuanto tenga un “tiempito” prometo hacer un ejemplo de este tipo para el blog (Y)

      Saludos y gracias por leer blog 😀

       
      • Rom1990ken

        10 octubre, 2014 at 10:33

        Hola de nuevo, gracias por la rapidez en responder, te lo agradeceria mucho estare pendiente…. saludos

         
  5. Juan

    1 agosto, 2015 at 19:39

    falta el GetStringWidth

     
  6. Scorpion

    2 diciembre, 2015 at 15:43

    hola primero que nada gracias por el tutorial, pero sabras como hacerle para que cuando el texto sobrepasa la celda se corte, es decir que no quede todo junto como en tu ejemplo

     
    • huguidugui

      6 diciembre, 2015 at 18:20

      Hola Scorpion, te sugiero que uses la librería de HTML2PDF que soluciona esto que comentas, tengo este mismo este tutorial de FPDF con la librería que te menciono. No es que FPDF esté desactualizado, sino lo que pasa es que funciona para documentos sencillos.

      Saludos y muchas por seguir esta serie de tutos, si te puedo ayudar en algo más específico por favor envíame un mail a ringhugos@gmail.com

      Saludos!

       
  7. Jason Mori

    17 agosto, 2017 at 10:15

    Excelente aporte amigo……

     

Responder

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: