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