Артём Мáлков

Dompdf – мощнейший PHP-класс для конвертирования HTML-документов в PDF-файлы

30 дек6 комм

Не так давно передо мной встала задача – организовать экспорт HTML-данных в один из популярных графических файлов или же в PDF.

Поскольку получать на выходе картинку в данном случае мне показалось безумием, я решил остановиться на PDF.

Поискав информацию в Интернете и испробовав уйму различных вариантов реализации похожего функционала, я обнаружил, что часть из них работают некорректно, а часть – попросту не работает с кириллицей (русским языком).

Это, конечно, меня не огорчило, и потратив еще немного времени (как говорится, кто ищет – тот всегда найдет), я нашел-таки тот инструмент, который помог мне решить поставленные задачи.

Это класс «Dompdf» для PHP. Что же он из себя представляет?

  1. Есть поддержка русского языка.
  2. Полностью бесплатен.
  3. Легок в использовании.
  4. Открытый исходный код.
  5. Поддержка HTML-разметки и CSS-стилей.
  6. Поддержка изображений.

Возможно, что-то забыл упомянуть, но согласитесь – звучит впечатляюще.

Так вот, именно этот класс помог мне превратить некий документ HTML в идентичный PDF. Именно тому, как им пользоваться, и будет посвящена эта статья.

Итак, прежде всего, для того чтобы воспользоваться этим классом, вы скачиваете архив в конце статьи.

Далее загружаете файлы к себе на сервер и осуществляете подключение скрипта в вашем PHP-файле:

require_once("dompdf/dompdf_config.inc.php");

Отлично, теперь для примера добавим некий HTML-документ:

$html = <<<HTML

	<!DOCTYPE html>
	
	<html>
	
		<head>
		
			<meta charset="utf-8">
			<title>Test Page</title>
			
		</head>
		
		<body>
			
			<p>Привет, <span style="color: green">Мир</span>!</p>
			
		</body>
		
	</html>
	
HTML;

Здесь мы указываем документ непосредственно в теле скрипта, но также вы можете заменить всю строку, например, на:

$html = file_get_contents("LINK");

Где «LINK» – ссылка на HTML-страницу, которую нужно конвертировать.

Ну и финальные штрихи – это добавить соответствующие теги класса:

$dompdf = new DOMPDF(); // Создаем обьект
$dompdf->load_html($html); // Загружаем в него наш HTML-код
$dompdf->render(); // Конвертируем HTML в PDF
$dompdf->stream("new_file.pdf"); // Выводим результат на скачивание

И общая картина получается такая:

<?php

	header("Content-Type: text/html; charset=utf-8");

	require_once("dompdf/dompdf_config.inc.php");

	$html = <<<HTML

		<!DOCTYPE html>
	
		<html>
	
			<head>
		
				<meta charset="utf-8">
				<title>Test Page</title>
			
			</head>
		
			<body>
			
				<p>Привет, <span style="color: green">Мир</span>!</p>
			
			</body>
		
		</html>
	
HTML;

	$dompdf = new DOMPDF();
	$dompdf->load_html($html);
	$dompdf->render();
	$dompdf->stream("new_file.pdf");

?>

Если вы не хотите, чтобы при посещении скрипта происходило скачивание полученного PDF-файла, а хотите поместить данные в переменную для дальнейшего использования, то строку:

$dompdf->stream("new_file.pdf");

замените на:

$new_file = $dompdf->output(0);

Еще один важный момент: если ссылки на изображения прописаны не относительные, а абсолютные (то есть не «/logo.png», а «https://your_site.com/logo.png»), то в таком случае откройте файл dompdf_config.inc.php в папке /dompdf/ и строку:

def("DOMPDF_ENABLE_REMOTE", false);

замените на:

def("DOMPDF_ENABLE_REMOTE", true);

Вот, собственно, и все. Очень важный момент: если вы получаете ошибку при конвертировании, то всего скорее, вы используете новые свойства стилей (как было у меня), в таком случае – просто постарайтесь оптимизировать (упростить) свой код.

Файл
Размер
Ссылка
dompdf.zip
8,57 Mb
Скачать с сервера
Рекомендуем к просмотру
Браузеры для Android с функцией исследования элемента
Посты
Ant Renamer: массовое переименование файлов в Windows
Статьи и советы
Как отследить направление прокрутки страницы на сайте на jQuery?
Статьи и советы
6
комментариев
Форма комментирования этого поста скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 1
    2
      •  Пользователь
    24 апр в 23:45

    Зравствуйте, а как его привязать к сайту? через ajax передать переменную html некому.php? а как заставить его выдать на скачивание пдф, а лучше открыть в новой вкладке?

      • 1
      1067
        •  Команда Pandoge
      25 апр в 15:35

      Артур, здравствуйте!

      Все верно. Через AJAX передаете данные в PHP. В нем сохраняете результат и в ответе на AJAX выводите ссылку на сохраненный файл.

      Ссылку встраиваете в этот скрипт - https://www.pandoge.com/moduli-i-skripty/skachivanie-faylov-po-ssylke-na-javascript

      Если не совсем поняли, могу составить небольшой пример.

      • 2
      2
        •  Пользователь
      25 апр в 18:13

      Артём Мáлков, спасибо, разобрался. сделал сохранение результата в фаил пдф, а на странице открытие этого файла посе запроса.

    • 1
    1
      •  Пользователь
    5 мар в 15:05

    Скажите Артем если у меня php файл вперемешку с html, как мне генерировать PDF?

    Как в конструкцию <<<HTML ,,,,,,,,, HTML вставить php код ?

      • 1
      1067
        •  Команда Pandoge
      6 мар в 04:32

      Vadym, здравствуйте!

      Не совсем понял вопрос.

    • 1
    1067
      •  Команда Pandoge
    11 мар в 02:02

    Если вы получаете ошибку вида:

    Fatal error: Uncaught exception 'DOMPDF_Exception' with message 'No block-level parent found. Not good.'

    при использовании этого класса, то сделайте следующее.

    Откройте файл dompdf_config.inc.php в папке /dompdf/ и строку:

    define("DOMPDF_ENABLE_HTML5PARSER", false);

    замените на:

    define("DOMPDF_ENABLE_HTML5PARSER", true);

    Таким образом, вы включаете поддержку обработки тегов и атрибутов HTML5.

Подняться наверх
«Pandoge» - помощник вебмастера