[Solucionado] Salto de Pagina mPDF

Buenos dias Comunidad.

Tengo un informe pdf generado a partir de un CGridView, el cual funciona muy bien, el problema que tengo es que necesito que los informes generados sean por cada usuario(cliente). Por lo cual he optado por hacer un salto de pagina cada que cambien el id del usuario y de esta manera tener el informe pdf en paginas distintas por cada usuario, pero no he logrado que funcione, la funcion que he utilizado para esto es


$mPDF->AddPage(); 

, por lo cual quisiera que me ayudaran con respecto a lo que debo hacer, si alguien tiene experiencia relacionada con el tema, y la libreria mPDF, agradeceria mucho su ayuda.

De antemano muchas gracias.

(Dejo el controlador y la vista).

Controlador




 public function actionGenerarPdf()

	{

		$session = new CHttpSession;

		$session->open();

		$model =$_SESSION['datos_filtrados']->getData();

		

		 $mPDF1 = Yii::app()->ePdf->mpdf('utf-8','Letter','','',15,15,35,25,9,9,'L'); //Esto lo pueden configurar como quieren, para eso deben de entrar en la web de MPDF para ver todo lo que permite.

		 $mPDF1->useOnlyCoreFonts = true;

		 $mPDF1->SetTitle("La Patria-Reportes-".$this->id); //Titulo de la ventana

		 $mPDF1->SetSubject('Reporte de documentos y listados la patria S.A');

		 $mPDF1->SetAuthor(Yii::app()->user->name);//Titulo del autor del archivo

		 $mPDF1->SetWatermarkText("La Patria S.A"); //Marca de agua

		 $mPDF1->showWatermarkText = true; // activar/Desactiuvar marca de agua (True/false)

		 $mPDF1->watermarkTextAlpha = 0.1; // Trasnparencia de la marca de agua (0-1)

		 $mPDF1->AddPage('P'); // Orientacion de la pagina (P/L)

		 $mPDF1->SetDisplayMode('fullpage'); // Modo de visualizacion a pantalla completa.

		 $mPDF1->WriteHTML($this->renderPartial('pdfReportMovimiento', array('model'=>$model, 'mpdf'=>$mPDF1), true)); //hacemos un render partial a una vista preparada, en este caso es la vista pdfReportDepartamento

		 $mPDF1->Output('Reportes'."-".$this->id."-".date('Y-m-d-H-i-s'),'I');  //Nombre del pdf y parámetro para ver pdf o descargarlo directamente.</pre>


	}



Vista pdfReportMovimiento.php




 <?php $contador=count($model); if ($model !== null):?>

	<html>

	<head>

		<style>

			body {font-family: sans-serif;

				font-size: 10pt;

			}

			p { margin: 0pt;

			}

			td { vertical-align: top; }

			.items td {

				border-left: 0.1mm solid #000000;

				border-right: 0.1mm solid #000000;

			}

			table thead td { background-color: #EEEEEE;

				text-align: center;

				border: 0.1mm solid #000000;

			}

			.items td.blanktotal {

				background-color: #FFFFFF;

				border: 0mm none #000000;

				border-top: 0.1mm solid #000000;

			}

			.items td.totals {

				text-align: right;

				border: 0.1mm solid #000000;

			}

		</style>

	</head>

	<body>


<!--mpdf

 <htmlpageheader name="myheader">

 <table width="100%"><tr>

 <td width="50%" style="color:#000000;"><span style="font-weight: bold; font-size: 14pt;">La Patria S.A</span><br />Manizales-Caldas<br /><span style="font-size: 15pt;">☎</span> (6) 878 17 00</td>

 <td width="50%" style="text-align: right;"><b>Reporte Movimientos</b></td>

 </tr></table>

 </htmlpageheader>

 

