В текущем проекте, заказчик попросил сделать возможность создавать PDF файлы прямо на сервере из HTML кода. Весь сайт написан с использованием фреймворка CodeIgniter. Но встроенных средств преобразования HTML в PDF-формат я не нашел. Кроме того, обязательной была поддержка русского языка, так как сайт русскоязычный. Я начал поиски, подробнее внутри.
Поковыряв самые популярные библиотеки для создания PDF файлов, я обнаружил, что у большинства нет нормальной поддержки русского языка. Либо часть, либо весь текст превращается в кракозябры. Само собой, такой расклад меня не устраивал и я нашел тяжеловесную (почти 30 мегабайт, если не удалять лишнее), зато эффективную библиотеку для генерации файлов формата PDF. Называется mPDF, официальный сайт здесь. Для интеграции ее в CodeIgniter достаточно создать свой класс-библиотеку.
Итак, качаем mPDF и распаковываем архив. Внутри видим папку MPDF54 (поскольку я скачал версию 5.4), в которой куча файлов и других папок. Копируем эту директорию прямо в /application/libraries/. Не забудьте проверить, что у папок /ttfontdata/, /tmp/, /graph_cache/, которые находятся внутри папки с библиотекой, выставлены права 6ХХ или 7ХХ.
Теперь создадим новый файл в папке /application/libraries/. Назовем его, например, pdf_generator.php. И сделаем заготовку:
<?php //Подключаем библиотеку require_once('MPDF54/mpdf.php'); //Папка для сохранения файлов define('PRICE_DIR', $_SERVER['DOCUMENT_ROOT'].'/uploads/pdf/'); //Проверка на попытку прямого доступа if ( ! defined('BASEPATH')) exit('No direct script access allowed'); //Класс-библиотека CodeIgniter class pdf_generator { //Функция генерации function generate($file_name, $content) { } }
Наш класс будет генерировать PDF файлы в папке http://site.com/uploads/pdf/ с помощью функции, которая принимает имя файла и сам HTML код. В моем случае, в качестве HTML кода выступал контент редактируемых страниц из админ-панели сайта.
Дальше — проще! «Куда уж, проще?» — спросите вы. Но так и есть.
function generate($file_name, $content) { //Создаем объект класса mPDF $mpdf = new mPDF(); //Записываем содержимое будущего PDF файла из HTML $mpdf->WriteHTML($content); //Сохраняем сам файл $mpdf->Output(PRICE_DIR.$file_name); }
Теперь можно в любом месте контроллера вызвать нашу функцию генерации. Например, вот так:
$this->load->library('pdf_generator'); $this->pdf_generator->generate('file1.pdf', $content);
В результате будет создан файл file1.pdf, в который запишется содержимое переменной $content.
Задавайте свои ответы.
mPDF не самая хорошая либа, весьма ограничена и не ест css норм.
Посоветуй вариант получше. Чем ты лично пользуешься?
Все еще жду ответа 🙂
Кстати, зацените мой английский блог. Ссылка в шапке сайта.
А как быть, если есть графика?
Если в хтмл есть тег img src — то при создании файла вместо них видно изображения крестика (нет рисунка).
А, нашел решение. Надо указывать абсолютный путь, относительный, почему то не работает…
Пожалуйста. У меня с графикой вроде относительный тоже работал. Хотя не помню уже.
Блин тема интересная….но как быть с различными системами вывода информациии и графики.? прописка картинок…-в моем случае..нужно копать пуху код…ладно…спасибо всеравно посотрим что и как…
Удачи вам.
Кстати, зацените мой английский блог. Ссылка в шапке сайта.
tcpdf und PDFLib
Мало информативный комментарий у вас, ничего не понял.