domingo, 13 de octubre de 2013

YII - Generar PDF



Al tener diferentes datos, es muy lógico que vamos a querer exportar esto a un formato, en este caso a PDF. Por suerte, YII trae algunas extensiones que nos facilitan mucho esto, ya que ocupan librerías de PHP para trabajar con PDF, como mpdf y html2pdf. 

La extensión que utilizaremos será yii-pdf, la cual la podemos descargar desde http://www.yiiframework.com/extension/pdf/ 

Al descargarla, debemos ubicar el directorio dentro de extensions, quedando: /protected/extensions/yii-pdf Luego debemos descargar las librerías que utiliza esta extensión, las podemos descargar desde: http://www.mpdf1.com/mpdf/download http://html2pdf.fr/en/download Estas las podemos ubicar en el directorio vendors (el directorio vendors lo debemos crear), quedando: /protected/vendors/mpdf /protected/vendors/html2pdf 

*Vendors es donde dejamos los elementos creados por terceros, que no son creados específicamente para el framework YII. 

En sí, no son necesarias ambas, sino, que la extensión nos permite utilizar cualquiera de las dos. Volviendo a la web de la extensión, copiamos el código en el fichero main.php, quedando algo como lo siguiente:

'components'=>array(
'ePdf' => array(
      		'class' => 'ext.yii-pdf.EYiiPdf',
		'params' => array(
             	'mpdf' => array(
'librarySourcePath' => 'application.vendors.mpdf.*',
                   	'constants' => array(
'_MPDF_TEMP_PATH' => Yii::getPathOfAlias('application.runtime'),
                    ),                    

		'class'=>'mpdf',
			
            ),
            'HTML2PDF' => array(
			'librarySourcePath' => 'application.vendors.html2pdf.*',
			'classFile' => 'html2pdf.class.php', 
            )
        ),
    ),
    //Resto del código

*El ejemplo que sale en la web, es mucho más extenso, pero elimine lo comentado. 

Ahora debemos configurar el controlador de donde queremos generar los PDF, según mi punto de vista, a diferencia del excel, en PDF no quiero generar todos los datos, sino, quiero generar fichas, por lo cual, se generará un PDF por registro, producto de lo anterior, debemos crear la función crearPDF, de la siguiente forma:

public function actionCrearPdf($id){
	$mPDF1 = Yii::app()->ePdf->mpdf();
	$mPDF1->WriteHTML(
		$this->render('pdf',array(
			'model'=>$this->loadModel($id), true
		))
	);
	$mPDF1->Output();
}

Luego, debemos crear una vista llamada pdf.php (puede tener otro nombre), por ejemplo, debería quedar algo como /protected/views/usuarios/pdf.php, este fichero debe componerse de la siguiente forma:


            
                RUN: 
                $model->rut-$model->dv
            
            
                Nombres:
                $model->nombre
            
            
                Apellidos:
                $model->apellidos
            
        
HERE;

$mpdf = new mPDF('utf-8','LETTER','','',15,15,25,12,5,7);
$mpdf->SetHeader(Yii::app()->name);
$mpdf->SetFooter('Pie de página');
$mpdf->SetWatermarkImage("/images/logo.jpg");
$mpdf ->showWatermarkImage = true;
$mpdf->WriteHTML($html);
$mpdf->Output('Ficha-Usuario_'.$model->rut.'-'.$model->dv.'.pdf','I');
exit;
?>


En el ejemplo anterior, tenemos una tabla que va mostrando los atributos del modelo, en este caso RUN,NOMBRE, APELLIDOS, luego empezamos a configurar mpdf. Con esto ya tenemos configurado para generar el PDF, ahora, agregaremos un ícono para acceder al PDF, para esto, vamos a la vista admin.php, y buscamos donde tenemos:
array (
	'class'=>'CButtonColumn',
),
y lo reemplazamos por:
array(
   'class'=>'CButtonColumn',
   'template' => '{view} {update} {delete} {pdf}',
   'buttons'=>array(
      'pdf' => array(
         'label'=>'Generar PDF', 
         'url'=>"CHtml::normalizeUrl(array('crearpdf', 'id'=>\$data->idusuarios))",
         'imageUrl'=>Yii::app()->request->baseUrl.'/images/pdf_icon.png', 
         'options' => array('class'=>'pdf'),
      ),
   ),
),

*Debemos tener una imagen de pdf, por ejemplo /images/pdf_icon.png 

Con esto, ya tenemos todo listo, y nos aparecerá un botón para acceder al pdf, como lo siguiente:

2 comentarios:

Este comentario ha sido eliminado por el autor.

Amigo me sigue dando un error me sale esto

Illegal string offset 'ID'

Publicar un comentario