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