Создание pdf документа из компонента битрикс
Пример почти готового кода создания pdf документа с помощью библиотеки dompdf
Ниже код страницы, на которую можно отправить аякс запрос, а в ответе будет получен путь до pdf документа.
<?php require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); require($_SERVER["DOCUMENT_ROOT"].'/path/to/dompdf/autoload.inc.php'); // путь до dompdf global $APPLICATION; use Bitrix\Main\Page\Asset, Dompdf\Dompdf, Dompdf\Options; ?> <!DOCTYPE html> <html lang="<?=LANGUAGE_ID?>"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=1920, initial-scale=1"> <?php // Подключаем стили шаблона/компонента Asset::getInstance()->addCss(SITE_TEMPLATE_PATH . '/css/custom.css'); $APPLICATION->ShowCSS(true, false); ?> </head> <body> <div class="container"> <?php // Компонент, сохраняемый в pdf $APPLICATION->IncludeComponent("bitrix:news.detail", "", []; ?> </div> <style> * { font-family: 'DejaVu Sans' !important; } footer{ position: absolute; left: 15px; bottom: 15px; } </style> <footer><a href="https://blog.budagov.ru/">https://blog.budagov.ru/</a> — Записки веб-разработчика © <?=date('Y')?></footer> </body> </html> <?php // Инлайнит стили и сохраняет pdf \Bitrix\Main\EventManager::getInstance()->addEventHandler("main", "OnEndBufferContent", "makePdf"); function makePdf (&$content) { global $APPLICATION; preg_match_all("/\<link.*href=\"(.*\.css).*\>/i", $content, $matches); foreach ($matches[1] as $i => $cssPath) { $cssInline = file_get_contents($_SERVER["DOCUMENT_ROOT"] . $cssPath); $content = str_replace($matches[0][$i], '<style>' . $cssInline . "</style>", $content); } $content = str_replace('img src="', 'img src="https://'.$_SERVER['SERVER_NAME'], $content); // Подменяем ссылки на изображениях $pdfLink = "/upload/pdf/test.pdf"; $fullFileSrc = $_SERVER["DOCUMENT_ROOT"] . $pdfLink; $options = new Options(); $options->set('temp_dir', $_SERVER["DOCUMENT_ROOT"] . "/tmp"); $options->set('isRemoteEnabled',true); $options->set('defaultFont', 'DejaVu Sans'); $dompdf = new Dompdf($options); $dompdf->loadHtml($content); $dompdf->setPaper('A4'); $dompdf->render(); $output = $dompdf->output(); if (file_exists($fullFileSrc)) { unlink($fullFileSrc); } file_put_contents($fullFileSrc, $output); $content = json_encode(['link' => $pdfLink]); // Выводим ссылку на pdf } require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
Не ждите, что всё получится с первого раза, вёрстка под pdf специфична. Но, взяв за основу готовый компонент с сайта, вам не придётся в будущем вносить правки дважды.
Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.