
Здравствуйте! В данной статье мы рассмотрим автоматическую генерацию PDF документа средствами PHP. Реализуем возможность сохранять любую статью на сайте в PDF формате. Данный функционал будем разворачивать на CMS 1c-Bitrix. Чем больше изучаю эту платформу, тем больше убеждаюсь в качестве её разработки.
Итак, общий алгоритм будет следующим: при сохранении, ипдейте элемента в инф. блоке, создается/обновляется PDF документ. Что бы ни изобретать велосипед, для создания PDF файла, будем использовать библиотеку mPDF () . На момент написания статьи, последний актуальный релиз mPDF v5.7. Качаем архив, разархивируем и заливаем на сервер (в корень сайта).
Теперь задача стоит в выборе метода генерации, можно создать отдельный скрипт, передать ему ID элемента и на выходе выплюнуть сгенерированный файл, можно повесить обработчик на события: создание и апдейт элемента инф. блока. Для теста я выбрал второй вариант, т.к. поток статей не очень большой и не будет существенной нагрузки при перезаписи или создании PDF документов.
Итак, общий алгоритм будет следующим: при сохранении, ипдейте элемента в инф. блоке, создается/обновляется PDF документ. Что бы ни изобретать велосипед, для создания PDF файла, будем использовать библиотеку mPDF () . На момент написания статьи, последний актуальный релиз mPDF v5.7. Качаем архив, разархивируем и заливаем на сервер (в корень сайта).
Теперь задача стоит в выборе метода генерации, можно создать отдельный скрипт, передать ему ID элемента и на выходе выплюнуть сгенерированный файл, можно повесить обработчик на события: создание и апдейт элемента инф. блока. Для теста я выбрал второй вариант, т.к. поток статей не очень большой и не будет существенной нагрузки при перезаписи или создании PDF документов.
Функция генерации файла (обработчик события):
function IBlockAfterSave($arFields)
{
require($_SERVER["DOCUMENT_ROOT"]."/MPDF57/mpdf.php");
if(!CModule::IncludeModule("iblock"))
return;
$res = CIBlockElement::GetByID($arFields['ID']);
if($ar_res = $res->GetNext()){
$HTML = "
<div class=\"post-pdf\">
<h1>$ar_res[NAME]</h1>
<div class=\"post-pdf-text\">$ar_res[DETAIL_TEXT]</div>
</div>";
$HTML = iconv('cp1251', 'utf-8', $HTML);
$PDF_NAME = $arFields['ID'].".PDF";
$BE_DIR = $_SERVER["DOCUMENT_ROOT"]."/".COption::GetOptionString("main", "upload_dir")."/pdf/";
$mpdf=new mPDF();
$mpdf->SetHeader($ar_res["DATE_CREATE"].'|{PAGENO}|Блог WEB программиста');
$mpdf->SetFooter('|{PAGENO} | http://'.COption::GetOptionString("main", "server_name").$ar_res["DETAIL_PAGE_URL"]);
$mpdf->WriteHTML($HTML);
$mpdf->Output($BE_DIR.$PDF_NAME,"F");
}
}
|
Регистрируем обработчики в файле init.php
<?php
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "IBlockAfterSave");
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "IBlockAfterSave");
?>
|
Так же прописываем обработчик, который будет удалять сгенерированный файл, при удалении элемента:
<?
AddEventHandler("iblock", "OnBeforeIBlockElementDelete", "IBlockBeforeDel");
function IBlockBeforeDel($ID)
{
if(file_exists($_SERVER["DOCUMENT_ROOT"]."/".COption::GetOptionString("main", "upload_dir")."/pdf/".$ID.".PDF"))
unlink($_SERVER["DOCUMENT_ROOT"]."/".COption::GetOptionString("main", "upload_dir")."/pdf/".$ID.".PDF");
}
?>
|
Далее в шаблон компонента вывода элементов из инф блока можно подключить проверку существования PDF версии и вывод ссылки на файл.
P.S. сильно не пинать, первая статья