Añadiendo nuevas fuentes y codificaciones
Este tutorial explica cómo usar fuentes TrueType o Type1 de forma que usted no
se vea limitado a las fuentes incorporadas en FPDF. El otro punto de interés es
que pueda elegir la codificación de la fuente, lo que le permitirá usar otros
idiomas aparte de los europeos occidentales (ya que las fuentes estándar tienen
muy pocos caracteres disponibles).
Existen dos formas de usar una nueva fuente: incluirla en el PDF o no. Cuando una
fuente no se incluye, se busca en el sistema. La ventaja es que el fichero PDF es
más pequeño; sin embargo, si la fuente no está disponible en el sistema, se usa otra
como sustituta. Así que es aconsejable asegurarse de que la fuente en cuestión está
instalada en los sistemas de los clientes. Si el fichero está destinado a una audiencia
numerosas, es mejor incluir la fuente.
Añadir una nueva fuente requiere tres pasos para las TrueType:
- 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
Para las fuentes Type1, el primer paso, teóricamente, no es necesario porque suelen
venir acompañadas de un fichero AFM. En el caso de que usted sólo tenga un fichero de
medidas en formato PFM, use el conversor disponible
aquí.
Generación del fichero de medidas
El primer paso para una TrueType consiste en generar el fichero AFM. Existe una aplicación
para hacer esto: ttf2pt1.
El ejecutable para Windows está disponible
aquí. La instrucción para usarlo
desde la línea de comandos es:
ttf2pt1 -a font.ttf font
Por ejemplo, para la Comic Sans MS Regular:
ttf2pt1 -a c:\windows\fonts\comic.ttf comic
Se crearán dos ficheros; el archivo en el que estamos interesados en el comic.afm.
Generación del fichero de definición de la fuente
El segundo paso consiste en generar un fichero PHP que contenga toda la información que
necesita FPDF; además, el fichero de la fuente deberá comprimirse. Para hacer esto, se distribuye
un script auxiliar en el directorio font/makefont del paquete: makefont.php. Contiene la
siguiente función:
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
.
patch
-
Modificación opcionar de la codificación. Vacío por defecto.
type
-
Tipo de la fuente (TrueType
o Type1
). Valor por defecto: TrueType
.
El primer parámetro es el nombre del fichero de la fuente. La extensión debe ser .ttf o .pfb y
determina el tipo de fuente. Si tiene una fuente Type1 en formato ASCII (.pfa), puede convertirla
a formato binario con t1utils.
Si no quiere incluir la fuente en el documento, pase una cadena vacía. En este caso, el tipo
se determina mediante el parámetro type
.
Nota: en caso de que una fuente tenga el mismo nombre que una estándar, por ejemplo arial.ttf,
es obligatorio incluirla. Si no lo hace, Acrobat usará su propia fuente (la estándar).
El fichero AFM es el que generamos anteriormente.
La codificación define la asociación entre un código (de 0 a 255) y un carácter. Los primeros
123 son fijos y se corresponden con los caracteres ASCII; los siguientes son variables. Las
codificaciones se almacenan en ficheros .map. Están disponibles:
- cp1250 (Europa Central)
- cp1251 (cirílico)
- cp1252 (Europa Occidental)
- cp1253 (griego)
- cp1254 (turco)
- cp1255 (hebreo)
- cp1257 (báltico)
- cp1258 (vietnamita)
- cp874 (tailandés)
- ISO-8859-1 (Europa Occidental)
- ISO-8859-2 (Europa Central)
- ISO-8859-4 (báltico)
- ISO-8859-5 (cirílico)
- ISO-8859-7 (griego)
- ISO-8859-9 (turco)
- ISO-8859-11 (tailandés)
- ISO-8859-15 (Europa Occidental)
- ISO-8859-16 (Europa Central)
- KOI8-R (ruso)
- KOI8-U (ucraniano)
Por supuesto, la fuente debe contener los caracteres aduecuados a la codificación escogida.
En el caso especial de una fuente de símbolos (esto es, que no contiene letras, como las fuentes
Symbol o ZapfDingbats), pase una cadena vacía.
Las codificaciones que empiezan con cp son usadas por Windows; los sistemas Linux usan por lo general
codificaciones ISO.
Nota: las fuentes estándar usan cp1252.
El cuarto parámetro le da la posibilidad de alterar la codificación. A veces puede que quiera
añadir caracteres. Por ejemplo, ISO-8859-1 no contiene el símbolo para el euro. Para añadirlo en
la posición 164, pase array(164=>'Euro')
.
El último parámetro se usa para definir el tipo de la fuenta en caso de que no se vaya a incluir
(esto es, si el primer parámetro está vacío).
Después de llamar a la función (puede crear un nuevo fichero e incluir makefont.php o simplemente
añadir la llamada en el propio makefont.php), se creará un fichero .php con el mismo nombre que
el .afm. Puede renombrarlo si lo desea. En caso de incluir la fuente, el fichero se comprime y da
lugar a un segundo fichero con extensión .z (excepto si la función de compresión no está disponible,
puesto que requiere la biblioteca zlib para PHP). También puede renombrarlo, pero, en este caso, tendrá
que modificar la variable $file
en el fichero .php consecuentemente.
Ejemplo:
MakeFont('c:\\windows\\fonts\\comic.ttf','comic.afm','cp1252');
que devuelve los ficheros comic.php y comic.z.
Entonces tendrá que copiar los ficheros generados en el directorio de fuentes. Si
el fichero de la fuente no pudo ser comprimido, copie el .ttf o .pbf en lugar del .z.
Declaración de la fuente en el script
El último paso es el más simple. Sólo necesita llamar al método AddFont(). Por ejemplo:
$pdf->AddFont('Comic','','comic.php');
o, simplemente,
Y la fuente queda disponible (en los estilos normal y subrayado), lista para usar como las otras.
Si hubiéramos trabajado con la Comic Sans MS Bold (comicbd.ttf), hubiésemos escrito:
$pdf->AddFont('Comic','B','comicbd.php');
Ejemplo
Veamos ahora un pequeño ejemplo completo. La fuente usada es Calligrapher, disponible en
www.abstractfonts.com (un sitio
que ofrece un buen número de fuentes TrueType gratuitas). El primer paso es generar el AFM:
ttf2pt1 -a calligra.ttf calligra
que nos devuelve calligra.afm (y calligra.t1a, que podemos borrar). Generamos entonces la definición:
<?php
require('font/makefont/makefont.php');
MakeFont('calligra.ttf','calligra.afm');
?>
La función nos devolverá el siguiente informe:
Warning: character Euro is missing
Warning: character Zcaron is missing
Warning: character zcaron is missing
Warning: character eth is missing
Font file compressed (calligra.z)
Font definition file generated (calligra.php)
El carácter del euro no está en la fuente (es muy antigua). También faltan otros tres caracteres,
pero no estamos interesados en ellos, así que da igual.
Podemos copiar estos dos ficheros en el directorio de fuentes y escribir el script:
<?php
require('fpdf.php');
$pdf=new FPDF();
$pdf->AddFont('Calligrapher','','calligra.php');
$pdf->AddPage();
$pdf->SetFont('Calligrapher','',35);
$pdf->Cell(0,10,'Enjoy new fonts with FPDF!');
$pdf->Output();
?>
[Demo]
Acerca del símbolo del euro
El carácter del euro no aparece en todas las codificaciones, y no siempre está en la misma posición:
Codificación | Posición |
cp1250 | 128
|
cp1251 | 136
|
cp1252 | 128
|
cp1253 | 128
|
cp1254 | 128
|
cp1255 | 128
|
cp1257 | 128
|
cp1258 | 128
|
cp874 | 128
|
ISO-8859-1 | ausente
|
ISO-8859-2 | ausente
|
ISO-8859-4 | ausente
|
ISO-8859-5 | ausente
|
ISO-8859-7 | ausente
|
ISO-8859-9 | ausente
|
ISO-8859-11 | ausente
|
ISO-8859-15 | 164
|
ISO-8859-16 | 164
|
KOI8-R | ausente
|
KOI8-U | ausente
|
La codificación ISO-8859-1 está muy extendida, pero no incluye el símbolo del euro. Si lo
necesita, la solución más simple consiste en usar cp1252 o ISO-8859-15, que son prácticamente
iguales pero contienen el preciado símbolo.
Para la ISO-8859-2, es posible sustituirla por la ISO-8859-16, pero contiene muchas diferencias.
Por tanto, es más sencillo apañar la codificación para añadir el símbolo, tal como se explica
arriba. Lo mismo se aplica a las demás codificaciones.
Síntesis de fuentes bajo Windows
Cuando una fuente TrueType no está disponible en un estilo determinado, Windows es capaz de
sintetizarla a partir de la versión normal. Por ejemplo, no hay Comic Sans MS en cursiva, pero
puede ser construida a partir de la Comic Sans MS regular (normal). Esta característica puede
ser empleada en un fichero PDF pero, desgraciadamente, requiere que la fuente normal esté instalada
en el sistema (no debe incluirla en el documento). Así es como se hace:
- Generar el fichero de definición para la fuente normal sin incluirla en el documento
(puede renombrarla para reflejar el estilo deseado)
- Abrirlo y añadir a la variable
$name
una coma (,) seguida del estilo deseado
(Italic
, Bold
o BoldItalic
)
Por ejemplo, para el fichero comici.php:
$name='ComicSansMS,Italic';
A partir de entonces, podrá usarse normalmente:
$pdf->AddFont('Comic','I','comici.php');
Reduciendo el tamaño de las fuentes TrueType
Los ficheros de fuentes son con frecuencia bastante voluminosos (más de 100, incluso 200 KB);
esto se debe a que contienen los caracteres correspondientes a muchas codificaciones. La compresión
zlib los reduce, pero continúan siendo bastante grandes. Existe una técnica para reducirlos aún más.
Consiste en convertir la fuente a formato Type1 con ttf2pt1 especificando la codificación que le interesa;
todos los demás caracteres serán omitidos.
Por ejemplo, la fuente arial.ttf que viene con Windows 98 tiene un tamaño de 267 KB (contiene 1296 caracteres).
Después de comprimirla, pesa 147 KB. Convirtámosla a Type1 manteniendo sólo los caracteres cp1250:
ttf2pt1 -b -L cp1250.map c:\windows\fonts\arial.ttf arial
Los ficheros .map están en el directorio font/makefont/ del paquete. El proceso devuelve
arial.pfn y arial.afm. El fichero arial.pfb ocupa sólo 35 KB, 30 KB después de comprimirlo.
Es incluso posible ir más allá. Si sólo está usted interesado en un subconjunto de la codificación (es
probable que no necesite los 217 caracteres), puede abrir el fichero .map y quitar las líneas que
no le interesen. Consecuentemente, el tamaño del fichero disminuirá.