[Ir al menú de PHP]
Crear ficheros PDF

Configuración de php.ini

Antes de utilizar esta opción -en modo local- es preciso hacer una pequeña modificación en el fichero php.ini. Además de lo que te sugería cuando te hablé de la configuración es necesario descomentar la línea que dice:
;extension=php_pdf.dll
y como descomentar no es otra cosa que quitar el punto y coma que va delante (¡¡verdad que queda muy fino eso de ...descomentar!!) o lo que es lo mismo, dejarla así:
extension=php_pdf.dll
y eso si... después de eso guardar el fichero php.ini con esa modificación.

Unidades de medida

Cuando utilices PHP para generar documentos PDF tendrás que tener en cuenta que las unidades de medida que debes usar son puntos.

Como sabes, un punto es igual a 1/72 de pulgada y como una pulgada (creo que en raro se le llama inche) es lo mismo que 25,4 milímetros pues ya sabes... a hacer cuentas que es muy sano ...;-)

Para que no te esfuerces te daré las medidas de un documento DIN A-4 (297 x 210 mm.) expresadas en puntos.

297 x 72 / 25,4=842 puntos
210 x 72 / 25,4=595 puntos

Y ya que estamos metidos en danza matemática (Señor, Señor... que cruz esto de los números) te voy a contar algo que me costó un montón de sudores y un cuarto de kilo de aspirinas... y que son las coordenadas que se utilizan para 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.

Si estás acostumbrad@ a utilizar coordenadas de pantalla, acuérdate de esto... avisad@ estás...

Diferentes versiones

Por lo que he podido leer y comprobar existen diferentes versiones de la librería PDFLib y por si fuera poco, también las nuevas versiones de PHP incorporan nuevas funciones y dejan obsoletas algunas funciones anteriores.

Por eso, los ejemplos y funciones que te iré comentando a continuación están desarrollados para que funcionen con la versión 3 de la libreria PDFLib y con la versión 4.0.3 de PHP.

A partir de la versión 4.0.5 de PHP se incorporan nuevas e interesantes funciones, pero... como mi servidor actual tiene instalada la versión 4.0.3 he tenido que adaptar a las circunstancias.

En cualquier caso, todos los ejemplos están comprobados con PHP 4.2.3 en modo local y... ¿milagrosamente?... también funcionan en esa versión.

Creación de ficheros PDF

Hechas las advertencias anteriores, aquí tienes las funciones que permiten crear un fichero PDF.

$f = fopen("nombre.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- con la función fopen.

El parámetro w abre el fichero en modo escritura, coloca el puntero al comienzo del fichero, reduce el tamaño a cero y si el fichero no existe intenta crearlo.

¿Te has olvidado de estas cosas?. Ay... Señor, Señor.. pincha aquí, anda...

$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 varíable que recoge aquel identificador de recurso.

Esta función devuelve un nuevo identificador de recurso que será el que utilizaremos en todas las demás funciones que generan el documento pdf.

pdf_begin_page($g,x,y)

Esta función comienza una nueva página y como ves contiene tres parámetros que son: $g (el identificador del 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 que es 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.

Bastará con que vayamos incluyendo sucesivos comienzos de página con dimensiones distintas teniendo siempre la cautela de no poner el comienzo de página 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, será suficiente acceder a el mediante un enlace. ¡¡Fíjate en los ejemplos..!!

Definir tipos de letra

Antes de insertar los textos es necesario tener definida fuente que se pretende utilizar. ¡¡Ojo al parche..!! Si no defines previamente una fuente puede que te lleves una sorpresa...

No digas luego que... si no te avisé... o que la abuela fuma... ;-)

pdf_set_font($g,let,x,t, n )

La función pdf_set_font requiere los parámetros siguientes:

$g que es el identificador de recurso del que te vengo hablando todo el rato.
let que es el nombre del tipo de letra y que por tratarse de una cadena deberías escribirlo entre comillas.

Ese nombre del tipo de letra ha de coincidir exactamente con uno de los nombres que figuran en el fichero pdflib.upr -te hablo de el aquí arriba cuando me refiero a tipos de letra- y es el nombre que figura a la izquierda del signo igual.

x es un número que indica el tamaño -en pixels- que quieres asignar a la letra.

t 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

Si usas host para todas las fuentes excepto en la Symbol y en ZapfDingbats y si en estas dos excepciones utilizas builtin te aseguro que no tendrás ningún problema

n puede tomar como valor 0 o 1, siendo la segunda opción la que se utiliza para caracteres embed que debe ser algo así como incrustados pero... escrito en raro. Como no tengo muy claro para que sirve pues... si pones cero funciona...

Una vez definida una fuente se utilizará a lo largo de toda la página hasta que no se defina una distinta.

Insertar textos

Una vez definida una fuente ya podemos escribir 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 (no olvides ponerla entre comillas) o también el nombre de una variable -definida previamente- que contiene el texto a insertar.

pdf_continue_text($g, texto)

La función pdf_show no controla si el texto cabe en el papel o no y si se repite lo único que hará será escribir a continuación del texto anterior, en las misma línea.

Si quieres que el nuevo texto se escriba en la línea siguiente bastará con que utilices la función pdf_continue_text


 
 


Comprobando si la opción está activada

Para comprobar si tu servidor remoto -o para comprobar si está activa la modificación del php.ini que te comento a la izquierda- basta con que abras el famosísimo fichero info.php y compruebes si aparece algo como esto:
Como ves, en este ejemplo PDF support está enabled (que debe ser algo así como activado pero escrito enn raro...), también aparece la versión de la librería y... si aparece eso de CJK Support Font y aparecé lo de yes... alégrate Jerusalén porque... t ienes el privilegio de de poder utilizar fuentes de los idiomas Chino,Japonés y Koreano.

De la opción In Memory PDF Creation Support ya te hablaré más adelante, aunque te anticipo que en la versión local de PHP 4.2.3 no viene activada por defecto.


Los tipos de letra

Dentro de directorio en el que has instalado PHP hay un subdirectorio que se llama pdf-related y dentro de ese directorio hay un fichero copyright.txt que te leas con lo cual advertid@ quedas de los aspectos legales de asunto.

Además de ese, hay otro fichero muy importante que es 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

Supongo yo que tendrás instalado en tu ordenata el Adobe Acrobat Reader pero por si las moscas ahí tienes un enlace de descarga... de nada ;-)

