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 :
- Génération du fichier de métrique (.afm)
- Génération du fichier de définition de police (.php)
- Déclaration de la police dans le script
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 :
- cp1250 (Europe Centrale)
- cp1251 (cyrillique)
- cp1252 (Europe de l'Ouest)
- cp1253 (grec)
- cp1254 (turc)
- cp1255 (hébreu)
- cp1257 (pays baltes)
- cp1258 (vietnamien)
- cp874 (thaïlandais)
- ISO-8859-1 (Europe de l'Ouest)
- ISO-8859-2 (Europe Centrale)
- ISO-8859-4 (pays Baltes)
- ISO-8859-5 (cyrillique)
- ISO-8859-7 (grec)
- ISO-8859-9 (turc)
- ISO-8859-11 (thaïlandais)
- ISO-8859-15 (Europe de l'Ouest)
- ISO-8859-16 (Europe Centrale)
- KOI8-R (russe)
- KOI8-U (ukrainien)
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 :
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 :
Encodage | Position |
cp1250 | 128 |
cp1251 | 136 |
cp1252 | 128 |
cp1253 | 128 |
cp1254 | 128 |
cp1255 | 128 |
cp1257 | 128 |
cp1258 | 128 |
cp874 | 128 |
ISO-8859-1 | absent |
ISO-8859-2 | absent |
ISO-8859-4 | absent |
ISO-8859-5 | absent |
ISO-8859-7 | absent |
ISO-8859-9 | absent |
ISO-8859-11 | absent |
ISO-8859-15 | 164 |
ISO-8859-16 | 164 |
KOI8-R | absent |
KOI8-U | absent |
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 :
- Générez le fichier de définition pour la police normale sans incorporation (et renommez-le
éventuellement pour refléter le style désiré)
- Ouvrez-le et ajoutez à la variable
$name
une virgule suivie du style (Italic
,
Bold
ou BoldItalic
)
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.