Пишите нам

Имя:
Email:

 
 
 

Статьи

Важные особенности, сопровождающие перевод паспорта с нотариальным заверением
Списание компьютерной и другой оргтехники: как это сделать
Коротко о продвижении
Восстановление данных с CD диска
Безопасность при создании сайтов
Виртуальный офис: новый уровень организации бизнеса
Виртуальная АТС Гравител
Акция на антивирус
Обзор iPad 3
Как сделать сайт удобным?
Как купить сумку для нетбука
Методы получения внешних ссылок на сайт
Широкие возможности Skype для Android
Качественные мобильные телефоны
Сайт визитка: особенности хорошего старта
Надувные матрасы от Ламон
WebNames.Ru – десятилетие деятельности в Интернете
Квартира для вашего сайта.
Технологии от BoldSoft
Как добиться успеха в безнадежных проектах
Новый тип навигационной системы при постраничном выводе
Генерация PDF с помощью PHP
PHP и PostgreSQL
Оптимизируем MySQL

Генерация PDF с помощью PHP

Предисловие
Одна из причин, почему я люблю PHP - это то, что в нем постоянно появляется поддержка новых технологий. Язык легко расширяем, и разработчики легко добавляют к нему новые модули, поэтому PHP стал одним из самых функциональных Web языков с поддержкой огромного разнообразия разных технологий. Расширения, существующие сегодня, позволяют разработчикам легко работать с сервером IMAP и POP3; динамически создавать изображения и рисунки в формате Flash; выполнять операции проверки кредитных карт; шифровать секретные данные; и работать с базами XML.

И это еще не все! Одно из самый интересных расширений, добавленных на сегодня в PHP - это расширение PDFLib, которое позволяет разработчикам динамически генерировать документы в формате PDF (Adobe Portable Document Format). На протяжении следующих нескольких страниц я кратко расскажу об этом модуле, и дам обзор используемых функций, расскажу как использовать это расширение в PHP разработках. Так что поехали!


Все права на публикацию этой статьи принадлежат RusHelp.com


Поехали!
Чтобы задействовать расширение PDFLib, сначала нужно установить соответсвующую библиотеку в Вашу систему. Если вы работаете на Linux, можно скачать копию с сайта http://www.pdflib.com/pdflib/index.html и скомпилировать ее для вашего сервера. Если вы работаете на Windows, все намного проще - вместе с дистрибутивом PHP уже поставляется скомпилированный модуль PDF, и все что Вам нужно сделать - это его активировать, раскомментировав соответствующую строку в конфигурационном файле.

Вдобавок, Вам потребуется копия программы Adobe Acrobat PDF reader, чтобы читать документы, созданные с помощью библиотеки PDFLib. Скачать бесплатно Adobe Acrobat Reader можно с сайта производителя: http://www.adobe.com/

Как только все установлено, время создать простой PDF документ:


<?php // create handle for new PDF document $pdf = pdf_new(); // open a file pdf_open_file($pdf, "philosophy.pdf"); // start a new page (A4) pdf_begin_page($pdf, 595, 842); // get and use a font object $arial = pdf_findfont($pdf, "Arial", "host", 1); pdf_setfont($pdf, $arial, 10); // print text pdf_show_xy($pdf, "There are more things in heaven and earth, Horatio,", 50, 750); pdf_show_xy($pdf, "than are dreamt of in your philosophy", 50, 730); // end page pdf_end_page($pdf); // close and save file pdf_close($pdf); ?>
Сохраните этот файл, а затем откройте его в браузере. PHP обработает данный скрипт и сгенерирует новый PDF файл, который сохранит в месте, указанном вверху скрипта. Вот что Вы увидите открыв этот PDF документ:




Все права на публикацию этой статьи принадлежат RusHelp.com

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

Создание PDF файла в PHP включает в себя 4 основных шага: создание указателя на документ, регистрация шрифтов и цветов для документа, запись или рисование в указатель с использований предопределенных функций, и сохранение документа.

Начнем с первого шага - создание указателя на PDF

файл.


// create handle for new PDF document $pdf = pdf_new();

