viernes, 17 de noviembre de 2017

Programación en C - 01 - Primeros pasos I

Surgido en sus inicios como un lenguaje de programación de sistemas operativos, C fue desarrollado como una herramienta para facilitar la codificación del sistema operativo UNIX. Simple, y a la vez muy potente, es considerado un lenguaje de bajo nivel, ya que nos permite acceder a instancias muy cercanas al hardware, prácticamente sin ninguna restricción. Vamos a experimentar los primeros pasos en la programación de ese lenguaje que, seguramente, nos resultara fascinante por su sencillez y capacidad.


Manos a la obra


Como la mejor manera de aprender a programar es programando, escribiremos nuestras primeras lineas de código, para obtener un mensaje en la pantalla de la computadora. Así, nos familiarizaremos con la dinámica de escritura de código. Pero antes de empezar a escribir, deberemos tener algún entorno de programación IDE.
Podemos usar cualquiera que nos guste, incluso el Block de Notas de Windows. Si éste es el caso, debemos recordar guardar el programa fuente en formato de texto con la extensión .c, para que luego el compilador pueda procesar el código.
Ejecutamos el editor y, sin preocuparnos mucho por entender el significado de cada una de las líneas de código, introducimos el programa que vemos a continuación, sin omitir nada de lo que esta escrito:

/* EJEMPLO 1.1 - Mi primer programa en C */

#include <stdio.h>
void main ()
{
    
printf ( "Hola mundo\n" );
}


Una vez ingresado el código, grabamos en una carpeta el archivo con el nombre hola.c, y ya estamos listos para compilar el programa. Vamos al menú Compile y seleccionamos Compile to OBJ, para generar el archivo objeto. Si todo va bien, el compilador nos indicará que la compilación ha tenido éxito y que el archivo hola.obj fue creado satisfactoriamente. Por último, solamente resta vincular el archivo objeto con las librerías del programa, para generar el archivo ejecutable. Vamos al menú Compile y seleccionamos Link EXE file. Finalmente, si no hay ningún inconveniente, el compilador nos indicara que la vinculación ha tenido éxito y que el archivo hola.exe fue creado satisfactoriamente.
Ahora, tenemos que comprobar el resultado de nuestro programa. Vamos al menú Run y seleccionamos Run. Una vez hecho esto, el programa se ejecutara y termina inmediatamente pues su única función es la de imprimir un mensaje en la pantalla del usuario. Tras la finalizacion del programa, el control se devuelve al entorno IDE. El mensaje se muestra en la pantalla del usuario, y para visualizarlo vamos al menú Run y elegimos User screen. Allí, se presenta nuestro mensaje:

Hola mundo

¿Que hace el programa?


Hemos conseguido realizar exitosa mente una aplicación en C cuya única tarea es la de mostrar un mensaje en pantalla, ¿pera qué es lo que hace que esto sea así?, ¿cómo sabe la aplicación que el mensaje lo debe mostrar en pantalla y no, por ejemplo, enviarlo a uno de los puertos de comunicación de la computadora?
Pues bien, analicemos es detalle cada una de las lineas de programa para entender su funcionamiento. Veamos la primera:

/* EJEMPLO 1.1 - Mi primer programa en C */ 

Como podemos observar, esta linea no forma parte del código, en el sentido de que no aporta instrucciones a la computadora para hacer algo, sino que simplemente esta allí para transmitir información a quien interprete el programa, que podemos ser nosotros o un tercero. Es, simplemente, un comentario. Los comentarios son muy útiles y, en general, debemos considerarlos como una buena practica, ya que nos evita tener que recordar que quisimos hacer con el código, posibilitan delinear la idea general del código que continua o, mejor aun, permiten a los otros programadores que deban trabajar con el entender cual fue nuestra lógica de programación a la hora de escribirlo. Observamos que el comentario esta encerrada entre los símbolos /* y */ . Usualmente, cuando el compilador se encuentra en el medio, descarta por completo cualquier cosa que este escrita entre ellos, sin importar cuantas lineas tenga (inclusive, si hay lineas de código no las tiene en cuenta), y continua buscando mas código real para procesar al final del comentario.
En la segunda linea escribimos:

#include <stdio.h> 


Aquí nos encontramos con la directiva pre-proceso #include, la cual no forma parte del código ejecutable, pero si es absolutamente indispensable para el correcto funcionamiento del programa. De hecho, si esta linea no estuviera, el compilador nos arrojaría un error. El símbolo # indica que es una directiva de pre-proceso y le esta diciendo al compilador que debe hacer algo antes de compilar el código fuente, en este caso, que tiene que incluir en nuestro programa el archivo stdio.h, que e la librería que contiene las declaraciones de las funciones de entrada/salida estándar. Este archivo se llama header o cabecera y se lo identifica con la extensión .h. De esta manera, cuando el compilador, en si proceso de codificación, vaya encontrando las funciones a las que el código fuente hace referencia, sabrá como interpretarlas y que hacer con ellas.

Desde la tercera línea de código en adelante, se declara una función:

void main () 
{ 
    
 printf ( "Hola mundo\n" ); 
}


En este caso, nombre de la función es main () y no es arbitrario y podría hacer distrito. La razón de estado de que todo programa Cee antier una función con este nombre y es el punto de partida, de donde el programa comienza su ejecución. La función esta precedida por la palabra reservada void, que indica el tipo de dato que retorna la función. Aquí, particularmente, void nos indica que la función no retorna valores a quien la llama (en este caso, el sistema operativo), pero hay veces en donde le vamos a tener que devolver datos al sistema operativo, por lo que la palabra reservada será diferente.
De la misma manera, vemos que la función contiene dos paréntesis que se abren y se cierra sin encerrar argumentos. Esto paréntesis encierran una definición de los tipo de dato que se van a pasar a la función, pero cuando están vacíos significa que ningún información en necesaria para su funcionamiento.
Finalmente, podemos observar que, seguido de la definición de la función, encontramos una estructura de código encerrado entre dos llaves {...} Que abren y cierran. Lo que encierra es el cuerpo de la función, que define categóricamente lo que ella está programada para hacer.
En este ejemplo, la función main () está programada para emitir un mensaje a través de la pantalla de la computadora, y de eso se encarga la función printf (), cuya definición está incluida la librería estándar stdio.h, que viene con el lenguaje C. La información encerrada entre los paréntesis que siguen inmediatamente la función se denomina argumento y definir el tipo de dato que se va a pasar a ella. En este caso, son del tipo string o cadena. Esta función en la que canalizan información que recibe como argumento accionario de memoria de la computadora encargada de mostrar dicha información en pantalla. No creemos aquí que la cadera detectó que se pasa a la función printf () termina en \n y no forma parte del resultado final que se obtiene en pantalla.
Para las cadenas de texto, existe, en C, una forma de indicar al compilador ciertos caracteres especiales llamado carácter el control, Los cuales son reemplazados durante la compilación, por su equivalente en el código ASCII. En el ejemplo, el carácter de control \n indica el compilador que debe incluir, en ese lugar de la cadena de texto, el código ASCII Correspondiente a Nueva Linea, formada por los caracteres de Avance de linea (Line Feed) y Retorno de Carro (Carriage Return).
Por último debemos notar algo muy importante, que es la presencia del punto y coma (;) al final de la sentencia printf(). Esta es la forma que tiene lenguaje para diferenciar entre final de una función y inicio de la siguiente.

Errores comunes


Durante la escritura un programa, es factible que cometamos errores. Cuando introducimos código que luego el compilador deberá producir e instrucciones para que una computadora lleve adelante, debemos atenernos a todas las estrictas reglas del lenguaje, de lo contrario, el resultado que obtendremos será un mensaje de error u otro totalmente inesperado.
Por ejemplo, si nos olvidamos de colocar un punto y coma entre dos sentencias printf (), el compilador interpretará la segunda sentencia como parte de la primera, y esto podrá ocasionar un mensaje de error. Generalmente, para el usuario que recién se iniciará el lenguaje, e inclusive para los programadores que llevan varios año de oficio, el olvido del punto y coma es un error bastante frecuente, por lo que debemos, desde un principio, tomar como buena práctica el hecho de colocarlos siempre final de cada línea de código que escribamos.
Usualmente, los errores de tipografía son más comunes de lo que podemos imaginar. En el mejor de los casos, serán detectados durante el proceso de compilación y/o vinculación y nos dará la oportunidad de revisar nuestro código y corregirlo. Puede darse el caso de que el olvido una coma donde se espera que vaya, o un punto y coma demás, donde no debería estar, produzca un código perfectamente ejecutable, pero sin dudas distinto del que nosotros esperamos o realizando tareas que no estaban dentro de nuestra lógica de programación.
Sin embargo, los problema descritos anteriormente son detectables a través de un análisis detallado de la sintaxis del código. Pero, por supuesto, estos inconvenientes no son los únicos que pueden ocasionar errores. Más grave aún puede resultar derecho a equivocarnos en la lógica del programa, en las instrucciones encargadas en la toma de decisiones. Esto suele ser particularmente probable en aquellos programas complicados, con mucha decisiones y/o comparaciones, las cuales pueden ser perfectamente correcta desde el punto de vista de la programación del lenguaje, pero incorrecta de la lógica. Es de suponer el resultado final será completamente distinto del que esperamos. En general estos problemas son los más difíciles de detectar, sobre todo si los pasos de programación no están suficientemente comentados.

