Générer du texte sur des images avec php

Dans ce billet je présente une procédure simple afin de générer à partir d’un fichier csv des étiquettes depuis un patron image en jpg. L’objectif étant de superposer à la volé du texte sur une image « patron ». Le tout est généré avec du PHP « natif » sans librairies supplémentaire.
Pour générer les images, je vais utiliser un patron d’image vierge dans lequel je vais insérer le texte désiré. Le rendu finale est généré dans la page directement au format A4 afin de faciliter l’impression directement depuis la page web.

Police utilisé pour le texte « OpenSans » : https://fonts.google.com/specimen/Open+Sans?selection.family=Open+Sans
Si vous décidez d’utiliser une autre police, pensez à modifier le code php afin de le faire matcher avec votre police

madata.csv

utilisateur1;utilisateur1@laintimes.com;Site1
utilisateur2;utilisateur2@laintimes.com;Site2
utilisateur3;utilisateur3@laintimes.com;Site3
utilisateur4;utilisateur4@laintimes.com;Site4
utilisateur5;utilisateur5@laintimes.com;Site5

patron.jpg

Structure du projet

La fonction « imagettftext » permet d’insérer le texte sur l’image, dans l’ordre, imagettftext($jpg_image, 10, 0, 390, 72, $color, $font_path, $text);

  • $jpg_image contient le fichier image originale ou écrire le texte
  • 10 définie
  • 0 indique l’inclinaison à donner au texte
  • 390 indique le décalage horizontal à laisser à gauche du texte
  • 72 indique le décalage vertical
  • $color indique la couleur du texte
  • $font_path définie l’emplacement du fichier font au format ttf
  • $text définie le texte à écrire sur l’image

Code PHP

<html>
<head>
<style>
    @page {
      size: A4;
      margin: 0;
    }
    @media print {
      html, body {
        width: 210mm;
        height: 297mm;
      }
      #returned{
        background-color: black;
      }
    }
</style>
</head>
    <body>
   
<form action="" method="post" enctype="multipart/form-data">
    <p>Fichier CSV:
        <input type="file" name="pictures[]" />
        <input type="submit" value="Send" />
    </p>
</form>
   
   
   
    <div id="returned">
<?php
            function LoadData($file)
            {
                // Lecture des lignes du fichier
                $lines = file($file);
                $data = array();
                foreach($lines as $line)
                    $data[] = explode(';',trim($line));
                return $data;
            }
           
            if(isset($_FILES["pictures"]["error"])){
                foreach ($_FILES["pictures"]["error"] as $key => $error) {
                    if ($error == UPLOAD_ERR_OK) {
                        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
                        $name = basename($_FILES["pictures"]["name"][$key]);
                        move_uploaded_file($tmp_name, "todo/$name");
                       
                        $data = LoadData('todo/'.$name);
                        //premier boucle pour le titre
                        foreach($data as $row){
                            $jpg_image = imagecreatefromjpeg('patron.jpg');
                            $color= imagecolorallocate($jpg_image, 0, 0, 0);
                            $font_path = dirname(__FILE__) . '/OpenSans-Regular.ttf';
                           
                            $mystring = $row[0];   
                            $text = $mystring;
                            imagettftext($jpg_image, 10, 0, 80, 72, $color, $font_path, $text);
                           
                            $mystring = $row[1];   
                            $text = $mystring;
                            imagettftext($jpg_image, 10, 0, 220, 72, $color, $font_path, $text);
                           
                            $mystring = $row[2];   
                            $text = $mystring;
                            imagettftext($jpg_image, 10, 0, 190, 35, $color, $font_path, $text);
                            $filename = "./images/".$row[0].".jpg";
                            imagejpeg($jpg_image, $filename);
                            imagedestroy ($jpg_image);
                            echo '</img>';
                        }
                    }
                }
            }
           
?>
    </div>
    </body>
</html>

Laisser un commentaire