[Solucionado] Encabezado PDF

Hola!
Estoy intentando que un encabezado salga en varias páginas.
Por lo que veo hay que usar pdf_encabezado que llama a la función: set_encabezado.
El problema que estoy teniendo es básicamente de estilos.
El título debería salir centrado (como sale), pero el resto (Desde: “Título:” y “El que suscribe…”) debería salir justificado.
Además en la segunda hoja no estaría saliendo con el espacio suficiente para que se lea el encabezado.

Alguna recomendación?

Subo todo al colab: operación: solicitud_titulo_impresion → controlador.php (Desde línea 324).
Se trata de una personalización para los alumnos en 3W sobre el circuito de Solicitud de Títulos, de la UNC.

Saludos. Andrea.

Hola Andrea!
Ahora me bajo el código y te respondo… mientras tanto, podría pedirte una captura de pantalla de un pdf donde se vea el encabezado que querés repetir en todas las páginas?
Gracias!!

Andrea, estuve viendo el código y te recomiendo lo siguiente:

1) Tamaño del encabezado
Para encabezados ‘grandes’, creamos una función que se llama ‘tiene_encabezado_long’… es decir, cuando seteás ‘tiene_encabezado’ en true, también le seteás ‘tiene_encabezado_long’, esto hace que deje un mayor espacio para el encabezado y no se te superponga en las siguientes hojas.


$pdf->set_tiene_encabezado(true);
$pdf->set_tiene_encabezado_long(true);

El ‘espacio’ que deja en ‘tiene_encabezado’ y ‘tiene_encabezado_long’ lo podés ver en el archivo: src/siu/operaciones/_comun/operaciones/reporte/generador_pdf.php
Función preparar_pdf, a partir de la línea 163. Podés personalizarlos, pero teniendo en cuenta que si tocás esta clase va a impactar en todos los pdfs que se generen en el sistema.
Sino, podes armarte otra función, por ejemplo ‘tiene_encabezado_XL’ y allí indicar el espacio a dejar para el encabezado en cuestión.

2) Sobre los estilos.
Hay unas funciones que se llaman: ‘set_encabezado_tabla’… esto sirve para los reportes que utilizan varios campos ‘encolumnados’ en su encabezado. Lo bueno de esto es que vos indicás cuantas columnas querés que tenga y en base a los datos que le pases por parámetro, te ordena solo el encabezado en forma de tabla… En tu caso vas a setear cant_columnas = 1. Cada ítem del array que vos pases como parámetro a esta función, será un renglón y se imprimirá en el orden que aparece en el array…
Si vos por ejemplo querés que la cantidad de columnas de tu encabezado sea 2 y tu array de datos tiene 6 ítems, la función acomodará esos 6 ítems en dos columnas y tres filas.

Entonces en tu función yo haría algo así (no lo probé porque nosé como acceder a la operación desde el perfil alumno)


....
$logo = kernel::localizador()->encontrar_img('www/img','logo.png');
$universidad = guarani::ua()->get_nombre_institucion()."\n".guarani::ua()->get_nombre()."\n";
//Intento de encabezado se repita en todas las hojas
$this->pdf_encabezado = array(
   $universidad,
   "<b>DECLARACIÓN JURADA DE MATERIAS RENDIDAS</b>", ------> ACÁ TU TÍTULO QUE SALDRÁ CENTRADO.
   110);

$this->pdf_encabezado_img = array('img'=>$logo['path'],'width' => '100');
$pdf->set_encabezado($this->pdf_encabezado[0], $this->pdf_encabezado[1], $this->pdf_encabezado[2]);
....

// ACÁ AGREGARÍA UNA 'TABLA' CON EL RESTO DE LOS DATOS QUE QUIERO QUE SE REPITAN EN TODOS LOS ENCABEZADOS
$datos_encabezado = array(
   'cant_columnas' => 1,
   'datos' => array( 0 =>$encabezado['carreras_nombre'],
                     1 => "<b>Título:</b>" . $encabezado['titulo'] . "  " . $encabezado['nombre_titulo'] ,
		     2 => $genero . "que suscribe " . $alumno . ", " . $encabezado['desc_abreviada']. ": " . $encabezado['nro_documento'] . ", Legajo: " . $encabezado['legajo'] . " " . $alum . " de la carrera " . $encabezado['carreras_nombre'] . ", manifiesta que los exámenes descriptos corresponden a los rendidos durante su actuación como " . $alum . "de esta facultad" ));
