- PVSM.RU - https://www.pvsm.ru -

Занимаюсь развитием образовательного проекта. И в этом году для ребят потребовались прописи на английском языке.
Несмотря на то, что мы все чаще печатаем тексты в электронном формате, написание их от руки остаётся ещё популярным в повседневной и профессиональной жизни.
Прописи — вещь полезная как и для детей, так и для взрослых. Одни еще учатся писать, другие — тренируются.
Нам было важно создать систему быстрого и удобного подбора прописей. Поэтому решили сделать свой генератор.
Тема интересная, но информации в интернете оказалось очень мало. Так возникла идея написать инструкцию создания своих прописей.
Изобрести велосипед сделать свой генератор прописей, для создания персональных заданий для каждого студента.
В силу особенности своего проекта моя реализация сделана на ПХП, уверен, что есть множество других интересных и хороших вариантов решения этой задачи.
Начинать надо всегда с простого, с постановки задачи. Что такое генератор прописей? Вот простая схема.
Вводим текст, из текста создается пдф файл с оформлением тетрадного листа и рукописным шрифтом, который надо обводить.
Если с вводом и текста и отправкой формы нам поможет обычный html, то для генерации пдф документа нам нужна специальная библиотека, мой взор пал fpdf [1](она маленькая, бесплатная и простая — идеально подходит для решения нашей задачи).
Отправка данных есть, генератор пдф есть, теперь нужен шрифт.
Есть хороший шрифт Learning Curve [2] он отлично решает нашу задачу. Шрифт надо будет обработать на сайте fpdf [3], чтобы можно было добавить его в скрипт(кодировка cp1252 вполне подходит).
Теперь осталось достать оформление тетрадного листа: я брал функцию для рисования клеток с сайта fpdf [4], убрал там вертикальные линии, добавил наклонные линии и поля.
Наконец, собрав все необходимые элементы можно делать генератор прописей.
Оформляем html страничку с отправкой формы(я брал оформление здесь [5]):
create-exercise.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
<form class="decor" action="gotopdf2.php" method="post">
<div class="form-left-decoration"></div>
<div class="form-right-decoration"></div>
<div class="circle"></div>
<div class="form-inner">
<h3>Выберите тип написания букв</h3>
<p>серый <input type="radio" name="type_letter_propisi" value=0 checked></p>
<p>пунктирный <input type="radio" name="type_letter_propisi" value=1></p>
<h3>Место для прописи:</h3>
<textarea name="data1"rows="10"></textarea>
<input type="submit" value="Создать пропись">
</div>
</form>
</body>
</html>
style.css
* {box-sizing: border-box;}
body {background: #f69a73;}
.decor {
position: relative;
max-width: 400px;
margin: 50px auto 0;
background: white;
border-radius: 30px;
}
.form-left-decoration,
.form-right-decoration {
content: "";
position: absolute;
width: 50px;
height: 20px;
background: #f69a73;
border-radius: 20px;
}
.form-left-decoration {
bottom: 60px;
left: -30px;
}
.form-right-decoration {
top: 60px;
right: -30px;
}
.form-left-decoration:before,
.form-left-decoration:after,
.form-right-decoration:before,
.form-right-decoration:after {
content: "";
position: absolute;
width: 50px;
height: 20px;
border-radius: 30px;
background: white;
}
.form-left-decoration:before {top: -20px;}
.form-left-decoration:after {
top: 20px;
left: 10px;
}
.form-right-decoration:before {
top: -20px;
right: 0;
}
.form-right-decoration:after {
top: 20px;
right: 10px;
}
.circle {
position: absolute;
bottom: 80px;
left: -55px;
width: 20px;
height: 20px;
border-radius: 50%;
background: white;
}
.form-inner {padding: 50px;}
.form-inner input{
display: inline;
width: normal;
padding: 0 20px;
margin-bottom: 10px;
background: #E9EFF6;
line-height: 40px;
border-width: 0;
border-radius: 20px;
font-family: 'Roboto', sans-serif;
}
.form-inner textarea {
display: block;
width: 100%;
padding: 0 20px;
margin-bottom: 10px;
background: #E9EFF6;
line-height: 40px;
border-width: 0;
border-radius: 20px;
font-family: 'Roboto', sans-serif;
}
.form-inner input[type="submit"] {
margin-top: 30px;
background: #f69a73;
border-bottom: 4px solid #d87d56;
color: white;
font-size: 14px;
}
.form-inner textarea {resize: none;}
.form-inner h3 {
margin-top: 0;
font-family: 'Roboto', sans-serif;
font-weight: 500;
font-size: 24px;
color: #707981;
}

Редактируем файл с классом сетки(создаем тетрадный лист):
grid.php (измененный файл, где раньше был код для создания сетки)
<?php
require_once('fpdf182/fpdf.php');
class PDF_Grid extends FPDF {
var $grid = false;
var $inclined = false;
var $border = true;
var $i_hl= 0;
var $i_hl_up= 13.5;
function DrawGrid()
{
if($this->grid===true){
$spacing = 5;
} else {
$spacing = $this->grid;
}
$this->SetDrawColor(0,0,0);
$this->SetLineWidth(0.35);
$h_limit=$this->h-20;
for($i=$this->i_hl;$i<$h_limit;$i+=$spacing){ //print _ horizontal lines
$this->Line(0,$i,$this->w,$i);
}
for($i=$this->i_hl_up;$i<$h_limit;$i+=$spacing){ //print up_ horizontal lines 13.5
$this->Line(0,$i,$this->w,$i);
}
//Create inclined lines
$tan_treangle_inc_line=tan(deg2rad(25));
if($this->inclined == true){ //print / inclined lines
$this->SetDrawColor(0,0,0);
for($i=4;$i<=55;$i+=7)
$this->Line(12*$i*$tan_treangle_inc_line, 0, 0, 12*$i);
}
if($this->border == true){ //print | right border line
$this->SetDrawColor(255,0,0); //red border
$this->Line(185, 0, 185, 300);
}
}
function Header()
{
if($this->grid)
$this->DrawGrid();
}
}
?>
Теперь создаем сам файл для обработки данных и генерации прописей:
gotopdf2.php (Файл обработчик, где все настраивается и создается)
<?php
require_once('gridphp.php');
$pdf=new PDF_Grid();
/*
//Устанавливаем основные настройки прописи
*/
$pdf->inclined = true; //Включаем наклонную линию
$pdf->SetMargins(5,5,25); //Устанавливаем отступы
$pdf->grid = 18; //устанавливаем через какое расстояние нижняя линейка будет повторяться
$pdf->AddPage();
/*
//Устанавливаем настройки начертания букв(настраиваем шрифты)
*/
switch ($_POST['type_letter_propisi']) {
case 0: //серое начертание
$pdf->AddFont('LearningCurve-Bold','','learning_curve_bold_ot_tt.php');
$pdf->SetFont('LearningCurve-Bold','',36);
$pdf->SetTextColor(140,140,140);
break;
case 1: //пунктирное начертание
$pdf->AddFont('LearningCurve-dashed','','learning_curve_dashed_ot_tt.php');
$pdf->SetFont('LearningCurve-dashed','',36);
$pdf->SetTextColor(0,0,0);
break;
default:
$pdf->Write(18,"Упс, ошибка при выборе начертаний букв");
break;
}
$text_propisi = mb_convert_encoding($_POST['data1'], "cp1252");
$pdf->Write(18,"$text_propisi"); //Вывод текста в виде прописи
$pdf->Output();
?>
Все, готово! Ниже прикрепляю полученные результаты:

Просто лист

Обычное серое начертание

Пунктирное начертание
С минимальными затратами получаем свой собственный генератор прописей. Дальше сюда можно добавлять разные интересные функции: выбор размера и цвета букв, языка и т.д.
Ссылка на GitHub [6]
P.S. Я делал проект на локальном сервере, использовал xampp
Автор: Николай Никонов
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/356458
Ссылки в тексте:
[1] fpdf: http://www.fpdf.org/
[2] Learning Curve: http://www.bvfonts.com/fonts/details.php?id=76
[3] fpdf: http://www.fpdf.org/makefont/
[4] сайта fpdf: http://www.fpdf.org/en/script/script100.php
[5] здесь: https://html5book.ru/krasivaya-forma-dlya-sayta/
[6] Ссылка на GitHub: https://github.com/nikola216/generator-for-letter-training
[7] Источник: https://habr.com/ru/post/517036/?utm_source=habrahabr&utm_medium=rss&utm_campaign=517036
Нажмите здесь для печати.