Генерация PDF со страницы и отправка на еmail
14 Мая 2019
следующая статья
Документы в формате 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 файла на сервер. На просторах Интернета оказалось катастрофически мало информации по этой теме. Поэтому я надеюсь, что мой личный опыт пригодится многим Битрикс-разработчикам.
Похожие статьи
Записаться на консультацию
Мы свяжемся с вами в течении 10 минут