Publicado en Guías, Manuales y Tutoriales, Open Source, Software, Testeo, Trabajo

Formato de pagina Personalizado en fpdf

Después de leer el comentario de Luis me puse a probar unas cosas que tenía ganas de agregarle a la clase y el resultado fue este pequeño post, que espero sirva de algo, aunque sea de referencia xD.

El ejemplo básico de fpdf es el siguiente:

<?php
require(‘fpdf.php’);

$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont(‘Arial’,’B’,16);
$pdf->Cell(40,10,’¡Hola, Mundo!’);
$pdf->Output();
?>

Si deseamos cambiar la orientación del papel, tamaño o unidad de medida solo tenemos que indicarlo en los parametros que se pasan al constructor.

FPDF([string orientation [, string unit [, mixed format]]])
Por defecto el constructor tiene los siguientes valores:
FPDF($orientation=’P’,$unit=’mm’,$format=’A4′)

Si queremos generar un pdf en forma horizontal con una hoja tamaño legal y con dimensiones en centímetros tendríamos que pasar los siguientes parámetros:
$pdf=new FPDF(‘L’,’cm’,’Legal’);
Orientación:
* P o Portrait (normal) por defecto
* L o Landscape (apaisado)

Unidad
* pt: punto
* mm: milimetro por defecto
* cm: centimetro
* in: pulgada

Un punto es igual a 1/72 de pulgada, es decir cerca de 0.35 mm (siendo una pulgada 2.54 cm). Esta es una unidad muy común en tipografía; los tamaños de fuentes son expresados en esa unidad.

Formato (texto sensible a minúscula/mayúscula)
* A3
* A4
* A5
* Letter
* Legal

Un formato personalizado en la forma de un array de dos elementos conteniedo el ancho y el alto (expresado en la unidad dada por unit).

La clase tiene por defecto una serie de opciones, pero eso no es una limitante para ampliarlas =) Por ejemplo si quisieramos manejar un tamaño no contemplado en la clase tendremos que agregar la descripción y luego comparar el valor recibido.

La sección es Formato de Página:

//Page format
if(is_string($format))
{
$format=strtolower($format);
if($format==’letter’)
$format=array(612,792);
elseif($format==’a4′)
$format=array(595.28,841.89);

elseif($format==’mcarta‘) //media carta
$format=array(311,396);

$this->fwPt=$format[0];//ancho del formato de página en puntos
$this->fhPt=$format[1];//alto del formato de página en puntos
}

Con eso debería bastar para tener otra formato de página, en el caso que se desee pasar un tamaño personalizado, el constructor tendría que alterarse un poco más.

Recibiendo los valores de ancho, alto de la página y válidando el formato con la cadena recibida como en el caso de arriba, asignado al Array los valores de ancho y alto.

FPDF($orientation=’P’,$unit=’mm’,$format=’A4′, $wcustom=0, $hcustom=0)

elseif($format==’custom’) //Personalizado
$format=array($wcustom,$hcustom);

y lo demás es historia je, je.. Por lo tanto el código al inicio del post solo cambiara en una línea: $pdf=new FPDF(‘P’,’cm’,’mcarta’);

Fuente: fpdf.org, tutorial constructor.

P.D.  Obtención de medidas

Pulgada – 2.54 cm
Punto – 1/72 pulgada
Punto – 0.35 mm – 0.03527 7777 (valor tomado en los calculos)
Por defecto es mm

Ejemplo Tamaño Carta medidas w 21.59| h 27.94.
612 x 72 = 44064
792 x 72 = 57024

21.59 / 612 = 0.03527 7777
27.94 / 792 = 0.03527 7777

21.59 / 0.03527 7777 = 612.0000135
27.94 / 0.03527 7777 = 792.0000175

Tomando el valor en mm las medidas aumentan un poco, queda a criterio de cada uno

21.59 / 0.035 = 616.86
27.94 / 0.035 = 798.29

Media Carta
10.79 / 0.03527 7777 = 311 – 310.9606368
13.97 / 0.03527 7777 = 396

41 comentarios sobre “Formato de pagina Personalizado en fpdf

  1. Un saludo desde Tlaxcala, y pues aprovechando para agradecerte no sabes cuando me ayudaste en un problema que tenia. muchas gracias y sigues escribiendo. y cualquier cosa que necesites si pude cuentas con un servidor, Y gracias otra vez

  2. Hola, me sirvio de mucho tu manual, se agradece mucho, solo tengo un problema al querer imprimir un reporte, y es que no logro cambiar el tamaño de los textos que estan dentro de una tabla, fuera de la tabla puedo hacerlo, pero dentro no se que pasa.

    Saludos desde chile, y haber si me puedes hechar una manito con eso.

    Chauuz

  3. Que tal mediasur, antes que nada serviría de mucho que comentarás que script estas utilizando si el más básico que corresponde al Tutorial No5.

    O algún otro de los que existen en la página. Según el script son los cambios que tendrás que hacer. De hecho revisando el tutorial 5 te darás cuenta que la propiedad de posición del texto se determina en el momento en que se crea la tabla.

    En tu caso, si pretendes cambiar el tamaño del texto tendrás que hacer pruebas para comprobar que no hay problemas.

    Saludos.

  4. Amigos esto es demasiado básico, mi urgencia es referente a generar el PDF desde una consulta de MYSQL en PHP, con su respectivo encabezado, pie de pág y contador de pág (1 de 90) por ejemplo; en cada pág. actualmente logre algo pero solo me coloca el encabezado en la 1ra. pág y el pie en la última y no hayo la manera de colocarle el contador de pág. Ayuda por favor

  5. Mmm.. pues si es «demasiado básico» porque no sigues haciendo pruebas ¬_¬U

    La información se encuentra en el manual. Para ser más exactos en la siguiente dirección:
    http://www.fpdf.org/es/tutorial/tuto2.htm

    Después de leerlo y modificar el ejemplo (nada más la ruta de la clase) obtengo lo siguiente:

    Haz clic para acceder a epc.pdf

    Vamos que intentarlo no ha tomado a nadie 😛
    Si después de intentarlo no te sale deja un post con tú código para ver que tienes mal. O si tengo tiempo te mando el código del ejemplo.

  6. la respuesta a la media carta es dejar la parte horizontal intacta , es decir que quede en 612 y solo dejar a la mitad la parte verticar en el caso de portrait y claro esta, hacerlo de manera inversa en Landscape

  7. Gracias por los comentarios Víctor y Alfabravo, entiendo lo que comentas Víctor.

    Sin embargo fue solo un ejemplo, escogí media carta porque fue el más rápido de postear =P

    Pero con las medidas puedes hacer cualquier tamaño para la salida =)

    Saludos.

  8. Hola Alberto, estoy trabajando con fpdf, hice varios reportes sin problema, ahora necesito imprimir recibos (papel continuo), la pagina personalizo con array() de acuerdo al ancho y alto de mi recibo, al generar el pdf no hay ningún problema pero al darle imprimir la impresora me toma otra medida que no tiene nada que ver con las medidas que definí(impresora de impacto epson FX-2160) y cualquier otra impresora, lo curioso que en la notebook donde programo me toma bien las medidas pero en cualquier otra pc nada que ver, no habría alguna manera o algun codigo que tenga que agregar el pdf para que me tome las medidas correctas??, se lo agredecería mucho si me respondieras……

  9. Veamos, las pruebas las haz realizado desde el notebook con la impresora mencionada.

    O las pruebas se realizaron con otra impresora pero con el papel del tamaño deseado.

    No debería tener problemas el script ya que envía la salida (pdf) en el tamaño indicado. Sin embargo si la impresora esta mal configurada en el tamaño de papel simplemente la impresión saldrá desajustada.

    Espero te sirva de algo el comentario, saludos

    P.D Ojalá puedas volver a comentar para saber que paso.

  10. Alberto, te explico con array(200,202) defino exactamente el tamaño de cada recibo, en la notebook cuando le doy en la propiedad de la impresora que me tome el tamaño definido por el pdf me da lo siguiente 201.70 x 209.97 que sería ancho alto, en cualquier otra maquina cuando hago lo mismo me da 215,9 x 279,4, todo en mm, con el mismo tipo de impresora con la diferencia q en la notebook tengo SO Win UE y las otras Win XP normal digamos, el PDF genera con el tamaño deseado pero al darle imprimir es el problema, ya no se donde tocar y veo que tendré que optar x un lenguaje cliente para hacer esta parte por que no puedo hallar la solución, en otros foros veo que suguieren generar pdf para este tipo de acción pero a mi no me funciona, gracias por responder, si de repente se te ocurre alguna solución te lo agredeceré mucho..

  11. para imprimir un solo recibo funcio chevere, imprimo en donde necesito los datos, pero cuando debo imprimir mas de uno se presenta el problema ya que la altura que me da la impresora no coincide con la altura de mi recibo..

  12. El visitante Wynec en este mensaje explica una forma de solucionar el problema.

    De todas formas te envió un correo con su email, ojalá te pueda responder y solucionar tu problema. De ser así espero tu respuesta en el blog para compartirla con los visitantes.

    Saludos.

  13. buenas, alberto y los demas integrantes del foro, ya resolví mi problema, como soy tan novato en impresión de recibos y facturas no sabía que tenía que crear un nuevo formulario en la propiedad del servidor de la impresora con las medidas deseadas para que al imprimir pueda tomar el tamaño de papel definido, si a alguien le pasa lo mismo ya saben que deben accede en Impresoras y faxes—>Archivo—>Propiedad del servidor, y ahí cran un nuevo formulario con el tamaño deseado, espero le sirva a laguien yo lo que he ignorado… suerte a todos…

  14. Mmm.. no entendí bien eso del formulario.
    Lo que entiendo (aunque tal vez lo este malinterpretando) es que en la impresora se debe configurar el tamaño de papel como personalizado y guardarlo.

    De todas formas voy a revisar lo que comentas porque tampoco lo sabía =P

    Saludos y muchas gracias.

    P.D. Ojalá sigas visitando el blog y comentando.

  15. saludos libres, ante todo gracias por cualquier tipo de ayuda, nesecitaba un programa que imprimiera cheques y que fuera SL pero no lo consegui me dispuse a hacerlo y todo bien el caso es que los cheques deben ser impresos en las hp injeck y por tanto deben salir en foprma vertical no se en realida como aqui les pando el codigo que tengo de salida con fpdf:
    AddPage();
    $pdf->Image(‘imagen/chh.jpg’,20,8,178,80,»,»);
    $pdf->SetFont(‘Arial’,’B’,10);
    $pdf->ln(1);
    $pdf->Cell(105);
    $pdf->Cell(100,10,$monto,0,2,’C’);
    $pdf->SetFont(‘Arial’,’B’,8);
    $pdf->ln(1);
    $pdf->Cell(90);
    $pdf->Cell(40,10,»Caduca a los 120 Dias»,0);
    $pdf->SetFont(‘Arial’,’B’,10);
    $pdf->ln(8);
    $pdf->Cell(30);
    $pdf->Cell(35,10,$beneficiario,0,2,’C’);
    $pdf->ln(4);
    $pdf->Cell(30);
    $pdf->Cell(60,-5,$cantidad,0,2,’C’);
    $pdf->ln(3);
    $pdf->Cell(30);
    $pdf->Cell(20,25,$fecha,0,2,’C’);
    $pdf->Cell(125,-25,$ano,0,0,’C’);
    $pdf->Cell(125,-25,$ano,0,0,’C’);
    $pdf->ln(3);
    $pdf->Cell(130);
    $pdf->Cell(45,10,»NO ENDOSABLE»,0);
    $pdf->Output();
    ?>

  16. necesito ayuda
    tengo todo mi codigo pero cuando lo mando a generar en pdf
    o me sale a montonado o separado o no se extiende o me sale en dos hojas o m as, yo lo q quiero es q salga en una sola hoja tamaño carta y q okupe el ancho y largo de la hoja….
    ayudaaaaaa

  17. mira este es mi codigo pero no me muestra la informacion de la base de datos, y me muestra la otra informacion toda montada una sobre otra, me puedes ayudar, mira el codigo.

    selectFont(‘clasess/fonts/arial.afm’);
    $pdf->ezSetCmMargins(1,1,1.5,1.5);

    $conexion = mysql_connect(«localhost», «user», «password»);
    mysql_select_db(«demo», $conexion);
    $queEmp = «SELECT nomp, codp, clave FROM docentes ORDER BY codp ASC»;
    $resEmp = mysql_query($queEmp, $conexion) or die(mysql_error());
    $totEmp = mysql_num_rows($resEmp);

    $ixx = 0;
    while($data[] = mysql_fetch_assoc($resEmp)) {
    }
    $titles = array(
    ‘nomp’=>’nomp‘,
    ‘codp’=>’codp‘,
    ‘clave’=>’clave‘,

    );
    $options = array(
    ‘shadeCol’=>array(0.9,0.9,0.9),
    ‘xOrientation’=>’center’,
    ‘width’=>980
    );
    $txttit = «BLOG.UNIJIMPE.NET\n»;
    $txttit.= «Ejemplo de PDF con PHP y MYSQL \n»;

    $pdf->ezText($txttit, 12);
    $pdf->ezTable($data, $titles, », $options);
    $pdf->ezText(«\n\n\n», 10);
    $pdf->ezText(«Fecha: «.date(«d/m/Y»), 10);
    $pdf->ezText(«Hora: «.date(«H:i:s»).»\n\n», 10);
    $pdf->ezStream();
    ?>

    gracias, por tu ayuda, mi correo es s0l0un0@hotmail.com

  18. Buenas, estoy generando un comprobante, el cual tiene un ancho de 200, pero mi problema es que nose como hacer para que el alto del pdf sea definido dinamicamente., ejemplo, si el contenido obtenido de la bd es de 300 de alto, que se genere un pdf de 200 x 300, si fuera de alto 500, entonces 200×500 etc, se entiende? espero me puedan ayudar muchas gracias

  19. Buenos días,

    Estoy generando un reporte, donde utilizo multicell…!!! pero mi problema es cuando la multiceda pasa la siguiente pagina en el sentido de que no me corta la celda (pasando una linea ) sino que continua la celda y el reporte no es nada elegante………

    1. Hola maria, buen día, oye una pregunta pudiste resolver tu inconveniente?? como lo hiciste? me encuentro actualmente con el mismo problema y no doy como resolverlo.

      Gracias!!

  20. Estimado, estoy intentando generar el contenido de las etiquetas del correo que miden (190 mm ancho x 118 mm alto) a traves de fpdf, me las genera perfecto, las visualizo perfecto en la previa, pero al enviarlas a la impresora «rota el contenido 90 grados a la izquierda, como si lo pusiera impresion horizontal), esto me sucede con todas las impresoras y pense que se me paso por alto algo en la configuracion del pdf.
    El codigo de ejemplo:
    require(‘../fpdf/fpdf.php’);

    // configuracion pdf
    $pdf = new FPDF(‘P’, ‘mm’, array(190, 118));

    // variable de control de version
    $configuracion = ‘FPDF(\’P\’, \’mm\’, array(190, 118))’;

    // configuracion fuente
    $pdf->SetFont(‘Arial’, », 12);

    //bucle para generar 2 etiquetas
    for ($i=1; $iAddPage();

    //Montos
    $pdf->Text(14, 35, ‘check_amount’);
    $pdf->Text(60, 35, ‘cash_amount’);

    //Remitente
    $pdf->Text(25, 66, ‘REMITENTE NOMBRE’);
    $pdf->Text(25, 71, ‘REMITENTE DIRECCION’);
    $pdf->Text(25, 76, ‘REMITENTE CIUDAD’);

    //Destinatario
    $pdf->Text(101, 66, ‘DESTINATARIO NOMBRE’);
    $pdf->Text(101, 70, ‘DESTINATARIO DIRECCION’);
    $pdf->Text(101, 74, ‘DESTINATARIO CIUDAD’);

    // Control de configuracion para control de version
    $pdf->Text(25, 90, ‘Configuracion: ‘.$configuracion);
    }

    //genera el pdf
    $pdf->Output();

    1. Hola Marcelo, saludos…
      has encontrado la solución a tu problema? , porque te cuento que tengo el mismo problema, y lo que veo es que en la librería fpdf.php hace la pregunta de que si cual es mayor, y al compararlos coloca el mayor como el largo, por eso el cambio de orientación, estoy atascado y nose como solucionarlo, incluso comente la linea pero nada.

  21. Hola estoy usando FPDF y todo me va bien solo tuve un pequeño invenveniente que quisiera que en pie de pagina me parezca cierta informacion pero solo en la primera y ultima pagina, ya tengo solo en la primera donde comparo si PageNo()==1 pero no se como comparar con la ultima pagina trate con el alias {nb} pero no me resulta la vdd no se como funcione esto del alias ojala alguien pueda ayudarme porke ya llevo varios dias con esto :S

  22. Hola estoy cargando un campo de mysql para mostrarlo en un reporte con fpdf, pero el campo es grande es decir es un parrafo, y no se como ajustarlo en una celda de la tabla fpdf… quien me ayudaa…. Gracias

  23. Buenos Dias amigos Saludos desde Colombia, necesito Hacer que el Alto de mi Documento sea Dinamico con Respecto a los Datos que mando a imprmir quiero saber si alguien sabe como hacerlo, es para imprimir Tickets, osea se auto ajuste el Tikete, con las lineas que contenga.

    Muchas Gracias por su colaboracion

  24. Gracias por aportar tu conocimiento al servicio de los demás…
    tengo una inquietud y no se si puedas ayudarme, estoy tratando de imprimir en una hoja media-carta, osea el ancho es el mismo del tamaño carta, pero el largo es dividido en 2, osea la mitad del largo de la hoja carta.
    sucede que al colocar de forma personalizada el array (612,396), simplemente me cambia la orientación, y revisando la librería FPDF en su algoritmo hay una linea que compara el ancho con el largo, y el mayor lo coloca como largo, entonces mi pregunta es como soluciono el inconveniente de imprimir en una hoja que sea mas ancha que larga (media hoja carta), ya que se esta usando el papel troquelado que divide la hoja carta en dos?

    *linea del archivo fpdf.php (1079), este es el codigo:
    if($size[0]>$size[1])
    return array($size[1], $size[0]);
    else
    return $size;

    saludos desde Colombia.

  25. Hola que tal super tu aporte y gracias por ello me sirvió a montones y te pregunto, ¿como hago para poner una imagen de fondo en las paginas del pdf, por ejemplo un formato de factura?
    gracias, la verdad he buscado y no… veo como.

Deja un comentario