------------------------------------------------------------------------------- $Id$ -----------------------------------------------------------------------------*/ require_once 'MECON/PDF/external/phppdflib.class.php'; /** * Liberia base para el manejo de pdf's. */ class MECON_PDF { /** * Orientacion (portrait o landscape). * @var sting $orientacion * @access public */ var $orientacion = "portrait"; /** * * Orientacion cambiada, indica la orientacion de la pagina cuando es * distinto al comun * @var array $orientacion_distinta * @access protected */ var $_orientacion_distinta = array(); /** * Configuracion * @var arary $config * @access protected */ var $_config = array (); /** * Libreria externa. * @var int $pdf * @access protected */ var $_pdf; /** * Identificacion de la pagina actual * @var int $pagina_actual * @access private */ var $_pagina_actual; /** * Array de paginas. * @var array $paginas * @access private */ var $_paginas = array(); /** * Nombre del archivo resultado para el display. * @var sting $nombre * @access private */ var $_nombre; /** * Class constructor. * * @param string $tam Tipo de hoja * @param string $ori Orientacion de las hojas (portrait o landscape). * @param string $nombre Nombre del archivo PDF. * * @return void * @access public */ function MECON_PDF($tam = "a4", $ori = "portrait", $nombre = "Doc.pdf") { setlocale (LC_ALL, 'en_US'); $this->orientacion = $ori; $this->_pdf = new pdffile; $this->_config = include 'MECON/PDF/medidas.php'; $this->_config = $this->_config[$tam]; $this->_nombre = $nombre; } /** * Permite agregar nuevas paginas al pdf que se esta armando. * * @param string $pagina Tipo de pagina que se va a utilizar. * @param string $orientacion Orientacion de la pagina en particular. * * @return void * @access public */ function newPage($pagina = "a4", $orientacion = null) { $this->_pagina_actual = $this->_pdf->new_page($pagina); $this->_paginas[] = $this->_pagina_actual; if(!is_null($orientacion) && $orientacion != $this->orientacion) $this->_orientacion_distinta[$this->numPage()] = $orientacion; } /** * Funcion que retorna la orientacion de la pagina indicada. * Si no se indica, toma la orientacion de la ultima pagina. * * @param int $pagina Numero de la pagina. * * @access public * @return int */ function getOrientation($pagina = null) { if(is_null($pagina)) $pagina = $this->numPage(); if(isset($this->_orientacion_distinta[$pagina])) return $this->_orientacion_distinta[$pagina]; else return $this->orientacion; } /** * Funcion que genera el archivo y prepara los headers para que se envie. * * @return void * @access public */ function display() { header("Content-Disposition: filename=".$this->_nombre); header("Content-Type: application/pdf"); $temp = $this->toPDF(); header('Content-Length: ' . strlen($temp)); echo $temp; } /** * Funcion que devuelve el PDF. * * @return string * @access public */ function toPDF() { return $this->_pdf->generate(); } /** * Funcion que permite agregar texto a una pagina. * * @param int $X $X * @param int $Y $Y * @param string $texto $texto * @param int $estilo $estilo * @param int $pag Numero de pagina virtual. * @param string $transformacion Indica la orientacion de la pagina. * * @return void * @access public */ function addText($X, $Y, $texto, $estilo = '', $pag = null, $transformacion = null) { $x = $X; $y = $Y; if(is_null($transformacion)) $transformacion = $this->getOrientation($pag); switch (strtolower($transformacion)) { case 'portrait': $X = $this->_portraitX($x,$y); $Y = $this->_portraitY($x,$y); break; case 'landscape': $X = $this->_landscapeX($x,$y); $Y = $this->_landscapeY($x,$y); @$estilo['rotation'] += 90; break; } $this->_pdf->draw_text($X, $Y, $texto, $this->refPage($pag), $estilo); } /** * Funcion que permite agregar un rectangulo a una pagina. * * @param int $Xi $Xi * @param int $Yi $Yi * @param int $Xf $Xf * @param int $Yf $Yf * @param long $estilo $estilo * @param int $pag Numero de pagina virtual. * @param string $transformacion Indica la orientacion de la pagina. * * @return void * @access public */ function addRectangle($Xi, $Yi, $Xf, $Yf, $estilo = '', $pag = null, $transformacion = null) { $xi = $Xi; $yi = $Yi; $xf = $Xf; $yf = $Yf; if(is_null($transformacion)) $transformacion = $this->getOrientation($pag); switch (strtolower($transformacion)) { case 'portrait': $Xi = $this->_portraitX($xi,$yi); $Yi = $this->_portraitY($xi,$yi); $Xf = $this->_portraitX($xf,$yf); $Yf = $this->_portraitY($xf,$yf); break; case 'landscape': $Xi = $this->_landscapeX($xi,$yi); $Yi = $this->_landscapeY($xi,$yi); $Xf = $this->_landscapeX($xf,$yf); $Yf = $this->_landscapeY($xf,$yf); break; } $this->_pdf->draw_rectangle($Yi, $Xi, $Yf, $Xf, $this->refPage($pag), $estilo); } /** * Funcion que permite agregar una linea a una pagina. * * @param int $Xi $Xi * @param int $Yi $Yi * @param int $Xf $Xf * @param int $Yf $Yf * @param int $estilo $estilo * @param int $pag Numero de pagina virtual. * @param string $transformacion Indica la orientacion de la pagina. * * @return void * @access public */ function addLine($Xi, $Yi, $Xf, $Yf, $estilo = '', $pag = null, $transformacion = null) { $xi = $Xi; $yi = $Yi; $xf = $Xf; $yf = $Yf; if(is_null($transformacion)) $transformacion = $this->getOrientation($pag); switch (strtolower($transformacion)) { case 'portrait': $Xi = $this->_portraitX($xi,$yi); $Yi = $this->_portraitY($xi,$yi); $Xf = $this->_portraitX($xf,$yf); $Yf = $this->_portraitY($xf,$yf); break; case 'landscape': $Xi = $this->_landscapeX($xi,$yi); $Yi = $this->_landscapeY($xi,$yi); $Xf = $this->_landscapeX($xf,$yf); $Yf = $this->_landscapeY($xf,$yf); break; } $this->_pdf->draw_line(array($Xi,$Xf),array($Yi,$Yf), $this->refPage($pag),$estilo); } /** * Funcion que permite agregar una imagen JPG a una pagina. * * @param string $archivo Path completo del archivo imagen. * @param int $X Posicion Horizontal. * @param int $Y Posixion vertical. * @param int $pag Numero de pagina virtual. * @param string $formato Formato del archivo (Extension). * @param string $transformacion Indica la orientacion de la pagina. * * @return void * @access public */ function addImage($archivo, $X, $Y, $pag = null, $formato = null, $transformacion = null) { $x = $X; $y = $Y; if(is_null($transformacion)) $transformacion = $this->getOrientation($pag); switch (strtolower($transformacion)) { case 'portrait': $X = $this->_portraitX($x,$y); $Y = $this->_portraitY($x,$y); break; case 'landscape': $X = $this->_landscapeX($x,$y); $Y = $this->_landscapeY($x,$y); break; } $formato = strtolower($formato); switch ($formato) { case 'jpg': $fh = fopen($archivo, "r"); $filedata = fread($fh, filesize($archivo)); fclose($fh); $image = $this->_pdf->jfif_embed($filedata); $this->_pdf->image_place($image, $Y, $X, $this->refPage($pag)); break; } } /** * Funcion que wrappea una linea. * * @param strgin $texto Texto que quiere wrappearse. * @param int $l_max Largo maximo del texto. * @param array $attr Atributos del texto. * * @return string * @access public */ function wrapLine($texto, $l_max, $attr) { //El if lo estoy haciendo porque en la funcion wordwrap de la libreria //externa no tienen en cuenta que te pueden pasar un texto vacio a //wrapear -> Amerita un mail a los autores. if ($texto) { return $this->_pdf->wrap_line ($texto, $l_max, $attr); } else { return ''; } } /** * Funcion que wrappea una linea. * * @param strgin $texto Texto que quiere wrappearse. * @param int $l_max Largo maximo del texto. * @param array $attr Atributos del texto. * * @return string * @access public */ function wordWrap($texto, $l_max, $attr) { //El if lo estoy haciendo porque en la funcion wordwrap de la libreria //externa no tienen en cuenta que te pueden pasar un texto vacio a //wrapear -> Amerita un mail a los autores. if ($texto) { return $this->_pdf->word_wrap ($texto, $l_max, $attr); } else { return array(); } } /** * Funcion que calcula cuanto va a ocupar cierto texto segun su formato en * una pagina. * * @param strgin $texto Texto que quiere medirse. * @param array $attr Atributos del texto. * * @return int * @access public */ function strlen($texto, $attr = '') { return $this->_pdf->strlen($texto, $attr); } /** * Funcion que devuelve la cantidad de paginas que contiene el documento. * * @return int * @access public */ function countPages() { return count($this->_paginas); } /** * Funcion que devuelve el numero de la pagina actual. * * @param mixed $id Identificador de la pagina. * * @return int * @access public */ function numPage($id = null) { $id = ($id) ? $id : $this->_pagina_actual; return (array_search($id, $this->_paginas)) + 1; } /** * Funcion que devuelve la referencia de una pagina vitual. Si no se pasa * nada utilizo la actual. * * @param int $pag Numero de pagina. * * @return int * @access public */ function refPage($pag = null) { return $pag ? $this->_paginas[$pag - 1] : $this->_pagina_actual; } /** * Funcion que devuelve el array de paginas * * @return array * @access public */ function getPages() { return $this->_paginas; } /** * Funcion que devuelve el ancho de la pagina. * * @param string $orientacion Orientacion de la pagina. * * @return int * @access public */ function getWidth($pagina = null, $orientacion = null) { if(is_null($orientacion)) $orientacion = $this->getOrientation($pagina); switch (strtolower($orientacion)) { case 'landscape': $width = $this->_config['Yf'] - $this->_config['Yi']; break; default: $width = $this->_config['Xf'] - $this->_config['Xi']; } return $width; } /** * Funcion que devuelve el alto de la pagina. * * @param string $orientacion Orientacion de la pagina. * * @return int * @access public */ function getHeight($pagina = null, $orientacion = null) { if(is_null($orientacion)) $orientacion = $this->getOrientation($pagina); switch (strtolower($orientacion)) { case 'landscape': $height = $this->_config['Xf'] - $this->_config['Xi']; break; default: $height = $this->_config['Yf'] - $this->_config['Yi']; } return $height; } /** * Funcion que devuelve la rotacion y traslacion para landscape. Variable X. * * @param int $x X * @param int $y Y * * @return int * @access protected */ function _landscapeX($x, $y) { return -$y + $this->_config['Xf']; } /** * Funcion que devuelve la rotacion y traslacion para landscape. Variable Y. * * @param int $x X * @param int $y Y * * @return int * @access protected */ function _landscapeY($x, $y) { return $x + $this->_config['Yi']; } /** * Funcion que devuelve la traslacion para portrait. Variable X. * * @param int $x X * @param int $y Y * * @return int * @access protected */ function _portraitX($x, $y) { return $x + $this->_config['Xi']; } /** * Funcion que devuelve la traslacion para portrait. Variable Y. * * @param int $x X * @param int $y Y * * @return int * @access protected */ function _portraitY($x, $y) { return $y + $this->_config['Yi']; } } ?>