Создание pdf документа из компонента битрикс

2k
Алексей,
Создание pdf документа из компонента битрикс

Пример почти готового кода создания pdf документа с помощью библиотеки dompdf

Пример почти готового кода создания 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 специфична. Но, взяв за основу готовый компонент с сайта, вам не придётся в будущем вносить правки дважды.

Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.

Опубликовано 8 февраля 2023 | Обновлено 30 октября 2023
pdf, dompdf, печать, разработчику, готовый код
Поделиться
Комментарии
❮…❯
Авторизуйтесь чтобы получать уведомления об ответе
Пример почти готового кода создания pdf документа с помощью библиотеки dompdf