<htmlpagefooter name="myfooter">

 <div style="border-top: 1px solid #000000; font-size: 9pt; text-align: center; padding-top: 4mm; ">

 Página {PAGENO} de {nb}

 </div>

 <div style="color:#000000; text-align: center;"><small style="font-weight: bold; font-size: 8pt;" >CONTÁCTENOS. MANIZALES PRINCIPAL: Dirección: Carrera 20 # 46- 35 Teléfono: (6) 878 17 00 E-mail: lapatria@lapatria.com. 

 <br> OFICINA CENTRO: Tel: 8730808. OFICINA PALERMO: Tel: 8873330. BOGOTÁ: Telefax: 2356351-2497028. MEDELLÍN: Tel: 2688374. CHINCHINÁ. Tel: 8400571.</small></div>

 </htmlpagefooter>

 

 <sethtmlpageheader name="myheader" value="on" show-this-page="1" />

 <sethtmlpagefooter name="myfooter" value="on" />

 mpdf-->


 <div style="text-align: right"><b>Fecha: </b><?php date_default_timezone_set('America/bogota'); echo date('Y-m-d H:i:s'); ?> </div>

 <?php $cliente = $model[0]->cliente_idcliente; ?>

 <table align="center">

 	<tr>

 		<td align="center"><b>LISTADO DE MOVIMIENTOS</b></td>

 	</tr>

 </table>

 <b>Total Resultados:</b> <?php echo $contador; ?>

 <table class="items" width="100%" style="font-size: 9pt; border-collapse: collapse;" cellpadding="5">

 	<thead>

 		<tr>

 		<td width="16.666666666667%">TIPO PUBLICACIÓN</td>

 			<td width="16.666666666667%">RAZON SOCIAL</td>

 			<td width="16.666666666667%">CODIGO CLIENTE</td>

 			<td width="16.666666666667%">FECHA MOVIMIENTO</td>

 			<td width="16.666666666667%">ENTREGA</td>

 			<td width="16.666666666667%">DEVOLUCION</td>

 			<td width="16.666666666667%">FALTANTE</td>

 			<td width="16.666666666667%">VR.UNIT</td>

 			<td width="16.666666666667%">TOTAL VALOR</td>

 		</tr>

 	</thead>

 	<tbody>

 		<!-- ITEMS -->

 		<?php foreach($model as $row): ?>

 			<tr>

 				<td align="center">

 					<?php echo $row->tipopublicacionIdtipopublicacion->nombretipopublicacion	; ?>

 				</td>

 				<td align="center">

 					<?php echo $row->clienteIdcliente->razonsocial; ?>

 				</td>

 				<td align="center">

 					<?php echo $row->clienteIdcliente->clientecod;?>

 				</td>

 				<td align="center">

 					<?php echo $row->fechamov;?>

 				</td>

 				<td align="center">

 					<?php echo $row->entrega;?>

 				</td>

 				<td align="center">

 					<?php echo $row->devolucion;?>

 				</td>

 				<td align="center">

 					<?php echo $row->faltante;?>

 				</td>

 				<td align="center">

 					<?php echo $row->vlrunitario;?>

 				</td>

 				<td align="center">

 					<?php echo $row->vlrdia;?>

 				</td>

 			</tr>

 			

 		<?php endforeach; ?>

 		<!-- FIN ITEMS -->

 		<tr>

 			<td class="blanktotal" colspan="9" rowspan="9"></td>

 		</tr>

 	</tbody>

 </table>

</body>

</html>

<?php endif; ?>



Buenas.

No sé si ese será tu problema pq en tu código no imprimes nada antes de generar una nueva página, pero en todos los ejemplos que he visto, antes de hacer el




$mpdf->AddPage();



se escribe el contenido ya existente.

Sería algo así:




$mpdf=new mPDF();

$mpdf->WriteHTML('Page 1');

$mpdf->AddPage();

$mpdf->WriteHTML('Page 2');

$mpdf->AddPage();

$mpdf->WriteHTML('Page 3');



Aplicando esto a la extensión Yii que utilizas, claro.

Un saludo.

Buenas Tardes, lagogz.

Muchas gracias por responder, tienes razon en el codigo quite lo que tenia de salto de pagina por que no me funcionaba, pero es que no se como debo utilizar la funcion:


 $mpdf->AddPage()

