En ocasiones necesitamos que nuestro PDF generado con la clase FPDF o derivadas tengo una mejor presentación con el uso de la fuentes, pero las fuentes que tiene la clase son muy pocas, si revisamos la documentación encontramos que la instrucción SetFont explica lo siguiente:
«Establece la fuente usada para imprimir cadenas de carácteres. Es obligatorio invocar este método por lo menos una vez antes de imprimir texto o el documento resultante no será válido.
La fuente puede ser una estándar o una adicionada via el método AddFont().»
Es decir, las fuentes estándar son aquellas que vienen con la clase y para su uso se debe tener acceso a los ficheros de medida. No podemos usar las fuentes de forma directa.
El método AddFont describe de forma muy clara aunque a la vez escueta la forma de agregar fuentes.
«Importa una fuente TrueType o Type1 y la hace disponible. Es necesario primero generar un archivo de definición de fuente con la utilidad makefont.php.
El archivo de definición (y el archivo de fuente mismo cuando es incorporado) debe estar presente en el directorio de fuentes. Si no puede ser encontrado, es generado el error <Could not include font definition file>.»
Bueno agregar una fuente de acuerdo al Tutorial 7 no es tan fácil como agregarla con un define(‘ruta’), ya que se requiere un fichero de medidas y un archivo de definición de fuente. Si hay otra forma más sencilla adelante expreselo en los comentarios 😀
Añadir una nueva fuente requiere tres pasos para las TrueType (las comunes):
* Generación del fichero de medidas (.afm)
* Generación del fichero de definición de la fuente (.php)
* Declaración de la fuente en el script
En el tutorial esta muy bien explicado y el archivo de la clase viene acompañado con un ejemplo, de todas formas hice la prueba con una fuente y no tuve mayor problema.
Para el ejemplo NO manejo la misma cantidad de pasos pero el resultado es el mismo, además utilizo la siguiente <Ruta: C:\servidor_web\fpdf> y tengo la siguiente estructura de directorios:
servidor_web <localhost>
|_genera_fuente.php
|__ FPDF
|____ afm
|____ doc
|____ font
|____ makefont
|_______ makefont.php
|____ pfm
|____ tutorial
El directorio AFM (Adobe Font Metrics) contiene el programa tff2pt1 del proyecto «True Type Font to Postscript Type 1 Converter«. Puede descargarse desde la página del proyecto o desde la liga de FPDF, antes de descargar cualquier cosa sigan leyendo hasta terminar el paso uno.
El directorio PFM (Printer Font Metrics) contiene el programa pfm2afm una utilidad para convertir ficheros de medidas. Se puede descargar desde la liga de FPDF, por cierto no encontré referencia hacia alguna página oficial de la utileria y la fecha que muestra el archivo es de 1991 😦
El directorio Makefont tiene el archivo makefont.php que genera el archivo de definición de fuente y que podemos utilizar a través de un archivo php.
IDENTIFICACIÓN DEL TIPO.
El paso 1 es identificar el tipo de fuente a utilizar (TrueType o Type1), ya que si se tratase del segundo caso (Type1) ya nos ahorramos algo de trabajo y pasaremos al paso 3, sino es así continuar en el paso 2-b.
Nota: Además de la fuente Type1 se necesita un archivo AFM, si en lugar de este último se tiene un archivo PFM continuar en el paso 2-a.
GENERACIÓN DEL FICHERO DE MEDIDAS.
El paso 2 consiste en generar un archivo AFM (el fichero de medidas).
2-a. Si su archivo de medidas esta en formato PFM se debe convertir con la ayuda de la utilidad PFM2AFM, el enlace en párrafos anteriores.
En una ventana de DOS (si esa pantallita en negro sin soporte para ratón y sin iconos xDD) escribir:
pfm2afm infile [outfile] -a = pfm2afm evanescence.pfm evanescence.afm -a
infile corrresponde al nombre del archivo PFM
outfile corresponde al nombre del archivo AFM que será generado.
El parámetro -a se los quedo a deber 😛
Como resultado tendremos el archivo de medidas en formato AFM.
2-b. Se debe generar un archivo AFM con la utilidad ttf2pt1, el enlace en párrafos anteriores.
En una venta de DOS escribir:
ttf2pt1 -a infile.ext [outfile] = ttf2pt1 -a impact.ttf impact
infile corresponde al nombre del archivo con su extensión TTF (Fuente TrueType)
outfile el nombre que tendrá el archivo de medidas, no es necesario indicar la extensión.
El parámetro -a se los quedo a deber 😛
Como resultado obtendremos una lista extensa como salida en la pantalla y el mensaje Finished – font files created. Se generan dos archivos el AFM que nos interesa y otro con extensión T1A que podemos borrar con toda confianza.
Nota: Las fuentes se encuentran en las respectivas carpetas para evitar problemas de rutas, los archivos resultantes también se generan en las respectivas carpetas.
El tutorial 7 tiene como ejemplo la fuente Comic Sans y la ruta c:\windows\fonts\comic.ttf, la cual no probe pero los invito a intentarlo 🙂
GENERACIÓN DEL FICHERO DE DEFINICIÓN DE LA FUENTE.
El paso 3 ya que se tiene el archivo de medidas AFM es generar la definición de la fuente con ayuda del archivo makefont.php. Aunque su uso es sencillo tal vez la fuente o el idioma en el que se utilice requiera ciertos ajustes en los parámetros de la función que realiza la definición (Como el uso del símbolo del Euro € o caracteres aún más especiales).
La función MakeFont tiene los siguientes parámetros para su uso.
MakeFont(string fontfile, string afmfile [, string enc [, array patch [, string type]]])
fontfile: Ubicación del fichero .ttf o .pfb.
afmfile: Ubicación del fichero .afm.
enc: Nombre de la codificación. Valor por defecto: cp1252 codificación (Europa Occidental).
patch: Modificación opcionar de la codificación. Vacío por defecto.
type: Tipo de la fuente (TrueType o Type1). Valor por defecto: TrueType.
Como esto es un ejemplo y no me quiero complicar la existencia usaremos lo mínimo de parámetros, para eso genere el archivo «genera_fuente.php» no quedo muy elegante pero todo es cuestión de que ustedes le agreguen una interfaz para seleccionar la ruta y fuente, el fichero AFM y la codificación. NO prometo nada pero si tengo tiempo luego lo mejoro.
<.?php
require(‘fpdf/font/makefont/makefont.php’);
MakeFont(‘c:\\windows\\fonts\\impact.ttf’, ‘fpdf/afm/impact.afm’, ‘cp1252’);
//como la fuente es nativa de windows intente utilizar el directorio y no hubo problemas.
//La ruta con la estructura de carpetas es C:\\servidor_web\\fpdf\\impact.ttf
?.>
Por favor eliminen los puntos antes y después de los signos de interrogación, lo puse porque wordpress me edita los códigos 😛
La salida del archivo es la siguiente:
Font file compressed (impact.z)
Font definition file generated (impact.php)
Recuerden solo se genera el archivo Z si tienen activa la librería de compresión ZLIB. El activarla queda fuera de esta explicación, esa es otra historia XD
Los archivos generados deben buscarlos en la misma carpeta donde tienen el archivo genera_fuente.php o en su caso el archivo que hace la llamada a la función MakeFont.
Bueno ya tenemos 2 archivos (impact.z, impact.php), lo menos que pueden obtener es 1 archivo (impact.php).
Ahora hay que copiar los ficheros generados (menos el AFM) en el directorio de fuentes (de la clase NO de windows). Si el fichero de la fuente no pudo ser comprimido (impact.z), copie el .ttf o .pbf en lugar del .z.
Como en mi caso se genero el archivo comprimido (Z) solo copie los archivos impact.z y el archivo impact.php. Si no me hubiera generado el comprimido habría tenido que copiar los archivos impact.ttf y el archivo impact.php.
Nota: Si por alguna razón pierden el archivo Z y no tienen, no saben o no quieren instalar la librería ZLIB editen el archivo PHP y cambien la línea $file=’impact.z’; en lugar de hacer referencia al archivo Z debe hacer referencia al archivo TTF.
En el archivo PDF solo hay que establecer las fuentes a utilizar e indicar en que momento.
El método AddFont puede llevar por lo menos un parámetro (El nombre de la fuente) para trabajar.
El nombre de la fuente la puede obtener al ver las propiedades de la misma (en windows Abrir), si el nombre no es correcto la fuente no se cargará y el pdf generará un error. Como referencia revisen la fuente que incluye la clase calligra.ttf (nombre: Calligrapher).
…
$pdf->AddFont(‘Calligrapher’,»,’calligra.php’); //Fuente de ejemplo que incluye la Clase.
$pdf->AddFont(‘Impact’,»,’impact.php’); //Fuente de windows convertida con el proceso.
…
…
$pdf->SetFont(‘Impact’,»,15);
$pdf->Cell(0,4,’Soy Una Fuente muy Impactante’,0,1,’C’);
$pdf->Ln(10);
$pdf->SetFont(‘Calligrapher’,»,25);
$pdf->Cell(0,4,’Mi caligrafía puede mejorar’,0,1,’C’);
Anexo el mismo documento PDF del ejemplo el cual usa dos fuentes incorporadas Calligrapher <fuente demo del zip> y la fuente Impact nativa de Windows.
Click en la imagen para ver más grande.
Archivo de Ejemplo click para bajar.
Si alguien desea los archivos de la fuente Impact o los cambios al archivo de ejemplo por favor deje un mensaje.
Saludos.
Hola Alberto,
Interesantes propuestas las que haces sobre la creación de PDF online… La verdad es que me vendrá bien tener algo de información sobre esto puesto que algún proyecto va a requerirlo.
Gracias.
PD: Ya estas añadido a mi blogroll 😉
Un saludo,
— Isern Palus
Gracias por la visita y comentario Isern, la clase aunque ya tiene algunos años que dejo de actualizarse sigue siendo muy útil.
Claro que para proyectos que requieran reportes más complejos es mejor utilizar programas como Crystal Reports o similares, de hecho existen varias soluciones en Java nada despreciables.
La verdad no la utilizo mucho, pero me encanta andar probando código y hacer experimentos XDD
Saludos.
hola mi email es brayan.rios12@hotmail.com
hola soy chimbo y mi email es andresmauro1994@hotmail.com
Hola Saludos, Alberto, muy intereante tu Blog, Me Gutaria que me enviaras el Codigo al email..
franciscoisamel@gmail.com.
de antemano Gracias.
ha una Pregunta, Que solucion le Darias, si en una Aplicacion que Genere Tramites en PDF desde PHP, Pero Dichos Tramites Cambia su Estructura y Diseño incluyendo la Fuente Constantemente, Esta aplicacion podria quedar obsoleta, la solucion tiene que ser algo, que desde un panel de administracion se pueda Corregir, y Modificar Dichos Tramites, Sin Tener que Programar, De Antemano Gracias y Espero me pueda ayudar en esta Solucion…
Mm.. lo veo algo complicado sin tener que programar, es decir, a final de cuentas si la estructura cambia y las fuentes también en alguna parte es necesario indicarlo.
De momento solo se me ocurre que generes una plantilla con los datos que siempre están presentes y con esta generes tantas estructuras como te sea posible. Así dependiendo de que trámite vas a realizar mandas a llamar a una u otra.
Complementando cada una con ciertas condiciones. Como te mencionó lo veo complicado sin programar, de hecho lo que quieres me recuerda más a un IDE donde solo te dediques arrastrar elementos, algo que con esta clase no he encontrado.
Saludos.
P.D. Sino entendí bien, vuelve a explicarlo con un ejemplo. No importa que sea en papel (escaneado) xDD
Sería bueno que le dieras un vistazo a esto: Plantillas a partir de PDFs generados con FPDF conFPDI
Su uso no parece tener gran problema, de momento no podría darte un ejemplo por falta de tiempo.
Saludos.
Bueno Gracias, Por tu ayuda, En esta semana trato de escanear, algun oficio, para una mejor idea, Nuevamente Gracias. (Estoy checando FPDI)
Saludos.
Hola:
Me gustaria, q me enviara su codigo fuente ya que necesito hacer una plantilla predefinida, me urge, por favor, se lo agradeceria mucho.
Hola yo te podria pasar mi código fuente si aun lo necesitas aunque no le entendi muy bien a esto de eso de modificar la fuente pero mi código ya hace las funciones de exportar los datos a un pdf.. y claro l otengo comentado todo para que sea mas fácil de analizar…
Gracias papi eres todo un love..
Hola justo lo que requiero, ya que necesito crear un pdf utilizando diferentes tipos de letras, y hasta ahorita solo he logrado que me lo genera con un mismo tipo.
Te agredeceria tu ayuda con el codigo, para implementarlo en mi proyecto. Ya que tengo ya un par de meses batallando con esto…
Gracias,
Brenda Martinez
brenda_vmtz@hotmail.com
Muchas gracias, por el codigo… lo voy a revisar.
Saludos
hola estoy generando un pdf con la libreria FPDF, pero quiero agregar nuevas fuentes como puedo hacer eso???????’
Karina, el post describe todo el proceso para agregar aquellas fuentes que no son parte de la clase FPDF.
Una vez que realizaste todos los pasos solo basta escribir como en el ejemplo:
$pdf->AddFont(’Impact’,”,’impact.php’); //Fuente de windows convertida con el proceso.
Es decir, anexar la fuente con su correspondiente archivo php, y comenzar a utilizarla con setfont.
$pdf->SetFont(’Impact’,”,15);
$pdf->Cell(0,4,’Soy Una Fuente muy Impactante’,0,1,’C’);
En realidad no termino de entender tu duda.
Saludos.
Hola Alberto, puedo pedirte un gran favor ¿ podrías enviarme el código a mi correo, si no es mucha molestia?
lin_e_to@hotmail.com
llevo tiempo batallando con eso, gracias Alberto por tus post te envio un saludo.
hola
agradeceria que me puedieras facilitar tu codigo fuente, ya que estoy realizando algo similar, y me gustaria apoyarme con el codigo que tu realizaste, ya que yo tengo algo de rato batallando con esto.
angel.smtz@hotmail.com
gracias!!
Hola, segui los paso como salio en el tutorial pero tengo problemas con las tildes y la ñ, ¿cómo puedo hacer para q el archivo las reconozca?, de antemano, gracias
Hola Alberto, lei tus post acerca de FPDF, tambien los comentarios y la informacion oficial de la clase, el problema que tengo es el siguiente:
en mi proyecto se permite al usuario adjuntar un archivo de texto(*.txt,*.doc.*.rtf) y generar el pdf. Con .doc y .rtf genera conflicto de codificacion de caracteres,¿para eso es aconsejable declarar una nueva fuente y asignar alguna otra codificacion(Europa Occidental)?.
De ser asi solicito tu codigo fuente de este ejemplo, sino otra alternativa es usar la clase TCPDF, que soporta UTF-8 Unicode?
Bueno desde ya muchas gracias, espero tu respuesta.-
Hola muy interesante tu blog es justo lo que necesito, tengo que crear un pdf utilizando diferentes tipos de letras, y hasta ahorita solo he logrado que me lo genera con un mismo tipo y varios datos en una misma columna
Te agredeceria muchisimo por favor tu ayuda con el codigo, para implementarlo en mi proyecto.
Gracias,
Miguel Jayme
Interesante la manera de generar documento en pdf. He intentado pero en tablas si pero no en formulario y no he podido solucionar, agradecería que me enviaras el codigo de lo que hiciste en pdf.
atte.
Jorge.
tnks… esta muy bien explicado….. ya me salio!!!
envienme el ejemplo porfavor gracias….email: alfred.loza@hotmail.com
envienme la infomarion porfavor…
alfred.loza@hotmail.com
buenas alguien ha podido hacer funcionar bien el fpdi por favor envienme codigo a mi correo ya que no se porque o si es que tnego un error pero cuando imprimo el pdf me dice que esta dañado y no se puede leer
A alguien le aparece un error en el Acrobat Reader de que la fuente contiene un cuadro BBox erroneo ?
Maestro todas las codigos ti tubieras, gracias de antemano
quisiera que alguien me diera una mano, estoy intentando crear un PDF desde php, con información que esta en una base de datos, me funciona bien con algunos tipos de letras, pero el problema que tengo es que cuando ejecuto el php, me genera el PDF con otro tipo de letra, la situación es que para esta pdf se ha creado un tipo de letra especial, y cuando defino este tipo de letra me sale el error «fuente contiene un cuadro BBox erroneo», quisiera que si alguien tienen la solución me lo comente considero que debe ser algun problema con el tipo de letra, pero sería bueno que nos comente a mi y otros que han tenido este problema como se puede solucionar.
Gracias
PD. si alguien pudiera mandarme algún ejemplo para imprimir pdf desde bases de datos, y que imprima las imágenes que estan en ella les agradecería.
hola alberto muy bueno el tuto solo que no consigo generar el fichero de definicion de la fuente (con la funcion makefont). te agredeceria mandar los archivos para tener una referencia y poder solucionar mi problema!
a lo mejor otro amigo buena onda que pueda ayudar para solucionar este inconveniente, de antemano gracias
correo:marquestebo@hotmail.com
Hola, este post ya esta viejo, pero espero puedas auxiliarme. resulta que uso fpdf pero me sale un error de
Could not include font metric file fpdf.com
al parecer es por la carpeta font que esta dentro de fpdf16
definio la variable pero no hago que funcione, que puedo hacer, uso linux y apache
define(‘FPDF_FONTPATH’,’var/www/miproyecto/fpdf16/font/’);
alguna sugerencia?
jajajajaja sorry ya encontre el problema para los que no lo encuentren hay que quitar la proteccion a la carpeta font, sorry
buenas tardes, necesito incluir la fuente de georgia en fpdf , me he guiado con los pasos que menciona pero no me da un error si me puedes enviar el codigo completo te lo agradeceria muchisimooo. mi correo noribel_85@hotmail.com
hola necesito cualquier tipo de letra seria(yo uso arial) con el simbolo del € y por mas que leo no logro plasmarla agradecería los archivos con este simbolo incluido mi email:
Gracias
Hola esta excelente con lo que explicas, pero me podrias enviar el codigo a mi correo porfavor, gracias.
javy_951@hotmail.com
Hola que tal , desde ya queria agradecerte por el exelete tutorial que compartiste, me sirvio de maravillas y pude hacer un desarrollo completo y muy bueno . Gente como vos hace que esta comunidad sea algo especial, muchas gracias !
Muchas gracias por el post. ¡Me ha servido de mucha ayuda! Un Saludo y gracias!
pfm2afm Convert PFM files to AFM, and vice versa.
¿ Sitio oficial pfm2afm?
http://www.ctan.org/tex-archive/fonts/utilities/pfm2afm
http://fpdf.fruit-lab.de/
se le carga la fuente xxxx.ttf
obteniendo xxx.z y xxxx.php estos se pechan en
la carpeta font
y se agrega asi:
$pdf->AddFont(‘xxxx’,»,’xxxx.php’);
ESTOS PASOS SIN NECESIDAD DE INSTALAR NADA:
abres este link
http://fpdf.fruit-lab.de/
se le carga la fuente xxxx.ttf
obteniendo xxx.z y xxxx.php estos se pegan en
la carpeta font
y se agrega asi:
$pdf->AddFont(‘xxxx’,»,’xxxx.php’);
el ttf lo puedes sacar de c\windows\font\
Hola, hice los pasos tal como lo indicas, pero me marca el siguiente error: TCPDF ERROR: Could not include font definition file: ‘mtcorsva
te agradeceria me puedas ayudar este es mi correo
Hola!!
Quisiera saber si pueden ayudarme con un problema, ya solucioné lo de las ñ y las tildes para las letras que trae por defecto la librería fpdf… Pero necesitaba trabajar el pdf con letra tahoma asi que agregué este tipo de letra por aparte a la librería y si me funciona pero tengo el problema de las ñ y las tildes, cómo podría solucionarlo?
Agradezco su pronta respuesta.
Hola, me podrian enviar el codigo fuente a mi correo, de antemano gracias.
gelybg@hotmail.com
Hola, realize todo paso a paso, pero la letra de tipo «Impact» me la muestra con mucho espacio entre caracteres, que puede ser? gracias
Hola, leí el articulo, estoy generando un pdf con la librería y se me hace interesante la fuente que explicas, podrías compartir , Saludos