Создание PDF файлов из HTML кода в CodeIgniter

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

Задавайте свои ответы.

Комментарии 10

  • mPDF не самая хорошая либа, весьма ограничена и не ест css норм.

  • А как быть, если есть графика?
    Если в хтмл есть тег img src — то при создании файла вместо них видно изображения крестика (нет рисунка).

  • А, нашел решение. Надо указывать абсолютный путь, относительный, почему то не работает…

    • Пожалуйста. У меня с графикой вроде относительный тоже работал. Хотя не помню уже.

  • Блин тема интересная….но как быть с различными системами вывода информациии и графики.? прописка картинок…-в моем случае..нужно копать пуху код…ладно…спасибо всеравно посотрим что и как…

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

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