$pdf->set_encabezado_tabla($datos_encabezado);

Esto te agregará en el encabezado 3 renglones abajo del título, justificados a la izquierda.

Te recomiendo que veas la operación del perfil docente ‘Actas de Examen’, el código del pdf que emite está en: siu/operaciones/acta_examenes/controlador.php, función accion__generar_pdf_acta.
Allí se utiliza el encabezado long y la tabla dentro del encabezado (recordá que tu tabla tendría una sola columna y tantos renglones como ‘/n’ pusiste en el título)

Es medio complejo, pero una vez que le agarrás la mano sale fácil.
No dudes en consultar cualquier duda que tengas!!!

Gracias, muy clara.
No esta saliendo bien, pero por lo que veo en la acta tampoco. Es como que la hoja “se come el logo”.
Me esta faltando agregar algo más? (Subo todo como quedo ahora)…
Y te adjunto los print de como sale y como debería salir.

Saludos! Andrea


como deberia salir.jpg

como deberia salir.png

sale asA.jpg

sale asA.png

Hola Andrea!!!

Sobre el título:
Para el tamaño de la fuente modificar el valor de : $pdf->set_pdf_fuente_subtitulo($this->pdf_fuente_subtitulo); (cuidado que si modificás $this->pdf_fuente_subtitulo va a influir en todos los PDFs de ese PHP).
Luego, para que tenga mas ‘espacio’ entre el nombre de la universidad y el título… yo haría algo así:

		
$this->pdf_encabezado = array(
           $universidad,
	   "


<b>DECLARACIÓN JURADA DE MATERIAS RENDIDAS</b>
" . $encabezado['carreras_nombre'],
	   110);

Cambiaría el \n por un
entre el título y el nombre de la carrera, a ver si le toma menor interlineado. Sino, ver el ‘spacing’ del text_options.
Capaz debas agrandar el margen de ‘tiene_encabezado_long’ para tener más espacio por las dudas.

Sobre el logo:
Esto es un poco más complejo… hay que personalizar la clase generadora de PDF.
Archivo: siu/operaciones/_comun/operaciones/reporte/generador_pdf.php
Función: preparar_pdf
Lo que hace esta función es preparar cada hoja del pdf, para luego insertarle los datos de cada reporte.
Si te fijás, hace un loop para cada hoja:
foreach ($this->instancia->ezPages as $pageNum => $id) {…} donde se setean los márgenes, encabezados, etc…
Lo complejo de esto es que las posiciones del cursor ($yPos y $xPos) son relativas, se calculan dividiendo la hoja y se le suman o restan los tamaños de fuente.
Yo diría que empieces probando distintos valores de $ypos en donde se inserta la imagen del logo e ir probando distintos valores hasta que quede.
Esta sería la sección del código a revisar:


            $this->instancia->ezSetY($yPos);
            $this->instancia->ezImage($this->encabezado["imagen"], 0, $this->encabezado["imagen_with"], "none", "left");

            $this->instancia->ezSetY($yPos+$this->pdf_fuente_titulo+5);

            $this->instancia->ezText($this->encabezado["titulo"], $this->pdf_fuente_titulo, array('left' => $this->encabezado["margen"], 'width' => $xPos, 'maxWidth' => $xPos, 'spacing'=> 1));
			
            //$this->instancia->ezSetY($yPos - 35 - $this->pdf_fuente_subtitulo);
			$this->instancia->ezSetY($yPos + $this->pdf_fuente_subtitulo-20);
            $this->instancia->ezText($this->encabezado["subtitulo"], $this->pdf_fuente_subtitulo, array('width' => $xPos, 'maxWidth' => $xPos, 'justification' => 'center', 'spacing'=> 2));


Lo cierto es, que cada vez que se hace el loop por hoja, pareciera que el $ypos se va subiendo un poquito.

Después comentanos cómo te fue.

La verdad que complicadísimo que quede correctamente.
Estuve trabajando sobre esta parte del código:

