Создание PDF в CodeIgniter c помощью R&OS pdf class

Автор оригинала: Chris Monnat
  • Перевод
Существует довольно большое количество PHP библиотек для создания PDF файлов, например такие как FPDF, Panda и dompdf, но наиболее лучшая, на мой взгляд, это R&OS pdf class. Я впервые узнал о ней из книги PHP Anthology. Я пробовал другие библиотеки для создания PDF, некоторые работают только на PHP5, некоторые на более ранних версиях, но ни одна из них не предоставила мне такого же контроля и легкости в использовании, как R&OS. И поэтому я использую этот класс в своем примере.

Начнем


Перед тем как мы начнем, скачайте архив, который я подготовил для вас. Он содержит CodeIgniter 1.6.3, а так же весь код и библиотеки, которые описаны в этом примере.

Для работы с библиотекой R&OS необходимы 2 файла, это class.ezpdf.php и class.pdf.php. Они расположены в директории application/libraries. Для правильной работы R&OS так же необходимы некоторые файлы шрифтов, которые расположены в корне архива, в директории fonts.

Я сделал некоторые изменения, чтобы все работало правильно в составе CodeIgniter. Переименовал class.ezpdf.php в cezpdf.php и заменил строку 3 на
include_once(APPPATH. 'libraries/class.pdf.php');

Так же я создал контроллер tutorial.php и хелпер pdf_helper.php

Hello World


function hello_world()
{
$this->load->library('cezpdf');

$this->cezpdf->ezText('Hello World', 12, array('justification' => 'center'));
$this->cezpdf->ezSetDy(-10);

$content = 'The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax quiz prog.
Junk MTV quiz graced by fox whelps. Bawds jog, flick quartz, vex nymphs.'
;

$this->cezpdf->ezText($content, 10);

$this->cezpdf->ezStream();
}


С помощью кода, приведенного выше, мы создали вот этот PDF файл.

Сначала мы подключили библиотеку R&OS. Затем при помощи ezText() задали заголовок нашего документа. Эта функция принимает первым аргументом текст заголовка, затем размер шрифта и последним необязательным аргументом, передаваемым в виде массива идут дополнительные конфигурационные опции. Например, выравнивание (в данном случае — по центру)

После заголовка, мы добавим немного пустого места, используя ezSetDy(). Затем разместим текст, который содержится в переменной $content. Для этого опять же используем ezText(). И завершим создание нашего документа используя ezStream(). Эта функция формирует документ и отсылает его браузеру. Теперь пользователь может просмотреть или загрузить наш PDF.

Работаем с табличными данными


Когда вы работаете с отчетами, или какими-либо данными, нуждающимися в табличном представлении, задача отображения таблицы в PDF становится не тривиальной. Но в библиотеке R&OS это так же просто, как создать массив.
function tables()
{
$this->load->library('cezpdf');

$db_data[] = array('name' => 'Jon Doe', 'phone' => '111-222-3333', 'email' => 'jdoe@someplace.com');
$db_data[] = array('name' => 'Jane Doe', 'phone' => '222-333-4444', 'email' => 'jane.doe@something.com');
$db_data[] = array('name' => 'Jon Smith', 'phone' => '333-444-5555', 'email' => 'jsmith@someplacepsecial.com');

$col_names = array(
'name' => 'Name',
'phone' => 'Phone Number',
'email' => 'E-mail Address'
);

$this->cezpdf->ezTable($db_data, $col_names, 'Contact List', array('width'=>550));
$this->cezpdf->ezStream();
}


Вот что у нас получилось.

В вышеприведенном коде, я создал массив данных $db_data, затем создал массив $col_names с ключами, соответствующим названиям столбцов будущей таблицы. Для создания таблицы используется функция ezTable(). В первом аргументе передан массив с данными таблицы, затем массив с названиями столбцов, третий аргумент — название таблицы, и последний, необязательный аргумент — массив с конфигурационными данными. В данном случае указана ширина таблицы.

