Статьи

Конвертировать HTML в PDF с Dompdf

PDF — это стандартный формат, изначально созданный Adobe для представления текста и изображений в документе с фиксированным макетом. Веб-приложение нередко поддерживает загрузку данных, таких как счета-фактуры или отчеты, в формате PDF, поэтому в этой статье мы рассмотрим, как легко создавать PDF-документы с использованием PHP.

Dompdf — это отличная библиотека, способная генерировать PDF из разметки HTML и стилей CSS (в основном она совместима с CSS 2.1 и поддерживает некоторые свойства CSS3). Мы можем решить, как должен выглядеть наш контент, используя эти знакомые технологии, а затем легко преобразовать его в фиксированный документ. В библиотеке также есть много других полезных и интересных функций.

Начиная

Dompdf доступен на GitHub и может быть установлен с помощью Composer. Правильная установка и запуск на основе Composer по-прежнему немного сложны, поэтому я рекомендую просто использовать Git для установки Dompdf.

Для библиотеки требуется PHP> = 5.0 с включенными расширениями mbstring и DOM. Также необходимы некоторые шрифты, которые обычно доступны на большинстве машин.

Перейдите туда, куда вы хотите поместить библиотеку и выполните:

  git clone https://github.com/dompdf/dompdf.git
 git submodule init
 обновление подмодуля git 

Загрузив Dompdf, напишем короткий пример, который сгенерирует простой PDF.

<?php set_include_path(get_include_path() . PATH_SEPARATOR . "/path/to/dompdf"); require_once "dompdf_config.inc.php"; $dompdf = new DOMPDF(); $html = <<<'ENDHTML' <html> <body> <h1>Hello Dompdf</h1> </body> </html> ENDHTML; $dompdf->load_html($html); $dompdf->render(); $dompdf->stream("hello.pdf"); 

Чтобы использовать библиотеку в проекте, мы сначала dompdf_config.inc.php который содержит большую часть конфигурации Dompdf. Он также загружает автозагрузчик и пользовательский файл конфигурации, в котором мы можем переопределить параметры конфигурации по умолчанию.

HTML-разметка задается в виде строки для load_html() . Кроме того, мы можем загрузить разметку из файла или URL, используя метод load_html_file() . Он принимает имя файла или URL веб-страницы в качестве аргумента.

Метод render() HTML в PDF, и мы готовы выгрузить файл PDF. stream() отправляет полученный PDF-файл в виде вложения в браузер. Метод stream() имеет необязательный второй параметр, массив опций:

  • Accept-Ranges — логическое значение, отправлять заголовок «Accept-Ranges» (по умолчанию false).
  • Attachment — логическое значение, отправьте заголовок «Content-Disposition: attachment», заставляющий браузер отображать приглашение сохранения (по умолчанию true).
  • compress — boolean, включить сжатие содержимого (по умолчанию true).

Мы создали очень простой PDF здесь, но это не очень практично. В действительности мы часто предъявляем требования к размеру бумаги, ориентации страницы, кодировке символов и т. Д. Существует ряд параметров конфигурации, которые мы можем установить, чтобы сделать Dompdf более подходящим для наших реальных потребностей. Все они перечислены и объяснены в dompdf_config.inc.php который устанавливает их значения по умолчанию. Вы можете изменить эти значения, обновив файл пользовательской конфигурации dompdf_config.custom.inc.php . Некоторые из важных настроек:

  • DOMPDF_DEFAULT_PAPER_SIZE — устанавливает размер бумаги по умолчанию для документа PDF. Поддерживаемые размеры бумаги можно найти в include/cpdf_adapter.cls.php (значение по умолчанию «letter»).
  • DOMPDF_TEMP_DIR — указывает временный каталог, используемый Dompdf. Убедитесь, что это местоположение доступно для записи учетной записи веб-сервера.
  • DOMPDF_UNICODE_ENABLED — устанавливает, использует ли PDF шрифты Unicode (по умолчанию установлено значение true).
  • DOMPDF_ENABLE_REMOTE — включает включение изображений или стилей CSS с удаленных сайтов (по умолчанию false).
  • DEBUG_LAYOUT — отображать ли рамку вокруг каждого блока HTML в файле PDF, что полезно для отладки макета (по умолчанию false).

Расширенное использование

Теперь поговорим о некоторых передовых применениях Dompdf. Возможно, мы хотим сохранить сгенерированный PDF-документ на диск, а не отправлять его в браузер. Вот как:

 <?php $dompdf = new DOMPDF(); $dompdf->load_html($html); $dompdf->render(); $output = $dompdf->output(); file_put_contents("/path/to/file.pdf", $output); 

Вместо вызова stream() как в предыдущем примере, мы используем output() который возвращает PDF в виде строки. Он также принимает необязательный массив параметров, но единственный доступный параметр — это сжатие (по умолчанию — true).

Dompdf также позволяет нам добавлять верхний или нижний колонтитул к сгенерированному PDF, встраивая PHP-скрипт в HTML, который он отображает. Но поскольку обработка произвольного кода может представлять угрозу безопасности, если вы не будете осторожны, значение конфигурации, управляющее этой функцией, по умолчанию отключено. Сначала нам нужно установить для параметра DOMPDF_ENABLE_PHP true.