Por que en la vista pdfReportMovimiento.php estoy recibiendo el objeto $model que viene cargado con los datos que deseo mostrar en una tabla en pdf, pero entonces lo que necesito es que cada que cambie el id del usuario(cliente), haga el salto de pagina y me genere los datos de ese cliente especifico. Ejm:




<?php $cleinte = $model[0]->clienteIdCliente; ?> // Guardo el primer id.

 <?php foreach($model as $row): ?>

                        <tr>

                                <td align="center">

                                        <?php echo $row->tipopublicacionIdtipopublicacion->nombretipopublicacion        ; ?>

                                </td>

                                <td align="center">

                                        <?php echo $row->clienteIdcliente->razonsocial; ?>

                                </td>

                                <td align="center">

                                        <?php echo $row->clienteIdcliente->clientecod;?>

                                </td>

                                <td align="center">

                                        <?php echo $row->fechamov;?>

                                </td>

                                <td align="center">

                                        <?php echo $row->entrega;?>

                                </td>

                                <td align="center">

                                        <?php echo $row->devolucion;?>

                                </td>

                                <td align="center">

                                        <?php echo $row->faltante;?>

                                </td>

                                <td align="center">

                                        <?php echo $row->vlrunitario;?>

                                </td>

                                <td align="center">

                                        <?php echo $row->vlrdia;?>

                                </td>

                        </tr>

                        <?php if($row->clienteIdCliente != $cliente) //Pregunto si cambio el id, y hago el salto de pagina para imprimir en la siguiente hoja la misma tabla pero solo con los datos de ese cliente.

                                   $mpdf->AddPage();

                                   $cliente = $row->clienteIdCliente;// la variable cliente es igual al nuevo id para que cada vez que cambie salte a la otra pagina en mi pdf ?>

                <?php endforeach; ?>



Esto seria mas o menos lo que necesito hacer, no se si puedas darme una mejor idea de como hacerlo.

Muchas gracias.

Buenos días, grifan.

Creo que estás confundiendo conceptos.

Por una parte tienes tu vies, donde muestras los datos que deseas sacar en el informe. En esta view no tienes que hacer nada con mPDF, sólo es una view en la que vas a mostrar los datos.

Por otra parte tienes tu actionGenerarPdf, que es ahí donde tienes que poner el condicional para que te salte de página!!!!!!

Por ejemplo:




 public function actionGenerarPdf()