//VER
            $this->instancia->ezSetY($yPos);
            $this->instancia->ezImage($this->encabezado["imagen"], 25, $this->encabezado["imagen_with"], "none", "left");

            $this->instancia->ezSetY($yPos+$this->pdf_fuente_titulo-45);
         
            $this->instancia->ezText($this->encabezado["titulo"], $this->pdf_fuente_titulo, array('left' => $this->encabezado["margen"], 'width' => $xPos, 'maxWidth' => $xPos, 'spacing'=> 1));
			
           	$this->instancia->ezSetY($yPos + $this->pdf_fuente_subtitulo-50);
            $this->instancia->ezText($this->encabezado["subtitulo"], $this->pdf_fuente_subtitulo, array('width' => $xPos, 'maxWidth' => $xPos, 'justification' => 'center', 'spacing'=> 2));

            if ($this->tiene_encabezado){
				if (isset($this->encabezado_tabla)){
					$this->instancia->ezSetY($yPos+$this->pdf_fuente_titulo-100);
					$this->agregar_tabla_encabezado($this->encabezado_tabla["cant_columnas"], $this->encabezado_tabla["datos"]);
					if(isset($this->encabezado_tabla2))
					{
					$this->agregar_tabla_encabezado($this->encabezado_tabla2["cant_columnas"], $this->encabezado_tabla2["datos"]);						
					}
				}else{					
					$this->instancia->ezText($this->encabezado_reporte, $this->pdf_fuente_texto, array('left' => 0, 'width' => $xPos, 'maxWidth' => $xPos, 'spacing'=> 2));
				}	
            }

pero no logro que quede bien.
Adjunto como esta quedando la hoja 1 y la hoja 2 (que se solapa todo)…

Alguna sugerencia?


hoja 1.jpg

hoja 1.png

hoja 2.jpg

hoja 2.png

Seteaste ‘tiene_encabezado_long’?
Yo agrandaría mas el espacio de tiene_encabezado y tiene_encabezado_long

Si, los tengo seteados de esta manera…

$pdf->set_tiene_encabezado(true);
		$pdf->dejar_espacio(-50);
		$pdf->set_tiene_encabezado_long(true);

Le agregué un espacio de 50 y quedo mejor, pero solo la primera hoja… la segunda no se da por enterado de esto, se superpone con la tabla…

Claro, porque el ‘dejar_espacio’ no se repite hoja a hoja.
Deberías personalizar la clase generadora: siu/operaciones/_comun/operaciones/reporte/generador_pdf.php, función: preparar_pdf, en esta sección del código:


            $yPos = (int) $this->instancia->ez['pageHeight'] - $this->instancia->ez['topMargin'] / 2;
            if($this->tiene_encabezado){
                $yPos = (int) $this->instancia->ez['pageHeight'] - $this->instancia->ez['topMargin'] /3;
            }
            if($this->tiene_encabezado_long){
                $yPos = (int) $this->instancia->ez['pageHeight'] - $this->instancia->ez['topMargin'] /20;
            }

Ir probando con distintos valores de $yPos para tiene_encabezado y tiene_encabezado_long.
Ojo que al ser la clase generadora de PDF, todo cambio que hagas impactará en el resto de los reportes existentes en guaraní.

No estoy teniendo suerte.
Cree una funcion tiene_encabezado_XL, y modifique eso que me sugieren pero no hay forma que desde la segunda hoja el encabezado salga correctamente. Probé con números positivos, negativos…

Hola Andrea, disculpá la demora en responder.

Probá lo siguiente… en la personalización de la clase generadora de pdf: operaciones/_comun/operaciones/reporte/generador_pdf.php hay una función que se llama __construct.
Hay un lugar donde hace:


$this->instancia->ezSetMargins('120','50','40','40');

El primer valor (120) es el valor que se le setea al márgen superior. Probá agrandandolo un poco a ver si baja la imagen, por ejemplo


$this->instancia->ezSetMargins('250','50','40','40');

Si esto aumenta mucho el márgen, fijate si queda bien bajando los valores de ‘tiene_encabezado_XL’
Mañana sigo haciendo pruebas y si encuentro algo más te aviso.

Perfecto.
Era exactamente eso.
Toque un poquito más los $yPos y $xPos y quedo bien.

Muchísimas gracias.
Saludos

Buenísimo, gracias a vos por la paciencia!
Cualquier duda quedo a su disposición, saludos!