tuto7.htm 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  5. <title>Ajout de polices et encodages</title>
  6. <link type="text/css" rel="stylesheet" href="../fpdf.css">
  7. <style type="text/css">
  8. table {border-collapse:collapse; border-style:solid; border-width:2px; border-color:#A0A0A0 #000000 #000000 #A0A0A0}
  9. table {margin:1.4em 0 1.4em 1em}
  10. th {background-color:#E0EBFF; color:#900000; text-align:left}
  11. th, td {border:1px solid #808080; padding:2px 10px}
  12. tr.alt0 {background-color:#FFFFEE}
  13. tr.alt1 {background-color:#FFFFE0}
  14. </style>
  15. </head>
  16. <body>
  17. <h1>Ajout de polices et encodages</h1>
  18. Ce tutoriel explique comment ajouter des polices TrueType ou Type1 afin de ne plus se limiter
  19. aux polices standard. L'autre intérêt est que l'on peut également choisir l'encodage des
  20. caractères afin d'utiliser d'autres langues (les polices standard ayant trop peu de caractères
  21. disponibles).
  22. <br>
  23. <br>
  24. Il y a deux façons d'utiliser une nouvelle police : en l'incorporant ou pas. Lorsqu'une police
  25. n'est pas incorporée, elle est recherchée dans le système. L'avantage est que le fichier PDF est
  26. plus léger ; par contre, si elle n'est pas trouvée, une police de substitution est utilisée. Il
  27. vaut donc mieux s'assurer que le système qui lit le PDF a bien la police installée ; si le fichier
  28. doit être largement diffusé, il est recommandé d'incorporer.
  29. <br>
  30. <br>
  31. L'ajout d'une police se fait en trois étapes pour les TrueType :
  32. <ul>
  33. <li>Génération du fichier de métrique (.afm)</li>
  34. <li>Génération du fichier de définition de police (.php)</li>
  35. <li>Déclaration de la police dans le script</li>
  36. </ul>
  37. Pour les Type1, la première étape n'est en principe pas nécessaire car le fichier AFM est
  38. généralement déjà fourni avec la police. Dans le cas où vous ne disposeriez que d'un fichier de
  39. métrique au format PFM, utilisez le convertisseur disponible <a href="http://www.fpdf.org/fr/dl.php?id=33">ici</a>.
  40. <h2>Génération du fichier de métrique</h2>
  41. La première étape pour une TrueType consiste à générer le fichier AFM. Il existe un utilitaire
  42. permettant de le faire : <a href="http://ttf2pt1.sourceforge.net" target="_blank">ttf2pt1</a>.
  43. L'exécutable pour Windows est disponible <a href="http://www.fpdf.org/fr/dl.php?id=21">ici</a>.
  44. La syntaxe à utiliser est la suivante :
  45. <br>
  46. <br>
  47. <kbd>ttf2pt1 -a police.ttf police</kbd>
  48. <br>
  49. <br>
  50. Par exemple, pour la police Comic Sans MS Normal :
  51. <br>
  52. <br>
  53. <kbd>ttf2pt1 -a c:\windows\fonts\comic.ttf comic</kbd>
  54. <br>
  55. <br>
  56. Deux fichiers sont créés ; celui qui nous intéresse est comic.afm.
  57. <h2>Génération du fichier de définition de police</h2>
  58. L'étape suivante consiste à générer un fichier PHP contenant toutes les informations dont a
  59. besoin FPDF ; on en profite également pour compresser le fichier de police. Pour cela, un script
  60. est fourni dans le répertoire font/makefont/ de l'archive : makefont.php. Il contient la
  61. fonction suivante :
  62. <br>
  63. <br>
  64. <code>MakeFont(<b>string</b> fontfile, <b>string</b> afmfile [, <b>string</b> enc [, <b>array</b> patch [, <b>string</b> type]]])</code>
  65. <dl class="param" style="margin-bottom:2em">
  66. <dt><code>fontfile</code></dt>
  67. <dd>
  68. <p>Chemin du fichier .ttf ou .pfb.</p>
  69. </dd>
  70. <dt><code>afmfile</code></dt>
  71. <dd>
  72. <p>Chemin du fichier .afm.</p>
  73. </dd>
  74. <dt><code>enc</code></dt>
  75. <dd>
  76. <p>Nom de l'encodage à utiliser. Valeur par défaut : <code>cp1252</code>.</p>
  77. </dd>
  78. <dt><code>patch</code></dt>
  79. <dd>
  80. <p>Modification de l'encodage. Vide par défaut.</p>
  81. </dd>
  82. <dt><code>type</code></dt>
  83. <dd>
  84. <p>Le type de la police (<code>TrueType</code> ou <code>Type1</code>). Valeur par défaut : <code>TrueType</code>.</p>
  85. </dd>
  86. </dl>
  87. Le premier paramètre est le nom du fichier de police. L'extension doit être .ttf ou .pfb et
  88. détermine le type de la police. Si vous possédez une police Type1 au format ASCII (.pfa), vous
  89. pouvez la convertir au format binaire grâce à <a href="http://www.lcdf.org/~eddietwo/type/#t1utils" target="_blank">t1utils</a>.
  90. <br>
  91. Si vous ne voulez pas incorporer la police, passez une chaîne vide. Le type est alors déterminé
  92. par le paramètre <code>type</code>.
  93. <br>
  94. Note : dans le cas d'une police qui porte le même nom qu'une police standard, par exemple arial.ttf, il
  95. est recommandé d'incorporer ; sinon, certaines versions d'Acrobat utiliseront leur propre police.
  96. <br>
  97. <br>
  98. Le fichier AFM est celui précédemment généré ou déjà fourni avec la police.
  99. <br>
  100. <br>
  101. L'encodage définit l'association entre un code (compris entre 0 et 255) et un caractère. Les 128
  102. premières sont fixes et correspondent à l'ASCII ; les suivantes sont variables. Les encodages sont
  103. stockés dans des fichiers .map. Ceux disponibles sont les suivants :
  104. <ul>
  105. <li>cp1250 (Europe Centrale)</li>
  106. <li>cp1251 (cyrillique)</li>
  107. <li>cp1252 (Europe de l'Ouest)</li>
  108. <li>cp1253 (grec)</li>
  109. <li>cp1254 (turc)</li>
  110. <li>cp1255 (hébreu)</li>
  111. <li>cp1257 (pays baltes)</li>
  112. <li>cp1258 (vietnamien)</li>
  113. <li>cp874 (thaïlandais)</li>
  114. <li>ISO-8859-1 (Europe de l'Ouest)</li>
  115. <li>ISO-8859-2 (Europe Centrale)</li>
  116. <li>ISO-8859-4 (pays Baltes)</li>
  117. <li>ISO-8859-5 (cyrillique)</li>
  118. <li>ISO-8859-7 (grec)</li>
  119. <li>ISO-8859-9 (turc)</li>
  120. <li>ISO-8859-11 (thaïlandais)</li>
  121. <li>ISO-8859-15 (Europe de l'Ouest)</li>
  122. <li>ISO-8859-16 (Europe Centrale)</li>
  123. <li>KOI8-R (russe)</li>
  124. <li>KOI8-U (ukrainien)</li>
  125. </ul>
  126. Il faut bien sûr que la police contienne les caractères correspondant à l'encodage choisi.
  127. <br>
  128. Dans le cas particulier d'une police symbolique (c'est-à-dire qui ne contient pas de lettres,
  129. comme Symbol et ZapfDingbats), il faut passer une chaîne vide.
  130. <br>
  131. Les encodages commençant par cp sont ceux utilisés par Windows ; les systèmes Linux utilisent
  132. généralement les ISO.
  133. <br>
  134. Remarque : les polices standard utilisent cp1252.
  135. <br>
  136. <br>
  137. Le quatrième paramètre permet d'apporter des modifications à l'encodage. Il peut en effet arriver
  138. que l'on souhaite ajouter des caractères. Par exemple, l'encodage ISO-8859-1 ne comporte pas
  139. le symbole euro. Pour l'ajouter en position 164, il faut passer <code>array(164=>'Euro')</code>.
  140. <br>
  141. <br>
  142. Le dernier paramètre est utilisé pour préciser le type de la police au cas où elle n'est pas
  143. incorporée (c'est-à-dire où <code>fontfile</code> est vide).
  144. <br>
  145. <br>
  146. Après avoir appelé la fonction (créez pour cela un nouveau fichier et incluez makefont.php, ou
  147. bien ajoutez l'appel directement dedans), un fichier .php est créé, avec comme nom celui du
  148. fichier AFM. Vous pouvez le renommer si vous le souhaitez. Dans le cas de l'incorporation, le
  149. fichier de police est compressé et donne un second fichier avec comme extension .z (sauf si la
  150. fonction de compression n'est pas disponible, elle nécessite zlib). Vous pouvez également le
  151. renommer, mais dans ce cas vous devez modifier la variable <code>$file</code> en conséquence dans le
  152. fichier .php.
  153. <br>
  154. <br>
  155. Exemple :
  156. <div class="source">
  157. <pre><code>MakeFont<span class="kw">(</span><span class="str">'c:\\windows\\fonts\\comic.ttf'</span><span class="kw">,</span><span class="str">'comic.afm'</span><span class="kw">,</span><span class="str">'cp1252'</span><span class="kw">);
  158. </span></code></pre>
  159. </div>
  160. Ce qui donne les fichiers comic.php et comic.z.
  161. <br>
  162. <br>
  163. Vous devez ensuite copier le ou les fichiers générés dans le répertoire des polices.
  164. Si la police n'a pas pu être compressée, il faut copier le .ttf ou .pfb à la place du .z.
  165. <br>
  166. <br>
  167. Remarque : pour les polices TrueType, il est possible de générer les fichiers en ligne
  168. <a href="http://fpdf.fruit-lab.de" target="_blank">ici</a> au lieu de le faire manuellement.
  169. <h2>Déclaration de la police dans le script</h2>
  170. Cette dernière étape est la plus simple. Il suffit d'appeler la méthode <a href='../doc/addfont.htm'>AddFont()</a>. Par
  171. exemple :
  172. <div class="source">
  173. <pre><code>$pdf<span class="kw">-&gt;</span>AddFont<span class="kw">(</span><span class="str">'Comic'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span><span class="str">'comic.php'</span><span class="kw">);
  174. </span></code></pre>
  175. </div>
  176. ou tout simplement :
  177. <div class="source">
  178. <pre><code>$pdf<span class="kw">-&gt;</span>AddFont<span class="kw">(</span><span class="str">'Comic'</span><span class="kw">);
  179. </span></code></pre>
  180. </div>
  181. Et la police est maintenant disponible (dans le style normal et souligné), utilisable comme les
  182. autres. Si on avait traité le Comic Sans MS Gras (comicbd.ttf), on aurait mis :
  183. <div class="source">
  184. <pre><code>$pdf<span class="kw">-&gt;</span>AddFont<span class="kw">(</span><span class="str">'Comic'</span><span class="kw">,</span><span class="str">'B'</span><span class="kw">,</span><span class="str">'comicbd.php'</span><span class="kw">);
  185. </span></code></pre>
  186. </div>
  187. <h2>Exemple</h2>
  188. Voyons maintenant un petit exemple complet. La police utilisée est Calligrapher, disponible sur
  189. <a href="http://www.abstractfonts.com/fonts/" target="_blank">www.abstractfonts.com</a> (un site proposant de
  190. nombreuses polices TrueType gratuites). La première étape est la génération du fichier AFM :
  191. <br>
  192. <br>
  193. <kbd>ttf2pt1 -a calligra.ttf calligra</kbd>
  194. <br>
  195. <br>
  196. ce qui donne calligra.afm (et calligra.t1a qu'on peut effacer). Générons ensuite le fichier de
  197. définition :
  198. <div class="source">
  199. <pre><code>&lt;?php
  200. <span class="kw">require(</span><span class="str">'font/makefont/makefont.php'</span><span class="kw">);
  201. </span>MakeFont<span class="kw">(</span><span class="str">'calligra.ttf'</span><span class="kw">,</span><span class="str">'calligra.afm'</span><span class="kw">);
  202. </span>?&gt;</code></pre>
  203. </div>
  204. L'exécution de la fonction donne lieu au compte-rendu suivant :
  205. <br>
  206. <br>
  207. <b>Warning:</b> character Euro is missing<br>
  208. <b>Warning:</b> character Zcaron is missing<br>
  209. <b>Warning:</b> character zcaron is missing<br>
  210. <b>Warning:</b> character eth is missing<br>
  211. Font file compressed (calligra.z)<br>
  212. Font definition file generated (calligra.php)<br>
  213. <br>
  214. Le caractère euro n'est pas présent dans la police (elle est trop ancienne). Trois autres
  215. caractères sont également absents, mais ils ne nous intéressent pas.
  216. <br>
  217. Nous pouvons maintenant copier les deux fichiers dans le répertoire des polices et écrire le
  218. script :
  219. <div class="source">
  220. <pre><code>&lt;?php
  221. <span class="kw">require(</span><span class="str">'fpdf.php'</span><span class="kw">);
  222. </span>$pdf<span class="kw">=new </span>FPDF<span class="kw">();
  223. </span>$pdf<span class="kw">-&gt;</span>AddFont<span class="kw">(</span><span class="str">'Calligrapher'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span><span class="str">'calligra.php'</span><span class="kw">);
  224. </span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
  225. </span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Calligrapher'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>35<span class="kw">);
  226. </span>$pdf<span class="kw">-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Changez de police avec FPDF !'</span><span class="kw">);
  227. </span>$pdf<span class="kw">-&gt;</span>Output<span class="kw">();
  228. </span>?&gt;</code></pre>
  229. </div>
  230. <p class='demo'><a href='tuto7.php' target='_blank' class='demo'>[Démo]</a></p>
  231. <h2>A propos du symbole euro</h2>
  232. Le caractère euro n'est pas présent dans tous les encodages, et n'est pas toujours situé à la
  233. même position :
  234. <table>
  235. <tr><th>Encodage</th><th>Position</th></tr>
  236. <tr class="alt0"><td>cp1250</td><td>128</td></tr>
  237. <tr class="alt1"><td>cp1251</td><td>136</td></tr>
  238. <tr class="alt0"><td>cp1252</td><td>128</td></tr>
  239. <tr class="alt1"><td>cp1253</td><td>128</td></tr>
  240. <tr class="alt0"><td>cp1254</td><td>128</td></tr>
  241. <tr class="alt1"><td>cp1255</td><td>128</td></tr>
  242. <tr class="alt0"><td>cp1257</td><td>128</td></tr>
  243. <tr class="alt1"><td>cp1258</td><td>128</td></tr>
  244. <tr class="alt0"><td>cp874</td><td>128</td></tr>
  245. <tr class="alt1"><td>ISO-8859-1</td><td>absent</td></tr>
  246. <tr class="alt0"><td>ISO-8859-2</td><td>absent</td></tr>
  247. <tr class="alt1"><td>ISO-8859-4</td><td>absent</td></tr>
  248. <tr class="alt0"><td>ISO-8859-5</td><td>absent</td></tr>
  249. <tr class="alt1"><td>ISO-8859-7</td><td>absent</td></tr>
  250. <tr class="alt0"><td>ISO-8859-9</td><td>absent</td></tr>
  251. <tr class="alt1"><td>ISO-8859-11</td><td>absent</td></tr>
  252. <tr class="alt0"><td>ISO-8859-15</td><td>164</td></tr>
  253. <tr class="alt1"><td>ISO-8859-16</td><td>164</td></tr>
  254. <tr class="alt0"><td>KOI8-R</td><td>absent</td></tr>
  255. <tr class="alt1"><td>KOI8-U</td><td>absent</td></tr>
  256. </table>
  257. ISO-8859-1 est très répandu mais ne comporte pas l'euro. Si vous en avez besoin, le plus simple
  258. consiste à prendre à la place cp1252 ou ISO-8859-15, qui sont pratiquement identiques mais
  259. disposent du précieux caractère.
  260. <br>
  261. Pour ISO-8859-2, il est possible de prendre à la place ISO-8859-16, mais ce dernier présente de
  262. nombreuses différences. Le plus simple consiste à patcher l'encodage pour ajouter l'euro, comme
  263. expliqué plus haut. Même chose pour les autres.
  264. <h2>Synthèse de police sous Windows</h2>
  265. Lorsqu'une police TrueType n'est pas disponible dans un style donné, Windows est capable de la synthétiser
  266. à partir de la version normale. Par exemple, il n'y a pas de police Comic Sans MS Italique, mais
  267. elle peut être fabriquée à partir de Comic Sans MS Normal. Ceci peut être exploité dans un PDF,
  268. mais nécessite malheureusement que la police normale soit présente dans le système (il ne faut
  269. pas l'incorporer). La marche à suivre est la suivante :
  270. <ul>
  271. <li>Générez le fichier de définition pour la police normale sans incorporation (et renommez-le
  272. éventuellement pour refléter le style désiré)</li>
  273. <li>Ouvrez-le et ajoutez à la variable <code>$name</code> une virgule suivie du style (<code>Italic</code>,
  274. <code>Bold</code> ou <code>BoldItalic</code>)</li>
  275. </ul>
  276. Par exemple, pour le fichier comici.php :
  277. <br>
  278. <br>
  279. <code>$name='ComicSansMS,Italic';</code>
  280. <br>
  281. <br>
  282. On l'utilise ensuite normalement :
  283. <div class="source">
  284. <pre><code>$pdf<span class="kw">-&gt;</span>AddFont<span class="kw">(</span><span class="str">'Comic'</span><span class="kw">,</span><span class="str">'I'</span><span class="kw">,</span><span class="str">'comici.php'</span><span class="kw">);
  285. </span></code></pre>
  286. </div>
  287. <h2>Réduction de la taille des polices TrueType</h2>
  288. Les fichiers de police sont souvent volumineux (plus de 100, voire 200 Ko) ; c'est dû au fait
  289. qu'ils contiennent les caractères correspondant à de nombreux encodages. La compression par
  290. zlib les réduit mais les fichiers restent encombrants. Il existe une technique pour diminuer
  291. la taille de ces fichiers. Elle consiste à convertir la police en Type1 avec ttf2pt1 en précisant
  292. l'encodage qui nous intéresse ; tous les autres caractères sont écartés.
  293. <br>
  294. Par exemple, la police arial.ttf livrée avec Windows 98 fait 267 Ko (elle contient 1296
  295. caractères). Compressée, elle en fait 147. Convertissons-là en Type1 en ne conservant que
  296. les caractères correspondant à l'encodage cp1250 :
  297. <br>
  298. <br>
  299. <kbd>ttf2pt1 -b -L cp1250.map c:\windows\fonts\arial.ttf arial</kbd>
  300. <br>
  301. <br>
  302. Les fichiers .map se trouvent dans le répertoire font/makefont/ de l'archive. On obtient alors
  303. les fichiers arial.pfb et arial.afm. arial.pfb ne fait plus que 35 Ko, et 30 Ko après compression.
  304. <br>
  305. <br>
  306. Il est possible d'aller encore plus loin. Si vous n'êtes intéressé que par un sous-ensemble
  307. de l'encodage (il est peu probable que vous ayez besoin des 217 caractères), vous pouvez ouvrir
  308. le fichier .map et enlever les lignes qui ne vous intéressent pas. Cela réduira d'autant la
  309. taille du fichier obtenu.
  310. </body>
  311. </html>