martes, 1 de diciembre de 2015

Crear PDF en PHP con FPDF


Manual de las librerías FPDF, que permiten crear archivos PDF desde scripts PHP. Con varios ejemplos y explicaciones sobre la creación de PDF desde PHP.


FPDF es una clase para la generación dinámica de documentos PDF en PHP. Vamos a instalar y crear un primer ejemplo de uso de las librerías FPDF.
Vemos algunas de las funciones más importantes que nos podemos encontrar en FPDF.
Vamos a darle estilo a la cabecera y el pie de un archivos .pdf creado con FPDF
Vemos la función Image(), para insertar imágenes en archivos PDF generados desde PHP por FPDF.
Vemos las distintas formas de realizar enlaces en FPDF.
Mostramos el texto de un archivo txt en nuestro documento PDF con las funciones de FPDF.
Vemos construir tablas para nuestros documentos en pdf con FPDF.
Vemos como maquetar nuestro archivo pdf a dos columnas.




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.

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.

Tablas en FPDF

Vemos construir tablas para nuestros documentos en pdf con FPDF.


Siguiendo con nuestro manual sobre FPDF vamos a ver como construir una tabla para el documento pdf.
Vamos a ver dos ejemplos de construcción de tablas, uno más sencillo que el otro, pero ambos igual de interesantes.

La primera tabla es muy sencillita, tan solo 2 lineas y la cabecera. Para ello vamos a pasarle un array con los nombres de cada celda, y después vamos a ir rellenando las columnas y las filas con la función CELL.

La función seria la siguiente:

functionTablaBasica($header)
{
  //Cabecera
  foreach($header as $col)
  $this->Cell(40,7,$col,1);
  $this->Ln();

  $this->Cell(40,5,"hola",1);
  $this->Cell(40,5,"hola2",1);
  $this->Cell(40,5,"hola3",1);
  $this->Cell(40,5,"hola4",1);
  $this->Ln();
  $this->Cell(40,5,"linea ",1);
  $this->Cell(40,5,"linea 2",1);
  $this->Cell(40,5,"linea 3",1);
  $this->Cell(40,5,"linea 4",1);
}

y la llamada a la función seria la siguiente:

//Creación del objeto de la clase heredada
$pdf=new PDF();

//Títulos de las columnas
$header=array('Columna 1','Columna 2','Columna 3','Columna 4');
$pdf->AliasNbPages();

//Primera página
$pdf->AddPage();
$pdf->SetY(65);

//$pdf->AddPage();
$pdf->Tabla Basica($header);

El siguiente ejemplo de tabla es algo más complicado ya que le vamos a dar colores a las filas y vamos a quitar los bordes inferiores de cala linea.

La función sería la siguiente:

function TablaColores($header)
{
  //Colores, ancho de línea y fuente en negrita
  $this->SetFillColor(255,0,0);
  $this->SetTextColor(255);
  $this->SetDrawColor(128,0,0);
  $this->SetLineWidth(.3);
  $this->SetFont('','B');

  //Cabecera
  for($i=0;$i<count($header);$i++)
  $this->Cell(40,7,$header[$i],1,0,'C',1);
  $this->Ln();

  //Restauración de colores y fuentes
  $this->SetFillColor(224,235,255);
  $this->SetTextColor(0);
  $this->SetFont('');
  //Datos
  $fill=false;
  $this->Cell(40,6,"hola",'LR',0,'L',$fill);
  $this->Cell(40,6,"hola2",'LR',0,'L',$fill);
  $this->Cell(40,6,"hola3",'LR',0,'R',$fill);
  $this->Cell(40,6,"hola4",'LR',0,'R',$fill);
  $this->Ln();
  $fill=true;
  $this->Cell(40,6,"col",'LR',0,'L',$fill);
  $this->Cell(40,6,"col2",'LR',0,'L',$fill);
  $this->Cell(40,6,"col3",'LR',0,'R',$fill);
  $this->Cell(40,6,"col4",'LR',0,'R',$fill);
  $fill=!$fill;
  $this->Ln();
  $this->Cell(160,0,'','T');
}

