1. Встановлення і налаштування необхідних елементів
Для роботи необхідно поставити пакет веб-розробника денвер. Що можна завантажити з офіційного сайту або самостійно поставити веб-сервер Apache та php. Процес встановлення можна почитати в офіційній документації.
Для встановлення бібліотеки, що дозволить нам генерувати pdf документи необхідно:
• Зайти на http://php.net/releases/ і скачати колекцію PECL модулів для відповідної версії інтерпритатора PHP, яка встановлена у Денвері 3. У випадку встановлення Денвера 3 з офіційного сайту з php 5.2.4, качаємо наступний архів zip: http://museum.php.net/php5/pecl-5.2.4-Win32.zip. При використанні безплатного модуля з оф. сайту pdflib у створеному документі буде непотрібний нам фоновий напис, тому то користуємося PECL модулем.
• З даного архіву беремо php_pdf.dll і кладемо її в директорію:
<denwer_root>\usr\local\php5\ext\
• В <denwer_root>\usr\local\php5\php.ini знаходимо секцію Windows Extensions і додаємо наступний рядок тексту:
extension=php_pdf.dll
• Перезапускаємо Apache — на цьому встановлення завершене.
• Для перевірки можна скористатися функцією phpinfo(). У виданій нею інформації повинно бути вказана підтримка pdf, що й зображено на рисунку.Для цього необхідно створити файл з розширення php із наступним змістом:
<? PHP phpinfo(); ?>
Далі при запущеному Apache запустити його на виконання ввівши URL-адресу у веб-браузері.
Бібліотеку pdf підключено
2. Друк тексту
Після того як усе встановлено починаємо створення документу. Наступна програма демонструє створення pdf документу з однією сторінкою і написом на даній сторінці.
<?php // Створити вказівник на новий PDF документ $pdf = pdf_new(); // відкрити файл (міняємо адресу під власну) pdf_open_file($pdf, "/home/univer.ua/www/example1.pdf"); // розпочати нову сторінку (A4) pdf_begin_page($pdf, 595, 842); // отримати і використати об'єкт шрифт з кириличною кодировкою cp1251 $fontdir = "C:\WINDOWS\Fonts"; pdf_set_parameter($pdf, "FontOutline", "arialMyName=$fontdir\arial.ttf"); $arial = pdf_findfont($pdf,"arialMyName", "cp1251" ,0 ); pdf_setfont($pdf, $arial, 10); // надрукувати текст pdf_show_xy($pdf, "Це перший рядок нашого документу,", 50, 750); pdf_show_xy($pdf, "а це другий рядок", 50,730); // кінець сторінки pdf_end_page($pdf); // закрити і зберегти файл pdf_close($pdf); ?>Після збереження скрипта під певною назвою (наприклад test.php), його можна запустити у браузері за адресом ВІРТУАЛЬНИЙ_ХОСТ/test.php. Так якщо був створений віртуальний хост univer.ua, то відповідно адреса буде http://univer.ua/test.php. За адресою вказаною на початку файлу буде створений example1.pdf. Результат зображено на рисунку:
Простий PDF документ
Почнемо з першого кроку – створення вказівника на PDF файл.$pdf = pdf_new();Це здійснюється за допомогою функції pdf_new(), яка повертає вказівник на цей документ. Згодом цей вказівник використовується для всіх наступних інструкцій по створенню PDF документу.
// відкриваємо файл pdf_open_file($pdf, "example.pdf");Як тільки документ був створений, в нього можна вставити початок нової сторінки функцією pdf_begin_page()
// розпочати нову сторінку (A4) pdf_begin_page($pdf, 595, 842);І кінець сторінки функцією pdf_end_page().
// end page pdf_end_page($pdf);Якщо ще потрібні сторінки, то знову ж потрібно використати ці функції. Функція pdf_begin_page() потребує два додаткові параметри - ширину і висоту створюваного документу в пунктах (один пункт(точка) рівний 1/72 дюйма). Між викликом pdf_begin_page() і pdf_end_page() знаходиться код, який пише в файл. Це може бути вставка тексту, картинок або геометричних фігур. В даному випадку – це лише текст. Тому все що необхідно вибрати шрифт і використати його в тексті документу. Вибір і регістрація шрифтів виконується функцією pdf_findfont() та pdf_setfont().
Функція pdf_findfont() вибирає шрифт для використання в документі, і вимагає ввести ім’я шрифту, метод кодування та булевий параметр, що вказує чи слід його інтегрувати в PDF документ; а повертає вона об’єкт-шрифт, який можна згодом використовувати при виклику функції pdf_setfont(). Виклик даної функції необхідно буде здійснювати на кожній сторінці документу, навіть якщо шрифт той же що і на попередніх.
// отримати і використати об'єкт шрифт $fontdir = "C:\WINDOWS\Fonts"; pdf_set_parameter($pdf, "FontOutline", "arialMyName=$fontdir\arial.ttf"); $arial = pdf_findfont($pdf,"arialMyName", "cp1251" ,0 ); pdf_setfont($pdf, $arial, 10);Як тільки шрифт вибраний, можна використати функцію pdf_show_xy() для запису тексту у відповідне місце на сторінці.
// надрукувати текст pdf_show_xy($pdf, "Це перший рядок нашого документу,",50,750); pdf_show_xy($pdf, "а це другий рядок", 50,730);Функція вимагає вказівник на PDF документ, посилання на об’єкт-шрифт, текст для запису і координати X Y, куди починати записувати текст. Ці координати вказуються відносно точки (0,0), яка знаходиться в лівому нижньому куті документу, а не у верхньому як можна б було сподіватись.
Як тільки текст був записаний, сторінка закривається викликом функції pdf_end_page(). Далі можна додати ще сторінку або, просто закрити документ із допомогою pdf_close(). Дана функція зберігає документ з ім’ям вказаним при виклику pdf_open_file() і знищує вказівник на документ.
3. Вставлення зображень
Розширення PDF в PHP дозволяє набагато більше, ніж просто писати текст в документ. Так можна додавати зображення у документ. Далі наводиться приклад, який здійснює це.
<?php // створити вказівник для нового PDF документу $pdf = pdf_new(); // відкрити файл pdf_open_file($pdf, "/home/univer.ua/www/example1.pdf"); // розпочати нову сторінку (A4) pdf_begin_page($pdf, 595, 842); // отримати і використати об'єкт шрифт $fontdir = "C:\WINDOWS\Fonts"; pdf_set_parameter($pdf, "FontOutline", "arialMyName=$fontdir\arial.ttf"); $arial = pdf_findfont($pdf,"arialMyName", "cp1251" ,0 ); pdf_setfont($pdf, $arial, 10); // надрукувати текст pdf_show_xy($pdf, "Еней був паробок моторний,",60, 750); pdf_show_xy($pdf, "і хоть куди козак", 60, 730); pdf_show_xy($pdf, "Удавсь на всеє зле проворний,", 60, 710); pdf_show_xy($pdf, "Завзятіший од всіх бурлак", 60, 690); // додати зображення над текстом і після $image = pdf_open_image_file($pdf, "jpeg", "/home/univer.ua/www/univer.jpg", 0, 0); pdf_place_image($pdf, $image, 70, 770, 0.25); pdf_place_image($pdf, $image, 70, 660, 0.25); // кінець сторінки pdf_end_page($pdf); // закрити і зберегти файл pdf_close($pdf); ?>
Вставлення зображень в pdf
Вставка зображення здійснюється за допомогою двох функцій pdf_open_image_file() та pdf_place_image(). Перша з них приймає тип зображення - GIF, JPEG, TIFF або PNG – та назву файлу в якості аргументів, і повертає вказівник на зображення, який згодом можна повторно використовувати в документі.Вказівник на рисунок, повернутий вище, далі можна передати функції pdf_place_image(), яка розташує зображення у певному місці на сторінці. Координати, передані даній функції (другий і третій аргумент) відносяться до лівого нижнього кута зображення, а четвертий аргумент задає параметр масштабування рисунку при відображенні (1 – покаже зображення у 100% масштабі, 0.5 – зменшить його в два рази.)
4. Малювання ліній
Модуль PDF включає в себе велику кількість функцій, які можуть малювати ліній, круги та інші фігури. Ось код, що здійснює малювання лінії:
<?php // створити вказівник для PDF документу $pdf = pdf_new(); // відкрити файл pdf_open_file($pdf, "/home/univer.ua/www/letter.pdf"); // розпочати сторінку (A4) pdf_begin_page($pdf, 595, 842); // отримати і використати об'єкт шрифт $fontdir = "C:\WINDOWS\Fonts"; pdf_set_parameter($pdf, "FontOutline", "arialMyName=$fontdir\arial.ttf"); $arial = pdf_findfont($pdf,"arialMyName","cp1251",0); pdf_setfont($pdf, $arial, 15); // встановити колір для ліній pdf_setcolor($pdf, "stroke", "rgb", 0, 0, 0, 0); // встановити логотип з самого верху сторінки по центру $image = pdf_open_image_file($pdf, "jpeg", "/home/univer.ua/www/univer.jpg", 0, 0); pdf_place_image($pdf, $image, 170, 785, 0.5); // намалювати лінію під логотипом pdf_moveto($pdf, 20, 780); pdf_lineto($pdf, 575, 780); pdf_stroke($pdf); // намалювати лінію знизу сторінки pdf_moveto($pdf, 20,50); pdf_lineto($pdf, 575, 50); pdf_stroke($pdf); // написати деякий текст під лінією pdf_show_xy($pdf, "Цілком конфіденційно", 200, 35); // кінець сторінки pdf_end_page($pdf); // close and save file pdf_close($pdf); ?>В результаті letter.pdf матиме вигляд:
Лінії в pdf
В даному випадку малювання лінії включає в себе використання функцій pdf_moveto(), pdf_lineto() та pdf_stroke(). В наведеному вище прикладі малюється лінія з точки (20,780) до точки (575, 780). Щоб це зробити, спочатку необхідно помістити курсор в початкову точку (20,780), з допомогою функції 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, 0);Необхідно помітити, що список кольорових значень, що передаються pdf_setcolor() повинен бути заданий в процентій величині інтенсивності - тобто, інтенсивність даного кольору, виражена в процентах від максимально можливого. Наприклад, якщо я хочу задати (RGB: 255,0,0) в якості кольору, виклик функції pdf_setcolor() буде виглядати так:
pdf_setcolor($pdf, "stroke", "rgb", 1, 0, 0, 0);
Заливка жовтим кольором буде виглядати так:
pdf_setcolor($pdf, "fill", "rgb", 1, 1, 0, 0);
5. Квадрати та круги
<?php // створити вказівник на PDF документ $pdf = pdf_new(); // відкрити файл pdf_open_file($pdf, "/home/univer.ua/www/shapes.pdf"); // розпочати нову сторінку (A4) pdf_begin_page($pdf, 595, 842); // встановити колір заповнення pdf_setcolor($pdf, "fill", "rgb", 1, 1, 0, 0); // встановити колір малювання контору pdf_setcolor($pdf, "stroke", "rgb", 0, 0, 0, 0); // намалювати прямокутник pdf_rect($pdf, 50, 500, 200, 300); pdf_fill_stroke($pdf); // встановити колір заповнення pdf_setcolor($pdf, "fill", "RGB", 0, 0.25, 0.5, 0); // встановити колір малювання контору pdf_setcolor($pdf, "stroke", "rgb", 0, 0, 1, 0); // намалюватиколо pdf_circle($pdf, 150, 650, 100); pdf_fill_stroke($pdf); // кінець сторінки pdf_end_page($pdf); // закрити і зберегти документ pdf_close($pdf); ?>
Коло намальоване на квадраті
pdf_fill_stroke() pdf_setcolor($pdf, "fill", "rgb", 1, 1, 0, 0); pdf_setcolor($pdf, "stroke", "rgb", 0, 0, 0, 0); pdf_rect($pdf, 50, 500, 200, 300); pdf_fill_stroke($pdf);Круги малюються функцією pdf_circle(), яка приймає три аргументи: координати X та Y центру кругу і довжини радіусу.
pdf_circle($pdf, 150, 650, 100);Можливість малювання геометричних зображень "на льоту" може пригодитися в різних ситуаціях. Наприклад, з використанням циклу "for" та функції pdf_lineto() можна згенерувати сітку з ліній.
<?php // створити вказівник на новий PDF документ $pdf = pdf_new(); // відкрити файл pdf_open_file($pdf, "/home/univer.ua/www/grid.pdf"); // створити нову сторінку (A4) pdf_begin_page($pdf, 595, 842); // встановити колір малювання pdf_setcolor($pdf, "stroke", "rgb", 0, 0, 0, 0); // намалювати вертикальні лініх (рухаємось по осі X з кроком 20) for ($x=0; $x<=595; $x+=20) { pdf_moveto($pdf, $x, 0); pdf_lineto($pdf, $x, 842); pdf_stroke($pdf); } // намалювати горизонтальні лінії (рухаємося по осі Y) for ($y=0; $y<=842; $y+=20) { pdf_moveto($pdf, 0, $y); pdf_lineto($pdf, 595, $y); pdf_stroke($pdf); } // кінець сторінки pdf_end_page($pdf); // закрити і зберегти файл pdf_close($pdf); ?>
Сітка на PDF-сторінці
6. Задання інформації про документ
Можна задавати інформацію про документ із допомогою функцій сімейства pdf_set_info(); Ця інформація визначає творця документа, назву і вміст. Наступний приклад демонструє це:
<?php // створити вказівник для нового PDF документу $pdf = pdf_new(); // відкрити файл pdf_open_file($pdf, "/home/univer.ua/www/eneida.pdf"); // розпочати нову сторінку (A4) pdf_begin_page($pdf, 595, 842); // встановити інформацію про документ pdf_set_info($pdf, "Author", "Іван Котляревський"); pdf_set_info($pdf, "Creator", "Іван Котляревський"); pdf_set_info($pdf, "Title", "Енеїда"); pdf_set_info($pdf, "Subject", "Початок"); pdf_set_info($pdf, "Keywords", "Еней козак Троя"); // отримати і використати об'єкт шрифт $fontdir = "C:\WINDOWS\Fonts"; pdf_set_parameter($pdf, "FontOutline", "arialMyName=$fontdir\\times.ttf"); $arial = pdf_findfont($pdf,"arialMyName", "cp1251" ,0 ); pdf_setfont($pdf, $arial, 12); // надрукувати текст pdf_show_xy($pdf, "Еней був паробок моторний",60, 750); pdf_show_xy($pdf, "І хлопець хоть куди козак", 60, 730); pdf_show_xy($pdf, "Удавсь на всеє зле проворний,", 60, 710); pdf_show_xy($pdf, "Завзятіший од всіх бурлак", 60, 690); // кінець сторінки pdf_end_page($pdf); // закрити і зберегти документ pdf_close($pdf); ?>Далі при перегляді документу в Adobe Reader, ви зможете побачити цю інформацію у Властивостях документу.
Властивості документу
7. Кругові діаграми
Форма знизу запитує декілька порцій даних, у вигляді чисел, що розділяються комами. Після вводу декількох чисел скрипт "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> <input name="data" type="text" /></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. Далі в циклі ці числа конвертуються в градуси для круга і для кожного сектора малюється дуга, В кожному проході циклу також обчислюється координати кінцевої точки дуги і малюється сегмент лінії для того, щоб відокремити дугу від решти окружності. Як тільки кругова діаграма намальована, використовується функція pdf_fill_stroke() для заливки її кольором; колір береться з масиву $colours.
Немає коментарів:
Дописати коментар