fpdf

Upload: robert-rojas

Post on 16-Oct-2015

12 views

Category:

Documents


0 download

TRANSCRIPT

  • Programacin Hipermedia I

    Prctica 15: PHP 8 (PDF)

    1. ObjetivosAprender a crear un documento PDF.

    2. RecursosCmo se genera un documento PDF en PHP?

    FPDF1: librera gratuita que genera documentos PDF.

    How to Generate a PDF With PHP2: pequeo tutorial que explica cmo usar FPDF.

    3. Qu tengo que hacer?En esta prctica tienes que aadir a la parte privada de la aplicacin una opcin para que un usuario

    se pueda descargar un documento PDF con las imgenes que contiene uno de sus lbumes. El propsitoes poder tener una copia esttica de un lbum y poderla compartir con otros usuarios.

    El lbum tiene que cumplir el siguiente formato:

    1. Primera pgina: tiene que aparecer el ttulo del lbum, la fecha del lbum, el nombre del usuario yla fecha de creacin del documento PDF.

    2. Segunda pgina: tiene que aparecer el ttulo, la descripcin, la fecha y el pas del lbum, junto conun mensaje que indique el nmero de fotografas que componen el lbum.

    3. Siguientes pginas: tiene que aparecer la fotografa, el ttulo, la descripcin y la fecha de la fotografa.Pueden aparecer varias fotografas por pgina con diferentes diseos (diferentes tamaos, diferentesalineaciones).

    4. ltima pgina: tiene que aparecer una lista con el ttulo de todas las fotografas del lbum.

    4. Cmo lo hago?Existen mltiples APIs para la creacin de documentos PDF al vuelo (on the fly). PHP trae soporte

    para dos APIs, haru3 y PDF4, pero ambas requieren la instalacin de bibliotecas adicionales, por lo quesu uso no es fcil. En aquellas situaciones en las que se emplea un alojamiento (hosting) compartido, suuso puede no estar permitido.

    Una de las APIs ms potente es PDFlib5, pero es de pago.Una API que es muy sencilla de utilizar, instalar y que es gratuita es FPDF6 (Free PDF ). FPDF

    est liberado bajo una licencia permisiva: no hay restriccin alguna de uso. Esto significa que se puedeintegrar libremente en cualquier aplicacin (comercial o no), con o sin modificaciones.

    La velocidad de generacin de un documento con FPDF es menor que con otros sistemas, ya que esuna API 100% PHP. Sin embargo, esto slo supone un problema cuando el documento a generar seacomplejo y extenso.

    1http://fpdf.org/2http://answers.oreilly.com/topic/1414-how-to-generate-a-pdf-with-php/3http://www.php.net/manual/es/book.haru.php4http://www.php.net/manual/es/book.pdf.php5http://www.pdflib.com/6http://fpdf.org/

    1

  • En principio, FPDF no tiene ningn lmite respecto al tamao de los ficheros PDF que puede generar,pero existen ciertas limitaciones de funcionamiento que pueden influir en su rendimiento:

    El mximo de memoria reservada para los scripts en PHP. En versiones anteriores a PHP 5.2 ellmite estaba fijado en 8 MB, ahora son 128 MB. Para documentos muy extensos, especialmente sicontienen imgenes, este lmite puede alcanzarse (ya que FPDF construye el fichero en memoria).El lmite se define con el valor memory_limit7 en el fichero php.ini.

    El tiempo mximo de ejecucin de un script PHP es por defecto 30 segundos. Este lmite puede serfcilmente sobrepasado cuando se genera un documento complejo y extenso. Este tiempo mximotambin se define con el valor max_execution_time8 en el fichero php.ini y puede ser modificadodinmicamente mediante la funcin de PHP set_time_limit()9.

    Los navegadores tienen por lo general un lmite mximo de 5 minutos de inactividad. Si se envadirectamente el PDF al navegador y se sobrepasa este lmite, se perder el documento, ya que elnavegador cerrar la conexin. Por lo tanto, en el caso de documentos muy grandes, se aconseja ge-nerarlos en un fichero y, cuando el documento est terminado, redireccionar al usuario al documentogenerado con JavaScript o con un enlace.

    4.1. Instalacin y configuracinFPDF no necesita ningn tipo de instalacin o configuracin. Slo hay que descargar el fichero com-

    primido con la ltima versin, descomprimirlo en un directorio que sea accesible desde PHP e incluir elfichero principal cuando se vaya a utilizar:

    require("fpdf17/fpdf.php");

    Del contenido de FPDF slo son necesarios el fichero fpdf.php y el directorio font. El resto de ficherosy directorios no son necesarios para el funcionamiento de esta API.

    4.2. Creacin un documento sencilloUn documento PDF se crea a partir de la clase FPDF. El constructor de esta clase tiene tres parmetros

    opcionales:

    La orientacin de la pgina:

    P o Portrait: vertical (orientacin por defecto). L o Landscape: horizontal (apaisado).

    La unidad de medida usada:

    pt: punto. mm: milmetro (unidad por defecto). cm: centmetro. in: pulgada.

    El tamao de la pgina:

    A3. A4 (tamao por defecto). A5. Letter. Legal. Un array, con el ancho y el alto (expresado en la unidad definida).

    7http://www.php.net/manual/es/ini.core.php#ini.memory-limit8http://www.php.net/manual/es/info.configuration.php#ini.max-execution-time9http://php.net/manual/es/function.set-time-limit.php

    2

  • Para fijar los mrgenes de una pgina se pueden usar los siguientes mtodos:

    SetMargins(float left, float top [, float right]): fija el margen izquierdo, superior y de-recho. El valor por defecto es 1cm.

    SetLeftMargin(float margin): fija el margen izquierdo.

    SetTopMargin(float margin): fija el margen superior.

    SetRightMargin(float margin): fija el margen derecho.

    Para definir el estilo del texto se emplea el mtodo SetFont() que tiene tres parmetros:

    La familia (el tipo de letra o fuente). Puede ser una de las familias que estn definidas en FPDF, ose puede aadir una familia nueva con el mtodo AddFont(). Las familias predefinidas son:

    Arial. Courier. Helvetica. Times. Symbol. ZapfDingbats.

    El estilo de la fuente. Los estilos se pueden combinar entre s. Los valores posibles son:

    Cadena vaca: normal. B: negrita (bold). I: cursiva (italic). U: subrayado (underline).

    El tamao de la fuente en puntos. El valor por defecto es el tamao actual. Si ningn tamao hasido especificado desde el comienzo del documento, toma el valor de 12.

    Para aadir una pgina al documento se emplea el mtodo AddPage(). Este mtodo tiene dos pa-rmetros opcionales que permiten indicar la orientacin y el tamao de la pgina, si no se indican, seemplean los valores definidos en el constructor.

    Para escribir texto existe cuatro mtodos:

    Cell(): muestra una celda (un rea rectangular) con texto y con bordes opcionales. El texto puedeestar alineado (izquierda o derecha) o centrado.

    MultiCell(): similar a Cell(), pero permite escribir texto con saltos de lnea. Los saltos de lneapueden ser automticos (al alcanzar el borde derecho de la celda) o explcitos (sealados con elcarcter de salto de lnea \n). El texto puede estar alineado (izquierda o derecha), centrado ojustificado.

    Text(): escribe una cadena de texto en la posicin indicada.

    Write(): escribe una cadena de texto con saltos de lnea en la posicin actual.

    El mtodo Ln(altura) genera un salto de lnea de la altura indicada.Finalmente, para generar el documento PDF y enviarlo al navegador se debe invocar el mtodo

    Output() que tiene dos parmetros opcionales:

    El nombre del fichero que se genera.

    El destino del documento, puede tomar uno de los siguientes valores:

    I: enva el documento en forma de fichero al navegador para que ste lo intente visualizar. D: enva el documento en forma de fichero al navegador y fuerza su descarga. F: guarda el documento como un fichero en el servidor.

    3

  • Figura 1: Ejemplo de un documento sencillo

    S: devuelve el documento como una cadena.

    El ejemplo siguiente crea un documento PDF sencillo compuesto de una pgina con una celda y conun fragmento de texto; para escribir el texto se utilizan los mtodos Cell() y Write():

    En la Figura 1 se puede ver el resultado de este ejemplo.

    4

  • 4.3. MetadatosEn FPDF existen cinco mtodos para definir los metadatos de un documento PDF:

    SetTitle(): define el ttulo del documento.

    SetAuthor(): define el autor del documento.

    SetSubject(): define el asunto del documento.

    SetKeywords(): define las palabras clave del documento.

    SetCreator(): define la aplicacin de creacin del documento.

    El siguiente ejemplo crea un documento con todos sus metadatos; en este ejemplo, al generar eldocumento PDF se ha optado por forzar la descarga del documento con el nombre metadatos.pdf:

    En la Figura 2 se puede ver cmo se visualizan los metadatos a travs de la opcin Propiedades enAdobe Acrobat:

    4.4. Dibujar una lneaFPDF es un poco limitado a la hora de dibujar figuras geomtricas, ya que slo dispone del mtodo

    Line() para dibujar lneas y el mtodo Rect() para dibujar rectngulos:

    SetDrawColor(rojo, verde, azul): define el color usado en las operaciones de dibujado, comopor ejemplo, el dibujado de una lnea.

    SetLineWidth(ancho): define el ancho de la lnea.

    Line(x1, y1, x2, y2): dibuja una lnea entre dos puntos.

    SetFillColor(rojo, verde, azul): define el color usado en las operaciones de relleno, como porejemplo, el dibujado de un rectngulo.

    Rect(x, y, w, h, estilo): dibuja un rectngulo con borde, relleno (sin borde) o con ambos.

    En el siguiente ejemplo, se dibujan dos lneas de color rojo en forma de aspa que unen las esquinas dela pgina. En las coordenadas para dibujar las lneas se ha respetado el margen por defecto de 1 cm queposee la pgina:

  • Figura 2: Visualizacin de metadatos en Adobe Acrobat

    Figura 3: Ejemplo de un documento con lneas

    6

  • $pdf->AddPage();

    $pdf->SetFont(Arial, , 18);$pdf->Write(10, "Este documento es un borrador\n");$pdf->SetFont(Arial, , 14);$pdf->Write(5, "Este documento es un borrador, y por tanto no se debe considerar

    definitivo, ya que el documento puede sufrir numerosos cambios.");

    $pdf->SetDrawColor(255, 0, 0);$pdf->SetLineWidth(2);$pdf->Line(10, 10, 210 - 10, 297 - 10);$pdf->Line(210 - 10, 10, 10, 297 - 10);

    $pdf->Output();?>

    En la Figura 3 se puede ver el resultado de este ejemplo.

    4.5. Cabecera y pie de pginaFPDF permite generar de forma automtica una cabecera y un pie de pgina. Para ello se tienen que

    sobreescribir los mtodos Header() y Footer() que tiene definida la clase FPDF. Estos mtodos estndeclarados, pero estn vacos.

    Si se quiere una cabecera o pie de pgina distintos para la primera pgina, para las pginas pares (oimpares), o para otro tipo de diseo, se puede invocar el mtodo PageNo() para saber en qu pgina seest mostrando la cabecera o el pie de pgina.

    Si se quiere mostrar el nmero total de pginas, se tiene que invocar el mtodo AliasNbPages(alias)que genera un alias para el nmero total de pginas que ser reemplazado por su valor real cuando eldocumento sea cerrado.

    Por ejemplo, el siguiente cdigo genera un documento PDF con dos pginas, con su cabecera y su piede pgina:

  • $pdf->SetFont("Arial", "B", 16);

    $pdf->AddPage();$pdf->Write(8, "Esto es una prueba...");

    $pdf->AddPage();$pdf->Write(8, "Esto es una prueba...");

    $pdf->Output();?>

    4.6. Insercin de una imagenFPDF permite inserta una imagen en formato JPEG, PNG o GIF en un documento PDF. Para ello

    se emplea el mtodo Image().En el siguiente ejemplo, se insertan dos imgenes con unos textos en un documento PDF:

    En la Figura 4 se puede ver el resultado de este ejemplo.

    5. RecomendacionesIntenta que el lbum no sea simplemente una sucesin de fotografas y textos, intenta que tenga un

    estilo visual atractivo.Si quieres modificar un fichero PDF ya existente, se puede hacer con FPDF, pero necesitas la extensin

    FPDI (Import existing PDF documents into FPDF)10.

    10http://www.setasign.de/products/pdf-php-solutions/fpdi/

    8

  • Figura 4: Ejemplo de un documento con dos imgenes

    9