Заказать проект
Оставьте заявку для получения коммерческого предложения.
Заполните форму и мы вышлем Вам предложение в котором решим,
чем можем вам помочь.
Генерация PDF со  страницы и отправка на еmail

Генерация PDF со страницы и отправка на еmail

14 Мая 2019
Олег Мостовой
Junior Back End Developer
Олег Мостовой
следующая статья

Документы в формате PDF поддерживаются огромным количеством устройств от компьютеров до мобильных телефонов или электронных книг. “PDF-ки” намного маловеснее, чем, скажем, изображения в популярном формате JPEG. Поэтому их использование в развитии вашего бизнеса всецело оправдано и эффективно.  

Это правдивая история одной разработки в компании Авиви по желанию заказчика, который думал именно так.

Удобные расчеты

На одной из страниц коммерческого сайта нашего клиента размещается калькулятор доходности инвестирования. Здесь пользователи могут рассчитать свой будущий доход в зависимости от вложенной суммы и периода инвестирования. Чтобы избавить посетителей от дополнительных хлопот с копированием результатов или создания скриншотов, заказчик решил расширить функционал своего сайта и дать пользователям возможность отправлять их расчеты на указанный email в виде  прикрепленного PDF-файла.
После детального изучения ТЗ и оценки задачи, было принято решение генерировать файл на лету с помощью javascript и отправлять на сервер, где он будет отправлен по почте стандартными методами CMS Битрикс.

Создание PDF-генератора

Для генераци выбор пал на js библиотеку html2pdf. А вернее ее ветку, в которой реализована callback-функция, где можно обрабатывать результаты генерации. Также в этой ветке реализован функционал, с помощью которого можно получить файл в виде   blob-объекта

Вот пример кода который генерирует PDF и отправляет его на сервер:

 html2pdf().from("calculator").set({
        filename: 'actual.pdf',
        margin:  [0.2,0,0.2,0],
        pagebreak: { mode: 'avoid-all', before: '#required_info' },
        html2canvas:  { scale: 1 },
        jsPDF: {orientation: 'landscape', unit: 'in', format: 'A4', compressPDF: false}
    }).toPdf().get('pdf').then(function (pdf) {
			var blob = pdf.output('blob'); // получаем наш файл в виде blob объекта
			var formData = new FormData();
			formData.append('pdf', blob);  
			formData.append('email', $('.popup-send-mail__input[name="email"]').val()); // указываем email
			$.ajax({
				url: '/ajax/mail.php',  
				method: 'POST',
				data: formData,
				processData: false,
				contentType: false,
				success: function(response){
					popupMailText.text('Сообщение отправлено');
				},
				error: function(err){

					popupMailText.text('Ошибка отправки');
				}
				});
		});

Хочу отметить, что данный метод создания PDF-файлов подходит не только для CMS Битрикс, но и для любой другой платформы управления сайтом.


Отправляем электронное письмо

На сервер приходит файл, доступ к которому можно получить из массива $_FILES  и email из массива  $_REQUEST.
Полученный файл переносим из временного хранилища в папку /upload/. Затем получаем ID файла, регистрируя его в CMS Битрикс.  В методе CEvent::Send в параметрах указываем шаблон письма, адрес и ID  файла. После отправки удаляем временные файлы.

Код отправки письма:

	 
$pdf = $_FILES['pdf']['tmp_name'];
if(isset($pdf))
{
	$location = $_SERVER['DOCUMENT_ROOT'].'/upload/calculation/temp_file.pdf'; 
	move_uploaded_file($pdf, $location);//временный файл
	if (CModule::IncludeModule("iblock"))
	{
		$path=($_SERVER['DOCUMENT_ROOT'].'/testia/calculator/random-name.pdf');
		$iFileId = \CFile::SaveFile(\CFile::MakeFileArray($location), "calculation"); // регистрируем файл в Битриксе и получаем его ID
		$eventID=\CEvent::Send(
		        'CALCULATE_PDF',
		        SITE_ID,
		        ['EMAIL_TO' => $_REQUEST['email']],
		        'Y',
		        '',
		        [$iFileId]
		    );
	    if ($iFileId) {
		unlink($location);
	        \CFile::Delete($iFileId);
	    }
	 }
 }

Post Scriptum

Описанные выше методы работают отлично. В данной задаче мы также реализовали функционал сохранения указанных адресов электронных почт пользователей, но об этом можем поговорить в личном порядке.

От себя лично хотелось бы добавить, что для решения этой задачи больше всего времени занял поиск способа передачи сгенерированного в js файла на сервер. На просторах Интернета оказалось катастрофически мало информации по этой теме. Поэтому я надеюсь, что мой личный опыт пригодится многим Битрикс-разработчикам.


Need help?

Ask a question.

Chat Now
Записаться На Консультацию
Записаться На Консультацию
Мы свяжемся
с вами
в течении
10 минут
laptop
Мы свяжемся с вами в течении 10 минут