Columnas en FPDF

  • Por
  • 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 y el enlace a una página aparte donde podemos verlo funcionando.

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

Autor

Sara Alvarez

Equipo DesarrolloWeb.com

Compartir

Comentarios

Rosspri

26/9/2010
Usar fpdf para llamar datos desde mysql
Como debo de declarar o que funcion utilizo para llamar datos de mi base de datos y mostrarlos en el pdf ?gracias

micnob

12/5/2011
Pasar datos desde MySQL
Tengo el mismo problema que el del comentario anterior.
Quisiera conectarme con la base de datos y colocar los datos en la página en PDF con FPDF.
Gracias por otra parte, el tutorial es perfecto.
Saludos

César Ríos Granados

10/1/2012
SOLUCION - FPDF Texto largo en Columnas y Justificado sin librerias extras
Aquí les dejo una solución que desarrolle para la creación de un PDF con FPDF sin librerias extras y es mucho más sencillo que la que se presenta en este articulo,
Solución a:
Texto largo en las columnas que uno desee, justificado y con FPDF sin librerias extras

primero se utiliza la función que desarrollé:

//***********************************************************************************************************************************************
//***********************************************************************************************************************************************
//***********************************************************************************************************************************************
// César Ríos Granados - México 10/01/2012
// crios@bam.com.mx
// infected_artillery@hotmail.com
//
// Parámetros: Cadena original, Numero de columnas a imprimir la cadena, Variable del FPDF para imprimir devuelta
function textIntoCols($strOriginal,$noCols,$pdf)
{
$iAlturaRow = 4; //Altura entre renglones
$iMaxCharRow = 190; //Número máximo de caracteres por renglón
$iSizeMultiCell = $iMaxCharRow / $noCols; //Tamaño ancho para la columna
$iTotalCharMax = 9957; //Número máximo de caracteres por página
$iCharPerCol = $iTotalCharMax / $noCols; //Caracteres por Columna
$iCharPerCol = $iCharPerCol - 290; //Ajustamos el tamaño aproximado real del número de caracteres por columna
$iLenghtStrOriginal = strlen($strOriginal); //Tamaño de la cadena original
$iPosStr = 0; // Variable de la posición para la extracción de la cadena.
// get current X and Y
$start_x = $pdf->GetX(); //Posición Actual eje X
$start_y = $pdf->GetY(); //Posición Actual eje Y
$cont = 0;
while($iLenghtStrOriginal > $iPosStr) // Mientras la posición sea menor al tamaño total de la cadena entonces imprime
{
$strCur = substr($strOriginal,$iPosStr,$iCharPerCol);//Obtener la cadena actual a pintar
if($cont != 0) //Evaluamos que no sea la primera columna
{
// seteamos a X y Y, siendo el nuevo valor para X
// el largo de la multicelda por el número de la columna actual,
// más 10 que sumamos de separación entre multiceldas
$pdf->SetXY(($iSizeMultiCell*$cont)+10,$start_y); //Calculamos donde iniciará la siguiente columna
}
$pdf->MultiCell($iSizeMultiCell,$iAlturaRow,$strCur); //Pintamos la multicelda actual
$iPosStr = $iPosStr + $iCharPerCol; //Posicion actual de inicio para extracción de la cadena
$cont++; //Para el control de las columnas
}
return $pdf;
}
//***********************************************************************************************************************************************
//***********************************************************************************************************************************************
//***********************************************************************************************************************************************

y se manda a llamar de la siguiente manera:

........
$Apriv = 'dsadsadasdsaddsadsadasdsaddsadsadasdsaddsadsadasdsaddsadsadasdsaddsadsadasdsaddsadsadasdsaddsadsadasdsaddsadsadasdsaddsadsadasdsad';

// se pasa como parametros la variable con el texto, el número de columnas deseado y la variable con la que imprimes el pdf
textIntoCols($Apriv,3,$pdf);
.......
$pdf->Output();
?>

Daniel Esteban Buccafusca

30/6/2013
Una duda
Buenas tardes, estaba viendo este título, "Vemos como maquetar nuestro archivo pdf a dos columnas.", tal cual se lo ve en el ejemplo, pero al duplicar el texto en el archivo prueba1.txt, y ejecutarlo, en vez de obtener un pdf con dos columnas mas largas, obtuve un pdf con tres columnas, mi duda es....hay algun comando que le indique que lo haga en dos columnas.
Sin otro particular, saludo a ustedes con mi mayor consideración.

Jose

19/2/2014
Generar PDF con php y FPDF
Hola a todos busco ayuda, trato de generar unas etiquetas en pdf para eso necesito tres columnas, el problema es que cuando pasa a la segunda columna no se mantiene el margen al mismo nivel de la primera columna, pongo un ejemplo:
segunda col
primera col

lo esperado es que al pasar a la segunda col, se visualice al mismo nivel de la primera, espero puedan orientarme porque tengo mis margenes en 10 mm, esto debería ser para toda la pagina o no?

martin__gorgojo_lopez

30/7/2015
Parsear codigo html
Hola me gustaría saber como evitar que al generar un pdf se vieran las p de párrafo, las b de negrita, etc