{

     $session = new CHttpSession;

     $session->open();

     $model = $_SESSION['datos_filtrados']->getData();

                

     $mpdf = Yii::app()->ePdf->mpdf('utf-8','Letter','','',15,15,35,25,9,9,'L');

....

....

     $control = $model[0]->clienteIdCliente;

     $datosImprimir = '';


     foreach($model as $fila)

     {

          if($control != $fila->clienteIdCliente)

          {

               $mpdf->WriteHTML($datosImprimir);

               $mpdf->AddPage();

               $datosImprimir = '';

          }

          else

          {

               $datosImprimir = 'lo que sea';

          }

     }


     if(!empty($datosImprimir))

          $mpdf->WriteHTML($datosImprimir);

     

....

....



Tu en la variable $datosImprimir puedes añadir tags HTML, y vas construyendo tus tablas de impresión. No te hace falta el renderPartial.

Si lo quieres hacer por renderPartial, tendrías que hacer tantos renderPartial como distintos identificadores de clientes tengas, y a cada renderPartial le pasarías sólo los datos de ese identificador de cliente. Es decir, dentro del bucle irías construyendo un array con los datos de un único identificador de cliente, y en el condicional harías algo como esto:




if($control != $fila->clienteIdCliente)

{

     $mpdf->WriteHTML($this->renderPartial('pdfReportMovimiento', array('datosImprimir'=>$datosImprimir));

....



Después en tu view llenas la tabla y listo.

Un saludo.

Buenos dias, lagogz.

Muchas gracias por tu respuesta, te cuento que estoy trabajando con la segunda forma que me indicaste, ya que como ya tengo la vista creada pienso que es una buena forma, con respecto a la forma como se hace, quisiera contarte que funciona y de nuevo gracias por darme esa luz, pero hay un problema hice lo que me recomiendas y en un array estoy cargando los datos de un cliente, y cada vez pregunto por el condicional de control, efectivamente cuando el id del cliente cambia, el action va y me hace el renderPartial, con el array que cargue con los datos de ese cliente, pero luego que me hace el renderPartial(con Exito). No regresa al action y no continua con el bucle, no se como prodria solucionarlo.

Mira como tengo el action actuamente.




 public function actionGenerarPdf()

	{

		$session = new CHttpSession;

		$session->open();

		$model =$_SESSION['datos_filtrados']->getData();

		

		 $mPDF1 = Yii::app()->ePdf->mpdf('utf-8','Letter','','',15,15,35,25,9,9,'L'); 

		 ....

                 ....

                 ....

                 $mPDF1->SetDisplayMode('fullpage'); // Modo de visualizacion a pantalla completa.

                 $cliente = array(); //Array para los datos del cliente especifico

		 $idcliente = $model[0]->cliente_idcliente; //Id para el control


		 foreach ($model as $key => $value) {

		 	$cliente[$key] = $value; 

		 	if ($idcliente != $value->cliente_idcliente) {

		 		$idcliente = $value->cliente_idcliente;//Iguala idcliente para el control del proximo cliente

		 		$mPDF1->WriteHTML($this->renderPartial('pdfReportMovimiento', array('model'=>$cliente), true)); //hacemos un renderPartial a una vista preparada, con los datos de un cliente especifico

		 		unset($cliente);//Dejo vacio el array para luego cargar los datos del siguiente cliente

		 	}

		 }

		 $mPDF1->Output('Reportes'."-".$this->id."-".date('Y-m-d-H-i-s'),'I');  //Nombre del pdf y parámetro para ver pdf o descargarlo directamente.</pre>


	}



Pues el código del renderPartial lo tienes bien.

Cómo sabes que no te sigue el action? te dá un error? imprime todo sin separar por cliente? no imprime el informe? página en blanco?

De todas formas en tu código te faltaría esto:




...

unset($cliente);

$mPDF1>AddPage();

...



Y deberías de cambiar el código de dentro de tu bucle por esto otro:




...

if ($idcliente != $value->cliente_idcliente) 

{

     $idcliente = $value->cliente_idcliente;

     $mPDF1->WriteHTML($this->renderPartial('pdfReportMovimiento',

                       array('model'=>$cliente), true)); 

     unset($cliente);

}


$cliente[$key] = $value;

...



Pq sino vas a perder un value cada vez que cambies de identificador de cliente, y el próximo renderPartial debería darte un error pq en la vista intentarás mostras un índice del array que no existe…

Dame más datos del error que te saca.

Un saludo.

Hola logogz.

Mira de hecho no me genera ningun error, cuando cambia el id el va y me hace el renderPartial con los datos de ese cliente, todo perfecto. Yo esa vista la estoy generando en una nueva pestaña en el navegador, pero supongo que el action no continua, por que ya no pasa nada más, simplemente me deja en el pdf generado y ps mi aplicacion no realiza nada más.

Y añadi lo que me dices que faltaba en el código, y si me hace el salto de pagina pero en blanco. Ya que despues de hacer un salto de pagina, se le debe enviar los datos que se escribiran en la nueva pagina.(que de hecho tu me enseñaste esa parte).

No se si te queda claro, lo que esta pasando.

Buenas grifan.

Si me queda claro. Entiende que tu el renderPartial no lo envías a ningun sitio, ya que como tercer parámetro le estás pasando true. Esto quiere decir que renderPartial no hace un echo, sino un return, con lo que no se imprime nada en el navegador.

Creo que tu problema es el bucle, ya que el código que viene después del renderPartial se está ejecutando.

Diría que sólo te está haciendo el bucle para el primer grupo de valores. La estructura que tú pones es para arrays unidimensionales, pero tú deberías tener un array multidimensional (array de arrays).

Prueba con:




.....

.....

$i = 0;


foreach($model as $fila)

{

     if ($idcliente != $fila['cliente_idcliente']) 

     {

          $idClente = $fila['cliente_idcliente'];

          $mPDF1->WriteHTML($this->renderPartial('pdfReportMovimiento',

                             array('model'=>$cliente), true)); 

          unset($cliente);

          $mPDF1>AddPage();


          $i = 0;

     }


     // Esto lo podrías hacer con un bucle con la estructura del que tú tienes, pero

     // no veo que sea necesario.

     $cliente[$i]['cliente_idcliente'] = $fila['cliente_idcliente'];

     $cliente[$i]['nombre'] = $fila['nombre'];

     $cliente[$i]['apellidos'] = $fila['apellidos'];

     // Y todos los datos que tengas.


     $i++;

.....

.....



Un saludo.

Buenas Logogz.

Quiero darte las gracias por que sin tu ayuda no lo hubiera logrado, implemente lo utlimo que me aconsejaste con unas pequeñas variaciones, hasta que me funciono lo que necesitaba, ¡YA PUEDO GENERAR INFORMES SEPARADOS POR CADA CLIENTE!. Adjunto como quedo al final el controlador, y te cuento cuales fueron las variaciónes.




 $mPDF1->SetDisplayMode('fullpage'); // Modo de visualizacion a pantalla completa.

...

...

...


		 $control = 0;//variable de control 

		 $cliente = array();

		 $idcliente = $model[0]->cliente_idcliente;

		 $i = 0;// control del array 

		 $contador=count($model); //Total de elementos que trae el modelo 

		 foreach ($model as $key => $value){

		 	$control++;// incremento en cada iteración 

		 	if ($idcliente != $value->cliente_idcliente) {

		 		$idcliente = $value->cliente_idcliente;

		 		$mPDF1->WriteHTML($this->renderPartial('pdfReportMovimiento', 

		 			array('model'=>$cliente), true));

		 		unset($cliente);

		 		$mPDF1->AddPage();

		 		$i=0;

		 	}

		 	$cliente[$i]['tipopublicacion_idtipopublicacion'] = $value->tipopublicacionIdtipopublicacion->nombretipopublicacion;

		 	$cliente[$i]['razonsocial'] = $value->clienteIdcliente->razonsocial;

		 	$cliente[$i]['codigo'] = $value->clienteIdcliente->clientecod;

		 	$cliente[$i]['fechamov'] = $value->fechamov;

		 	$cliente[$i]['entrega'] = $value->entrega;

		 	$cliente[$i]['devolucion'] = $value->devolucion;

		 	$cliente[$i]['faltante'] = $value->faltante;

		 	$cliente[$i]['vlrunitario'] = $value->vlrunitario;

		 	$cliente[$i]['vlrdia'] = $value->vlrdia;

		 	$cliente[$i]['nit'] = $value->clienteIdcliente->cedulanit;//cargo los datos que necesito

		 	$i++;

		 	if ($control == $contador) { //si es la ultima iteracion del bucle hago el renderPartial, de lo contrario no se cargaria el ultimo cliente, ya que en esa ultima iteracion el idcliente no cambiaria.

		 		$mPDF1->WriteHTML($this->renderPartial('pdfReportMovimiento', 

		 			array('model'=>$cliente), true));

		 		unset($cliente);

		 	}


		 }

		 $mPDF1->Output('Reportes'."-".$this->id."-".date('Y-m-d-H-i-s'),'I');



Saludos y de nuevo muchisimas gracias.

Claro, tu lo que tienes en $model sería algo así:




array(

     0 => objetocliente,

     1 => objetoCliente,

     ...

     ...

     )



Entonces en el bucle $key => $value en lugar de $value[‘loQueSea’] es $value->loQueSea.

Me alegro de que lo solucionases.

Un saludo.

puedes probar con FPDF http://fpdf.org/. A mi me funcionó