]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/PDF/Marco.php
Modifico PDF y PDF_Marco para cambiar la orientacion en cada pagina
[mecon/meconlib.git] / lib / MECON / PDF / Marco.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: Fri Oct 24 16:34:11 2003
22 Autor:  Martin Marrese <mmarre@mecon.gov.ar>
23 -------------------------------------------------------------------------------
24 $Id$
25 -----------------------------------------------------------------------------*/
26
27 require_once 'MECON/PDF.php';
28
29 /**
30  * Libreria que crea un marco estandar para los pdfs.
31  */
32 class MECON_PDF_Marco extends MECON_PDF {
33
34
35     /**
36      * Array de objetos MECON_PDF_Contenido
37      @ @var array $contenido
38      * @access protected
39      */
40     var $_contenido = array();
41     
42     /**
43      * Espacio dispobible en la pagina. Representa la coordenada Y a partir de
44      * la cual se puede comenzar a escribir el contenido.
45      * @var int $espacioDisponible
46      * @access public
47      */
48     var $espacioDisponible;
49
50     /**
51      * Logo.
52      * @var string $logo
53      * @access public
54      */
55     var $logo; 
56
57     /**
58      * Paginador.
59      * @var bool $paginador
60      * @access public 
61      */
62     var $paginador = true;
63
64     /**
65      * Fecha. Si es true se pone la fecha del servidor, si es false no se pone
66      * nada, en caso contrario se pone lo que haya en esta variable.
67      * @var mixed $fecha
68      * @access public
69      */
70     var $fecha = true;
71     
72     /**
73      * Seccion.
74      * @var string $seccion
75      * @access public 
76      */
77     var $seccion = '';
78
79     /**
80      * SubSeccion.
81      * @var string $subseccion
82      * @access public 
83      */
84     var $subseccion = 'Ministerio de Economia';
85
86     /**
87      * Titulo.
88      * @var string $string
89      * @access public 
90      */
91     var $titulo;
92
93     /**
94      * SubTitulo.
95      * @var string $subtitulo
96      * @access public 
97      */
98     var $subtitulo;
99
100     /**
101      * Excepciones al encabezado
102      * @var array $excepciones
103      * @access protected
104      */
105     var $_excepciones = array ();
106      
107     /**
108      * Class constructor.
109      *
110      * @param string $tam Tamanio de las hojas.
111      * @param string $ori Orientacion de las hojaz (portrait o landscape).
112      *
113      * @return void
114      * @access public
115      */
116     function MECON_PDF_Marco($tam = "a4", $ori = "portrait") {
117         $this->MECON_PDF($tam, $ori);
118         $this->tamanio = $tam;
119         $this->_resetConf();
120     }
121
122     /**
123      *  Funcion que setea los valores de conf para poder poner las cabeceras
124      *  @access private
125      *  @param int $pagina numero del la pagina de la que debe setear loa
126      *  valores
127      *  @return void
128      */
129     function _resetConf($pagina = null)
130     {
131         if(is_null($pagina));
132           $pagina = $this->numPage();
133         $tmp = include 'MECON/PDF/Marco/medidas.php' ; 
134         $tmp = $tmp[$this->tamanio][$this->getOrientation($pagina)];
135         $tmp['Xi'] = $this->_config['Xi'];
136         $tmp['Yi'] = $this->_config['Yi'];
137         $tmp['Xf'] = $this->_config['Xf'];
138         $tmp['Yf'] = $this->_config['Yf'];
139         $this->_config = $tmp;
140         if (@$this->_config['encabezado']['logo']['path']) {
141             $this->logo = $this->_config['encabezado']['logo']['path'];
142         }
143     }
144
145     /**
146      * Permite agregar nuevas paginas al pdf que se esta armando.
147      *
148      * @param string $pagina Tipo de pagina que se va a utilizar.
149      * @param string $orientacion Orientacion de la hoja
150      * @param bool $encabezado Indica si el encabezado debe ponerse en la
151      * pagina.
152      * @param string $seccion Seccion del encabezado para esta pagina nueva.
153      * @param string $subseccion SubSeccion del encabezado para esta pagina 
154      * nueva.
155      *
156      * @return void
157      * @access public
158      */
159     function newPage($pagina = 'a4', $orientacion = null, $encabezado = true, $seccion = null, $subseccion =
160             null)
161     {   
162         parent::newPage($pagina, $orientacion);
163         if ($encabezado) {
164             $this->espacioDisponible = $this->_config['encabezado']['Yi'] - 27;
165             if ($this->countPages() === 1) {
166                 if ($this->titulo || $this->subtitulo) {
167                     $this->espacioDisponible -= 27;
168                 }
169             }
170             if (!is_null($seccion)) {
171                 $this->excepciones[$this->countPages()]['seccion'] = $seccion;
172             }
173             if (!is_null($subseccion)) {
174                 $this->excepciones[$this->countPages()]['subseccion'] = $subseccion;
175             }
176         }
177         else {
178             $this->espacioDisponible = $this->_config['encabezado']['Yf'];
179             $this->excepciones[$this->countPages()]['nova'] = true;
180             
181         }
182     }
183
184     /**
185      * Funcion que agrega el logo al encabezado de una pagina.
186      *
187      * @return void
188      * @access protected
189      */
190     function _addLogo() {
191         $this->_resetConf();
192         $conf = $this->_config['encabezado'];
193         if ($this->logo) {
194             $this->addImage($this->logo, $conf['logo']['X'],
195                     $conf['logo']['Y'], null, 'jpg');
196         }
197     }
198
199     /**
200      * Funcion que agrega la seccion al encabezado de una pagina.
201      *
202      * @return void
203      * @access protected
204      */
205     function _addSeccion() {
206         $this->_resetConf();
207         $conf = $this->_config['encabezado'];
208         if ($this->seccion) {
209             $tmp = $this->strlen($this->seccion, $conf['seccion']);
210             $tmp2 = $conf['linea2']['Xi'] - $conf['linea1']['Xi'];
211             if ($tmp >= $tmp2) {
212                 $this->seccion = $this->wrapLine ($this->seccion, $tmp2,
213                         $conf['seccion']);
214                 $tmp = $this->strlen($this->seccion, $conf['seccion']);
215             }
216             $init = $conf['linea1']['Xi'] + ( $conf['linea2']['Xi'] 
217                     - $conf['linea1']['Xi'] - $tmp) / 2; 
218             $this->addText($init, $conf['seccion']['Y'], $this->seccion,
219                     $conf['seccion']);
220         }
221     }
222    
223     /**
224      * Funcion que agrega la subseccion al encabezado de una pagina.
225      *
226      * @return void
227      * @access protected
228      */
229     function _addSubSeccion() {
230         $this->_resetConf();
231         $conf = $this->_config['encabezado'];
232         if ($this->subseccion) {
233             $tmp = $this->strlen($this->subseccion, $conf['subseccion']);
234             $tmp2 = $conf['linea2']['Xi'] - $conf['linea1']['Xi'];
235             if ($tmp >= $tmp2) {
236                 $this->subseccion = $this->wrapLine ($this->subseccion, $tmp2,
237                         $conf['subseccion']);
238                 $tmp = $this->strlen($this->subseccion, $conf['subseccion']);
239             }
240             $init = $conf['linea1']['Xi'] + ( $conf['linea2']['Xi'] 
241                     - $conf['linea1']['Xi'] - $tmp) / 2; 
242             $this->addText($init, $conf['subseccion']['Y'], $this->subseccion, 
243                     $conf['subseccion']);
244         }
245     }
246
247     /**
248      * Funcion que agrega el paginador al encabezado de una pagina.
249      *
250      * @return void
251      * @access protected
252      */
253     function _addPager() {
254         $this->_resetConf();
255         $conf = $this->_config['encabezado'];
256         if ($this->paginador) {
257             $txt = 'Pagina '.$this->numPage().' de '.
258                 $this->countPages();
259             $tmp = $this->strlen($txt, $conf['paginador']);
260             $init = $conf['linea2']['Xi'] + ( $conf['Xf'] 
261                     - $conf['linea2']['Xi'] - $tmp) / 2; 
262             $this->addText($init, $conf['paginador']['Y'], $txt, 
263                     $conf['paginador']);
264         }
265     }
266     
267     /**
268      * Funcion que permite agregar la fecha al encabezado de una pagina.
269      *
270      * @return void
271      * @access protected
272      */
273     function _addDate() {
274         $this->_resetConf();
275         $conf = $this->_config['encabezado'];
276         if ($this->fecha) {
277             if (is_a($this->fecha, 'Date')) {
278                 $this->fecha = $this->fecha->format("%d/%m/%Y");
279             }
280             elseif ($this->fecha === true) {
281                 $this->fecha = date("d/m/Y");
282             }
283             $tmp = $this->strlen($this->fecha, $conf['fecha']);
284             $init = $conf['linea2']['Xi'] + ( $conf['Xf'] 
285                     - $conf['linea2']['Xi'] - $tmp) / 2; 
286             $this->addText($init, $conf['fecha']['Y'], $this->fecha,
287                     $conf['fecha']);
288         }
289     }
290     
291     /**
292      * Funcion que arma el recuadro del encabezado de las paginas.
293      * 
294      * @return void
295      * @access protected
296      */
297     function _addHeaderRectangle() {
298         $this->_resetConf();
299         $conf = $this->_config['encabezado'];
300         //Armo el recuadro
301         $this->addRectangle ($conf['Xi'], $conf['Yi'], $conf['Xf'], 
302                     $conf['Yf'], '');
303         $this->addLine($conf['linea1']['Xi'], $conf['linea1']['Yi'], 
304                 $conf['linea1']['Xf'], $conf['linea1']['Yf'], '');
305         $this->addLine($conf['linea2']['Xi'], $conf['linea2']['Yi'], 
306                 $conf['linea2']['Xf'], $conf['linea2']['Yf'], '');
307     }
308
309     /**
310      * Funcion que permite agregar el titulo a una pagina.
311      *
312      * @return void
313      * @access protected
314      */
315     function _addTitle() {
316         $this->_resetConf();
317         $conf = $this->_config['titulo'];
318         if ($this->titulo) {
319             $tmp = $this->strlen($this->titulo, $conf);
320             $tmp2 = $this->getWidth();
321             if ($tmp >= $tmp2) {
322                 $this->titulo = $this->wrapLine ($this->titulo, $tmp2,
323                         $conf);
324                 $tmp = $this->strlen($this->titulo, $conf);
325             }
326             $init = ($tmp2 - $tmp) / 2; 
327             $this->addText($init, $conf['Y'], $this->titulo, 
328                     $conf);
329         }
330     }
331
332     /**
333      * Funcion que permite agregar el subtitulo a una pagina.
334      *
335      * @return void
336      * @access protected
337      */
338     function _addSubTitle() {
339         $this->_resetConf();
340         $conf = $this->_config['subtitulo'];
341         if ($this->subtitulo) {
342             $tmp = $this->strlen($this->subtitulo, $conf);
343             $tmp2 = $this->getWidth();
344             if ($tmp >= $tmp2) {
345                 $this->subtitulo = $this->wrapLine ($this->subtitulo, $tmp2,
346                         $conf);
347                 $tmp = $this->strlen($this->subtitulo, $conf);
348             }
349             $init = ($tmp2 - $tmp) / 2; 
350             $this->addText($init, $conf['Y'], $this->subtitulo, 
351                     $conf);
352         }
353     }
354     
355     /**
356      * Funcion que agrega el encabezado a la pagina actual.      
357      *
358      * @param bool $title Muetra o no el titulo.
359      * @param bool $subtitle Muestra o no el subtitulo.
360      *
361      * @return void
362      * @access protected
363      */
364     function _buildHeader($title = true, $subtitle = true) {
365         $this->_resetConf();
366         $this->_addLogo();
367         $this->_addSeccion();
368         $this->_addSubseccion();
369         $this->_addPager();
370         $this->_addDate();
371         $this->_addHeaderRectangle();
372         if ($title) {
373             $this->_addTitle();
374         }
375         if ($subtitle) {
376             $this->_addSubTitle();
377         }
378     }
379
380     /**
381      * Funcion que agrega el contenido al PDF.
382      *
383      * @return void
384      * @access protected
385      */
386     function _buildContent() {
387         $this->_resetConf();
388         if ($this->_contenido) {
389             foreach ($this->_contenido as $cont) {
390                 $cont->toPDF($this); 
391                 //MECON_PDF_Marco se pasa por referencia para que se agregen las
392                 //paginas a medida que se van necesitando. Esto permite que varie el
393                 //tipo de contenido que se agrega.
394             }
395         }
396     }
397
398     /**
399      * Funcion que se encarga de transformar la informacion para que se genere
400      * el archivo pdf.
401      *
402      * @return pdffile Archivo PDF.
403      * @access public
404      */
405     function toPDF() {
406         $this->newPage($this->tamanio);
407         $this->_buildContent();
408         if ($this->getPages()) {
409             $t = true;
410             foreach ($this->getPages() as $page) {
411                 $this->_pagina_actual = $page;
412                 
413                 $sec = $this->seccion;
414                 $subsec = $this->subseccion;
415                 
416                 if (@$this->_excepciones[$this->numPage($page)]['seccion']) {
417                     $this->seccion = 
418                         $this->_excepciones[$this->numPage($page)]['seccion'];
419                 }
420                 
421                 if (@$this->_excepciones[$this->numPage($page)]['subseccion']) {
422                     $this->subseccion = 
423                         $this->_excepciones[$this->numPage($page)]['subseccion'];
424                 }
425                 
426                 if (@!$this->_excepciones[$this->numPage($page)]['nova']) {
427                     $this->_buildHeader($t, $t);      
428                 }
429                 $t = false;
430                 
431                 $this->seccion = $sec;
432                 $this->subseccion = $subsec;
433             }
434         return parent::toPDF();
435         }
436     }
437
438     /**
439      * Funcion que pemite agregar contenido al PDF.
440      *
441      * @param mixed $contenido Objeto contenido que se agrega.
442      * @param bool $separador Indicacion si hay que agregar un separador.
443      *
444      * @return void
445      * @access public
446      */
447     function addContent($contenido, $separador = true) {
448         if ($separador && $this->getPages()) {
449             //@TODO Agregar el separador por defecto.
450             //$this->contenido[] = $separador_defecto
451         }
452         $this->_contenido[] = $contenido;
453     }
454 }
455 ?>