Todas las funciones que vemos ya están explicadas en otros artículos del manual de FPDF por lo que no entraremos en detalles.

Hemos establecido el color de relleno de las celdas, el color del texto, el grosor de los bordes y el tipo de letra. A continuación hemos creado la primera linea en rojo y la letra en negrita. Después asignamos otros colores para el relleno y la letra y vamos rellenando el resto de filas. Vamos colocando los bordes donde necesitamos y diciendo si la celda va rellena o no de color con la variable $fill.

Al final tenemos que añadir el borde de abajo del todo, para ello utilizamos la linea:

$this->Cell(160,0,'','T');


Que nos dice que la linea tiene que ser 160 de ancho, 0 de alto y mostrando solo el borde superior.

Os pongo el ejemplo completo con las dos tablas:

<?
 require('fpdf.php');

 class PDF extends FPDF
 {
   //Cabecera de página
   function Header()
   {
     //Logo
     $this->Image("leon.jpg" , 10 ,8, 35 , 38 , "JPG" ,"http://www.mipagina.com");

     //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().'/{nb}',0,0,'C');
   }

   //Tabla simple
   function TablaSimple($header)
   {
     //Cabecera
     foreach($header as $col)
     $this->Cell(40,7,$col,1);
     $this->Ln();
     $this->Cell(40,5,"hola",1);
     $this->Cell(40,5,"hola2",1);
     $this->Cell(40,5,"hola3",1);
     $this->Cell(40,5,"hola4",1);
     $this->Ln();
     $this->Cell(40,5,"linea ",1);
     $this->Cell(40,5,"linea 2",1);
     $this->Cell(40,5,"linea 3",1);
     $this->Cell(40,5,"linea 4",1);
   }
     
   //Tabla coloreada
   function TablaColores($header)
   {
     //Colores, ancho de línea y fuente en negrita
     $this->SetFillColor(255,0,0);
     $this->SetTextColor(255);
     $this->SetDrawColor(128,0,0);
     $this->SetLineWidth(.3);
     $this->SetFont('','B');

     //Cabecera
     for($i=0;$i<count($header);$i++)
     $this->Cell(40,7,$header[$i],1,0,'C',1);
     $this->Ln();

     //Restauración de colores y fuentes
     $this->SetFillColor(224,235,255);
     $this->SetTextColor(0);
     $this->SetFont('');

     //Datos
     $fill=false;
     $this->Cell(40,6,"hola",'LR',0,'L',$fill);
     $this->Cell(40,6,"hola2",'LR',0,'L',$fill);
     $this->Cell(40,6,"hola3",'LR',0,'R',$fill);
     $this->Cell(40,6,"hola4",'LR',0,'R',$fill);
     $this->Ln();
     $fill=!$fill;
     $this->Cell(40,6,"col",'LR',0,'L',$fill);
     $this->Cell(40,6,"col2",'LR',0,'L',$fill);
     $this->Cell(40,6,"col3",'LR',0,'R',$fill);
     $this->Cell(40,6,"col4",'LR',0,'R',$fill);
     $fill=true;
     $this->Ln();
     $this->Cell(160,0,'','T');
   }
 }

 $pdf=new PDF();

 //Títulos de las columnas
 $header=array('Columna 1','Columna 2','Columna 3','Columna 4');
 $pdf->AliasNbPages();

 //Primera página
 $pdf->AddPage();
 $pdf->SetY(65);

 //$pdf->AddPage();
 $pdf->TablaSimple($header);

 //Segunda página
 $pdf->AddPage();
 $pdf->SetY(65);
 $pdf->TablaColores($header);
 $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.

Insertar archivos de texto con FPDF

PHP Mostramos el texto de un archivo txt en nuestro documento PDF con las funciones de FPDF.


Estamos realizando una serie de artículos prácticos para aprender a crear PDF directamente desde scripts PHP con las librerías FPDF. En el articulo anterior veíamos cómo crear los enlaces en el texto de los archivos PDF pero todavía nos queda bastante por delante.
Bien, pues en este articulo del manual sobre FPDF vamos a ver varias funciones para introducir el texto de un archivo .txt, es decir, vamos a mostrar el contenido de dicho archivo en nuestro PDF.