Это достигается с помощью функции pdf_new(), которая возвращает указатель на этот документ. Затем этот указатель используется во всех последующих операциях по созданию PDF документа.

Следующим шагом следует дать PDF файлу имя - это достигается функцией pdf_open_file(), которая принимает два аргумента - указатель, возвращенный предыдущей функцией и собственно имя файла, определяемое пользователем.


// open a file pdf_open_file($pdf, "philosophy.pdf");

Как только документ был создан, в него можно вставить начало новой страницы функцией pdf_begin_page(),


// start a new page (A4) pdf_begin_page($pdf, 595, 842);

и конец страницы - да вы угадали!! - функцией pdf_end_page().


// end page pdf_end_page($pdf);

Заметьте, что функция pdf_begin_page() требует два дополнительных параметра, которые представляют собой ширину и высоту создаваемого документа в точках (точка равна 1/72 дюйма). Если у вас плохо с математикой, учебник по PHP включает в себя стандартные размеры для всех распространенных размеров страниц, в том числе и A4, который используется выше.

Между вызовами pdf_begin_page() и pdf_end_page() находится код, который пишет в файл, будт это текст, картинки или геометрические фигуры. В данном примере я всего лишь пишу в документ строку текста - поэтому, все что мне нужно сделать - выбрать шрифт и использовать его при записи текста в документ.

Выбор и регистрация шрифта выполняется функциями pdf_findfont() и pdf_setfont(). Функция pdf_findfont() выбирает шрифт для использования в документе, и требует ввести имя шрифта, метод кодирования и Булевый параметр, указывающий на то, следует ли внедрить шрифт в PDF документ; а возвращает она объект-шрифт, который можно потом использовать при вызове функции pdf_setfont().


$arial = pdf_findfont($pdf, "Arial", "host", 1); pdf_setfont($pdf, $arial, 10);
Как только шрифт выбран, можно использовать функцию pdf_show_xy() для записи текста в определенное место на странице.
 

// print text pdf_show_xy($pdf, "There are more things in heaven and earth, Horatio,", 50, 750); pdf_show_xy($pdf, "than are dreamt of in your philosophy", 50, 730);

Как вы заметили, эта функция требует указатель на PDF документ, ссылку на используемый объект-шрифт, текст для записи и координаты X Y места, откуда начинать запись текста. Эти координаты указываются относительно точки (0,0), которая находится в левом нижнем углу документа.

Как только текст был записан, страница закрывается вызовом функции pdf_end_page(). Затем можно добавить еще страницы или, как я здесь сделал, просто закрыть документ с помощью pdf_close(). Эта функция сохранит документ с именем, указанным при вызове pdf_open_file(), и уничтожит указатель на документ.

Все права на публикацию этой статьи принадлежат RusHelp.com


Красота как на картинке!
Ну это был очень простой пример - но расщирение PDF в PHP позволяет намного больше, чем просто писать текст в документ. Поскольку лучше один раз увидеть, посмотрите-ка на пример ниже, который показывает как добавить изображение в PDF файл.


<?php // create handle for new PDF document $pdf = pdf_new(); // open a file pdf_open_file($pdf, "philosophy.pdf"); // start a new page (A4) pdf_begin_page($pdf, 595, 842); // get and use a font object $arial = pdf_findfont($pdf, "Arial", "host", 1); pdf_setfont($pdf, $arial, 10); // print text pdf_show_xy($pdf, "There are more things in heaven and earth, Horatio,", 50, 750); pdf_show_xy($pdf, "than are dreamt of in your philosophy", 50, 730); // add an image under the text $image = pdf_open_image_file($pdf, "jpeg", "shakespeare.jpg"); pdf_place_image($pdf, $image, 50, 650, 0.25); // end page pdf_end_page($pdf); // close and save file pdf_close($pdf); ?>

А вот PDF вывод:



Все волшебство здесь заключается в функциях pdf_open_image_file() и pdf_place_image(). Превая из них принимает тип изображения - GIF, JPEG, TIFF или PNG - и название файла в качестве аргументов, и возвращает указатель на рисунок, который затем можно повторно использовать в документе.

