Телеграм: @camouf_ru Почта: mihail@bazarow.ru

Создать pdf файл из элемента инфоблока, дать скачать пользователю, поддерживать в актуальном состоянии или отправить на e-mail.

Просмотров: 3950

Задача: при каждом посещении статьи, на сайте, нужно создавать pdf файл с ее содержимым и записывать в свойство инфоблока.

Сконвертировать HTML в PDF файл и сохранить:

Для начала, нам нужно просто сгенерировать pdf файл и сохранить. Сделать это можно несколькими способами, но при всех нужно использовать дополнительные библиотеки. Я буду использовать DOMPDF так как, с помощью него можно как угодно сверстать pdf файл, используя обычный html.

Так же, можете обратить внимание на библиотеку FPDF- класс PHP, который позволяет создавать файлы PDF на чистом PHP, то есть без использования библиотеки PDFlib.

Pdf файл будем создавать из текста статьи. В детальном шаблоне статьи создаем файл result_modifier.php (если его еще нет) и создаем переменную с html кодом будущего pdf файла. Сверстать можете как угодно:

$articleTitle = $arResult['NAME']; // название статьи
$articleImg = base64_encode(
	file_get_contents($arResult['DETAIL_PICTURE']['SRC'])
); // картинка
$articleText = $arResult['DETAIL_TEXT']; // текст статьи
$articleID = $arResult['ID']; // ID статьи-элемента

$articleToPdf = 
'<html lang=ru><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><body>
<style type="text/css">
    * {box-sizing: border-box; margin: 0; padding: 0;}
    body {font-family: DejaVu Sans;}
    h1 {font-size: 25px; text-align: center;}
    img {margin:0px 20px; max-width: 100%;}
    p {font-size: 15px; line-height: 23px;}
</style>
<body>'.
   '<h1>' . $articleTitle  . '</h1>'.
   '<img src="data:image/jpg;base64,' . $articleImg . '" width="100%">'.
   '<p>'. $articleText . '</p>'.
'</body></html>';

Обратите внимание: картинку статьи мы преобразовали в base64 иначе она не отобразится в pdf файле.

Теперь качаем библиотеку DOMPDF и загружаем на сайт и подключаем в этом же файле (result_modifier.php). Если планируете использовать библиотеку повсеместно на сайте, можете подключить ее глобально ко всему проекту. Мне нужно только в статьях.

require_once 'ПУТЬ_КУДА_ЗАГРУЗИЛИ_DOMPDF/dompdf/autoload.inc.php';
use Dompdf\Dompdf;
$dompdf = new Dompdf();
$dompdf->loadHtml($articleToPdf);
$dompdf->setPaper('a4', 'portrait');
$dompdf->render();
$output = $dompdf->output(0);

Пояснения:

  • use Dompdf\Dompdf: подключили класс Dompdf
  • dompdf->loadHtml: загрузили наш HTML код со статьей
  • $dompdf->setPaper: установли формат бумаги в A4 с портретной ориентацией. В Dompdf много настроек, по поводу вывода. Смотрите в документации.
  • dompdf->render: запустили генерацию pdf файла.
  • $output = $dompdf->output: в переменной $output получили pdf файл возвращенный как строка.

Теперь, сохраним pdf файл в свойство инфоблока. Сделаем это методом CIBlockElement::Update.

$el = new CIBlockElement;
$PROP = array();
$PROP['ATT_PDF_FILE'] = CFile::MakeFileArray($output);
$arUpdateArticle = Array(
  "PROPERTY_VALUES"=> $PROP,
);
$res = $el->Update($articleID, $arUpdateArticle);
Если, хотите сразу сохранить файл в произвольное место, используйте:
file_put_contents('/ПУТЬ_КУДА_СОХРАНЯЕТЕ/'.$articleTitle.".pdf", $output);

Если хотите отдать файл на скачивание сразу, используйте
$dompdf->stream($articleTitle . ".pdf");
вместо $output = $dompdf->output(0);

Если не хотите, что бы файл создавался каждый раз и пересохранялся: обверните его в проверку на наличие файла.

if (empty($arResult['PROPERTY']['ATT_PDF_FILE']['VALUE'])) {
		....
		Весь наш код
		....
	}

Соотвественно, не используйте условие- если файл нужно создавать каждый раз. Например: статья постоянно меняется и нужно держать pdf файл в актуальном состоянии.

Pdf файл будет создаваться каждый раз при открытии статьи и для каждого пользователя будет максимально актуальным.

Отправить файл на электронную почту, через почтовое событие.

Если хотите реализовать отправку файла на электронную почту, можете использовать метод CEvent::Send

Создаем почтовое событие, например: SEND_ARTICLE_PDF_FILE примерно, с таким содержанием:


Ваш файл #PDF_NAME#.pdf  во вложении к этому письму

И обработчик, в который получаем email пользователя

