PHP imagettftext

Dernièrement, je constatai que le captcha (test permettant de distinguer un utilisateur humain d’un ordinateur) que j’avais installé sur la page des commentaires ne marchait subitement plus. En y regardant de plus près, je vis que l’erreur venait de la fonction php imagettftext de la bibliothèque GD. Cette fonction dessine un texte avec une police TrueType. Elle accepte en paramètre (entre autres) le chemin vers le fichier de police.
Le problème est que depuis la version 2.0.18 de la librairie GD la façon d’interpréter le chemin a changé. Dorénavant, le fichier doit être défini sans l’extension ttf et la recherche des fichiers se fait par rapport aux répertoires spécifiés dans la variable d’environnement GDFONTPATH. Ainsi, si le fichier de police se trouve au même emplacement que le script php, il convient d’écrire :


putenv('GDFONTPATH=' . realpath('.'));

 

$font = 'Font';

Je tenais l’explication (et la correction) de mon bug ; mon hébergeur avait mis à jour la lib GD du serveur dédié sur lequel est installé mon blog.

Cette mésaventure montre, en tout cas, que php ne semble pas évoluer de manière aussi conservative que java ; rappellons que la JVM 1.5 est toujours capable de faire tourner du code écrit avec la première monture du jdk. Cela pourrait être un frein à l’adoption de php dans l’entreprise.

10 Commentaires

  1. C’est encore bien plus compliqué et vicieux…

    Certains hebergeurs (comme Free) sont en mode « safe_mode=on » dans PHP.INI
    Mode qui interdit l’utilisation en ecriture de la variable GDFONTPATH et qui interdit l’utilisation de polices qui serait dans un chemin absolu dont certains repertoires ne sont pas du meme proprietaire 🙁

    Exemple:
    Le site de « toto » est physiquement sur /home/sites/m-u/toto/

    realpath() renvoie la valeur absolue. Les polices sous toto peuvent ne pas être accessibles selon la config de php.ini car les repertoires /home/sites/m-u n’appartiennent pas à toto 🙁

    Vive le php 6 qui fait sauter cette catastrophique option « safe_mode ».

    Sylvain

  2. Christophe

    Bonjour,
    Je rencontre le même problème avec la fonction imagettftext chez Free.
    Je l’ai testé en local sur mon PC avec une police standard dans une commande du genre :
    imagettftext($Image, 8, 30, $x, $y, $couleur, « Arial »,$Texte);

    Ca marche impeccable.

    Par contre lorsque j’ai voulu le publier chez Free, j’ai obtenu l’erreur suivante :

    Warning: imagettftext() [function.imagettftext]: Could not find/open font in /mnt/146/free.fr/f/4/pyreneesespacevtt/Courbe.php on line 600

    En quelque sorte il ne trouve pas le fichier police Arial.ttf sur le serveur.

    J’ai suivi le conseil d’internautes en plaçant directement ce fichier sur la racine de mon espace de publication et en modifiant la variable d’environnement par la commande

    putenv(‘GDFONTPATH=’ . realpath(‘.’));

    Mais je me suis rapidement aperçu que je n’en avais pas le droit (le safe_mode est activé et la fonction putenv interdite).

    D’ailleurs j’ai contacté l’assistance de Free, voici leur réponse :

    « Il n’est pas possible d’utiliser la fonction imagettftext sur les pages perso de Free malheureusement, la gestion du safe_mode est activée pour des raisons de stabilité liées à notre hébergement mutualisé. »

    J’utilise pourtant une police standard

    Connaissez-vous un moyen de contourner le problème ?
    Pourquoi est-ce que ça marche en local ?

  3. Florent Garin Author

    Je ne sais pas quelle est la version de la lib GD de Free.
    Par contre ce que tu peux essayer:
    Place le fichier de font directement dans ton espace web comme tu as fait mais spécifie le chemin avec l’extension.
    Par exemple si Arial.ttf est dans le même répertoire que ton script php definis le chemin comme ceci :
    « ./Arial.ttf »

  4. Benjy

    Je confirme j’avai le meme probleme et il faut mettre la police comme ceci « ./police.ttf » et ca marche 😀

  5. thomas

    Bonjour,
    Je rencontre un problème un peu different :
    sur mon serveur, gd est instalé avec comme option
    FreeType Linkage : with TTF library
    et le texte ne s’affiche pas dans l’image sauf si je lui mets la couleur noir (0x000000) et là le texte est ecrit en jaune (????).
    J’ai testé la même chose sur d’autres serveurs qui ont
    FreeType Linkage : with freetype
    comme configuration et là aucun problème.

    Avez vous une solution?

  6. cecleo

    Bonjour,
    C’est peut être un peu tard, mais comme j’ai eu le même problème et que d’autres l’auront peut être (invisible ou couleur jaune). Je préfère laisser une trace.

    essayez de modifier le fichier cryptographp.inc.php

    et de remplacer
    imagecreatetruecolor($cryptwidth,$cryptheight);

    $img = imagecreate($cryptwidth,$cryptheight);

  7. Au nom de toutes les cellules de mon corps: merci

    Essaie de te référencer un peu mieux ^^

  8. Your article helped me a lot, is there any more related content? Thanks! https://accounts.binance.com/id/register-person?ref=JHQQKNKN

  9. Thank you for your sharing. I am worried that I lack creative ideas. It is your article that makes me full of hope. Thank you. But, I have a question, can you help me? https://www.binance.com/ka-GE/register?ref=FIHEGIZ8

  10. Thank you for your sharing. I am worried that I lack creative ideas. It is your article that makes me full of hope. Thank you. But, I have a question, can you help me? https://accounts.binance.com/ur/register?ref=GJY4VW8W

Comments are closed.