]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MLIB/PDF/Texto.php
Se agrega un objeto que permite armar tablas html a partir de templates.
[mecon/meconlib.git] / lib / MLIB / PDF / Texto.php
1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
3                                     mlib
4 -------------------------------------------------------------------------------
5 This file is part of mlib.
6
7 mlib is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2 of the License, or (at your option)
10 any later version.
11
12 mlib is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15  
16 You should have received a copy of the GNU General Public License; if not,
17 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 Boston, MA  02111-1307  USA
19 -------------------------------------------------------------------------------
20 Creado: jue nov  6 16:13:38 ART 2003
21 Autor:  Martin Marrese <mmarre@mecon.gov.ar>
22 -------------------------------------------------------------------------------
23 $Id$
24 -----------------------------------------------------------------------------*/
25
26 require_once 'MLIB/PDF/Contenido.php';
27
28 /**
29  * Libreria de texto en PDF.
30  */
31 class MLIB_PDF_Texto extends MLIB_PDF_Contenido {
32     
33     /**
34      * Parrafos que componen el texto.
35      * @var array $parafos
36      * @access protected
37      */
38     var $_parrafos = array();
39
40     /**
41      * Estilos PDF para cada parrafo. Entre los estilos pdf se debe encontrar
42      * aquel que defina la alineacion 'align' => center, left o right
43      * @var array $estilos
44      * @access protected
45      */
46     var $_estilos = array();
47
48     /**
49      * Estilo estandar.
50      * @var array $estilo_defecto
51      * @access protected
52      */
53     var $_estilo_defecto = array (
54             'font'   => 'Helvetica-Bold',
55             'height' => 8,
56             'align'  => 'left'
57             );
58
59     /**
60      * Orientacion de las nuevas paginas
61      * @var string $orientacion  
62      * @access protected
63      */
64     var $_orientacion;
65
66     /**
67      * Indica si el encabezado debe ir en la nuevas paginas.
68      * @var bool $encabezado
69      * @access protected;
70      */
71     var $_encabezado;
72     
73     /**
74      * Class Constructor.
75      *
76      * @param string $orientacion Orientacion que tendran las nuevas paginas que
77      * esta clase genere.
78      * @param bool $encabezado Indica si las paginas nuevas que genere esta
79      * clase tendran el encabezado de MLIB_PDF_Marco.
80      *
81      * @return void
82      * @access public
83      */
84     function MLIB_PDF_Texto($orientacion = null, $encabezado = true) {
85         $this->_orientacion = $orientacion;
86         $this->_encabezado = $encabezado;
87     }
88
89     /**
90      * Funcion que se encarga de crear las nuevas paginas.
91      *
92      * @param &Object $MARCO MLIB_PDF_Marco
93      *
94      * @return void
95      * @access protected
96      */
97     function _newPage(&$MARCO) {
98         $tmp = ($this->_orientacion) ? $this->_orientacion :
99             $MARCO->getOrientation();
100         $MARCO->newPage($MARCO->tamanio, $tmp, $this->_encabezado);               
101     }
102    
103     /**
104      * Funcion que agrega el contenido del texto al PDF.
105      *
106      * @param &Object $MARCO MLIB_PDF_Marco.
107      *
108      * @return void
109      * @access public
110      */
111     function toPDF(&$MARCO) {
112         $alto = $MARCO->espacioDisponible;
113         if ($alto <= 0 ) {
114             $this->_newPage($MARCO);
115             $alto = $MARCO->espacioDisponible;
116         }
117         
118         $ancho_pagina = $MARCO->getWidth($MARCO->refPage(),$MARCO->getOrientation());
119         $orientacion = $MARCO->getOrientation();
120
121         for ($i=0; $i < count($this->_parrafos); $i++) {
122             if (@!$this->_estilos[$i]) {
123                 $this->_estilos[$i] = $this->_estilo_defecto;
124             }
125         
126             $txt = @$MARCO->wordWrap($this->_parrafos[$i], $ancho_pagina - 2,
127                     $this->_estilos[$i]);
128             
129             foreach ($txt as $t) {
130                 $alto -= $this->_estilos[$i]['height'];
131                 if ($alto <= 0) 
132                 {
133                     $this->_newPage($MARCO);
134                     $alto = $MARCO->espacioDisponible;
135                 }
136
137                 if (@$this->_estilos[$i]['align'] == 'center') {
138                     $tam = @$MARCO->strlen($t, $this->_estilos[$i]);
139                     $init = ($ancho_pagina - $tam) / 2;
140                 }
141                 elseif (@$this->_estilos[$i]['align'] == 'right') {
142                     $tam = @$MARCO->strlen($t, $this->_estilos[$i]);
143                     $init = $ancho_pagina - $tam + 1;
144                 }
145                 else {
146                     $init = 0;
147                 }
148
149                 $MARCO->addText($init, $alto + 2,
150                         $t, $this->_estilos[$i], null, $orientacion);
151             }
152         }
153         $MARCO->espacioDisponible = $alto;
154     }
155  
156     
157     /**
158      * Funcion que permite agregar parrafos al texto. Puede recibir un string
159      * con parrafos separados por \\n o un array con las mismas caracteristicas.
160      * Los estilos deben ser pasados dentro de un array, en donde a cada clave
161      * del array de contenido que se forme con el contenido le correspondera una
162      * clave del array de estilos. Existe la posibilidad de pasar solo un estilo
163      * y que este sea utilizado por todos los parrafos que se genere.
164      * 
165      * @param mixed $cont   Parrafos a agregar
166      * @param array $estilo Estilos de los parrafos.
167      *
168      * @access public
169      * @return void
170      */
171     function addContent($cont) {
172         if (is_string($cont)) {
173             $cont = split ("\n", $cont);
174         }
175         foreach ($cont as $c) {
176             //Me aseguro que lo que me pasen dentro del array de parrafos
177             //sean parrafos.
178             $c = split ("\n", $c); 
179             foreach ($c as $tmp) {
180                 if ($tmp) {
181                     $this->_parrafos[] = $tmp;
182                 }
183                 else {
184                     $this->_parrafos[] = ' ';
185                 }
186             }
187         }
188     }
189
190     /**
191      * Funcion que permite remover parrafos del texto. Recibe el id del parrafo
192      * (posicion dentro del array de parrafos). Elimina tambien el estilo que
193      * este tiene asociado en el array de parrafos.
194      * 
195      * @param int $pos Posicion del parrafo a eliminar.
196      *
197      * @access public
198      * @return void
199      */
200     function removeContent($pos) {
201         array_splice($this->_parrafos, $pos, 1);
202         array_splice($this->_estilos, $pos, 1);
203     }
204     
205     /**
206      * Funcion que permite setear los parrafos al texto. Recibe el texto (array
207      * o string) a agregar y una posicion en donde en donde ponerlo (posicion
208      * del array de parrafos). Si no recibe un identificador del parrafo, borra
209      * el contenido actual y agrega solamente lo que se paso por parametro.
210      * Los estilos deben ser pasados dentro de un array, en donde a cada clave
211      * del array de contenido que se forme con el contenido le correspondera una
212      * clave del array de estilos. Existe la posibilidad de pasar solo un estilo
213      * y que este sea utilizado por todos los parrafos que se genere.
214      * 
215      * @param int $pos      Posicion del/los parrafo/s
216      * @param mixed $cont   Parrafos a agregar
217      *
218      * @access public
219      * @return void
220      */
221     function setContent($pos, $cont) {
222         if (is_string($cont)) {
223             $cont = split ("\n", $cont);
224         }
225         foreach ($cont as $c) {
226             //Me aseguro que lo que me pasen dentro del array de parrafos
227             //sean parrafos.
228             $c = split ("\n", $c); 
229             foreach ($c as $tmp) {
230                 $parrafos[] = $tmp;
231             }
232         }
233         $tmp = array_slice ($this->_parrafos, 0, $pos);
234         $tmp = array_merge ($tmp, $parrafos, array_slice ($this->_parrafos, 
235                     $pos));
236         $this->_parrafos = $tmp;
237     }
238   
239     /**
240      * Funcion que permite modificar los estilos de uno o mas parrafos.
241      *
242      * @param mixed $pos Array o int que identifique la posicion de los parrafos.
243      * @param array $estilo Array de estilos.
244      *
245      * @access public
246      * @return void
247      */
248     function updateEstilo($pos, $estilo) {
249         if (@$this->_estilos[$pos]) {
250             $this->_estilos[$pos]  = array_merge($this->_estilos[$pos], $estilo);
251         }
252         else {
253             $this->setEstilo($pos, array_merge($this->_estilo_defecto, $estilo));
254         }
255     }
256     
257     /**
258      * Funcion que permite eliminar los estilos de uno o mas parrafos.
259      *
260      * @param mixed $pos Array o int que identifique la posicion de los parrafos.
261      *
262      * @access public
263      * @return void
264      */
265     function removeEstilo($pos) {
266         array_splice($this->_estilos, $pos, 1);
267     }
268
269     /**
270      * Funcion que permite setear los estilos de uno o mas parrafos.
271      *
272      * @param mixed $pos Array o int que identifique la posicion de los parrafos.
273      * @param array $estilo Array de estilos.
274      *
275      * @access public
276      * @return void
277      */
278     function setEstilo($pos, $estilo) {
279         $this->_estilos[$pos] = $estilo;
280     }
281
282     /**
283      * Devuelve el array de estilos o uno en particular.
284      *
285      * @param int $pos NĂºmero parrafo.
286      *
287      * @access public
288      * @return mixed
289      */
290     function getEstilo($pos = null) {
291         if ($pos) {
292             return $this->_estilos[$pos];
293         }
294         else {
295             return $this->_estilos;
296         }
297     }
298     
299     /*
300      * Devuelve el estilo por defecto.
301      *
302      * @access public
303      * @return mixed
304      */
305     function getEstiloDefecto() {
306         return $this->_estilo_defecto;
307     }
308
309     /**
310      * Funcion que devuelve el numero de parrafos que hay cargados.
311      *
312      * @access public
313      * @return int
314      */
315     function cantParrafos() {
316         return count($this->_parrafos);
317     }
318
319     /**
320      * Devuelve el array de parrafos
321      *
322      * @access public
323      * @return array
324      */
325     function getParrafos() {
326         return $this->_parrafos;
327     }
328 }
329 ?>