Crear ficheros PDF Configuración de php.ini Antes de utilizar esta opción es preciso hacer una pequeña modificación en php.ini. Hemos de descomentar la línea que dice: Comprobar si la opción está activada Para comprobar si está activa la modificación del php.ini que comentamos a la izquierda- bastaría con visualizar el famosísimo info.php y comprobar que aparece lo siguiente: ;extension=php_pdf.dll y como descomentar no es otra cosa que quitar el punto y coma que va delante de una línea, habremos de dejarla así: extension=php_pdf.dll Una vez guardados los cambios habrá que –como siempre en estos casos– volver a iniciar el servidor Apache. Si es así, ya estamos en disposición de empezar a trabajar con este nuevo tipo de funciones PHP. La visualización de ficheros con extensión PDF requiere tener instalado el programa Adobe Acrobat Reader. En caso de que nos dispusieras de él puedes descargar desde el enlace incluido en este párrafo. Unidades de medida Cuando utilices PHP para generar documentos PDF tendrás que tener en cuenta que la unidad de medida que debes usar es el punto. Como sabes, un punto es igual a 1/72 de pulgada y como una pulgada es lo mismo que 25,4 milímetros pues ya sabes... las medidas de un documento DIN A4 (297 x 210 mm.) serían: 297 x 72 / 25,4=842 puntos 210 x 72 / 25,4=595 puntos Y ya que estamos metidos matemáticas hablaremos del sistema de coordenadas que se utiliza en los PDF. Ten presente que utiliza coordenadas cartesianas es decir que -por defecto- el punto (0,0) es la esquina inferior izquierda del papel y que los valores positivos de la ordenada se miden hacia arriba y no en la forma habitual de las coordenadas de pantalla. Los tipos de letra Dentro del directorio en el que hemos instalado PHP hay un subdirectorio que se llama pdf-related y dentro de este, un fichero copyright.txt que contiene las advertencias legales sobre el uso de las fuentes que contiene. Además, hay otro fichero muy importante –el pdflib.upr –donde aparece una lista como esta: FontAFM Courier=Courier.afm Courier-Bold=Courier-Bold.afm Courier-BoldOblique=Courier-BoldOblique.afm Courier-Oblique=Courier-Oblique.afm Helvetica=Helvetica.afm Helvetica-Bold=Helvetica-Bold.afm Helvetica-BoldOblique=Helvetica-BoldOblique.afm Helvetica-Oblique=Helvetica-Oblique.afm Symbol=Symbol.afm Times-Bold=Times-Bold.afm Times-BoldItalic=Times-BoldItalic.afm Times-Italic=Times-Italic.afm Times-Roman=Times-Roman.afm ZapfDingbats=ZapfDingbats.afm En este enlace tienes una muestra de las tipografías que contiene esta lista, que son las que podremos utilizar en nuestros documentos PDF. ejemplo132.pdf Diferentes versiones Existen diferentes versiones de la librería PDFLib, y por si fuera «PHP en la Educación» Un fichero pdf en blanco Aquí tienes el código fuente para crear el fichero pdf más sencillo: un fichero que contiene tres páginas distintas, con distintos tamaños, Crear ficheros PDF Página 1 poco, también las nuevas versiones de PHP incorporan nuevas funciones y vuelven obsoletas algunas de las anteriores. Los ejemplos y funciones que iremos comentando y utilizando están desarrollados para que puedan funcionar con la versión 3 y posteriores de la libreria PDFLib, y con versiones posteriores a la versión 4.0.3 de PHP, con lo cual, aunque no incorporemos lo más reciente, cubriremos un espectro de posibilidades de utilización mucho más amplio. Creación de ficheros PDF Hechas estas advertencias previas, veamos las funciones que permiten crear un fichero PDF. $f = fopen("nom.pdf", "w") Esta es una función ya conocida, que recoge en la variable $f el identificador del recurso generado al crear un fichero -al que asignamos un nombre y la extensión PDF- mediante la función fopen. Mediante parámetro w se abre el fichero en modo escritura, se sitúa el puntero interno al principio del mismo, se reduce su tamaño a cero y, si aún no existe, se crea el fichero. No añadimos nada nuevo respecto a lo tratado cuando nos referíamos al manejo de ficheros. $g = pdf_open($f) Una vez creado el identificador de recurso anterior debemos abrir el fichero pdf utilizando la función pdf_open, a la que pasamos la variable en la que se recoge aquel identificador de recurso. pero en blanco. Fíjate que antes de crear cada nueva página cerramos la anterior con pdf_end_page. <? $f = fopen("ejemplo133.pdf", "w"); $g = pdf_open($f); #dimensionamos la página con formato A-4 pdf_begin_page($g, 595, 842); pdf_end_page($g); #dimensionamos la segunda página con formato A-5 pdf_begin_page($g, 421, 595); pdf_end_page($g); #dimensionamos la tercera página con formato A-6 pdf_begin_page($g, 297, 421); pdf_end_page($g); pdf_close($g); ?> <A Href="ejemplo133.pdf">Ver el pdf creado</a> Ejemplo133.php Una simple línea de texto Aquí tienes un ejemplo en el que creamos un documento pdf donde aparecerá una línea de texto, pero... ¡fíjate donde aparece! ¿no la encuentras? pues mira bien... mira al final de la página en la esquina inferior izquierda. ¿Por qué? bueno la razón es que pdf_show empieza a colocar el texto a partir de la coordenada (0,0) y ya sabes que aquí las coordenadas son puramente cartesianas. <? $f = fopen("ejemplo134.pdf", "w"); $g = pdf_open($f); pdf_begin_page($g, 595, 842); pdf_set_font($g, "Times-Roman", 30,"host", 0 ); pdf_show($g,"Este es el texto"); pdf_end_page($g); pdf_close($g); ?> <A Href="ejemplo134.pdf">Ver el pdf creado</a> Ejemplo134.php Cambiando el origen de coordenadas PHP dispone de una función que permite desplazar el origen de coordenadas. Su utilización es muy sencilla, basta con escribir, después de crear la nueva página, está función: pdf_translate($g, x, y) en la que $g es -como siempre- el identificador de recurso y x e y son las coordenadas (horizontal y vertical) del nuevo origen de coordenadas. Si observas el ejemplo que presentamos aquí debajo, hemos transladado el origen a la ordenada 750 (como siempre en pixels) y quizá te preguntes ¿por qué no la cambiaron a 842 si 842 es la altura de la página? Esta función devuelve un nuevo identificador de recurso que es el que hemos de utilizar en todas las demás funciones que generan el documento pdf. La respuesta es sencilla, si hubiéramos puesto el nuevo origen en 842 lo que ocurriría es que empezaría a escribir a partir de ese punto, pero hacia arriba –la ordenada señala la base de la línea, y claro, si fuera el extremo superior de la página escribiría fuera de ella y no se visualizaría. pdf_begin_page($g,x,y) Por esa razón hemos dejado el origen un poquito más abajo ¡para que cupiera en la página! Esta función comienza una nueva página y como ves contiene tres parámetros que son: $g (el identificador del «PHP en la Educación» <? $f = fopen("ejemplo135.pdf", "w"); $g = pdf_open($f); Crear ficheros PDF Página 2 recurso), x (el ancho de la página expresado en pixels) e y (la altura de la página también expresada en pixels). pdf_end_page($g) Con esta función indicamos a PHP que acaba la página. Como ves, contiene un solo parámetro: el identificador del recurso. Un documento PDF, como es lógico, puede contener varias páginas e, incluso, cada una de ellas puede tener tamaños diferentes. Para irlas creando incluiremos sucesivos comienzos de página teniendo cuidado de no poner ese comienzo antes de haber puesto el final de la anterior. pdf_close($g) Esta función cierra el fichero PDF, que será guardado en el servidor. Para visualizarlo, bastará con acceder a él a través de un enlace. ¡Fíjate en los ejemplos! pdf_begin_page($g, 595, 842); pdf_translate($g, 20, 750); pdf_set_font($g, "Times-Roman", 30,"host", 0 ); pdf_show($g,"Este es el texto"); pdf_end_page($g); pdf_close($g); ?> <A Href="ejemplo135.pdf">Ver el pdf creado</a> Ejemplo135.php Saltos de línea y posicionamiento por coordenadas En este ejemplo puedes observar los resultados de aplicar las funciones pdf_show, pdf_continue_text y pdf_show_xy. Observa como pdf_show va colocando un texto a continuación de otro siempre en la misma línea- sin tener en consideración si desborda o no el margen del documento. <? $f = fopen("ejemplo136.pdf", "w"); $g = pdf_open($f); pdf_begin_page($g, 595, 842); pdf_translate($g, 20, 750); pdf_set_font($g, "Times-Roman", 60,"host", 0 ); pdf_show($g,"Este es el texto"); pdf_show($g,"Mas texto"); pdf_continue_text($g,"Una nueva línea"); pdf_show_xy($g,"Esto sale en (40,-300)",40,-400); pdf_end_page($g); pdf_close($g); ?> <A Href="ejemplo136.pdf">Ver el pdf creado</a> Ejemplo136.php Definir tipos de letra Antes de insertar los textos es necesario tener definida fuente que se pretende utilizar. ¡Cuidado! Si no definimos fuentes podemos llevarnos una desagradable sorpresa. pdf_set_font($g,let,x,t, n ) Para usar pdf_set_font requiere dar valores a parámetros siguientes: se los • $g, que es la variable del el identificador de recurso. • let, que es el nombre del tipo de letra y, por tratarse de una cadena, debe escribirse entre comillas. El nombre de letra ha de coincidir exactamente con uno de los nombres que figuran en el fichero pdflib.upr -lo mencionamos a la derecha al referirnos a tipos de letra- y es el nombre que figura a la izquierda del signo igual. • x, que es un número que indica «PHP en la Educación» Los diferentes codificaciones de las fuentes Los tipos de codificación que utiliza la función pdf_set_font son los siguientes: • winansi es la codificación de Windows con codepage 1252 • macroman es la codificación Mac Roman que utilizan por defecto los sistemas Macintosh • ebcdic es la codificación EBCDIC que utilizan algunos sistemas I.B.M. de las series AS400 y S/390 • host Utiliza macroman en sistemas Macintosh, ebcdic en sistemas basados en EBCDIC y winansi en todos los demás casos. • builtin Utiliza una codificación específica aplicable en el caso de fuentes de símbolos o a otras fuentes que no pertenecen al alfabeto latino. Como podrás observar, lo práctico y cómodo es utilizar la codificación host que sirve para todo, con las excepciones de las fuentes Symbol y ZapfDingbats que por sus peculiaridades -alfabeto griego en un caso y símbolos en el otro- deben utilizar la codificación builtin. <? $f = fopen("ejemplo137.pdf", "w+"); $g = pdf_open($f); pdf_begin_page($g, 595, 842); Crear ficheros PDF Página 3 el tamaño -en pixels- que pretendemos asignar a la letra. • t, que es una cadena que recoge el tipo el tipo de codificación de los caracteres y que, por tratarse de una cadena, debe escribirse entre comillas. Admite los siguientes valores: host, winansi, macroman, ebcdic o builtin La opción más práctica es utilizar host en todos los casos, excepto para Symbol y para ZapfDingbats, dónde hemos de utilizar builtin. • n puede tomar como valor 0 o 1. Lo dejaremos siempre como 0. Una vez definida una fuente se utilizará a lo largo de toda la página hasta que no se defina una distinta. Insertar textos Establecido un tipo de letra ya estamos en disposición de poder insertar textos. Para ello podemos usar una de estas funciones: pdf_show($g,texto) donde $g sigue siendo el identificador de recurso y texto puede ser la cadena de texto que pretendemos escribir (entre comillas) o también el nombre de una variable que contenga el texto a insertar. pdf_translate($g, 20, 842); pdf_set_font($g, "Courier", 20,"host", 0 ); pdf_show_xy($g, "Courier", 0, -40); pdf_set_font($g, "Courier-Bold", 20,"host", 0 ); pdf_continue_text($g,"Courier-Bold"); pdf_set_font($g, "Courier-BoldOblique", 20,"host", 0 ); pdf_continue_text($g,"Courier-BoldOblique"); pdf_set_font($g, "Courier-Oblique", 20,"host", 0 ); pdf_continue_text($g,"Courier-Oblique"); pdf_set_font($g, "Helvetica", 20,"host", 0 ); pdf_continue_text($g,"Helvetica"); pdf_set_font($g, "Helvetica-Bold", 20,"host", 0 ); pdf_continue_text($g,"Helvetica-Bold"); pdf_set_font($g, "Helvetica-BoldOblique", 20,"host", 0 ); pdf_continue_text($g,"Helvetica-BoldOblique"); pdf_set_font($g, "Helvetica-Oblique", 20,"host", 0 ); pdf_continue_text($g,"Helvetica-Oblique"); pdf_set_font($g, "Times-Bold", 20,"host", 0 ); pdf_continue_text($g,"Times-Bold"); pdf_set_font($g, "Times-BoldItalic", 20,"host", 0 ); pdf_continue_text($g,"Times-BoldItalic"); pdf_set_font($g, "Times-Italic", 20,"host", 0 ); pdf_continue_text($g,"Times-Italic"); pdf_set_font($g, "Times-Roman", 20,"host", 0 ); pdf_continue_text($g,"Times-Roman"); #cuidado con la definición de fuentes Zapfdingbats pdf_set_font($g, "ZapfDingbats", 20,"builtin", 0 ); pdf_continue_text($g,"ZapfDingbats"); #cuidado con la definición de fuentes Symbol pdf_set_font($g, "Symbol", 20,"builtin", 0 ); pdf_continue_text($g,"Symbol"); pdf_end_page($g); pdf_close($g); ?> <A Href="ejemplo137.pdf">Ver el pdf creado</a> Ejemplo137.php La función pdf_show no controla si el texto cabe en el papel o no y, además, a través las sucesivas llamadas se irá insertando el texto a conti- nuación del anterior y siempre en las misma línea. pdf_continue_text($g, txt) Mediante esta función el texto contenido en la cadena txt se insertará en una nueva línea. «PHP en la Educación» Crear ficheros PDF Página 4