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);
}

?>






No hay comentarios: