Answer the question
In order to leave comments, you need to log in
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'));
}
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);
}
$model = new ZachetForm();
$k1 = $model->k1;
$request = Yii::$app->request;
$data = $request->post();
echo $data['ZachetForm']['k1']
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;
}
<?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 questionAsk a Question
731 491 924 answers to any question