Vamos a empezar esta práctica colocando un ejemplo, que luego iremos explicándolo paso a paso para que se pueda entender todo lo que hacemos.

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

 class PDF extends FPDF
 {
   //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 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);
   }

   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(0,5,$txt);
     //Salto de línea
     $this->Ln();

   }

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

Las primeras lineas no las vamos a explicar, ya que están detenidamente analizadas en los artículos anteriores de este manual. Así que pasamos directamente a la función TituloArchivo(), que nos permite especificar el diseño de los títulos de los archivos que vamos a mostrar. Le estamos dando un tipo de letra Arial con un tamaño 12, un color de fondo azul utilizando la función SetFillColor y colocando el titulo con su correspondiente formato, utilizando la función Cell.

A continuación creamos la función CuerpoArchivo() que es la que va a leer el archivo y imprimirlo en nuestro PDF.
Le pasamos como parámetro la ruta del archivo. Con fopen abrimos el archivo en modo lectura, después lo leemos con fread() y guardamos en una variable, cerramos el archivo y damos formato al texto que vamos a mostrar en nuestro PDF.

Para finalizar creamos la función ImprimirArchivo() que engloba las dos anteriores y nos hace más sencillo nuestro código.

Ya lo único que nos queda es lo de siempre, abrir nuestro archivo pdf, ponerle titulo y utilizar la función de ImprimirArchivo() las veces que queramos. Por ultimo cerrar el archivo y listo.

A continuación vamos a mostrar las dos funciones nuevas que hemos utilizado para la realización de este código:

Función SetFillColor()


Esta función nos define el color de relleno para celdas y rectángulos rellenos. Podemos expresar dicho color en RGB o escala de grises
Su sintaxis es la siguiente:

SetFillColor(int r [, int g, int b]);

siendo:


  • r: si g y b los ponemos, nos muestra el rojo sino la escala de gris
  • g: el verde
  • b: azul


Función MultiCell()


Este método nos permite imprimir texto con saltos de línea. Estos pueden ser automáticos o explícito (con el carácter n).
Su sintaxis es la siguiente:

MultiCell(float w, float h, string txt [, mixed border [, string align [, boolean fill]]])

Siendo:


  • w: Ancho de celdas. Si 0, estos se extienden hasta el margen derecho de la página.
  • H : Alto de las celdas.
  • Txt:Cadena para imprimir.
  • Border : Indica si los bordes deben ser dibujados al rededor del bloque de la celda. El valor puede ser un número:
    • 0: no borde
    • 1: marco
    • o algún o todos los siguientes caracteres:
    • L: izquierda
    • T: superior
    • R: derecha
    • B: inferior
    • Su valor por defecto es 0.
  • align : Establece la alineación de texto.
    • L: a la izquierda
    • C: centrado
    • R: a la derecha
    • J: justificación (valor por defecto)
  • fill : Indica si el fondo de la celda debe ser dibujado (true) o transparente (false). Valor por defecto: false.




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.

Enlaces en FPDF

PHP Vemos las distintas formas de realizar enlaces en FPDF.


En este capitulo del manual de Crear PDF en PHP con FPDF vamos a ver las tres funciones que nos permiten crear enlaces internos y externos en nuestros documentos pdf. En el artículo anterior haciamos una pequeña introducción ya que las utilizábamos en alguno de los ejemplos, bueno pues ahora los veremos detenidamente.

AddLink


Esta función nos permite crear un identificador que más tarde utilizaremos para crear un enlace interno a la página.
Su sintaxis es bastante sencilla ya que no requiere que se le pase ningún parámetro.

int AddLink()

El identificador resultante puede ser pasado a las funciones Cell(), Write(), Image() o Link(). El destino se define con SetLink().

SetLink


Nos define la posición y la pagina a la que un enlace hace referencia.
Su sintaxis es la siguiente:

SetLink(int link [, float y [, int page]])

Donde:

  • link: identificador obtenido mediante AddLink()
  • y: posición donde se encuentra la sección a la que hace referencia el enlace. El valor por defecto es 0 y nos sitúa en la parte superior de la página.
  • page: el número de la página a la que nos lleva el enlace.

Tenemos que tener en cuenta que esto es para enlaces internos dentro del documento.
Para que entendáis mejor estas funciones vamos a poner un ejemplo que crea dos paginas con un logo(con enlace externo) en la cabecera y un enlace interno.

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

 class PDF extends FPDF
 {
   function Header()
   {
     //Logo
     Image("leon.jpg" , 10 ,8, 35 , 38 , "JPG" ,"http://www.desarrolloweb.com");
     //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().'/{nb}',0,0,'C');
   }
 }

 //Creación del objeto de la clase heredada
 $pdf=new PDF();
 $pdf->AliasNbPages();
 //Primera página
 $pdf->AddPage();
 $pdf->SetFont('Arial','',15);
 $pdf->Cell(40,20);
 $pdf->Write(5,'Para ir a la página 2, pulse ');
 $pdf->SetFont('','U');
 $link=$pdf->AddLink();
 $pdf->Write(5,'aquí',$link);
 $pdf->SetFont('');
 //Segunda página
 $pdf->AddPage();
 $pdf->SetLink($link);

 $pdf->Output();
?>

Link


La función link() se utiliza generalmente para colocar un enlace en una parte concreta de una imagen, ya que puedes seleccionar el área concreta de acción de dicho link. Hay que tener en cuenta que siempre sera un rectángulo.
Su sintaxis es la siguiente:


Link(float x, float y, float w, float h, mixed link)

Donde:

  • x: Abscisa de la esquina superior izquierda.
  • y: Ordenada de la esquina superior izquierda.
  • w: Ancho del rectángulo
  • h: alto del rectángulo
  • link: Url o identificador devuelto por AddLink().


Podríamos poner un enlace dentro de una imagen de la siguiente forma:

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


 class PDF extends FPDF
 {
   //Cabecera de página
   function Header()
   {
     //Logo
     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().'/{nb}',0,0,'C');
   }
 }

 //Creación del objeto de la clase heredada
 $pdf=new PDF();
 $pdf->AliasNbPages();
 //Primera página
 $pdf->AddPage();
 $pdf->SetFont('Arial','',15);
 $pdf->Link(10,8,10,10,"http://www.recetasparatodos.com.es");
 $pdf->Output();
?>

Como podéis comprobar hemos partido de la cabecera y el pie del articulo anterior y hemos conseguido que el enlace en la imagen solo sea un recuadro en la parte superior izquierda.




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.

Función Image() en FPDF

Vemos la función Image(), para insertar imágenes en archivos PDF generados desde PHP por FPDF.


A lo largo del Manual de FPDF, hemos visto cómo generar PDFs básicos desde PHP. En el artículo anterior aprendíamos a modificar el pie y la cabecera de un archivo pdf con FPDF y ahora vamos a ver de forma detenida la función Image().

Image()


Esta función la utilizamos para añadir imágenes a nuestros archivos PDF.
Nos admite los formatos JPEG, PNG y GIF (para este formato necesitamos la extensión GD).
El formato de la imagen se puede especificar explícitamente o simplemente ser deducido a partir de la extensión del fichero.

Tenemos tres opciones en cuanto a la especificación de tamaño de la imagen:

  1. Podemos especificar el ancho y el largo con unidades de medida definidas por nosotros mismos
  2. Podemos especificar solo el ancho y el sistema calculará el alto automáticamente
  3. No especificar nada, lo que hará que se imprima la imagen a 72 puntos por pulgada

Esta función además nos permite asociar un enlace a la imagen.

Por otro lado si repetimos las imágenes, FPDF solo guardará una copia para así bajar el peso del archivo.

Su sintaxis es la siguiente:

Image(string file [, float x [, float y [, float w [, float h [, string type [, mixed link]]]]]])

Donde:

  • file: nombre del archivo de la imagen.
  • x: Abscisa de la esquina superior izquierda. Si no se especifica se utilizará la abscisa actual.
  • y: Ordenada de la esquina superior izquierda. Si no se especifica se utilizará la ordenada actual.
  • w: Ancho de la imagen en la página.
  • h: Alto de la imagen en la página.
  • type:Formato de la imagen.
  • link: identificador devuelto por el método AddLink() o la url del enlace.

Un ejemplo sencillo sería el siguiente: $this->Image('logo.jpg',10,8,22);
En este ejemplo nos calcularía el alto de la imagen de forma automática.
Un ejemplo completo lo haríamos asi:


<?

require('/fpdf/fpdf.php');
$pdf=new FPDF();

//Primera página
$pdf->AddPage();
$pdf->SetFont('Arial','',15);
$pdf->Cell(40,20);
$pdf->Write(5,'A continuación mostramos una imagen ');

$pdf->Image('leon.jpg' , 80 ,22, 35 , 38,'JPG', 'http://www.desarrolloweb.com');

$pdf->Output();

?>


Este ejemplo es bastante sencillo y lo único que hace es mostrar un texto que nos presenta una imagen que aparecerá debajo centrada.




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.