Ajout de polices et encodages

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

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 recommandé d'incorporer.

L'ajout d'une police se fait en trois étapes pour les TrueType : Pour les Type1, la première étape n'est en principe pas nécessaire car le fichier AFM est généralement déjà fourni avec la police. Dans le cas où vous ne disposeriez que d'un fichier de métrique au format PFM, utilisez le convertisseur disponible ici.

Génération du fichier de métrique

La première étape pour une TrueType consiste à générer le fichier AFM. Il existe un utilitaire permettant 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

L'étape suivante 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 [, string type]]])
fontfile

Chemin du fichier .ttf ou .pfb.

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.

type

Le type de la police (TrueType ou Type1). Valeur par défaut : TrueType.

Le premier paramètre est le nom du fichier de police. L'extension doit être .ttf ou .pfb et détermine le type de la police. Si vous possédez une police Type1 au format ASCII (.pfa), vous pouvez la convertir au format binaire grâce à t1utils.
Si vous ne voulez pas incorporer la police, passez une chaîne vide. Le type est alors déterminé par le paramètre type.
Note : dans le cas d'une police qui porte le même nom qu'une police standard, par exemple arial.ttf, il est recommandé d'incorporer ; sinon, certaines versions d'Acrobat utiliseront leur propre police.

Le fichier AFM est celui précédemment généré ou déjà fourni avec la police.

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 quatrième 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-1 ne comporte pas le symbole euro. Pour l'ajouter en position 164, il faut passer array(164=>'Euro').

Le dernier paramètre est utilisé pour préciser le type de la police au cas où elle n'est pas incorporée (c'est-à-dire où fontfile est vide).

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 en conséquence 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 dans le répertoire des polices. Si la police n'a pas pu être compressée, il faut copier le .ttf ou .pfb à la place du .z.

Remarque : pour les polices TrueType, il est possible de générer les fichiers en ligne ici au lieu de le faire manuellement.

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 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 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 et écrire le script :
<?php
require('fpdf.php');

$pdf=new FPDF();
$pdf->AddFont('Calligrapher','','calligra.php');
$pdf->AddPage();
$pdf->SetFont('Calligrapher','',35);
$pdf->Cell(0,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.
Pour ISO-8859-2, il est possible de prendre à la place ISO-8859-16, mais ce dernier 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 les autres.

Synthèse de police sous Windows

Lorsqu'une police TrueType 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 (il ne faut pas l'incorporer). 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');

Réduction de la taille des polices TrueType

Les fichiers de police sont souvent volumineux (plus de 100, voire 200 Ko) ; 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 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 98 fait 267 Ko (elle contient 1296 caractères). Compressée, elle en fait 147. 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 font/makefont/ de l'archive. On obtient alors les fichiers arial.pfb et arial.afm. arial.pfb ne fait plus que 35 Ko, et 30 Ko 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.