domingo, 29 de marzo de 2009

Manual de PHP 67. PDF. Añadir nuevas fuentes para PDF

Programas necesarios
Para generar las nuevas fuentes es necesario disponer del programa ttf2pt1.exe. Si accedemos a este enlace podemos ver, en la zona de descargas, una opción dónde dice Complete package, except sources desde el que podemos descargar el fichero ttf2pt1-3.4.4.exe.

Al ejecutar este instalador, con la opción por defecto, nos creará un directorio llamado GnuWin32 (en Archivos de Programa) dentro del cual encontramos un directorio llamado bin en el que se encuentra el ejectuable ttf2pt1.

El resto de las opciones de esta distribución no son necesarias para nuestros fines.

Creación del fichero .afm

Este fichero, cuya extensión es el acrónimo de Adobe Font Metric contiene las información sobre ancho, alto y kerning de cada carácter de una fuente.

El primer paso ha de ser la creación de ese fichero. El procedimiento para hacerlo es el que tienes descrito al margen.
¡Cuidado!

En el directorio fuentes tienes los ficheros cayge.afm y caygr.afm generados según el proceso descrito al margen.

Definición de las fuentes

El directorio fontsPDF de estos materiales (recuerda que es el fruto de renombrar el directorio font extraido del fichero de instalación de la clase FPDF) contiene otro subdirectorio (makefont) que incluye un script llamado makefont.php. La definición de fuentes requiere la ejecuación de una de las funciones que contiene ese script llamada MakeFont() y que utiliza los siguientes parámetros:

MakeFont(f1, f2, c, p, tipo)

donde f1 es el nombre y path de la fuente TrueType a utilizar (fichero .ttf), f2 es el nombre del fichero .afm creado para esta misma fuente mediante ttf2pt1. Estos dos parámetros son obligatorios.

Mediante el parámetro c (opcional) se especifica el tipo de codificación (el mapa de fuentes a utilizar). Si no se indica el valor por defecto sería cp1252.

El parámetro opcional c permite cambiar la codificación de algunos caracteres, y, mediante tipo puede indicarse el tipo de fuente original (por defecto se asigna TrueType).

La definición de nuevas fuentes requiere la ejecución de la función MakeFont. Para ello, una de las opciones, es utilizar un script como el que ves a la derecha. En una primera instrucción se incluye el fichero makefont.php y en la segunda se hace una llamada a la función únicamente con los parámetros obligatorios.

La ejecución de ese script daría como resultado la creación de dos ficheros con el mismo nombre. Uno de ellos con extensión .z y el otro con extensión .php. Ambos, para que puedan ser usados por la clase FPDF, deberán ser incluidos en el directorio fontsPDF.

Diferentes tipografías

Lo habitual es que entre las fuentes TrueType de un tipo determinado existan varios ficheros. Uno para la fuente normal, otro para la cursiva, etcétera. Cuando se trabaja con este tipo de fuentes y se pretende usar estilos distintos lo aconsejable es definir una fuente para cada tipo y tratarlos, a la hora de escribir el código de los script como fuentes independientes.

De esta forma podríamos tener parejas de ficheros del estilo: fxx_normal.z y fxx_normal.php; fxx_cursiva.z y fxx_cursiva.php, etcétera. A la hora de utilizarlas se haría como si se tratara de fuentes de distintas familias y habría de evitarse incluir el estilo en SetFont.

La sintaxis de la asignación de fuentes habría de ser:

$obj->SetFont("nombre","", 9);

dejando el valor del segundo parámetro (estilo) como una cadena vacía. La única excepción a esta norma sería el caso del subrayadado que no requiere otra cosa que asignar el valor U al parámetro estilo.

Precauciones con las fuentes

El uso de fuentes externas puede producir efectos indeseados si, por alguna circunstancia, tal como ocurre en los ejemplos la fuente utilizada carece de alguno carácteres (eñes, letras con tilde, símbolos). Conviene tenerlo en cuenta para evitar que la elección de una tipografía pueda afectar a los contenidos del documento.



Proceso de generación de fuentes



Esta primera imagen es la visualización del directorio fuentes de estos materiales. Podrás observar que contiene fuentes TrueType y el ejecutable ttf2pt1.


Hemos incluido dos fuentes TrueType llamadas bobcayge.ttf y bobcaygr.ttf. Serán las que utilizaremos para añadir nuevas opciones de fuentes a nuestros PDF's.





No es necesario que realices la instalación de ttf2pt1-3.4.4.exe comentada al margen. En el subdirectorio fuentes de estos materiales ya dispones del fichero ttf2pt1.

Creación del fichero .afm


Desde la ventana de MS-DOS y una vez elegido el directorio que contiene el ejecutable ttf2pt1 podemos crear el fichero .afm usando la siguiente sintaxis:


ttf2pt1 -anombre_de_la_fuente_TrueType.ttf nombre_del_nuevo_fichero




Nos generará dos ficheros con el nombre asignado al nuevo fichero y extensiones .afm y .t1a tal como puedes ver en la imagen.




Creación del fichero de definición de fuente


Este es un ejemplo de script que permitiría definir nuevas fuentes mediante la utilidad makefont.

