dompdf в Codeigniter-е на раз, два, три…

это всего-лишь шпаргалка для самого себя…

Представим, что у вас есть проект, базирующийся на фреймворке Codeigniter, и вам кровь из носу нужно, чтобы он мог создавать PDF-файлы. Когда у меня возникла такая задача, то выбор мой пал на библиотеку dompdf. И все написанное ниже — это просто краткий конспект действий по ее (библиотеки) установке и интеграции (как говорят в кино — «основано на реальных событиях» 🙂 ).

Вводные

Коль уж проект на Codeigniter-е имеется, то, полагаю, и сервер, где он размещен, тоже есть в наличии. А на сервере том, как минимум, присутствуют Apache и PHP (а может даже и MySQL?!). Все это установлено, настроено и отлично работает, взаимодействуя друг с другом. Да и сам проект уже делает все, что должен, вот только PDF-ов там и не хватает!.. У вас ведь именно так все  и есть на самом деле? Ну ОК, тогда поехали дальше…

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

sudo apt-get install zlibc

И если пакета в системе не было, то ОС-ь установит его, а если был — то просто сообщит, что такой уже имеется. Но зато в дальнейшем у вас уж точно не будет затыков по причине его отсутствия…

И последнее уточнение — лично я использовал Codeigniter 3-й версии.

Подготовка — установка composer

На самом деле, на сайте composer-а все расписано — и как его качать, и как его ставить, и даже насыпан кучкой набор консольных команд для этого. Лично я из них выбрал лишь первые две — одну для загрузки файла с сервера:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

…и вторую — для проверки целостности загруженного файла:

php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

ВАЖНО! По поводу второй команды должен сразу предупредить — она БЫЛА АКТУАЛЬНА на тот момент, когда я проделывал описываемые тут манипуляции (так как она подходит лишь для конкретной версии composer-а, а именно — 2.0.9). Причина заключается в том, что непосредственно в самой команде указан тот эталонный хеш, с которым будет сверяться хеш файла, скачанного вами из интернета. И как только версия composer-а на сайте изменится, то поменяется и хеш! Поэтому, вторую команду в момент выполнения вами этих действий КОПИРУЙТЕ С САЙТА composer-а (с актуальным хешем)!

Ели проверка хеша завершилась успешно (сообщением «Installer verified»), то пришло время выполнить непосредственно саму установку composer-а. Вот такая команда:

php composer-setup.php --install-dir=/bin --filename=composer

… установит его в папку /bin, а сам бинарник назовет именем «composer» (благодаря чему, в дальнейшем вы сможете вызывать его, просто набирав это слово как команду в консоли, и при этом, ввод пути к файлу и пр. «шаманские танцы» — будут излишними).

Установка библиотеки dompdf в проект

Начнем с зависимостей. Есть ряд обязательных пакетов-зависимостей, которые нужно установить в системе, иначе библиотека dompdf работать не будет. Для этого введите команду:

sudo apt-get install php-xml php-gd php-mbstring

Кроме того, в документации к dompdf предлагается установить НЕОБЯЗАТЕЛЬНЫЕ (дополнительные) пакеты php-gmagick и php-imagick, цель которых — ускорение обработки графики. По поводу именно этой парочки могу лишь сказать, что во первых, у меня в некоторых случаях в списке «стандартных» пакетов отсутствовал какой-нибудь из них, если же вдруг оказывалось, что присутствовали оба, то тогда они конфликтовали между собой, а главное — я так и не увидел реального ускорения процедуры создания PDF-файлов после установки (любого из них). Правда, может у меня графика была никакая, и ускорять там реально было нечего?! Короче говоря, вы можете ввести команду для установки сразу обоих пакетов, и посмотреть на реакцию вашей системы (что поставится, что не поставится, проверить — а будет ли реальное ускорение, и т.д., и т.п.):

sudo apt-get install php-gmagick php-imagick

Если оба сразу не устанавливаются, ставьте по одному. Ну а если нет желания, то можете и не устанавливать их вовсе…

Чтобы установить сам dompdf, во первых, перейдите в папку applications вашего Codeigniter-проекта. После чего просто введите команду:

sudo composer require dompdf/dompdf

Composer поругается, что вы пытаетесь запускать его от имени root-а, предложит почитать наставления по этому поводу, и спросит, хотите ли вы продолжать дальше? Нажимаете кнопку «y» на клавиатуре, и плавно наблюдаете, как происходит установка библиотеки. Подтверждением того, что все ОК, является отсутствие сообщений, подсвеченных красным фоном. Если же сообщения об ошибках имеются — изучаете их, устраняете причины, повторяете установку dompdf заново.

По итогу, в папке applications должна будет появиться папка vendor (если ее там не было ранее), а уже в ней — папка c библиотекой dompdf и парочкой других, которые composer установит как «зависимости».

Использование dompdf в проекте

Во первых, перейдите в папку application/config вашего проекта. В ней вам нужно найти и отредактировать файл config.php. Цель редактирования — «глобально» включить в Codeigniter-е использование composer-а (за это отвечает параметр composer_autoload, поэтому, найдите и измените его). После редактирования строка с параметром должна выглядеть следующим образом:

$config['composer_autoload'] = TRUE;

Во вторых, предлагаю создать в Codeigniter-е дополнительную «библиотеку», которая и будет генерить PDF-файлы (лично я считаю этот вариант более удобным в случаях, когда процедуру нужно вызывать из целой кучи разных контроллеров). Для этого перейдите в папку application/libraries и создайте в ней НОВЫЙ файл Pdfgenerator.php с таким содержанием:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
use Dompdf\Dompdf;
class Pdfgenerator {
  public function generate($html, $filename = '', $stream = TRUE, $paper = 'A4', $orientation = "portrait")
  {
    $dompdf = new DOMPDF();
    $dompdf->set_option('enable_remote', TRUE);
    $dompdf->set_option('dpi','79');
    $dompdf->set_option('enable_html5_parser',TRUE);
    $dompdf->loadHtml($html);
    $dompdf->setPaper($paper,$orientation);
    $dompdf->render();
    $dompdf->stream($filename.".pdf", array("Attachment" => !$stream));
  }
}

