Ajout de polices et encodages

Ce tutoriel explique comment ajouter des polices TrueType, OpenType et Type1 afin de ne plus se limiter aux polices standard. L'autre intérêt est que l'on peut également choisir l'encodage des caractères afin d'utiliser d'autres langues (les polices standard ayant trop peu de caractères disponibles).

Remarque : pour l'OpenType, seul le format basé sur le TrueType est supporté (pas celui basé sur le Type1).

Il y a deux façons d'utiliser une nouvelle police : en l'incorporant ou pas. Lorsqu'une police n'est pas incorporée, elle est recherchée dans le système. L'avantage est que le fichier PDF est plus léger ; par contre, si elle n'est pas trouvée, une police de substitution est utilisée. Il vaut donc mieux s'assurer que le système qui lit le PDF a bien la police installée ; si le fichier doit être largement diffusé, il est fortement recommandé d'incorporer.

L'ajout d'une police se fait en deux étapes : Pour les Type1, vous devez posséder le fichier AFM correspondant. Il est généralement fourni avec la police.

Génération du fichier de définition de police

La première étape consiste à générer un fichier PHP contenant toutes les informations dont FPDF a besoin ; on en profite également pour compresser le fichier de police. Pour cela, un script est fourni dans le répertoire makefont de l'archive : makefont.php. Il contient la fonction suivante :

MakeFont(string fontfile, [, string enc [, boolean embed]])
fontfile

Chemin du fichier .ttf, .otf ou .pfb.

enc

Nom de l'encodage à utiliser. Valeur par défaut : cp1252.

embed

Indique si la police doit être incorporée ou non. Valeur par défaut : true.

Le premier paramètre est le nom du fichier de police. L'extension doit être .ttf, .otf ou .pfb et détermine le type de la police. Si votre police Type1 est au format ASCII (.pfa), vous pouvez la convertir en binaire (.pfb) grâce à t1utils.

Pour les polices Type1, le fichier .afm correspondant doit se trouver dans le même répertoire.

L'encodage définit l'association entre un code (compris entre 0 et 255) et un caractère. Les 128 premières sont fixes et correspondent à l'ASCII ; les suivantes sont variables. Les encodages sont stockés dans des fichiers .map. Ceux disponibles sont les suivants : Il faut bien sûr que la police contienne les caractères correspondant à l'encodage choisi.

Remarque : les polices standard utilisent cp1252.

Après avoir appelé la fonction (créez pour cela un nouveau fichier et incluez makefont.php), un fichier .php est créé, avec le même nom que celui du fichier de police. Vous pouvez le renommer si vous le souhaitez. Dans le cas de l'incorporation, le fichier de police est compressé et donne un second fichier avec comme extension .z (sauf si la fonction de compression n'est pas disponible, elle nécessite Zlib). Vous pouvez également le renommer, mais dans ce cas vous devez modifier la variable $file en conséquence dans le fichier .php.

Exemple :
<?php
require('makefont/makefont.php');

MakeFont('c:\\Windows\\Fonts\\comic.ttf','cp1252');
?>
Ce qui donne les fichiers comic.php et comic.z.

Vous devez ensuite copier les fichiers générés dans le répertoire des polices. Si la police n'a pas pu être compressée, il faut la copier directement à la place de la version compressée.

Il est également possible d'appeler MakeFont() via la ligne de commande :

php makefont\makefont.php c:\Windows\Fonts\comic.ttf cp1252

Enfin, pour les polices TrueType et OpenType, il est possible de générer les fichier en ligne au lieu de le faire manuellement.

Déclaration de la police dans le script

La seconde étape est la plus simple. Il suffit d'appeler la méthode AddFont() :
$pdf->AddFont('Comic','','comic.php');
Et la police est maintenant disponible (dans le style normal et souligné), utilisable comme les autres. Si on avait traité le Comic Sans MS Gras (comicbd.ttf), on aurait mis :
$pdf->AddFont('Comic','B','comicbd.php');

Exemple

Voyons maintenant un exemple complet. La police utilisée est Calligrapher. La première étape consiste à générer les fichiers :
<?php
require('makefont/makefont.php');

MakeFont('calligra.ttf','cp1252');
?>
L'exécution du script donne le compte-rendu suivant :

Warning: character Euro is missing
Warning: character zcaron is missing
Font file compressed: calligra.z
Font definition file generated: calligra.php

Le caractère euro n'est pas présent dans la police (elle est trop ancienne). Un autre caractère manque également.

Nous aurions également pu utiliser la ligne de commande :

php makefont\makefont.php calligra.ttf cp1252

ou bien le générateur en ligne.

Nous pouvons maintenant copier les deux fichiers générés dans le répertoire des polices (font) et écrire le script :
<?php
require('fpdf.php');

$pdf = new FPDF();
$pdf->AddFont('Calligrapher','','calligra.php');
$pdf->AddPage();
$pdf->SetFont('Calligrapher','',35);
$pdf->Write(10,'Changez de police avec FPDF !');
$pdf->Output();
?>

[Démo]

A propos du symbole euro

Le caractère euro n'est pas présent dans tous les encodages, et n'est pas toujours situé à la même position :
EncodagePosition
cp1250128
cp1251136
cp1252128
cp1253128
cp1254128
cp1255128
cp1257128
cp1258128
cp874128
ISO-8859-1absent
ISO-8859-2absent
ISO-8859-4absent
ISO-8859-5absent
ISO-8859-7absent
ISO-8859-9absent
ISO-8859-11absent
ISO-8859-15164
ISO-8859-16164
KOI8-Rabsent
KOI8-Uabsent
ISO-8859-1 est très répandu mais ne comporte pas l'euro. Si vous en avez besoin, le plus simple consiste à prendre à la place cp1252 ou ISO-8859-15, qui sont pratiquement identiques mais disposent du précieux caractère.

Réduction de la taille des polices TrueType

Les fichiers de police sont souvent volumineux ; c'est dû au fait qu'ils contiennent les caractères correspondant à de nombreux encodages. La compression par Zlib les réduit mais les fichiers restent encombrants. Il existe une technique pour diminuer la taille de ces fichiers. Elle consiste à convertir la police en Type1 avec ttf2pt1 (l'exécutable pour Windows est disponible ici) en précisant l'encodage qui nous intéresse ; tous les autres caractères sont écartés.
Par exemple, la police arial.ttf livrée avec Windows Vista fait 748 ko (elle contient 3381 caractères). Compressée, elle en fait 411. Convertissons-là en Type1 en ne conservant que les caractères correspondant à l'encodage cp1250 :

ttf2pt1 -b -L cp1250.map c:\Windows\Fonts\arial.ttf arial

Les fichiers .map se trouvent dans le répertoire makefont de l'archive. On obtient alors les fichiers arial.pfb et arial.afm. arial.pfb ne fait plus que 57 ko, et 53 après compression.

Il est possible d'aller encore plus loin. Si vous n'êtes intéressé que par un sous-ensemble de l'encodage (il est peu probable que vous ayez besoin des 217 caractères), vous pouvez ouvrir le fichier .map et enlever les lignes qui ne vous intéressent pas. Cela réduira d'autant la taille du fichier obtenu.