<?
# incluimos el fichero makefont.php que está
# en la ruta que se especifica (si lo tuvieramos en otra
# ubicación bastaría cambiar el path del include
include("c:/Apache/htdocs/cursoPHP/fontsPDF/
makefont/makefont.php");

# ejecutamos la función MakeFont indicando como parametros
# la ruta y el fichero ttf a convertir(la fuente trueType)
# y como segundo parámetro la ruta y el nombre del fichero afm
# creado en el proceso anterior
MakeFont("c:/Apache/htdocs/cursoPHP/fuentes/bobcaygr.ttf",
"c:/Apache/htdocs/cursoPHP/fuentes/caygr.afm");

?>


Al ejecutar el script anterior puede ocurrir que, dependiendo de la fuente ttf que estemos utilizando, aparezcan mensajes de advertencia como los que ves en esta imagen.




Significaría que algunos tipos (generalmente los asociados a los caracteres ASCII ampliados) no estarían disponibles y que, en consecuencia, o no se visualizarían o se visualizarían de forma incorrecta.


Una vez creados los ficheros como las nuevas fuentes es necesario incluirlos en el directorio fontsPDF de modo que estén disponibles a la hora de crear los documentos PDF.



Ejemplo de utilización


La utilización de nuevas fuentes requiere que


objeto->AddFont(nombre_a_utilizar, estilo, fichero_fuente.php)


donde el nombre_a_utilizar puede ser cualquiera, el parámetro estilo puede ser la cadena vacía y el tercer parámetro es el nombre y extensión del fichero .php que contiene la definición de la fuente y que fué creado por medio de makefont.


Si se omite el tercer parámetro será asignado, de forma automática, la cadena formada por la unión las cadenas nombre_a_utilizar y estilo, agregándole la extensión .php.

<?
#incluimos el fichero con la clase y definimos la variable FPDF_FONTPATH
# con el mismo criterio comentado en el ejemplo anterior
include("fpdf.php");
define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');

/* establecemos las dimensiones del documento
creamos un nuevo objeto y añadimos una página*/
$dimensiones=array (140,200);
$MiPDF=new FPDF('P','mm',$dimensiones);

# ajustamos al 100% la visualización
$MiPDF->SetDisplayMode('real');
#insertamos una página en blanco
$MiPDF->Addpage();
# establecemos el color de la letra
$MiPDF->SetTextColor(255,0,0);
# añadimos la nueva fuente. Podemos ponerle un nombre cualquiera
# Al no incluir estilo considerará el estilo normal
$MiPDF->AddFont('fuentenueva1','','cayge.php');
# a indicar SetFont habremos de utilizar el mismo nombre de fuente
# establecido mediante AddFont
$MiPDF->SetFont('fuentenueva1','',24);
$MiPDF->Multicell(0,10,"Prueba de la fuente que hemos
llamado fuente nueva1",1,'L',0);
$MiPDF->Ln(10);

# incluimos la fuente caygr.php con nombre fuentenueva2
$MiPDF->AddFont('fuentenueva2','','caygr.php');
$MiPDF->SetFont('fuentenueva2','',24);
>
$MiPDF->Multicell(0,10,"Prueba de la fuente que hemos
llamado fuente nueva2",1,'R',0);
$MiPDF->Output();
?>
EJEMPLO144

En estos dos ejemplos pueden verse los resultados -con algunos problemas gráficos- de la sustitución de las fuentes en algunos de los ejemplos de páginas anteriores.

ejemplo145.php ejemplo146.php




Fuente:

sábado, 28 de marzo de 2009

Museo arqueológico provincial de Orense


Me ha enviado una compañera la nueva página/dirección del Museo arqueolóxico provincial de Ourense - Museo arqueológico provincial de Orense-.

Lo cierto es que la página tiene un diseño moderno y fácilmente accesible, desde la misma podrás encontrar fácilmente multitud de información relativa a la actividad de este organismo.

Lamentablemente para aquellos que lo quieran disfrutar en vivo, tendrán todavía que esperar hasta que finalicen las reformas que se están realizando en el edificio.

Para matar el gusanillo cada mes, desde la propia página, nos ofrecen alguna de las piezas del museo a través de un folleto explicativo, dónde hacen un análisis de la misma, la contextualizan, detallan sus características, muestran más imágenes,... todo ello descargable desde la propia página.

Por ponerle algún pero, yo intentaría mostrar de algún modo al menos parte del catálogo actual, y en cuanto al tema de yacimientos aunque ahora sólo aparece Santomé, sé que están trabajando para incorporar nuevos yacimientos de la provincia, de hecho parece que el próximo a incorporar será el de Castromao.

En definitiva una página para visitar todos los meses, cuando menos para echarle un vistazo a la pieza seleccionada y enterarnos de cuándo podremos visitar el museo.

Enlaces:
Museo Arqueológico Provincial de Ourense: http://www.musarqourense.xunta.es

Manual de PHP 66. PDF. Celdas Múltiples, encabezados y pies de página.

Celdas con saltos de línea

La función Cell, estudiada en la página anterior, no interpreta los saltos de línea y, en el caso de que la cadena de texto sea más larga que el ancho de la celda, escribirá fuera de sus márgenes.

La clase FPDF dispone de la función:

$obj->MuliCell(a,h,text,b,aln,r)

donde a es el ancho de la celda (si se indica cero ocupará hasta el margen derecho de la página), h es el alto de cada una de las celdas aunque, en la práctica, se comporta de forma idéntica al interlineado de un procesador de textos), text es la cadena de texto (o variable que lo contiene) a insertar.

b es un parámetro que puede valer: 0 (sin bordes); 1 (con bordes), y también: L (borde por el lateral izquierdo de la celda); T (borde por la parte superior), R (línea de borde en el margen derecho), B (línea de borde en la parte inferior) ó agrupaciones de estos últimos valores, en cualquier orden, tales como: LR ó TB, etcétera.

El parámetro aln indica la alineación horizontal que han de tener los textos y permite los valores: L (izquierda); C (centro); R (derecha) ó J (justificado).

Por último, el parámetro r (relleno) especifica si a las celdas se les aplicará (valor 1) un color de fondo o si se va a tratar (valor 0) de un fondo transparente.

El comportamiento de esta función tiene las siguientes particularidades:

• Inserta los saltos de línea contenidos en el fichero origen y los incluidos en la cadena de texto mediante la secuencia de escape\n.

• Inserta saltos de línea automáticos en el momento en que el texto alcanza el borde derecho de la celda.

• Si AutoPageBreak está activado inserta saltos de página automáticos en el momento en que el texto alcanza el margen inferior de la página.


Encabezados y pies de página

La clase FPDF contiene dos métodos (funciones) llamados: Header() y Footer().

Si editamos el fichero fpdf.php podemos ver que ambas están vacías (no contienen ninguna instrucción) presentando una sintaxis como esta:

function Header(){
// comentario
}
y
function Footer(){
// comentario
}
Ambas son invocadas de forma automática cada vez que se ejecuta la función AddPage() y, eso permite crear otras funciones a medida, con igual nombre, e incluirlas en una clase extendida.

Recuerda que los métodos de la clase extendida prevalecen sobre los que pudieran existir en la clase padre con su mismo nombre. Por esta razón, las nuevas funciones de la clase extendida nos permitirían incluir encabezados y pies de página en cada una de las nuevas páginas añadidas mediante AddPage().

El procedimiento sería este:

• Creamos una clase extendida de la clase original FPDF.

• Incluimos en esta nueva clase funciones con nombres Header() y Footer() (no podemos modificar el nombre ya que han de coincidir con los nombres de las funciones vacias de la clase padre) en las que indicamos los contenidos que han de insertarse (y su posición) mediante cada una de ellas. • Al crear el nuevo objeto mediante:

$obj= new nombre_clase()

utilizaremos el nombre el de la clase extendida que hemos creado para incluir estas funciones.

De esta forma, cada vez que se ejecuta AddPage() (añadir una nueva página) se ejecutarán también Header() y Footer() que, al no ser ya funciones vacías, realizarán una inclusión de contenidos en cada una de las páginas del documento.

Gestión de la inserción automática de páginas

La clase FPDF contiene esta función:

function AcceptPageBreak(){
// comentario
return $this->AutoPageBreak;
}

que igual que ocurría con Header() y Footer() es invocada en el momento en que encuentra un salto de página y dependiendo del valor que devuelva (true ó false) se ejecuta ó no la funcion AddPage().

Tal como está diseñada esta clase devolverá el valor que tenga asignado AutoPageBreak() (true ó false) pero, igual que ocurría con Header() y Footer() permite incluir otra función con el mismo nombre en una clase extendida. La condición de la nueva función es que, al igual que ocurre con esta, habrá de devolver un valor booleano (cierto ó falso).

Esta posibilidad añade nuevas e interesantes funcionalidades al uso de la clase FPDF. Una de las posibilidades podría ser la de crear documentos con varias columnas (estilo periodístico). La forma de proceder (una de las posibles) la tienes descrita en el ejemplo que hemos incluido al final de este documento

Otras opciones

Además de las funciones que hemos descrito a lo largo de esta página, existen clases extendidas que incluyen nuevas, y en algunos casos muy interesantes, funciones que resuelven problemas específicos concretos a la hora de crear ficheros PDF. Algunas de ellas están disponibles desde el propio sitio FPDF de Olivier PLATHEY.

Una de las utilidades más interesantes -desde luego que ni mucho menos únicas- de este tipo de formatos podría ser la paginación de los resultados de las consultas en bases de datos.

Cuando nos encontremos en esa situación podremos utilizar un procedimiento casi idéntico al usado en el ejemplo sobre las tablas de alimentos.

No importaría el tamaño del fichero de texto (número de páginas que pudiera ocupar) ni el número de registros obtenidos como resultado de una consulta a una base de datos. Sería la propia clase FPDF quien se encargaría de crear las páginas necesarias de un documento con un formato preestablecido.

Encabezados, pies de página y saltos automáticos

<?
# include y define idénticos a los anteriores
include("fpdf.php");
define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');

# creamos una clase extendida de la clase FPDF
class GranPDF extends FPDF {
# incluimos la funcion Header (debe ser definida con este nombre)
# que se ejecuta cada vez que se añade una página, sea en forma
# manual o en forma automática.
# Nos permite insertar los encabezados de todas las páginas del
# documento
function Header(){
#insertamos un salto de línea de 2 mm. a partir
#del margen superior
$this->Ln(2);
# establecmos color y estilo de letra del encabezado
$this->SetTextColor(0,0,0);
$this->SetFont("Times","I", 11);
# establecemos una celda cuyo ancho es cero
# de esta forma se extenderá hasta el margen derecho
# ocupando toda la caja de texto de la página.
# le ponemos unicamente brode inferior, texto centrado
# sin relleno y le adjudicamos como parámetro de posición
# de la celda siguiente 1 de forma que comience en el margen
# izquierdo de una línea nueva
$this->Cell(0,8,"La Regenta",'B',1,'C',0);
# colocamos un salto de línes de 3 milimetros para separar el
# encabezado de los textos de la página
$this->Ln(3);
}
# incluimos la funcion Footer (debe ser definida con este nombre)
# para insertar pies de página cada vez que cree una página nueva
function Footer(){
$this->Ln(2);
$this->SetTextColor(0,0,0);
$this->SetFont("Arial","I", 9);
# en este caso incluimos el número de página con un borde superior
# de la celda, texto centrado y tambien activando la celda siguiente
# de modo que se produzca un saldo de línea
$this->Cell(0,5,"Página ".$this->PageNo(),'T',1,'C',0);
}
}
# acabada la inserción de la clase extendida continuamos con el código
# establecemos las dimensiones del documento
$dimensiones=array (140,200);
# creamos un nuevo objeto pero ¡cuidado! utilizaremos
# la clase extendida GranPDF
$MiPDF=new GranPDF('P','mm',$dimensiones);
# ajustamos al 100% la visualización
$MiPDF->SetDisplayMode('fullpage');
# añadimos la primera página del documento. La ejecución de esta función
# disparará la ejecución de las funciones Header() y Footer() de la
# clase extendida y, por tanto, incluirá en el documento los encabezados
# y pies de página allí establecidos
$MiPDF->Addpage();
# cambiamos el estilo de fuente a "normal"
$MiPDF->SetFont('Times','',12);
# leemos un fichero de texto y lo recogemos en una variables
$f1=fopen('regenta.txt','r');
$regenta1=fread($f1,filesize('regenta.txt'));
fclose($f1);

# insertamos el fichero mediante Multicell
# el ancho 0 establece que la celda ocupará desde el margen
# izquierdo hasta el derecho. La interlinea será de 4mm.
# el texto que se incluirá (con salto de línea automático
# e inserción automática de nuevas páginas) será el recogido
# del fichero de texto. La celda no tendrá bordes
# el texto estará justificado y no tendrá relleno de fondo.
$MiPDF->Multicell(0,4,$regenta1,0,'J',0);
# establecemos la visualización del documento
$MiPDF->Output();?>

Ejemplo141.php


El ejemplo siguiente es una adaptación del ejemplo139 al uso de encabezados y pies de página.


Ver código fuente ejemplo142.php




<?
# incluimos la clase fpdf.php y la constante FPDF_FONTPATH
include("fpdf.php");
define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');

# creamos la clase GranPDF extendida de fpdf.php
class GranPDF extends FPDF {
# definimos dos nuevas variables internas
# el identificador de la columna actual
# y el valor de la ordenada de inicio de las columnas
var $columna_actual=0;
var $ordenada_inicio=21;
# la función Header se comporta de forma idéntica al ejemplo anterior
function Header(){
$this->SetTextColor(0,0,0);
$this->SetFont("Times","I", 11);
$this->Cell(0,8,"La Regenta",'B',1,'C',0);
$this->Ln(3);
}

# Footer es similar al caso anterior con la única diferencia que
function Footer(){
$this->SetY(-20);
$this->Ln(2);
$this->SetTextColor(0,0,0);
$this->SetFont("Arial","I", 9);
$this->Cell(0,5,"Página ".$this->PageNo(),'T',1,'C',0);
}

function AcceptPageBreak(){
# al alcanzar el margen inferior se activa esta función
# que comprueba si el punto de inserción está en la columna
# primera (0) ó en la segunda
if($this->$columna_actual==0){
# cambia el valor del número de columna a 1 (pasa a la segunda)
$this->$columna_actual=1;
# cambia el punto de inserción a la coordenada de inicio
# que es la parte superior de la página
$this->SetY($this->ordenada_inicio);
# cambia el margen izquierdo de modo que el texto
# aparezca en la columna derecha (a partir de los 72.5 mm).
# más abajo está comentada la razon de estos valores
$this->SetLeftMargin(72.5);
# cambia el punto de insercion al nuevo margen izquierdo
$this->SetX(72.5);
# establecemos que la función devuelva false
# con ello no se produce un salto de página
# y el punto de inserción se translada a las
# coordenadas indicadas en las instrucciones anteriores
return false;
}else{
# si la columna es la segunda (no es la cero)
# cambia a la primera, asigna el valor cero
$this->$columna_actual=0;
# cambia el punto de inserción a la coordenada de inicio
# que es la parte superior de la página
$this->SetY($this->ordenada_inicio);
# cambia el margen izquierdo de modo que el texto
# aparezca en la columna izquierda (a partir de los 10 mm).
$this->SetLeftMargin(10);
# cambia el punto de insercion al nuevo margen izquierdo
$this->SetX(10);
# establecemos que la función devuelva true
# con ello genera un salto de página
# y la insercion de texto continua en la pagina siguiente
return true;
}
}

}
/* establecemos el tamaño de la página
que tendrá 140 mm. de ancho.
Si establecemos un margen por la izquierda de 10 mm.
un margen por la derecha de otros 10 mm.
y un espacio entre columnas de 5 mm. nos restan
140-25=115 mm. que repartidos entre dos columnas
les darían un ancho de 115/2=57,5 mm.
Las primera columna comenzará en 10 y acabará en
10 +57,5=67.5 mm. La segunda deberá empezar en
72.5 (añadiendo 5 mm. de espacio entre columnas */
$dimensiones=array (140,200);
# creamos el nuevo objeto partiendo de la clase ampliada
$MiPDF=new GranPDF('P','mm',$dimensiones);
# ajustamos al 100% la visualización
$MiPDF->SetDisplayMode('fullpage');
# insertamos la primera página del documento
$MiPDF->Addpage();
# cambiamos el estilo de fuente a "normal"
$MiPDF->SetFont('Times','',12);
# establecemos un color de fondo para las celdas de texto
# y el color de la tipografia
$MiPDF->SetFillColor(240,240,240);
$MiPDF->SetTextColor(0,0,0);

# leemos un fichero de texto y lo recogemos en una variables
$f1=fopen('regenta.txt','r');
$regenta1=fread($f1,filesize('regenta.txt'));
fclose($f1);

# insertamos el fichero mediante Multicell
# el ancho 57.5 estable el ancho de columna igual
# para la derecha que para la izquierda La interlinea será de 4mm.
# el texto que se incluirá (con salto de línea automático
# e inserción automática de nuevas páginas cuando se hayan completado
# las dos columnas) será el recogido
# del fichero de texto. La celda no tendrá bordes
# el texto estará justificado y SI tendrá relleno de fondo.
$MiPDF->Multicell(57.5,4,$regenta1,0,'J',1);
# establecemos la visualización del documento
$MiPDF->Output();?>




sábado, 21 de marzo de 2009

Manual de PHP 65. PDF. Inserción de imágenes y elementos gráficos

Lineas y rectangulos

La clase FPDF incluye métodos para el dibujo de segmentos rectilineos y de rectángulos.

Las funciones que utiliza para estos menesteres son las siguientes:

$obj->Line(X1,Y1,X2,Y2)

Si no se ha especificado ningún color -usando SetDrawColor- o un espesor de línea - por medio de SetLineWidth - se usarán los valores por defecto (color negro y 0,2 mm. de espesor).

Cuando se trata de dibujar rectángulos, hemos de utilizar la función:

$obj->Rect(X1,Y1,A,H,'estilo')

donde X1 e Y1 son las coordenadas de la esquina superior izquierda del mismo, A el ancho, H el alto y estilo que puede ser una de estas tres cadenas: D, F, DF que significan: dibujar líneas de borde, rellenar, y dibujar líneas y rellenar. Si no se especifica estilo se interpretará por defecto la opción D.

Las imágenes GIF

La clase FPDF, en su versión original, no permite utilizar imágenes en formato GIF. No obstante es posible adaptar la clase y añadirle esa posibilidad. Para ello es preciso realizar las modificaciones que se indican a continuación:

Modificación de la clase FPDF



El fichero fpdf.php que contiene la clase FPDF tiene una carencia relativa a la gestión de imágenes en formato GIF. En la propia principal http://www.fpdf.org/ se hace una mención a esa carencia y la forma de subsanarla.

























Fichero inicial fpdf.php
Guardado como fpdf_con_gif.php
Modificaciones en el fichero inicial
LíneaCambios
911Donde dice:
if($type=='jpg' || $type=='jpeg')

$info=$this->_parsejpg($file);

elseif($type=='png')

$info=$this->_parsepng($file);

else

{

//Allow for additional formats
añadir las líneas en rojo:
if($type=='jpg' || $type=='jpeg')

$info=$this->_parsejpg($file);

elseif($type=='png')

$info=$this->_parsepng($file);

elseif($type=='gif')

$info=$this->_parsegif($file);


else

{

//Allow for additional formats
1638Donde dice:
//End of class

}
anteponer:
function _parsegif($file){
//Function by Jérôme Fenal
require_once 'gif.php';
//GIF class in pure PHP from Yamasoft
//(formerly at http://www.yamasoft.com)
$h=0; $w=0;
$gif=new CGIF();
if (!$gif->loadFile($file, 0))
$this->Error("GIF parser: unable to open file $file");
if($gif->m_img->m_gih->m_bLocalClr) {
$nColors = $gif->m_img->m_gih->m_nTableSize;
$pal = $gif->m_img->m_gih->m_colorTable->toString();
if($bgColor != -1) {
$bgColor= $gif->m_img->m_gih->m_colorTable->colorIndex($bgColor);
}
$colspace='Indexed';
} elseif($gif->m_gfh->m_bGlobalClr) {
$nColors = $gif->m_gfh->m_nTableSize;
$pal = $gif->m_gfh->m_colorTable->toString();
if($bgColor != -1) {
$bgColor = $gif->m_gfh->m_colorTable->colorIndex($bgColor);
}
$colspace='Indexed';
} else {
$nColors = 0;
$bgColor = -1;
$colspace='DeviceGray';
$pal='';
}
$trns='';
if($gif->m_img->m_bTrans && ($nColors > 0)) {
$trns=array($gif->m_img->m_nTrans);
}
$data=$gif->m_img->m_data;
$w=$gif->m_gfh->m_nWidth;
$h=$gif->m_gfh->m_nHeight;
if($colspace=='Indexed' and empty($pal))
$this->Error('Missing palette in '.$file);
if ($this->compress) {
$data=gzcompress($data);
return array( 'w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>8,
'f'=>'FlateDecode', 'pal'=>$pal, 'trns'=>$trns, 'data'=>$data);
} else {
return array( 'w'=>$w, 'h'=>$h, 'cs'=>$colspace,
'bpc'=>8, 'pal'=>$pal, 'trns'=>$trns, 'data'=>$data);
}
}


Incluir (en el mismo directorio que fpdf_con_gif.php) el fichero:
gif.php





y que pueden resumires en tres acciones.

La primera de ellas es efectuar una modificación de la función Image() contenida en la clase FPDF del fichero fpdf.php. Se trata de incluir la condición para imágenes gif.

El uso de imágenes GIF requiere utilizar una nueva función llamada _parsegif -la tienes en la tabla anterior- que habrá que incluir como un método más dentro de la clase FPDF.

La función _parsegif requiere el uso de un nuevo fichero -gif.php- desarrollado por Yamasoft y que nosotros hemos encontrado en el fichero zip que puede descargarse desde este enlace. Lo hemos extraido de él y lo hemos incluido en estos materiales.

Hemos editado el fichero fpdf.php y lo hemos guardado con un nuevo nombre: fpdf_con_gif.php (se trata de conservar el fichero original y hacer los cambios sobre uno nuevo) y hemos realizado los cambios que se indican antes sobre este último fichero.

Una vez realizadas las modificaciones la opción GIF ha quedado totalmente funcional.

¡Cuidado!

Los cambios comentados en la tabla anterior ya han sido realizados.

Lao ficheros gif.php y fpdf_con_gif.php se han incluido junto con estos materiales.


Inserción de imágenes

Se pueden incluir imágenes mediante la función:

$obj->Image('nombre',X1,Y1,A,H,'tipo','enl')

donde X1 e Y1 son las coordenadas dónde se situará la esquina superior izquierda de la imagen, A es el ancho con el que se visualizará la imagen, H su altura, tipo es el formato de la imagen original que puede ser: JPG, JPEG, PNG ó GIF. Por último, el parámetro enl permite -tal como ocurría con CELL ó con WRITE y con los mismos criterios allí utilizados- establecer un enlace externo o una referencia interna.

El parámetro nombre debe especificar la ruta, el nombre y la extensión de la imagen a incluir. La clase no soporta ni entrelazados en las imágenes gif ni transparencias (canales alfa) en las imágenes png.

Las dimensiones de la imagen pueden omitirse (incluyendo en su lugar una cadena vacia). En ese caso incluiría la imagen original con una resolución de 72 puntos por pulgada.

Si se especifica una sola de las dimensiones la otra se calcula de forma automática y se mantienen las proporciones. Si se insertan valores de largo y ancho pueden generarse, a voluntad, efectos de distorsión.

Inserción de imágenes dinámicas

Es posible combinar la potencia gráfica de las funciones de PHP para la creación de imágenes dinámicas con la opción de crear ficheros PDF mediente la clase FPDF. La forma de proceder es simple y puedes verla en el ejemplo que tienes al final.

Basta incluir una función -dentro del mismo fichero o por inclusión de un fichero externo que la contenga- que cree la imagen dinámica y la guarde con un nombre previamente establecido.

Incluimos el nombre de esa imagen en la función Image y, una vez producida la salida mediante Output, proceder a borrarla del directorio en el que fue creada.


Un ejemplo con gráficos e imágenes

<?
#incluimos el fichero resultante de las modificaciones anteriores
include("fpdf_con_gif.php");
define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');
/* establecemos las dimensiones del documento en mm.
creamos un nuevo objeto y A-4 apaisado.
Hemos modificado algunas funciones de la clase pero no le hemos cambiado
el nombre, por ello el constructor es el mismo */
$MiPDF=new FPDF('L','mm','A4');
# ajustamos la visualización para ver la página completa en pantalla
$MiPDF->SetDisplayMode('fullpage');
#añadimos una página
$MiPDF->AddPage();
# sin haber definido previamente ni un color ni un ancho de linea
# aparecerá en negro y con un espesor de 0.2 mm
$MiPDF->Line(5,5,287,5);
#ensayamos las diferentes opciones de rectangulos
#con los colores y espesores por defecto
$MiPDF->Rect(10,10,50,50);
$MiPDF->Rect(70,10,50,50,'D');
$MiPDF->Rect(140,10,50,50,'F');
$MiPDF->Rect(200,10,50,50,'DF');

# modificamos los colores y espesores de linea
$MiPDF->SetDrawColor(255,0,0);
$MiPDF->SetFillColor(0,0,255);
$MiPDF->SetLineWidth(3);

# dibujamos nuevos rectángulos con los nuevos valores
$MiPDF->Rect(10,65,50,50);
$MiPDF->Rect(70,65,50,50,'D');
$MiPDF->Rect(140,65,50,50,'F');
$MiPDF->Rect(200,65,50,50,'FD');

# insertamos una imagen (png) sin especificar dimensiones
$MiPDF->Image('./images/cruz.png',10,118,'','','png');
# otra imagen(jpg) en la que unicamente especificamos el alto
$MiPDF->Image('./images/cabina.jpg',90,118,'',90,'jpg');
# otra imagen(gif) en la que especificamos ancho y alto y provocamos
# una distorsión
$MiPDF->Image('./images/peligro.gif',215,118,80,50,'gif');
#añadimos una nueva página
$MiPDF->AddPage();
# asignamos un nombre a la imagen dinámica que vamos a generar
# e incluir en el documento PDF
$imagen="ladinamica.jpg";
# ejecutamos la función que crea la nueva imagen
imagen1($imagen);
# insertamos la nueva imagen y generamos la salida
$MiPDF->Image($imagen, 45, 35 , 150, '','jpg','http://www.google.es');
$MiPDF->Output();

# ya podemos borrar la imagen dinámica que hemos creado
unlink($imagen);
# esta es la función que crea la imagen dinamica
# le asignamos un nombre para que sea guarda temporalmente
# en el directorio actual
function imagen1($imagen){
Header("Content-type: image/jpeg");
$im = imagecreate(200,200);
$fondo=imagecolorallocate ($im, 0, 0, 200);
$blanco=imagecolorallocate ($im, 255, 255, 255);
Imagefill ($im, 0, 0, $fondo);
Imagerectangle ($im, 10, 10, 190, 190, $blanco);
Imagejpeg($im,$imagen);
ImageDestroy($im);
}

?>






Manual de PHP 64. PDF. Textos encuadrados, tablas y enlaces

Textos encuadrados

La funcion Cell ofrece un montón de posibilidades a la hora de insertar celdas conteniendo textos. Su sintaxis es la siguiente:

$obj->Cell(a,h,text,b,q,p,r,e)

dónde los parámetros son los siguientes: a es el ancho de la celda; h su altura; text la variable o cadena que contiene el texto a insertar; b un parámetro que que establece los bordes de la celda y que puede tomar los siguientes valores:

Valor Opción
0 Sin bordes
1 Con bordes
L Borde por la izquierda
T Borde superior
R Borde por la derecha
B Borde inferior


El valor por defecto es cero. Las especificaciones de bordes laterales pueden agruparse (LR, TL, etcétera sin que importe el orden en que se haga la agrupación).

El parámetro q permite establecer en qué posición se habrá de insertar el elemento posterior a la celda actual (otra celda, un texto mediante Write, un gráfico, etcétera). Permite los siguientes valores:

Valor Opción
0 A la derecha de la celda actual
1 En el margen izquierdo de la línea siguiente
2 Debajo de la celda actual alineado a su borde izquierdo


Por medio del parámetro p se puede establecer la alineación del texto (contenido en la celda) respecto a sus bordes. Permite usar L, C y R como indicadores de alineaciones del texto a la izquierda, centro ó derecha.

El parámetro r es un valor booleano (1 ó 0) que especifica si la celda ha de rellenarse con un color de fondo (1) o ha de ser transparente (0).

El parámetro e -es opcional- permite establecer la celda como un hiperenlace.
Si se especifica una URL se establecerá un enlace a la misma y, además, es posible establecer enlaces internos de la forma que puedes ver comentada en el ejemplo.

Tamaño de una cadena de texto

La función:

$obj->GetStringWidth('cad')

devuelve un número decimal que indica la longitud de la cadena indicada en cad con la fuente y tamaño de letra actuales. Es una función muy útil para dimensionar las celdas de modo que los textos que contienen no sobrepasen sus bordes.

Espesor de líneas

Puede especificarse el grosor de las líneas -en los elementos gráficos que las utilizan(rectángulos, celdas, etcétera)- mediante la función:

$obj->SetLineWidth('grosor')

dónde grosor es un valor numérico que especifica el espesor de las líneas en las unidades asignadas en el constructor. Por defecto -si no se asigna espesor mediante esta función- el ancho de línea sería de 0,2 milímetros.

Números de página

La función:

$obj->PageNo()

devuelve el número de la página actual.

Color de las líneas

También es posible establecer el color de las líneas mediante la función:

$obj->SetDrawColor('R,G,B')

dónde R,G,B son valores númericos comprendidos entre 0 y 255 que asignan los valores de las componentes de los colores primarios rojo, verde y azul respectivamente. Si se incluye un único parámetro será interpretado como escala de grises. El valor 0 sería el negro y 255 representaría el blanco.

Color de relleno

Algunos elementos gráficos (celdas de texto, rectángulos) permiten que se les aplique un color de fondo. Para establecer tal color basta con ejecutar la función:

$obj->SetFillColor('R,G,B')

El criterio de asignación de colores es idéntico al del párrafo anterior.

Una vez asignado un color de relleno (lo mismo ocurre con los colores y espesores de línea) se mantiene a lo largo del documento en tanto no sea modificado por la ejecución del método con unos parámetros distintos.

Número de páginas del documento

La clase FPDF incluye la posibilidad de determinar el número total de páginas del documento. Para ello es preciso ejecutar (después de crear el objeto) la función:

$obj ->AliasNbPages('idn')

donde idn es una palabra cualquiera. Si se omite se considerará su valor por defecto que es: {nb}.

Para imprimir este valor en el documento será suficiente incluir el identificador utilizado en una cadena de texto. Puedes verlo comentado en el ejemplo.

Enlaces internos

En el ejemplo que tienes a continuación hemos insertado algunas de las opciones de las funciones comentadas anteriormente. En los párrafos siguientes incluimos algunos comentarios sobre la manera de utilizar las funciones de inclusión enlaces internos en el documento. Esta opción requiere tres pasos:
  • Crear una referencia interna y recogerla en una variable identificadora.

    La sintaxis sería la siguiente: $enlace=$obj->AddLink()

  • Definir la zona del documento (área, imagen o texto) en la que, al pulsar sobre ella, se activará el redireccionamiento. Podría hacerse de varias formas, entre otras:

    $obj->Cell(a,h,text,b,q,p,r,$enlace)
    Mediante esta opción se añade como último parámetro de la función Cell la variable creada mediante AddLink(). Si se tratara de un enlace a una URL no sería necesario AddLink y bastaría con incluir -entre comillas- la dirección de la URL. Convertiría la cadena de texto en un hiperenlace.

    $obj->Link(X,Y,ancho,alto,$enlace)
    Permite definir como hiperenlace un área de la página actual definida por un rectángulo cuya esquina superior izquierda está definida por los parámetros X e Y y cuyo ancho y alto se establecen a través de los parámetros del mismo nombre. La variable $enlace se comporta de forma idéntica a la indicada en el caso anterior.

    $obj->Write(interlinea,'texto',$enlace)
    En este caso, añadimos un tercer parámetro a la función Write (es opcional) que contiene la variable indicadora del enlace. El comportamiento sería idéntico a los supuestos anteriores.

  • Establecer la posición a la que redigiría el enlace. Será necesario indicar a dónde habrá de redirigirse el cliente en el momento que se pulse sobre uno de los enlaces anteriores. Eso se indica mediante:

    $obj->SetLink($enlace, pos_vertical, pagina)
    La variable $enlace será el indicador mencionado en los párrafos anteriores, pos_vertical la distancia del margen superior de la página de destino en la que se inicia la visualización y pagina el número de la página a la que se redirige mediante el enlace. Si se omiten estos parámetros se entenderá que la posición vertical es 0 y que la página es la página actual.

<?
#incluimos el fichero con la clase y definimos la variable FPDF_FONTPATH
# con el mismo criterio comentado en el ejemplo anterior
include("fpdf.php");
define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');

/* establecemos las dimensiones del documento
creamos un nuevo objeto y añadimos una página*/
$dimensiones=array (210,297);
$MiPDF=new FPDF('P','mm',$dimensiones);

# ajustamos al 100% la visualización
$MiPDF->SetDisplayMode('real');

#insertamos una página en blanco
$MiPDF->Addpage();
# estableceremos los colores para bordes, fondos y textos
# color de borde
$MiPDF->SetDrawColor(255,0,0);
# color del relleno (gris)
$MiPDF->SetFillColor(200);
# color del texto
$MiPDF->SetTextColor(0,0,255);
# establecemos espesores de lineas y tipo y tamaño de letra
# espesor de linea 1 milimetro
$MiPDF->SetLineWidth(1);
# fuente y tamaño: Arial, negrita de 12 puntos
$MiPDF->SetFont("Arial","B",12);
# establecemos el texto para la primera celda
$celda1="Esto irá en la celda 1";
# determinamos el tamaño de esta cadena y lo recogemos
# en la variable ancho
$ancho=$MiPDF->GetStringWidth($celda1);
/* definimos la celda estableciendo:
ancho--- igual al de la cadena que va a contener + 6 mm.
alto --- 6 milimetros
texto--- el contenido de la variable $celda1
borde--- 1 (para que ponga los cuatro bordes
celda siguiente--- 0 (para que la incluya a continuación de la actual)
alineación --- C para que centre el texto en la celda horizontalmente
relleno --- 1 para que aplique el fondo a la celda
enlace--- pondremos un enlace al buscador google */

# como aun no hemos insertaod ningún elemento en la página
# la celda aparecerá en la parte superior de la página y apoyada
# sobre su borde izquierdo

$MiPDF->Cell($ancho+6,6,$celda1,1,0,C,1,"http://www.google.com");

/* pero modificando insertamos una nueva celda con el mismo contenido
modificando:
bordes--- ahora los pondremos solo por la parte superior T e inferior B
posicion de la siguiente celda: 2 (inmediatamente debajo)
relleno --0 */
# la nueva inserción se realizará a la derecha de la anterior
# ya que así lo especificamos al definir allí la celda siguiente
$MiPDF->Cell($ancho+6,6,$celda1,TB,2,C,0,"http://www.google.com");

# cambiamos el color del borde y el del relleno
# color de borde
$MiPDF->SetDrawColor(255,255,0);
# color del relleno (gris)
$MiPDF->SetFillColor(0,255,255);

/* una nueva inserción de una celda similar modificando
identica a la primera celda salvo el parámetro de posición
de la celda siguiente que cambiamos a 1 para que la celda
siguiente aparezca en el margen izquierdo del documento.
La actual, aparecerá inmediatamente debajo de la anterior
ya que se así se especificó en su Cell correspondiente */

$MiPDF->Cell($ancho+6,6,$celda1,1,1,C,1,"http://www.google.com");

# la misma función anterior que ahora debería aparecer en el margen izquierdo
# modificando la especificación para que inserte la potencial celda siguiente
# inmediatamente a la derecha

$MiPDF->Cell($ancho+6,6,$celda1,1,0,C,1,"http://www.google.com");

# insertamos un salto de línea de 10 mm.
$MiPDF->Ln(10);
# una nueva celda que por efecto del salto de linea
# perdería la referencia de situarse a la derecha de la anterior
# se desplazaría 10 unidades hacia abajo y se insertaría en el margen izquierdo
$MiPDF->Cell($ancho+6,6,$celda1,1,0,C,1,"http://www.google.com");

# modificaremos ahora el punto de inserción mediante SetXY a las coordenadas
# -100, -120 mm. valores negativos
# con lo cual las referencias serán al margen derecho y al inferior

$MiPDF->SetXY(-100,-120);

# vamos a crear un enlace interno mediante la función AddLink()
# y vamos a recoger el resultado en la variable $salta
$salta=$MiPDF->AddLink();
# estableceremos la referencia del enlace
$MiPDF->SetLink($salta,0,2);
# crearemos ahora una zona (transparente) de enlace
# será el rectangulo definido como parámetros en la la función Link
# es decir un rectango de 297mm. de ancho, 30 de alto
# que tendrá su esquina superior izquierda en el punto (0,40)
# este enlace nos llevará al lugar del documento
# que se especifique mediante SetLink($salta);
# que indi
$MiPDF->Link(0,40,297,30,$salta);
#comprobemos que allí se inserta el texto mediante el cell correspondiente
$MiPDF->Cell($ancho+6,6,$celda1,1,0,C,1,$salta);

# insertemos un salto de página y comprobemos la función nº de pagina
$MiPDF->Addpage();
#añadimos a la cadena de texto el valor del número de pagina actual
$MiPDF->Cell(50,6,"pagina nº".$MiPDF->PageNo(),1,0,C,1);
# activamos el valor por defecto del señalados de número total de páginas
# al no incluir nada como parámetro de la funcion AliasNbPages();
# deberemos recurri al señalador por defecto {nb}
$MiPDF->AliasNbPages();
# insertamos una nueva celda y añadimos a la cadena de texto
# anterior "de {nb}". Como puedes ver
# el señalador {nb} forma parte de la cadena como un texto más
$MiPDF->Cell(50,6,"pagina nº ".$MiPDF->PageNo()." de {nb}",1,0,C,1);

$MiPDF->Output();
?>





Ejemplo de creación de tablas



A continuación incluimos un ejemplo de utilización de estas funciones para la creación de tablas a partir de un fichero de texto.


En este ejemplo, utilizaremos saltos de página manuales y -dada la dimensión del fichero de texto- tendremos la oportunidad de comprobar el tiempo de generación de un documento de más de 200 páginas.


En páginas posteriores veremos como confeccionar la misma tabla utilizando encabezados, pies de página e inserción de páginas automáticas.

Ver código fuente Ver fichero de texto Crear el PDF





<--Anterior ------- Índice del manual de PHP ------- Siguiente -->

Manual de PHP 63. PDF. Textos en PDF

Fijación de márgenes

Algunas funciones de inserción de textos permiten colocar los mismos dentro de lo podría llamarse caja de texto que no es otra cosa que la superficie de la página delimitada por los márgenes de la misma.

Por defecto, estos márgenes miden un centímetro, por la izquierda, la parte superior y la derecha del documento. El tratamiento del margen inferior requiere una función específica que veremos en otro de los epígrafes de esta página.

$obj->SetMargins(iz,su,de)

Los parámetros iz, su y de son los valores numéricos que permiten establecer, -en la unidad de medida que se indique en el constructor- los márgenes izquierdo, superior y derecho, por este orden, del documento.

Si se omite el tercer parámetro (margen derecho) se le asignará el valor que se haya indicado para el izquierdo.

Margen inferior y salto de página

La función:

$obj->SetAutoPageBreak(a,b)

permite activar o desactivar el salto de página automático y establecer el margen inferior (mínimo) de las páginas. El parámetro a puede tomar dos valores: 1 ó 0 (cierto ó falso), que se corresponden con la condición activo/inactivo.

Cuando está activo se van añadiendo nuevas páginas, de forma automática, hasta que se incluya la totalidad del texto especificado. En el caso de estar inactivo, los textos que excedieran los límites de la página no se visualizarían ya que no se añadiría una nueva página.

Por defecto está opción está activada.

El segundo parámetro, el valor b, permite indicar el margen inferior mínimo de la página. Su valor -numérico- deberá indicarse en las unidades establecidas por el constructor. Si no se indica asumirá, por defecto, un valor igual a dos centímetros.

Color del texto

El color del texto se establece utilizando la siguiente función:

$obj->SetTextColor(R,G,B)

donde R, G, B son valores numéricos comprendidos entre 0 y 255 y que representan las respectivas componentes de los colores primarios: rojo, verde y azul. Si se utiliza con un sólo parámetro:

$obj->SetTextColor(K)

el valor numérico, también comprendido entre 0 y 255, establece colores de la escala de grises desde el negro (cero) hasta el blanco (255).

Si no se especifica color los textos aparecerán en negro.

Una vez establecido un color su valor se mantiente hasta que no sea invocada nuevamente la función SetTextColor para su modificación.

Tipo de letra, estilo y tamaño

Podemos asignar estos tres valores mediante la función:

$obj->SetFont(nom,est,tam)

donde nom es una cadena que debe indicar el nombre del tipo de letra elegido (Helvetica, Arial, Times, Zapfdingbats, Courier ó Symbol son las fuentes por defecto).

El estilo (est) puede indicarse mediante la cadena vacía ("") para el tipo normal o mediante B, I, U (negrita, cursiva, subrayada) o sus combinaciones, por ejemplo BU para negrita subrayada.

Las fuentes de símbolos sólo permiten el estilo normal. El parámetro tam especifica el tamaño de la letra expresado en puntos. Si no se especifica, el valor por defecto es 12 puntos.

Más adelante, dedicamos un apartado a la creación y utilización de nuevas fuentes tipográficas.

Posición actual

La clase FPDF dispone de funciones que determinan el valor actual de las coordenadas del punto de inserción (lugar donde se va a posicionar el texto, imagen o elemento gráfico que se incluya) y otras que permiten modificar esos puntos de inserción.

Son las siguientes:

$obj->GetX()
y
$obj->GetY()

que devuelven los valores la posiciones actuales, horizontal (X) y vertical (Y). El resultado estará expresado en las unidades establecidas por el constructor considerando como origen de coordenadas la esquina superior izquierda del documento y valores positivos -horizontal y vertical- los colocados a la derecha (X) y debajo (Y) del origen.

Para definir una nuevo punto de inserción se pueden usar cualquiera de estas funciones:

$obj->SetX(valor X)
$obj->SetY(valor Y)
$obj->SetXY(valor X, valor Y)

que permiten establecer el punto de inserción mediante sus coordenadas: horizontal, vertical o ambas.

Cuando el valor X (en el caso SetX) es negativo se considera con referencia al margen derecho de la página. De igual modo, cuando se asigna un valor negativo en SetY se considera respecto a la parte inferior de la página.

Saltos de línea

Mediante $obj->Ln (valor) se ejecuta un salto de línea. La posición actual regresa al margen izquierdo y la vertical se desplaza en el número de unidades indicado en el parámetro valor.

Inserción de textos

La forma más simple de inserción de textos –poco utilizada por el número de incovenientes que conlleva– es la que utiliza la función:

$obj->Text(x,y,texto)

donde x e y son los valores numéricos que representan las coordenadas del punto de la página en el que pretende realizarse la inserción y texto es una cadena (o una variable conteniendo una cadena) con el texto que se pretende insertar.

Esta función no considera ni los eventuales saltos de línea que pudiera haber en la cadena (inserta todo el texto en una sola línea) ni tampoco los márgenes del documento. Por ello puede ocurrir, tal como puedes comprobar en el ejemplo, que, por desbordar los márgenes del documento, no aparezcan los textos completos.

Una función mucho más útil es la siguiente:

$obj->Write(interlinea,texto)

en la que interlinea es el interlineado (expresado en la misma unidad utilizada por el constructor) y texto la cadena o variable que contiene el texto a insertar.

Se comporta de la siguiente forma:
  • Comienza a escribir el texto en la posición actual de punto de inserción.

  • La posición actual del punto de inserción. puede ser una de la siguientes:
    • La esquina superior izquierda del área de impresión de la página (en el caso en que se ha producido un salto de página y no se hubieran insertado elementos anteriormente.
    • La posición resultante del final de la inserción del el elemento anterior.
    • La posición establecida como posición actual mediante las funciones SetX, SetY ó SetXY

  • La inserción de textos mediante la función Text() no modifica la localización del punto de inserción ya que utiliza sus propias coordenadas de posicionamiento.

  • Una vez que la línea alcanza el margen derecho -establecido de forma explícita o por defecto- de la caja de texto produce un salto de línea automático.

  • Incluye los saltos de línea que encuentra en el propio texto (caso, por ejemplo, de inclusión de ficheros de texto) y también aquellos incluidos en la propia cadena medienta la secuencia de escape \n.

  • Si la opción AutoPageBreak (comentada al margen) está activada produce un salto de página automático al alcanzar el margen inferior de la página.

  • Alinea los textos a la izquierda sin permitir modificar la configuración de esta opción

<?
#incluimos el fichero con la clase y definimos la variable FPDF_FONTPATH
# con el mismo criterio comentado en el ejemplo anterior
include("fpdf.php");
define('FPDF_FONTPATH','c:/Apache/htdocs/cursoPHP/fontsPDF/');

/* establecemos las dimensiones del documento
creamos un nuevo objeto y añadimos una página*/
$dimensiones=array (140,200);
$MiPDF=new FPDF('P','mm',$dimensiones);

# ajustamos al 100% la visualización
$MiPDF->SetDisplayMode('real');


#insertamos una página en blanco
$MiPDF->Addpage();
# establecemos el color de la letra
$MiPDF->SetTextColor(255,0,0);
# establecemos la fuente a utilizar, estilo
# y tamaño en puntos. Al no incluir estilo
# considerará el estilo normal
$MiPDF->SetFont('Arial','',11);
# creamos una variable en la que incluimos un texto
$texto="Este es el texto que tendremos que escribir aquí dentro.\n";
$texto.="Esto habría de ir detrás de un salto de línea. Veremos si funciona o no. ";
$texto.="Estamos alargando la línea para comprobar el funcionamiento de ";
$texto.="las diferentes funciones";

# usamos el método Text para presentar el contenido de la variable
# situamos las coordenadas de inserción en el punto (30,40) mm.
# podremos observar que la función Text inserta todo el texto en
# una linea sin tener en cuenta si sobrepasa o no el borde del papel
# ni tampoco los caracteres de salto de línea
$MiPDF->Text(30,40,$texto);
# cambiamos el color de la letra. Al pasar un solo parámetro
# será interpretado como escala de grises 0 -255 (0 negro, 255 blanco)
$MiPDF->SetTextColor(200);
# cambiamos el tipo de letra (Helvetica y Arial son alias de la misma fuente)
$MiPDF->SetFont('Helvetica','B',11);
# utilizaremos la función Write para escribir el texto. Lo hará con
# alineación a la izquierda, interpretando los saltos de línea
# y efectuando uno automático cuando alcanza el margen.
# El valor de la interlinea se expresa en milímetros.

# Dado que la única inserción ha sido mediante Text() que no modifica el
# punto de inserción el resultado de este Write se incluirá al comienzo
# de la página, respetando los márgenes por defecto.
$MiPDF->Write(4,$texto);

# Comprobaremos los tipos de letra existentes en el directorio fonts.
$MiPDF->SetFont('Symbol','',11);
/* insertamos un salto de línea de 8 unidades que producirá
un desplazamiento del punto de inserción hasta el margen izquierdo
de una línea situada 8 unidades por debajo de la posición del final
de la cadena insertada anteriormente */
$MiPDF->Ln(8);
# escribimos el texto anterior con la letra Symbol
$MiPDF->Write(4,$texto);
# cambiamos nuevamente el tipo de letra
$MiPDF->SetFont('zapfdingbats','',11);
# insertamos un nuevo salto de párrafo de 8 unidades
# y repetimos la impresión del texto con la nueva tipografía
$MiPDF->Ln(8);
$MiPDF->Write(4,$texto);

# establecemos márgenes (izquierda, superior, derecha)
# expresados en la unidad usada por el constructor (mm).
# Serán utilizados en las páginas siguientes
$MiPDF->SetMargins(30,40,25);
# establecemos el modo de inserción automática de página
# indicando el margen inferior mínimo. El salto automático
# no sería necesario ya que, si no se especifica, se configura
# por defecto como tal
$MiPDF->SetAutoPageBreak(1,8);


# Insertamos una nueva página. En adelante
# los contenidos aprecerán en esa nueva página
$MiPDF->Addpage();
# cambiamos el color y tipo de letra
$MiPDF->SetTextColor(0,0,200);
$MiPDF->SetFont('Times','I',12);

# insertamos texto mediante Write y observaremos
# que ahora respeta los nuevos margenes
$MiPDF->Write(4,$texto);
# posicionamos el punto de inserción en las coordenadas
# (2,2) y escribimos de nuevo el texto.

$MiPDF->SetXY(2,2);

# al visualizar el documento podremos observar que solo
# respeta estas coordenadas la primera línea, ya que las siguientes
# se ajustan a los márgenes establecidos para la página
$MiPDF->Write(4,$texto);
# redimensionamos nuevamente los márgenes
$MiPDF->SetMargins(20,5,15);


# cambiamos a una nueva página
$MiPDF->Addpage();
# cambiamos el estilo de fuente a "normal"
$MiPDF->SetFont('Times','',12);
# leemos el fichero de texto y lo recogemos en una variables
$f1=fopen('regenta.txt','r');
$regenta1=fread($f1,filesize('regenta.txt'));
fclose($f1);

# insertamos el fichero mediante write
# podremos observar como se realiza el salto de página
# de forma automática respetando los márgenes inferiores
$MiPDF->Write(4,$regenta1);


# inseramos una nueva página
$MiPDF->Addpage();
# desactivamos el salto de página automatico
# con lo cual no será respetado el margen inferior
# y el texto rebasará ahora los límites del papal
$MiPDF->SetAutoPageBreak(0);
#ponemos el texto en negro y cursiva para poder
#diferenciar los resultados al visualizar el documento
$MiPDF->SetTextColor(0);
# reescribimos el texto anterior
$MiPDF->Write(4,$regenta1);
# visualizamos el documento
$MiPDF->Output();
?>