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...
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>
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>
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>
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>
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>
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... ;-)