En este enlace tienes una muestra de esas tipografías que te he comentado... que son las que te funcionarán con toda seguridad.

Te anticipo que es posible utilizar también fuentes TrueType, etc. etc. pero como parece que no funcionan con todas la versiones de la librería PDF será mejor que de momento te conformes con estas...


Ver tipos de letra


Un fichero pdf en blanco

Aquí tienes el código fuente para crear el fichero pdf más sencillo... un fichero en blanco que contiene tres páginas distintas con distintos tamaños.

Fíjate que antes de crear la nueva página cerramos la anterior con un pdf_end_page.


<?
$f = fopen("ejemplo1pdf.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="ejemplo1pdf.pdf">Ver el pdf creado</a>


Ejemplo1pdf.pdf


Un simple línea de texto

Aquí tienes un ejemplo en el que creamos un documento pdf en el que 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... pues parece que 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("ejemplo2pdf.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="ejemplo2pdf.pdf">Ver el pdf creado</a>


Ejemplo2pdf.pdf


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 escribir -despues de crear la nueva página- está función:

     pdf_translate($g, x, y)

en la que $g es -como siempre- el famoso identificador de recurso y x e y son las coordenadas (horizontal y vertical) del nuevo origen de coordenadas.

Si observas el ejemplo que te pongo aquí debajo, he transladado el origen a la ordenada 750 (como siempre en pixels) y quizá te preguntes... ¿por qué no la cambió a 842 si 842 es la altura de la página?...

La respuesta es sencilla, si hubiera puesto el nuevo origen en 842 -de hecho lo hice y me llevé un buen susto- lo que ocurre es que empieza a escribir a partir de ese punto, pero hacia arriba y claro, como ese es el extremo superior de la página escribe fuera de ella y... no se ve nada.
Por esa razón dejé el origen un poquito más abajo... para que cupiera en la página...

Te recuerdo que las coordenadas en los documentos pdf son coordenadas cartesianas... ;-) ¡¡avisad@ quedas..!!


<?
$f = fopen("ejemplo2bpdf.pdf", "w");
$g = pdf_open($f);
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="ejemplo2bpdf.pdf">Ver el pdf creado</a>


Ejemplo2bpdf.pdf


Saltos de línea y posicionamiento por coordenadas

En este ejemplo puedes observar los resultado 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("ejemplo2cpdf.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="ejemplo2cpdf.pdf">Ver el pdf creado</a>


Ejemplo2cpdf.pdf


Los diferentes tipos tipos de letra

Cuando te comentaba -al margen- la función pdf_set_font no fuí demasiado explícito al comentarte los tipos de codificación. Aquí tienes un poco más de información al respecto.

     • 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 al caso de fuentes de símbolos o a otras fuentes que no pertenecen al alfabeto latino.

Como podrás observar lo práctico y lo cómodo es utilizar la codificación host que sirve para todo con las excepciones de las fuentes Symbol y ZapfDingbats que por su peculiaridades -alfabeto griego en un caso y símbolos en el otro- deben utilizar la codificación builtin.

Y por si acaso desconfías de mi que dicho sea de paso sería una opción muy prudente por tu parte, aquí tienes la prueba de que no te engaño.... ;-).


<?
$f = fopen("ejemplo3pdf.pdf", "w+");
$g = pdf_open($f);
pdf_begin_page($g, 595, 842);
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="ejemplo3pdf.pdf">Ver el pdf creado</a>


Ejemplo3pdf.pdf


Supongo yo que con le que te he comentado sobre el manejo de textos no estarás demasiado satisfech@ y tienes toda la razón.... aún no te he dicho nada de como presentar bloques de texto, de como alinearlos, de como hacer que las letras tengan colorcitos... etc. etc., pero te prometo que si pulsas en el el botoncito que dice siguiente podrás satisfacer tu curiosidad...

Paciencia, amig@... paciencia... que es virtud cristiana, esta página me está quedando más larga que un mes sin pan y como debo rellenar este espacio (cuestiones estéticas) no se me ocurría otra cosa, así que me he visto obligado a recurrir al socorrido capítulo de consejos... ;-)


Sugerir a un/a amig@ Envíame tus comentarios
Anterior
Indice
Siguiente