Заголовок и подвал


Довольно большое количество отчетов содержат стандартные заголовки/подвалы. Они могут содержать и дату создания, и имя автора документа, количество страниц и прочее.

Процесс добавления заголовков/подвалов немного сложнее. Я вынес этот процесс в хелпер
function prep_pdf($orientation = 'portrait')
{
$CI = & get_instance();

$CI->cezpdf->selectFont(base_url(). '/fonts');

$all = $CI->cezpdf->openObject();
$CI->cezpdf->saveState();
$CI->cezpdf->setStrokeColor(0,0,0,1);
if($orientation == 'portrait') {
$CI->cezpdf->ezSetMargins(50,70,50,50);
$CI->cezpdf->ezStartPageNumbers(500,28,8,'','{PAGENUM}',1);
$CI->cezpdf->line(20,40,578,40);
$CI->cezpdf->addText(50,32,8,'Printed on '. date('m/d/Y h:i:s a'));
$CI->cezpdf->addText(50,22,8,'CI PDF Tutorial — www.christophermonnat.com');
}
else {
$CI->cezpdf->ezStartPageNumbers(750,28,8,'','{PAGENUM}',1);
$CI->cezpdf->line(20,40,800,40);
$CI->cezpdf->addText(50,32,8,'Printed on '.date('m/d/Y h:i:s a'));
$CI->cezpdf->addText(50,22,8,'CI PDF Tutorial — www.christophermonnat.com');
}
$CI->cezpdf->restoreState();
$CI->cezpdf->closeObject();
$CI->cezpdf->addObject($all,'all');
}

Пример использования этого хелпера можно найти в функции headers() контроллера tutorial.php. Итоговый PDF.

Вышеприведенный код находится в функции prep_pdf() хелпера pdf_helper.php. Эта функция делает всю работу по созданию подвала для PDF файла. Все что мне нужно сделать — это загрузить этот хелпер и вызвать функцию prep_pdf() в контроллере.

Заключение


Я не вдавался в подробности в этом примере, чтобы он не был объемным. Все что я хотел показать, это то, с какой легкостью можно создавать PDF документы используя CodeIgniter и класс R&OS.
Есть еще много способов создания PDF файлов, некоторые из них описаны в Вики фреймворка CodeIgniter.
Поделиться публикацией

Похожие публикации

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

    +1
    Отлично :) По крайней мере, мне понравилось. Но вас не смущает тот факт, что pdf библиотек, написанных под php уже туева хуча и, что именна эта библиотека сможет заменить другие?
      0
      Спасибо :)
      Да, не спорю что библиотек более чем достаточно, но надо же с чего-то начинать :)
        0
        Понятное дело :) Монополизация нам ни к чему :) Как говорится - поставил бы плюс, если мог бы)
          0
          Кстати, неплохо было бы сравнительную таблицу по скорости выложить, очень актуально при создании больших объёмов страниц в pdf.

          P.s. Спасибо за карму :)
            0
            Да, вот может быть будет время, тогда и...
            А статья эта - перевод, не моя
      • НЛО прилетело и опубликовало эту надпись здесь
          0
          Целью было показать легкость интеграции в фреймворк, а TCPDF довольно объемная библиотека.
          • НЛО прилетело и опубликовало эту надпись здесь
          0
          А на русском оно умеет?
            0
            вроде когда пробовал были проблемы с utf-8, правда давно было. а вообще за перевод спасибо ))
              +1
              я уже давно с успехом использую http://www.princexml.com/doc/6.0/
              отличная библиотека, имеет интерфейс к многим популярным языкам, в том числе php. конвертирует (x)html в pdf с поддержкой css. работает как с utf-8, так и с windows-1251 (вдруг кому нужно). короче говоря я свой выбор сделал.
                0
                спасибо за перевод
                только исправьте опечатку в первом абзаце: "Я впервые узнал о ней из книни"
                  0
                  Спасибо. Исправил

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

                Самое читаемое