(Если пожелаете использовать другое имя файла, то учтите, что во первых, оно должно начинаться с заглавной буквы, во вторых, в вышеприведенном коде имя класса должно совпадать с именем файла (без расширения «.php»), и в третьих — не забудьте изменить имя вызываемой библиотеки в коде показанном ниже).

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

Первым делом, я хотел бы заострить ваше внимание на одном из них (т.к. в свое время самому пришлось искать его). Причина заключалась в том, что мне нужно было в PDF включать файлы (CSS-стили и картинки) из «внешних» (по отношению к dompdf) папок. И вот именно данный параметр помог мне «подчинить» библиотеку моим пожеланиям:

$dompdf->set_option('enable_remote', TRUE);

Второй параметр, который, полагаю, тоже нуждается в пояснении — это переменная $stream. Меняя ее значение (возможные варианты — TRUE и FALSE), вы будете управлять поведением браузера касательно сформированного PDF-ника — либо он будет сразу же открываться в браузере, либо браузер будет каждый раз спрашивать вас, что с ним делать (сохранять, открывать в приложении, и т.д. и т.п.)…

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

$html=$this->load->view('my_doc_print',$data, TRUE);
$this->load->library('pdfgenerator');
$this->pdfgenerator->generate($html,'pdf_name',FALSE,'A4','portrait');

Первая строка вызывает view, который собственно и формирует тот HTML-документ, который должен быть преобразован в PDF. Тут все сравнительно стандартно, за исключением третьего параметра — TRUE. Его использование приводит к тому, что сформированная веб-страница не выводится в браузер, а возвращается в переменную $html.

Вторая трока — стандартное подключение библиотеки. Если ранее вы имя файла Pdfgenerator.php поменяли на свое собственное, то и в этой строке, и в третьей, не забудьте изменить его (только тут вписывайте имя уже с маленькой буквы!).

И третья строка — вызов самой функции формирования PDF-документа. Ей передается до пяти параметров (нумерация слева направо):

  1. Тот самый HTML-документ для преобразования в PDF;
  2. Имя будущего PDF-файла (без расширения);
  3. Упоминавшееся выше «поведение» (открывать PDF-файл сразу или спрашивать пользователя). Этот параметр имеет свое «дефолтное» значение в самой функции, поэтому может не указываться;
  4. Размер бумаги. Этот параметр имеет свое «дефолтное» значение (A4) в самой функции, поэтому может не указываться;
  5. Ориентация страницы в документе. Этот параметр имеет свое «дефолтное» значение (портрет) в самой функции, поэтому может не указываться;

Кастомные шрифты в dompdf (кириллица и т.п.)

Сюрприз может поджидать тех, кто захочет использовать в документе кириллицу (либо иные национальные наборы символов). Входящие в комплект dompdf шрифты их не поддерживают. Поэтому, нужно будет как-то «досыпать» туда своих. Лично мне показалось, что проще всего будет импортировать подходящие TTF-шрифты с требующимся набором символов.

Когда-то раньше в числе прочего в библиотеке dompdf присутствовал специальный файл — load_font.php, который предназначался именно для этих целей. Но на данном этапе его среди прочих не оказалось, и мне пришлось его скачивать отдельно.

Для этого идем на страницу утилит библиотеки dompdf, и там находим нужный файл. В принципе, вы можете попробовать использовать приведенную ниже команду, но на всякий случай напоминаю — ссылки в интернете имеют свойство меняться с годами. Хотя, попробовать-то можно 🙂 .

Для начала, перейдите в папку application/vendor вашего проекта (именно в ней и нужно разместить скачиваемый файл). И там уже введите такую команду:

wget https://raw.githubusercontent.com/dompdf/utils/master/load_font.php

Затем в полученном файле необходимо отредактировать значение одного параметра. Откройте файл в редакторе, найдите в нем такую строку:

require_once "vendor/autoload.php";

…и измените ее, чтобы в итоге стало так:

require_once 'autoload.php';

На всякий случай, обращаю внимание, что указанный в параметре файл (autoload.php) должен находиться в той же папке, что и load_font.php. Именно поэтому выше было сказано, что файл load_font.php нужно сохранять в папку application/vendor (как раз там по умолчанию и «живет» autoload.php после описанных выше манипуляций composer-а).

В эту же папку копируете и TTF-файлы со шрифтами. Команда позволяет добавить в dompdf разные «начертания» шрифта. Именно с этой целью лично я и скопировал в проект сразу четыре файла: CALIBRI.TTF («обычный шрифт»), CALIBRIB.TTF («жирный шрифт»), CALIBRII.TTF («наклонный шрифт») и CALIBRIZ.TTF («жирный наклонный шрифт»). После чего ввел команду:

php load_font.php calibri CALIBRI.TTF CALIBRIB.TTF CALIBRII.TTF CALIBRIZ.TTF

В ней я указал (произвольное) имя для нового «семейства» шрифтов (calibri), а затем перечислил (в нужном порядке) все четыре файла с различными «начертаниями» шрифта.

Ну и напоследок, пример того, как в  CSS формируемого HTML-документа (будущего PDF-файла) указать использование только что добавленного в dompdf нового семейства шрифтов (calibri):

*{
  font-family:"calibri";
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *