A
A
andrej33372020-10-04 21:00:57
Yii
andrej3337, 2020-10-04 21:00:57

How to generate png with data in yii2?

Hello.
There is a form (the database is not used), where the data comes from, there are fields for the names of organizations that I want to overlay on the image through the variables $k1, $k2, $k3 In the same form, under the form, you need to display the generated image, depending on the entered data. Pure php example here https://zachet.pro/ .

You can work with incoming data through a standard action.

public function actionZachet()
    {
        $model = new ZachetForm();
            if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            }
        return $this->render('zachet', compact('model'));

    }

In the same controller, I created a second action to generate png. It works fine with regard to the generation and drawing of figures.
public function actionImgDefawltv1() {   
        $img_width = 1000;
        $img_height = 200;
        $img = imagecreatetruecolor($img_width, $img_height);

        $black = imagecolorallocate($img, 0, 0, 0);
        $white = imagecolorallocate($img, 255, 255, 255);
        imagefill($img, 0, 0, $white);

        $font = 'E:\OpenServer\domains\myproject.com\frontend\views\service\Roboto-Medium.ttf';
        imagettftext($img, 10, 0, 3, 85, $black, $font, perenos1($k1)); // первый контрагент
        imagettftext($img, 10, 0, 362, 85, $black, $font, perenos2($k2)); // второй контрагент
        imagettftext($img, 10, 0, 722, 85, $black, $font, perenos3($k3)); // третий контрагент

        imagerectangle($img, $img_width*0/100, $img_height*30/100, $img_width*27/100, $img_height*60/100, $black); //левый прямоугольник
        imagerectangle($img, $img_width*36/100, $img_height*30/100, $img_width*63/100, $img_height*60/100, $black); //средний прямоугольник
        imagerectangle($img, $img_width*72/100, $img_height*30/100, $img_width*99/100, $img_height*60/100, $black); //правый прямоугольник

        imagepng($img); // вывод изображения
        return imagedestroy($img);
    }

However, attempts to pass data to the variables $k1, $k2, $k3 in actionImgDefawltv1() did not work for me, I tried using
$model = new ZachetForm();
$k1 = $model->k1;

... and so too
$request = Yii::$app->request;
$data = $request->post();
echo $data['ZachetForm']['k1']


Also, if you leave the functions for line wrapping in this action, then an error also pops up
function perenos($k1) {
global $font, $k1;
$width = 200;
$margin = 5;
//разбиваем текст на слова
$text_a = explode(' ', $k1);
$text_new = '';
foreach($text_a as $word){
    //создаём новый текст, добавляем слово и вычисляем параметры текста
    $box = imagettfbbox(10, 0, $font, $text_new.' '.$word);
    //если строка влезает в заданную ширину, то добавляем слово с пробелом, если нет то переносим на новую строку
    if($box[2] > $width - $margin*2){
        $text_new .= "\n".$word;
    } else {
        $text_new .= " ".$word;
    }
} return $text_new; 
}

The complete pure php code from the example is as follows. But I don't understand how to make it work on yii2 point-blank.
spoiler
<?php
//Картинка для первого варианта, когда контрагенты в первоначальном положении
//Устанавливаем отображение сообщений об ошибках
ini_set ("display_errors", "1");
error_reporting(E_ALL);
session_start();
$k1=htmlspecialchars_decode($_SESSION['k1']); 
$k2=htmlspecialchars_decode($_SESSION['k2']); 
$k3=htmlspecialchars_decode($_SESSION['k3']);
if (!empty($_SESSION['sum1'])) {$sum1=number_format($_SESSION['sum1'], 2, ',', ' ');} else {$sum1=$_SESSION['sum1'];}
if (!empty($_SESSION['sum2'])) {$sum2=number_format($_SESSION['sum2'], 2, ',', ' ');} else {$sum2=$_SESSION['sum2'];}
if (!empty($_SESSION['sum3'])) {$sum3=number_format($_SESSION['sum3'], 2, ',', ' ');} else {$sum3=$_SESSION['sum3'];}
if (!empty($_SESSION['sum4'])) {$sum4=number_format($_SESSION['sum4'], 2, ',', ' ');} else {$sum4=$_SESSION['sum4'];}

