martes, 1 de diciembre de 2015

Columnas en FPDF

PHP Vemos como maquetar nuestro archivo pdf a dos columnas.


En este artículo vamos a seguir dándole forma a nuestro archivo PDF. Para ello en esta ocasión vamos a ver como colocar texto en dos columnas, además vamos a trabajar con la estructura de control if.

Vamos a seguir utilizando el ejemplo del articulo anterior siguiendo la línea de nuestro manual sobre FPDF.

Lo primero que vamos a hacer es crear dos variables e inicializarlas:

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

 class PDF extends FPDF
 {
   //Columna actual
   var $col=0;
   
   //Ordenada de comienzo de la columna
   var $y=0;

A continuación añadimos la cabecera y el pie del documento

   //Cabecera de página
   function Header()
   {
     //Logo
     $this->Image("leon.jpg" , 10 ,8, 35 , 38 , "JPG" );

     //Arial bold 15
     $this->SetFont('Arial','B',15);

     //Movernos a la derecha
     $this->Cell(80);

     //Título
     $this->Cell(60,10,'Titulo del archivo',1,0,'C');

     //Salto de línea
     $this->Ln(20);
   }
     
   //Pie de página
   function Footer()
   {
     //Posición: a 1,5 cm del final
     $this->SetY(-15);

     //Arial italic 8
     $this->SetFont('Arial','I',8);

     //Número de página
     $this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
   }

Ahora tenemos que crear una función que nos establezca la posición de una columna.


   function SetCol($col)
   {
     //Establecer la posición de una columna dada
     $this->col=$col;
     $x=10+$col*75;
     $this->SetLeftMargin($x);
     $this->SetX($x);
   }

En este caso lo que hacemos es asignar a $this->col el valor de la variable col especificada al inicio. A partir de hay creamos una variable $x que nos dará el margen izquierdo de la posición de dicha columna.

Y a continuación la función que realmente nos interesa ya que es la que realiza el salto de columna o página según la posición en la que estemos.

   function AcceptPageBreak()
   {
     //Método que acepta o no el salto automático de página
     if($this->col<2)
     {
       //Ir a la siguiente columna
       $this->SetCol($this->col+1);

       //Establecer la ordenada al principio
       $this->SetY($this->y0);

       //Seguir en esta página
       return false;
     }
     else
     {
       //Volver a la primera columna
       $this->SetCol(0);

       //Salto de página
       return true;
     }
   }
Esta función lo que nos hace es preguntar si estamos en cualquiera de las columnas menor que 2, si estamos aquí cambiamos la variable para en el siguiente paso ir a la columna siguiente, y seguimos en la misma pagina. Si ya estamos en la columna 2 lo único que hacemos es pasar de página y situarnos nuevamente en la columna 0.

Ahora pasamos el resto de funciones que necesitamos para imprimir los textos contenidos en los archivos externos.


   function TituloArchivo($num,$label)
   {
     $this->SetY(55);

     //Arial 12
     $this->SetFont('Arial','',12);

     //Color de fondo
     $this->SetFillColor(200,220,255);

     //Título
     $this->Cell(0,6,"Archivo $num : $label",0,1,'L',true);

     //Salto de línea
     $this->Ln(4);

     //Guardar ordenada
     $this->y0=$this->GetY();
   }
   
   function CuerpoArchivo($file)
   {
     //Leemos el fichero
     $f=fopen($file,'r');
     $txt=fread($f,filesize($file));
     fclose($f);

     //Times 12
     $this->SetFont('Times','',12);

     //Imprimimos el texto justificado
     $this->MultiCell(60,5,$txt);

     //Salto de línea
     $this->Ln();

     //Volver a la primera columna
     $this->SetCol(0);
   }

   function ImprimirArchivo($num,$title,$file)
   {
     $this->AddPage();
     $this->TituloArchivo($num,$title);
     $this->CuerpoArchivo($file);
   }

Después de esto tenemos que empezar a crear el archivo con el siguiente código:

   $pdf=new PDF();
   $title='Mostramos un archivo txt';
   $pdf->SetTitle($title);
   $pdf->SetY(65);
   $pdf->ImprimirArchivo(1,'Archivo de prueba ','prueba1.txt');
   $pdf->ImprimirArchivo(2,'Otro archivo','prueba2.txt');
   $pdf->Output();

Ahora para terminar colocamos el código completo.

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

 class PDF extends FPDF
 {
   //Columna actual
   var $col=0;

   //Ordenada de comienzo de la columna
   var $y=0;

   //Cabecera de página
   function Header()
   {
     //Logo
     $this->Image("leon.jpg" , 10 ,8, 35 , 38 , "JPG" );

     //Arial bold 15
     $this->SetFont('Arial','B',15);

     //Movernos a la derecha
     $this->Cell(80);

     //Título
     $this->Cell(60,10,'Titulo del archivo',1,0,'C');

     //Salto de línea
     $this->Ln(20);
   }
   //Pie de página
   function Footer()
   {
     //Posición: a 1,5 cm del final
     $this->SetY(-15);

     //Arial italic 8
     $this->SetFont('Arial','I',8);

     //Número de página
     $this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
   }

   function SetCol($col)
   {
     //Establecer la posición de una columna dada
     $this->col=$col;
     $x=10+$col*75;
     $this->SetLeftMargin($x);
     $this->SetX($x);
   }

   function AcceptPageBreak()
   {
     //Método que acepta o no el salto automático de página
     if($this->col<2)
     {
       //Ir a la siguiente columna
       $this->SetCol($this->col+1);

       //Establecer la ordenada al principio
       $this->SetY($this->y0);

       //Seguir en esta página
       return false;
     }
     else
     {
       //Volver a la primera columna
       $this->SetCol(0);

       //Salto de página
       return true;
     }
   }

   function TituloArchivo($num,$label)
   {
     $this->SetY(55);
     $this->SetFont('Arial','',12);
     $this->SetFillColor(200,220,255);
     $this->Cell(0,6,"Archivo $num : $label",0,1,'L',true);
     $this->Ln(4);
     //Guardar ordenada
     $this->y0=$this->GetY();
   }

   function CuerpoArchivo($file)
   {
     //Leemos el fichero
     $f=fopen($file,'r');
     $txt=fread($f,filesize($file));
     fclose($f);

     //Times 12
     $this->SetFont('Times','',12);

     //Imprimimos el texto justificado
     $this->MultiCell(60,5,$txt);

     //Salto de línea
     $this->Ln();

     //Volver a la primera columna
     $this->SetCol(0);
   }

   function ImprimirArchivo($num,$title,$file)
   {
     $this->AddPage();
     $this->TituloArchivo($num,$title);
     $this->CuerpoArchivo($file);
   }
 }

 $pdf=new PDF();
 $title='Mostramos un archivo txt';
 $pdf->SetTitle($title);
 $pdf->SetY(65);
 $pdf->ImprimirArchivo(1,'Archivo de prueba ','prueba1.txt');
 $pdf->ImprimirArchivo(2,'Otro archivo','prueba2.txt');
 $pdf->Output();






Este manual esta sacado textualmente DesarrolloWeb.com de puede acceder a el en el siguiente link . Lo copio acá exclusivamente porque me resulto muy útil y quiero poder encontrarlo de forma rápida cada vez que lo necesite.

No hay comentarios:

Publicar un comentario