Ajout de polices et encodages

Ce tutoriel explique comment ajouter des polices TrueType, OpenType et Type1 afin de ne plus se limiter aux polices standards. 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 standards ne supportant que l'encodage cp1252).

Pour l'OpenType, seul le format basé sur le TrueType est supporté (pas celui basé sur le Type1).
Pour les Type1, vous devez posséder le fichier AFM correspondant (il est généralement fourni avec la police).

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

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 [, boolean subset]]])
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.

subset

Indique si le subsetting doit être utilisé. 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.

Le troisième paramètre indique si la police doit être incorporée ou non. 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. Pour assurer un rendu correct dans tous les cas, il est fortement recommandé d'incorporer.

Le dernier paramètre indique si le subsetting doit être utilisé, c'est-à-dire si seuls les caractères de l'encodage spécifié doivent être conservés dans la police incorporée. Cela permet de réduire de manière importante la taille du fichier PDF, surtout si la police d'origine était volumineuse.

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 fichiers 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]