Event::send(array(
	"EVENT_NAME" => "SEND_ARTICLE_PDF_FILE",
	"LID" => "s1",
	"C_FIELDS" => array(
		"PDF_NAME" => $articleTitle,
		"USER_MAIL" => $userEmail // Это используем в поле "Кому"
    ),
   "FILE" => array($arResult['PROPERTY']['ATT_PDF_FILE']['VALUE']),
));

Данный метод поставит почтовое событие в очередь. Если хотите отправить вне очереди используйте Event::sendImmediate вместо Event::send

В параметр "FILE" можете передать массив ID зарегистрированных в системе файлов или полные пути до файлов - если не используете запись pdf файла в свойство элемента (или хотите приложить, еще несколько файлов).

Михаил Базаров 16.04.2021
Сохранять и регистрировать файл можно методом
CFile::SaveFile
Артем 20.05.2022
Добрый день! Данным метод подойдет для формирования pdf файла в разделе корзина? чтобы пользователь при переходе в корзину - мог сразу выгрузить свой заказ при клике на кнопку? ну и, соответственно, на почту отправлять ему файл pdf при заказе
Михаил Базаров 20.05.2022
Цитата
Артем написал:
Добрый день! Данным метод подойдет для формирования pdf файла в разделе корзина? чтобы пользователь при переходе в корзину - мог сразу выгрузить свой заказ при клике на кнопку? ну и, соответственно, на почту отправлять ему файл pdf при заказе

В целом да. Так же собрать все данные в html массив и сгенерировать pdf ку

Записная книжка разработчика

Примерно с 2013-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Вывести свойство отдельно ото всех или исключить из всех Просмотров: 7019 Иногда, на сайте, под управлением 1С-Битрикс, нужно вывести какое-то конкретное свойство о... Не дать пользователю купить больше одного товара, в Битрикс Просмотров: 5148 Иногда нужно и такое: Например: на одном из разрабатываемых сайтов, мне нужно было создать... Отключить поиск по описаниям товаров в Битрикс Просмотров: 10621 Иногда, нужно отключить поиск по описаниям анонсов и детальному описанию товаров, при разр... Сортировка элементов по индексу сортировки значений типа список Просмотров: 10545 Внутри любого компонента есть заранее заложенные поля для сортировки элементов. МОжно сорт... Вывод элементов с помощью API битрикс Просмотров: 22422 Иногда, выводить элементы инфоблока с помощью компонентов, может оказаться избыточным. Нап... Установить цену товара из свойства инфоблока Просмотров: 8713 На одном из проектов, нужно было единоразово заполнить цены товаров из свойства инфоблока... Создание PWA для сайта на 1С-Битрикс Просмотров: 2100 Технология PWA позволяет создать приложение для любого сайта. Не обязательно работающего ... Вывести дату окончания скидки в карточке товара Просмотров: 3651 Если нужно вывести информацию о скидке в карточке товара, можно воспользоваться методом AJAX корзина с отправкой количества из раздела каталога Просмотров: 19124 Столкнулся с задачкой: нужно было на одном сайте реализовать интерактивный прайс лист. При... Помечаем новинки лейблом в каталоге битрикс Просмотров: 20036 Достаточно часто, при разработке каталога товаров или интернет магазина на системе управле... Самодельная форма добавления элемента на API Битрикс Просмотров: 42558 Компонент iblock.element.add.form написан таким образом, что вы не сможете (не попотев изр... Умный фильтр во всплывающей панели на мобильных. Просмотров: 1447 Шаблон умного фильтра в Битриксе достаточно сложный, с точки зрения верстки и не очень кра... Валидация пароля и подтверждения при регистрации в битрикс Просмотров: 14264 Встала задачка сделать валидацию пароля и его подтверждения в стандартной форме регистраци... Добавление и удаление из сравнения на AJAX: Битрикс Просмотров: 17697 Рецепт лежал у меня в закромах, почти о нем и забыл, но тут подвернулся под руку- решил оп... Подключение мобильной версии шаблона Битрикс сайта, с автопереключени... Просмотров: 42288 Предпочитаю, что бы сайт не грузил кучу скриптов и стилей. При загрузке адаптивного шаблон... Правильное подключение стилей и скриптов в Битрикс Просмотров: 80649 Есть несколько способов подключения файлов стилей и скриптов, при верстке шаблонов в систе... Заполнить картинки разделов каталога из картинок товаров Просмотров: 337 Задача: в каталоге, разделы и подразделы выводятся в виде плитки над товарами, с картинкам... Дать пользователю возможность быстро отредактировать материал Просмотров: 4364 На одном из разрабатываемых сайтов, пользователи формирую его контент. После регистрации, ... Cordova, ввод в input под диктовку. Голосовой поиск в мобильном прило... Просмотров: 1263 Итак, задачка: реализовать голосовой поиск в мобильном приложении на Cordova. По сути, нам... Базовая защита "Битрикс виртуальная машина" от DDoS атак. Просмотров: 5262 Данный способ защиты не панацея, и скорее всего не спасет от профессиональной DDoS атаки, ...