header('Content-type: image/png');

$img_width = 1000;
$img_height = 200;
 
$img = imagecreatetruecolor($img_width, $img_height);
 
$black = imagecolorallocate($img, 0, 0, 0);
$white = imagecolorallocate($img, 255, 255, 255);
imagefill($img, 0, 0, $white);

$font = dirname(__FILE__) . '/Roboto-Medium.ttf';
imagettftext($img, 10, 0, 3, 85, $black, $font, perenos($k1)); // первый контрагент
imagettftext($img, 10, 0, 362, 85, $black, $font, perenos2($k2)); // второй контрагент
imagettftext($img, 10, 0, 722, 85, $black, $font, perenos3($k3)); // третий контрагент

if (empty($sum1)) {imagettftext($img, 10, 0, 282, 87, $black, $font, $sum2." р."); } // сумма первого контрагента
else {imagettftext($img, 10, 0, 282, 87, $black, $font, $sum1." р."); }
imagefilledpolygon($img, [$img_width*35/100, $img_height*43/100, $img_width*35/100, $img_height*49/100, $img_width*36/100, $img_height*46/100], 3, $black); //первая стрелка
imageline($img, $img_width*27/100, $img_height*46/100, $img_width*36/100, $img_height*46/100, $black); //первая линия 

imagefilledpolygon($img, [$img_width*71/100, $img_height*43/100, $img_width*71/100, $img_height*49/100, $img_width*72/100, $img_height*46/100], 3, $black); //вторая стрелка
imageline($img, $img_width*63/100, $img_height*46/100, $img_width*72/100, $img_height*46/100, $black); //вторая линия
if (empty($sum3)) {imagettftext($img, 10, 0, 642, 87, $black, $font, $sum4." р."); }
else {imagettftext($img, 10, 0, 642, 87, $black, $font, $sum3." р."); }  // сумма второго контрагента

function perenos($k1) {
global $font, $k1;
$width = 200;
$margin = 5;
//разбиваем текст на слова
$text_a = explode(' ', $k1);
$text_new = '';
foreach($text_a as $word){
    //создаём новый текст, добавляем слово и вычисляем параметры текста
    $box = imagettfbbox(10, 0, $font, $text_new.' '.$word);
    //если строка влезает в заданную ширину, то добавляем слово с пробелом, если нет то переносим на новую строку
    if($box[2] > $width - $margin*2){
        $text_new .= "\n".$word;
    } else {
        $text_new .= " ".$word;
    }
} return $text_new; 
}

function perenos2($k2) {
global $font, $k2;
$width = 200;
//разбиваем текст на слова
$text_a = explode(' ', $k2);
$text_new = '';
foreach($text_a as $word){
    //создаём новый текст, добавляем слово и вычисляем параметры текста
    $box = imagettfbbox(10, 0, $font, $text_new.' '.$word);
    //если строка влезает в заданную ширину, то добавляем слово с пробелом, если нет то переносим на новую строку
    if($box[2] > $width){
        $text_new .= "\n".$word;
    } else {
        $text_new .= " ".$word;
    }
} return $text_new; 
}

function perenos3($k3) {
global $font, $k3;
$width = 200;
//разбиваем текст на слова
$text_a = explode(' ', $k3);
$text_new = '';
foreach($text_a as $word){
    //создаём новый текст, добавляем слово и вычисляем параметры текста
    $box = imagettfbbox(10, 0, $font, $text_new.' '.$word);
    //если строка влезает в заданную ширину, то добавляем слово с пробелом, если нет то переносим на новую строку
    if($box[2] > $width){
        $text_new .= "\n".$word;
    } else {
        $text_new .= " ".$word;
    }
} return $text_new; 
}

imagerectangle($img, $img_width*0/100, $img_height*30/100, $img_width*27/100, $img_height*60/100, $black); //левый прямоугольник
imagerectangle($img, $img_width*36/100, $img_height*30/100, $img_width*63/100, $img_height*60/100, $black); //средний прямоугольник
imagerectangle($img, $img_width*72/100, $img_height*30/100, $img_width*99/100, $img_height*60/100, $black); //правый прямоугольник
imagepng($img); // вывод изображения
imagedestroy($img);

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question