Ajout de polices et encodage

Ce tutoriel explique comment ajouter des polices TrueType 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).

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 préférable d'incorporer.

L'ajout d'une police se fait en trois étapes :

Génération du fichier de métrique

La première étape consiste à générer le fichier AFM. Il existe un utilitaire gratuit qui permet de le faire : ttf2pt1. L'exécutable pour Windows est disponible ici. La syntaxe à utiliser est la suivante :

ttf2pt1 -a police.ttf police

Par exemple, pour la police Comic Sans MS Normal :

ttf2pt1 -a c:\windows\fonts\comic.ttf comic

Deux fichiers sont créés; celui qui nous intéresse est comic.afm.

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

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

MakeFont(string fontfile, string afmfile [, string enc [, array patch]])

fontfile
Chemin du fichier .ttf.
afmfile
Chemin du fichier .afm.
enc
Nom de l'encodage à utiliser. Valeur par défaut : cp1252.
patch
Modification de l'encodage. Vide par défaut.

Si vous ne voulez pas incorporer la police, passez une chaîne vide comme premier argument.

Le fichier AFM est celui précédemment généré.

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.
Dans le cas particulier d'une police symbolique (c'est-à-dire qui ne contient pas de lettres, comme Symbol et ZapfDingbats), il faut passer une chaîne vide.
Les encodages commençant par cp sont ceux utilisés par Windows; les systèmes Linux utilisent généralement les ISO.
Remarque : les polices standard utilisent cp1252.

Le dernier paramètre permet d'apporter des modifications à l'encodage. Il peut en effet arriver que l'on souhaite ajouter des caractères. Par exemple, l'encodage ISO-8859-2 ne comporte pas le symbole euro. Pour l'ajouter en position 164, il faut passer array(164=>'Euro').

Après avoir appelé la fonction (créez pour cela un nouveau fichier et incluez makefont.php, ou bien ajoutez l'appel directement dedans), un fichier .php est créé, avec comme nom celui du fichier AFM. 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 dans le fichier .php.

Exemple :

MakeFont('c:\\windows\\fonts\\comic.ttf','comic.afm','cp1252');

Ce qui donne les fichiers comic.php et comic.z.

Vous devez ensuite copier le ou les fichiers générés soit dans le répertoire du script qui va utiliser la nouvelle police, soit dans le répertoire donné par FPDF_FONTPATH si la constante est définie. Si la police n'a pu être compressée, il faut copier le .ttf à la place du .z.

Déclaration de la police dans le script

Cette dernière étape est la plus simple. Il suffit d'appeler la méthode AddFont(). Par exemple :

$pdf->AddFont('Comic','','comic.php');

ou tout simplement :

$pdf->AddFont('Comic');

Et la police est maintenant disponible (dans le style normal ou 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 petit exemple complet. La police utilisée est Calligrapher, disponible sur www.abstractfonts.com (un site proposant de nombreuses polices TrueType gratuites). La première étape est la génération du fichier AFM :

ttf2pt1 -a calligra.ttf calligra

ce qui donne calligra.afm (et calligra.t1a qu'on peut effacer). Générons ensuite le fichier de définition :

<?php
require('../font/makefont/makefont.php');

MakeFont('calligra.ttf','calligra.afm');
?>

L'exécution de la fonction donne lieu au compte-rendu suivant :

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)

Le caractère euro n'est pas présent dans la police (elle est trop ancienne). Trois autres caractères sont également absents, mais ils ne nous intéressent pas.
Nous pouvons maintenant copier les deux fichiers dans le répertoire des polices, ou bien les mettre dans le même répertoire que notre script :

<?php
require('fpdf.php');

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

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 :

cp1250128
cp1251136
cp1252128
cp1253128
ISO-8859-1absent 
ISO-8859-2absent 
ISO-8859-5absent 
ISO-8859-7absent 
ISO-8859-15 164
ISO-8859-16 164
KOI8-Rabsent 

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.
Pour ISO-8859-2, il est possible de prendre à la place ISO-8859-16, mais ce dernier est récent et présente de nombreuses différences. Le plus simple consiste à patcher l'encodage pour ajouter l'euro, comme expliqué plus haut. Même chose pour ISO-8859-5, ISO-8859-7 et KOI-R.

Synthèse de police sous Windows

Lorsqu'une police n'est pas disponible dans un style donné, Windows est capable de la synthétiser à partir de la version normale. Par exemple, il n'y a pas de police Comic Sans MS Italique, mais elle peut être fabriquée à partir de Comic Sans MS Normal. Ceci peut être exploité dans un PDF, mais nécessite malheureusement que la police normale soit présente dans le système (l'incorporer ne fonctionne pas). La marche à suivre est la suivante : Par exemple, pour le fichier comici.php :

$name='ComicSansMS,Italic';

On l'utilise ensuite normalement :

$pdf->AddFont('Comic','I','comici.php');