Указатель на рисунок, возвращенный выше затем можно передать функции pdf_place_image(), которая расположит рисунок в определенном месте на странице. Координаты, переданные данной функции (второй и третий аргумент) относятся к левому нижнему углу рисунка, а четвертый аргумент задает параметр масштабирования рисунка при отображении (1 - покажет рисунок в 100% масштабе, 0.5 уменьшит его в два раза.)

Все права на публикацию этой статьи принадлежат RusHelp.com


Кратчайшее расстояние между двумя точками
Не юудем останавливаться! Модуль PDF включает в себя огромное количество функций, который помогут Вам рисовать линии, круги и другие фигуры. Вот пример, где мы нарисуем линию.


<?php // create handle for new PDF document $pdf = pdf_new(); // open a file pdf_open_file($pdf, "letterhead.pdf"); // start a new page (A4) pdf_begin_page($pdf, 595, 842); // get and use a font object $arial = pdf_findfont($pdf, "Arial", "host", 1); pdf_setfont($pdf, $arial, 12); // set a colour for the line pdf_setcolor($pdf, "stroke", "rgb", 0, 0, 0); // place a logo in the top left corner $image = pdf_open_image_file($pdf, "jpeg", "logo.jpg"); pdf_place_image($pdf, $image, 50, 785, 0.5); // draw a line under the logo pdf_moveto($pdf, 20, 780); pdf_lineto($pdf, 575, 780); pdf_stroke($pdf); // draw another line near the bottom of the page pdf_moveto($pdf, 20, 50); pdf_lineto($pdf, 575, 50); pdf_stroke($pdf); // and write some text under it pdf_show_xy($pdf, "Confidential and proprietary", 200, 35); // end page pdf_end_page($pdf); // close and save file pdf_close($pdf); ?>
Вот что вы увидите:



В данном случае процесс рисования линии включает в себя использование функций pdf_moveto(), pdf_lineto() и pdf_stroke().

В приведенном выше примере я рисую линию из точки (20,780) до точки (575, 780). Чтобы сделать это сначала мне нужно поместить курсор в начальную точку (20,780), с помощью вызова функции to pdf_moveto().
 

pdf_moveto($pdf, 20, 780);

Затем необходимо задать конечную точку с помощью pdf_lineto():


pdf_lineto($pdf, 575, 780);

Наконец, рисуем линию с помощью pdf_stroke().


pdf_stroke($pdf);

Цвет линии задается функцией pdf_setcolor(), которая принимает несколько параметров: указатель на PDF документ, тип линии: "stroke", "fill" или "both", цветовая палитра (RGB или CMYK), и список цветовых значений, подходящих к выбранной палитре.


pdf_setcolor($pdf, "stroke", "rgb", 0, 0, 0);

Важно заметить, что список цветовых значений, передаваемый pdf_setcolor() должен быть задан в процентной величине интенсивности - то есть, интенсивности данного цвета, выраженной в процентах от максимально возможной. Например, если я хочу задать (RGB: 255,0,0) в качестве цвета для заливки, мой вызов функции pdf_setcolor() будет выглядеть вот так,


pdf_setcolor($pdf, "stroke", "rgb", 1, 0, 0);

А заливка желтым цветом будет выглядеть так:


pdf_setcolor($pdf, "fill", "rgb", 1, 1, 0);


Все права на публикацию этой статьи принадлежат RusHelp.com


Квадраный колышек, круглая дыра
Линии - это не единственное, что Вы можете рисовать - круги и прямоугольники также присутсвуют в сегодняшнем меню. Посмотрите на пример ниже:


<?php // create handle for new PDF document $pdf = pdf_new(); // open a file pdf_open_file($pdf, "shapes.pdf"); // start a new page (A4) pdf_begin_page($pdf, 595, 842); // set a fill colour pdf_setcolor($pdf, "fill", "rgb", 1, 1, 0); // set a stroke colour pdf_setcolor($pdf, "stroke", "rgb", 0, 0, 0); // draw a rectangle pdf_rect($pdf, 50, 500, 200, 300); pdf_fill_stroke($pdf); // set a fill colour pdf_setcolor($pdf, "fill", "rgb", 0, 1, 0); // set a stroke colour pdf_setcolor($pdf, "stroke", "rgb", 0, 0, 1); // draw a circle pdf_circle($pdf, 400, 600, 100); pdf_fill_stroke($pdf); // end page pdf_end_page($pdf); // close and save file pdf_close($pdf); ?>

Вот вывод:



В данном случае функция the pdf_rect() используется для рисования прямоугольника с помощью заданных координат левого нижнего угла, высоты и ширины. Затем прямоугольник закрашивается и обводится двумя разными цветами с помощью функции pdf_fill_stroke().


pdf_setcolor($pdf, "fill", "rgb", 1, 1, 0); pdf_setcolor($pdf, "stroke", "rgb", 0, 0, 0); pdf_rect($pdf, 50, 500, 200, 300); pdf_fill_stroke($pdf);

Круги рисуются функцией pdf_circle(), которая принимает три аргумента: координаты X и Y центра круга и длину радиуса.


pdf_circle($pdf, 400, 600, 100);

Эта возможность рисования геометрических изображений "на лету" может пригодиться в различных ситуациях. К примеру, вот одна из них - в ней пара циклов "for" соединяются с функцией pdf_lineto() для генерации сетки из линий.


<?php // create handle for new PDF document $pdf = pdf_new(); // open a file pdf_open_file($pdf, "grid.pdf"); // start a new page (A4) pdf_begin_page($pdf, 595, 842); // set a stroke colour pdf_setcolor($pdf, "stroke", "rgb", 0, 0, 0); // draw vertical lines (move along X axis) for ($x=0; $x<=595; $x+=20) { pdf_moveto($pdf, $x, 0); pdf_lineto($pdf, $x, 842); pdf_stroke($pdf); } // draw horizontal lines (move along Y axis) for ($y=0; $y<=842; $y+=20) { pdf_moveto($pdf, 0, $y); pdf_lineto($pdf, 595, $y); pdf_stroke($pdf); } // end page pdf_end_page($pdf); // close and save file pdf_close($pdf); ?>

Вот вывод:



Все права на публикацию этой статьи принадлежат RusHelp.com


Небо и Земля
Можно задавать информацию о документе с помощью функций семейства pdf_set_info_*(); эта информация определяет создателя документа, название и содержимое. Вот пример:


<?php // create handle for new PDF document $pdf = pdf_new(); // open a file pdf_open_file($pdf, "philosophy.pdf"); // start a new page (A4) pdf_begin_page($pdf, 595, 842); // set document information pdf_set_info_author($pdf, "William Shakespeare"); pdf_set_info_creator($pdf, "William Shakespeare"); pdf_set_info_title($pdf, "Hamlet"); pdf_set_info_subject($pdf, "Act I Scene 5"); pdf_set_info_keywords($pdf, "Horatio Hamlet philosophy"); // get and use a font object $arial = pdf_findfont($pdf, "Arial", "host", 1); pdf_setfont($pdf, $arial, 10); // print text pdf_show_xy($pdf, "There are more things in heaven and earth, Horatio,", 50, 750); pdf_show_xy($pdf, "than are dreamt of in your philosophy", 50, 730); // end page pdf_end_page($pdf); // close and save file pdf_close($pdf); ?>

А теперь, при просмотре документа в Adobe Reader, вы сможете увидеть эту информацию в Свойствах Документа.



Все права на публикацию этой статьи принадлежат RusHelp.com


Кусок пирога
Теперь, когда Вы умеете создавать документы PDF, обратимся к реальному применению. Следующий пример демонстрирует как PHP может принимать числовые данные и генерировать из них графики - к примеру, многоцветный график-"пирог".

Форма внизу запрашивает несколько кусков данных, в виде чисел, разделенных запятыми. После ввода нескольких чисел скрипт "pie.php" конвертирует их из абсолютных чисел в куски данных относительных размеров и использует эти куски для генерации PDF документа, содержащего график-"пирог", выделяя различные куски и заливая из разными цветами.


<html> <head> <basefont face=arial> </head> <body> <h3>Pie Chart Generator</h3> <table cellspacing="5" cellpadding="5"> <form action="pie.php" method=POST> <tr> <td>Enter numeric values (pie segments), separated by commas</td> </tr> <tr> <td><input type=text name=data></td> </tr> <tr> <td><input name="submit" type=submit value="Generate PDF Pie Chart"></td> </tr> </form> </table> </body> </html>
А вот скрипт:
 

<?php // raw data $data = $_POST['data']; $slices = explode(",", $data); // initialize some variables $sum = 0; $degrees = Array(); $diameter = 200; $radius = $diameter/2; // set up colours array for pie slices (rgb, as percentages of intensity) // add more to these if you like $colours = array( array(0,0,0), array(0,0,1), array(0,1,0), array(1,0,0), array(0,1,1), array(1,1,0), array(1,0,1), ); // calculate sum of slices $sum = array_sum($slices); // convert each slice into corresponding percentage of 360-degree circle for ($y=0; $y<sizeof($slices); $y++) { $degrees[$y] = ($slices[$y]/$sum) * 360; } // start building the PDF document // create handle for new PDF document $pdf = pdf_new(); // open a file pdf_open_file($pdf, "chart.pdf"); // start a new page (A4) pdf_begin_page($pdf, 500, 500); // set a stroke colour pdf_setcolor($pdf, "stroke", "rgb", 1, 1, 0); // draw baseline pdf_moveto($pdf, 250, 250); pdf_lineto($pdf, 350, 250); pdf_stroke($pdf); for ($z=0; $z<sizeof($slices); $z++) { // set a fill colour pdf_setcolor($pdf, "fill", "rgb", $colours[$z][0], $colours[$z][1], $colours[$z][2]); // calculate coordinate of end-point of each arc by obtaining // length of segment and adding radius // remember that cos() and sin() return value in radians // and have to be converted back to degrees! $end_x = round(250 + ($radius * cos($last_angle*pi()/180))); $end_y = round(250 + ($radius * sin($last_angle*pi()/180))); // demarcate slice with line pdf_moveto($pdf, 250, 250); pdf_lineto($pdf, $end_x, $end_y); // calculate and draw arc corresponding to each slice pdf_arc($pdf, 250, 250, $radius, $last_angle, ($last_angle+$degrees[$z])); // store last angle $last_angle = $last_angle+$degrees[$z]; // fill slice with colour pdf_fill_stroke($pdf); } // redraw the circle outline pdf_circle($pdf, 250, 250, 100); pdf_stroke($pdf); // end page pdf_end_page($pdf); // close and save file pdf_close($pdf); ?>

Данные, введенные в форму, передаются скрипту "pie.php" переменной $data; эти данные затем разделяются на отдельные компоненты функцией explode(), и каждое значение присваивается массиву $slices. Затем в цикле эти числа конвертируются в градусы для круга и для каждого куска рисуется дуга. В каждом проходе цикла также вычисляется координата конечной точки дуги и рисуется сегмент линии для того, чтобы отделить дугу от остальной окружности. Как только "кусок пирога" нарисован, используется функция the pdf_fill_stroke() для заливки его цветом; цвет берется из массива $colours.

мы не будем рассматривать как скрипт вычисляет длинц каждой дуги и сегмента линии - в комментариях кода все объясняется.

Если вы введете 5 равных кусков данных, график будет выглядеть так,



Если введете 2, то:



Вот так - поиграйте со скриптом, и посмотрите как различные куски меняют форму, отражая относительные размеры данных Ну а пока - до скорого!

Замечание: Все примеры в данной статье проверены на платформе Linux/i586 с Apache 1.3.12 и PHP 4.2.0. Примеры приводятся только для иллюстративных целей и не предназначены для жизненных применений.



Внимание! Любая перепечатка и использование материалов статей на других сайтах только с разрешения RusHelp.com (info@rushelp.com).