Как только мы включили встроенное выполнение PHP, объект PDF станет доступным в скрипте, который мы можем использовать для управления страницей. Мы можем добавлять текст, линии, изображения, прямоугольники и т. Д. В любом месте на странице.

 $html = <<<'ENDHTML' <html> <body> <script type="text/php"> if (isset($pdf)) { // open the PDF object - all drawing commands will // now go to the object instead of the current page $footer = $pdf->open_object(); // get height and width of page $w = $pdf->get_width(); $h = $pdf->get_height(); // get font $font = Font_Metrics::get_font("helvetica", "normal"); $txtHeight = Font_Metrics::get_font_height($font, 8); // draw a line along the bottom $y = $h - 2 * $txtHeight - 24; $color = array(0, 0, 0); $pdf->line(16, $y, $w - 16, $y, $color, 1); // set page number on the left side $pdf->page_text(16, $y, "Page: {PAGE_NUM} of {PAGE_COUNT}", $font, 8, $color); // set additional text $text = "Dompdf is awesome"; $width = Font_Metrics::get_text_width($text, $font, 8); $pdf->text($w - $width - 16, $y, $text, $font, 8); // close the object (stop capture) $pdf->close_object(); // add the object to every page (can also specify // "odd" or "even") $pdf->add_object($footer, "all"); } </script> <h1>Hello Dompdf</h1> </body> </html> ENDHTML; 

Сценарий внедряется непосредственно в разметку HTML и сначала открывает объект, чтобы мы могли повлиять на рендеринг. Весь рисунок будет записан в этот объект, и мы можем добавить этот объект ко всем или выбранным страницам (хотя есть ограничения).

Затем мы выбираем фактическую ширину и высоту страницы, чтобы вычислить координаты нижнего колонтитула, который мы собираемся добавить. Также нам нужно предоставить объект шрифта, пока мы добавляем текстовое содержимое. Font_Metrics::get_font() позволяет нам создать Font_Metrics::get_font() нам объект. Мы также берем высоту данного шрифта по размеру шрифта, используя get_font_height (), чтобы вычислить позиционирование содержимого нижнего колонтитула. Метод get_font_width() возвращает ширину нашего текста для данного шрифта и размер шрифта, который также используется в наших вычислениях.

Метод line() рисует линию от точки (X1, Y1) до (X2, X2). Обратите внимание, что предоставленное нами значение цвета не является фактическим значением RGB. Базовый класс PDF требует значений от 0 до 1, поэтому мы конвертируем значения RGB в эти новые значения. Чтобы получить лучшее приближение, вы можете разделить его на 255.

Мы добавляем номер страницы для каждой страницы, используя метод page_text (), который принимает позицию X и Y, текст, который нужно добавить, объект шрифта, размер шрифта и цвет. Dompdf автоматически заменяет значения {PAGE_NUM} и {PAGE_COUNT} на каждой странице и делает доступным для нас $pdf .

Когда рендеринг PDF, нижний колонтитул будет выглядеть так:

DOMPDF-01

Можно избежать использования встроенного PHP и добиться того же эффекта непосредственно из PHP, например, так:

 <?php $dompdf = new DOMPDF(); $dompdf->set_paper("A4"); // load the html content $dompdf->load_html($html); $dompdf->render(); $canvas = $dompdf->get_canvas(); $font = Font_Metrics::get_font("helvetica", "bold"); $canvas->page_text(16, 800, "Page: {PAGE_NUM} of {PAGE_COUNT}", $font, 8, array(0,0,0)); $dompdf->stream("sample.pdf",array("Attachment"=>0)); 

Обратите внимание, что мы $dompdf->render() код после вызова $dompdf->render() потому что мы по сути модифицируем отрендеренный PDF.

Вывод

В этой статье мы обсудили, как легко конвертировать HTML в PDF, используя Dompdf. Хотя Dompdf — отличная библиотека, она не является пуленепробиваемым решением для создания PDF-документов; у него есть некоторые ограничения и проблемы. Dompdf на самом деле не терпит плохо сформированный HTML, и большие таблицы могут легко привести к нехватке памяти. Некоторые базовые функции CSS, такие как float, поддерживаются не полностью, а поддержка CSS3 ограничена. Если вам нужны функции, которые не поддерживаются Dompdf, лучше подойдет что-то вроде wkhtmltopdf. Тем не менее, Dompdf довольно прост и подходит для большинства потребностей экспорта PDF.

Действительно сложно объяснить все функции, предоставляемые библиотекой в ​​статье, такой как эта, поэтому обязательно ознакомьтесь с документацией и исходным кодом, а также узнайте о интересных функциях, таких как добавление обратных вызовов, использование пользовательских шрифтов и т. Д. Кроме того, я Я рад помочь вам в рамках моего ограниченного опыта. Не стесняйтесь оставлять свои вопросы и делиться своим опытом в разделе комментариев.

Изображение через Fotolia

И если вам понравилось читать этот пост, вы полюбите Learnable ; место, чтобы узнать новые навыки и приемы у мастеров. Участники получают мгновенный доступ ко всем электронным книгам SitePoint и интерактивным онлайн-курсам, таким как Jump Start PHP .

Комментарии к этой статье закрыты. Есть вопрос по PHP? Почему бы не спросить об этом на наших форумах ?