RSS

FPDF: Celdas redondeadas

27 Nov

En la librería FPDF como tal, no existen las celdas con borde redondeado pero gracias a la misma comunidad que comparte sus códigos, hubo quien modificó el método Rect (que dibuja un rectángulo) para que se generará rectángulos con borde redondeado. En el futuro habrá quien modifique y comparta el código para que el mismo método Cell tenga como opción de parámetro que la celda tenga borde redondeado.

Ya que no existe existe (aún) la propiedad que necesitamos, pero tenemos lo antes mencionado… ¡a darle! 😀 Cabe mencionar que la librería FPDF permite traslapar posiciones (x, y) y con esto, poner en la misma posición varios métodos.

En esta ocasión lo que haremos en términos generales es lo siguiente: crear la tabla como la hemos venido haciendo pero sin borde y, en cada paso del ciclo para formar los tres campos, agregaremos un solo rectángulo redondeado del tamaño de los mismos. Y en este caso, el relleno de celda lo tendrán los rectángulos y no las celdas.

Veamos el código, espero que los comentarios sean explicativos xD Pero sino, dejen su comentario 🙂

Lo primero que haremos es agregar al final, el código para generar los rectángulos redondeados en la clase PDF.php.

<?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
		$ejeX = 10;
		foreach($cabecera as $fila)
		{
			$this->RoundedRect($ejeX, 10, 30, 7, 2, 'FD');
	    	$this->CellFitSpace(30,7, utf8_decode($fila),0, 0 , 'C');
	    	$ejeX = $ejeX + 30;
    	}
    }

    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
		$ejeY = 17; //Aquí se encuentra la primer CellFitSpace e irá incrementando
		$letra = 'D'; //'D' Dibuja borde de cada CellFitSpace -- 'FD' Dibuja borde y rellena
		foreach($datos as $fila)
		{
			//Por cada 3 CellFitSpace se crea un RoundedRect encimado
			//El parámetro $letra de RoundedRect cambiará en cada iteración
			//para colocar FD y D, la primera iteración es D
			//Solo la celda de enmedio llevará bordes, izquierda y derecha
			//Las celdas laterales colocarlas sin borde
			$this->RoundedRect(10, $ejeY, 90, 7, 2, $letra);
			$this->CellFitSpace(30,7, utf8_decode($fila['nombre']),0, 0 , 'L' );
			$this->CellFitSpace(30,7, utf8_decode($fila['apellido']),'LR', 0 , 'L' );
			$this->CellFitSpace(30,7, utf8_decode($fila['matricula']),0, 0 , 'L' );

			$this->Ln();
			//Condición ternaria que cambia el valor de $letra
			($letra == 'D') ? $letra = 'FD' : $letra = 'D';
			//Aumenta la siguiente posición de Y (recordar que X es fijo)
			//Se suma 7 porque cada celda tiene esa altura
			$ejeY = $ejeY + 7;
    	}
    }

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

	//**************************************************************************************************************
	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);
    }
//**********************************************************************************************

 function RoundedRect($x, $y, $w, $h, $r, $style = '', $angle = '1234')
    {
        $k = $this->k;
        $hp = $this->h;
        if($style=='F')
            $op='f';
        elseif($style=='FD' or $style=='DF')
            $op='B';
        else
            $op='S';
        $MyArc = 4/3 * (sqrt(2) - 1);
        $this->_out(sprintf('%.2f %.2f m', ($x+$r)*$k, ($hp-$y)*$k ));

        $xc = $x+$w-$r;
        $yc = $y+$r;
        $this->_out(sprintf('%.2f %.2f l', $xc*$k, ($hp-$y)*$k ));
        if (strpos($angle, '2')===false)
            $this->_out(sprintf('%.2f %.2f l', ($x+$w)*$k, ($hp-$y)*$k ));
        else
            $this->_Arc($xc + $r*$MyArc, $yc - $r, $xc + $r, $yc - $r*$MyArc, $xc + $r, $yc);

        $xc = $x+$w-$r;
        $yc = $y+$h-$r;
        $this->_out(sprintf('%.2f %.2f l', ($x+$w)*$k, ($hp-$yc)*$k));
        if (strpos($angle, '3')===false)
            $this->_out(sprintf('%.2f %.2f l', ($x+$w)*$k, ($hp-($y+$h))*$k));
        else
            $this->_Arc($xc + $r, $yc + $r*$MyArc, $xc + $r*$MyArc, $yc + $r, $xc, $yc + $r);

        $xc = $x+$r;
        $yc = $y+$h-$r;
        $this->_out(sprintf('%.2f %.2f l', $xc*$k, ($hp-($y+$h))*$k));
        if (strpos($angle, '4')===false)
            $this->_out(sprintf('%.2f %.2f l', ($x)*$k, ($hp-($y+$h))*$k));
        else
            $this->_Arc($xc - $r*$MyArc, $yc + $r, $xc - $r, $yc + $r*$MyArc, $xc - $r, $yc);

        $xc = $x+$r ;
        $yc = $y+$r;
        $this->_out(sprintf('%.2f %.2f l', ($x)*$k, ($hp-$yc)*$k ));
        if (strpos($angle, '1')===false)
        {
            $this->_out(sprintf('%.2f %.2f l', ($x)*$k, ($hp-$y)*$k ));
            $this->_out(sprintf('%.2f %.2f l', ($x+$r)*$k, ($hp-$y)*$k ));
        }
        else
            $this->_Arc($xc - $r, $yc - $r*$MyArc, $xc - $r*$MyArc, $yc - $r, $xc, $yc - $r);
        $this->_out($op);
    }

    function _Arc($x1, $y1, $x2, $y2, $x3, $y3)
    {
        $h = $this->h;
        $this->_out(sprintf('%.2f %.2f %.2f %.2f %.2f %.2f c ', $x1*$this->k, ($h-$y1)*$this->k,
            $x2*$this->k, ($h-$y2)*$this->k, $x3*$this->k, ($h-$y3)*$this->k));
    }
} // FIN Class PDF
?>

El index.php sigue siendo el mismo

<?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 al navegador:

Bordes redondeados

Bordes redondeados

Ya es cuestión de que lo ajusten a su proyecto 🙂

Ajustar texto en celda <— Anterior || Siguiente —> Reporte Dinámico

@huguidugui || ringhugos@gmail.com

 
Deja un comentario

Publicado por en 27 noviembre, 2013 en FPDF, PHP

 

Etiquetas: , , ,

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: