Статьи
Лучшие школы программирования для детей: качественное образование и новые навыки Игровые автоматы Вулкан бесплатно и без регистрации Игровые автоматы Азино777 Как выбрать надежный выделенный сервер Уход за своим ноутбуком: советы Как проверить сайт на уязвимости Игровые автоматы играть бесплатно гейша — для умеющих отдыхать Автоматы — выигрывайте у лучших Важные особенности, сопровождающие перевод паспорта с нотариальным заверением Списание компьютерной и другой оргтехники: как это сделать Коротко о продвижении Восстановление данных с 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).
|