> Manuales > Crear PDF en PHP con FPDF

Aprende a maquetar el contenido de un archivo PDF por columnas, con la librería FPDF de PHP.

Columnas en FPDF

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, sobre las tablas en archivos PDF, siguiendo la línea de nuestro manual sobre FPDF.

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

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

El código de la siguiente clase tiene sintaxis antigua, basada en PHP 4. Quizás la tengas que adaptar para que funcione en la actualidad. Sobre todo por la declaración de propiedades que no se realiza con "var" sino con "public", "private", etc.

<?php
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();

Eso es todo. Esperamos que estas funciones y la clase que hemos visto te orienten para poder maquetar a columnas un PDF. Estos códigos fueron escritos y usados en programas desarrollados en 2010, por lo que es posible que los tengas que adaptar para que funcionen en la actualidad. Tómalos como una guía para poder hacer tus propios programas que produzcan archivos en formato PDF.

Sara Alvarez

Equipo DesarrolloWeb.com

Manual