Создавайте PDF с помощью PHP

  1. Впереди игра
  2. Начиная
  3. Урок анатомии
  4. Довольно как картина
  5. Наименьшее расстояние между двумя точками
  6. Квадратный колышек, круглое отверстие
  7. Рай это место на земле
  8. Кусок пирога

Эта статья была написана в 2003 году и остается одной из наших самых популярных публикаций. Если вы хотите больше узнать о PDF-файлах и документах, вы можете найти это недавняя статья о создании редактора документов HTML5 большой интерес.

Впереди игра

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

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

Начиная

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

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

Как только у вас все будет готово, пришло время создать простой файл PDF. Вот оно:

<? php создать дескриптор для нового документа PDF $ pdf = pdf_new (); открыть файл pdf_open_file ($ pdf, "философия.pdf"); начать новую страницу (A4) pdf_begin_page ($ pdf, 595, 842); получить и использовать объект шрифта $ arial = pdf_findfont ($ pdf, "Arial", "host", 1); pdf_setfont ($ pdf, $ arial, 10); печатный текст pdf_show_xy ($ pdf, «Есть больше вещей на небе и на земле, Горацио», 50, 750); pdf_show_xy ($ pdf, «о чем мечтали в вашей философии», 50, 730); конечная страница pdf_end_page ($ pdf); закройте и сохраните файл pdf_close ($ pdf); ?>

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

Урок анатомии

Давайте внимательнее посмотрим на код, использованный в приведенном выше примере.

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

Давайте сделаем первый шаг - создадим дескриптор для документа PDF.

создать дескриптор для нового документа PDF $ pdf = pdf_new ();

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

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

открыть файл pdf_open_file ($ pdf, "философия.pdf");

После того, как документ создан, вы можете вставить в него новые страницы с помощью
функция pdf_begin_page (),

начать новую страницу (A4) pdf_begin_page ($ pdf, 595, 842);

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

конечная страница pdf_end_page ($ pdf);

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

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

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

$ arial = pdf_findfont ($ pdf, "Arial", "host", 1); 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 (), и уничтожит созданный дескриптор документа.

Довольно как картина

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

<? php создать дескриптор для нового документа PDF $ pdf = pdf_new (); открыть файл pdf_open_file ($ pdf, "философия.pdf"); начать новую страницу (A4) pdf_begin_page ($ pdf, 595, 842); получить и использовать объект шрифта $ arial = pdf_findfont ($ pdf, "Arial", "host", 1); pdf_setfont ($ pdf, $ arial, 10); печатный текст pdf_show_xy ($ pdf, «Есть больше вещей на небе и на земле, Горацио», 50, 750); pdf_show_xy ($ pdf, «о чем мечтали в вашей философии», 50, 730); добавить изображение под текстом $ image = pdf_open_image_file ($ pdf, "jpeg", "shakespeare.jpg"); pdf_place_image ($ pdf, $ image, 50, 650, 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 покажет изображение в реальном размере, в то время как коэффициент 0,5 уменьшит изображение до половины его размера).

Наименьшее расстояние между двумя точками

Зачем останавливаться на достигнутом? Расширение PHP для PDF поставляется с целым пакетом функций, позволяющих рисовать линии, круги и другие фигуры в документе PDF. Рассмотрим следующий пример, который демонстрирует процесс рисования линии.

<? php создать дескриптор для нового документа PDF $ pdf = pdf_new (); открыть файл pdf_open_file ($ pdf, "letterhead.pdf"); начать новую страницу (A4) pdf_begin_page ($ pdf, 595, 842); получить и использовать объект шрифта $ arial = pdf_findfont ($ pdf, "Arial", "host", 1); pdf_setfont ($ pdf, $ arial, 12); установить цвет для линии pdf_setcolor ($ pdf, "stroke", "rgb", 0, 0, 0); разместить логотип в верхнем левом углу $ image = pdf_open_image_file ($ pdf, "jpeg", "logo.jpg"); pdf_place_image ($ pdf, $ image, 50, 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); закройте и сохраните файл pdf_close ($ 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, независимо от того, установлен ли цвет «штрих», «заливка» или «оба», используемую цветовую схему ( 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);

в то время как цвет заливки желтый (RGB: 255,255,0) будет:

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

Квадратный колышек, круглое отверстие

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

<? php создать дескриптор для нового документа PDF $ pdf = pdf_new (); откройте файл pdf_open_file ($ pdf, "shape.pdf"); начать новую страницу (A4) pdf_begin_page ($ pdf, 595, 842); установить цвет заливки 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_setcolor ($ pdf, «fill», «rgb», 0, 1, 0); установить цвет обводки pdf_setcolor ($ pdf, "stroke", "rgb", 0, 0, 1); нарисуйте круг pdf_circle ($ pdf, 400, 600, 100); pdf_fill_stroke ($ PDF); конечная страница pdf_end_page ($ pdf); закройте и сохраните файл pdf_close ($ pdf); ?>

Вот вывод:

В этом случае функция 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 () для создания линейной сетки PDF.

&lt;? php создать дескриптор для нового документа PDF $ pdf = pdf_new (); открыть файл pdf_open_file ($ pdf, "grid.pdf"); начать новую страницу (A4) pdf_begin_page ($ pdf, 595, 842); установить цвет обводки pdf_setcolor ($ pdf, "stroke", "rgb", 0, 0, 0); рисовать вертикальные линии (двигаться вдоль оси X) для ($ x = 0; $ x <= 595; $ x + = 20) {pdf_moveto ($ pdf, $ x, 0); pdf_lineto ($ pdf, $ x, 842); pdf_stroke ($ PDF); } нарисуйте горизонтальные линии (перемещайтесь вдоль оси Y) для ($ 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_set_info _ * (); эта информация идентифицирует создателя документа, название и содержание. Следующий пример демонстрирует:

&lt;? php создать дескриптор для нового документа PDF $ pdf = pdf_new (); открыть файл pdf_open_file ($ pdf, "философия.pdf"); начать новую страницу (A4) pdf_begin_page ($ pdf, 595, 842); установить информацию о документе pdf_set_info_author ($ pdf, "Уильям Шекспир"); pdf_set_info_creator ($ pdf, "Уильям Шекспир"); pdf_set_info_title ($ pdf, "Гамлет"); pdf_set_info_subject ($ pdf, «Акт I Сцена 5»); pdf_set_info_keywords ($ pdf, «Философия Горацио Гамлета»); получить и использовать объект шрифта $ arial = pdf_findfont ($ pdf, "Arial", "host", 1); pdf_setfont ($ pdf, $ arial, 10); печатный текст pdf_show_xy ($ pdf, «Есть больше вещей на небе и на земле, Горацио», 50, 750); pdf_show_xy ($ pdf, «о чем мечтали в вашей философии», 50, 730); конечная страница pdf_end_page ($ pdf); закройте и сохраните файл pdf_close ($ pdf); ?>

И теперь, когда вы просматриваете динамически сгенерированный PDF-файл в Acrobat Reader, вы увидите эту информацию в окне «Свойства документа».

Кусок пирога

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

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

<html> <head> <basefont face = arial> </ head> <body> <h3> Генератор круговых диаграмм </ h3> <table cellspacing = "5" cellpadding = "5"> <form action = "pie.php "method = POST> <tr> <td> Введите числовые значения (круговые сегменты), разделенные запятыми </ td> </ tr> <tr> <td> <input type = text name = data> </ td> < / tr> <tr> <td> <input name = "submit" type = submit value = "Создать круговую диаграмму PDF"> </ td> </ tr> </ form> </ table> </ body> </ HTML>

Вот скрипт, который делает всю работу:

&lt;? php необработанные данные $ data = $ _POST ['data']; $ slices = explode (",", $ data); инициализировать некоторые переменные $ sum = 0; $ градус = массив (); диаметр диаметра = 200; $ радиус = $ диаметр / 2; установить массив цветов для кусочков пирога (rgb, в процентах от интенсивности) // добавить к ним больше, если вам нравится $ colors = array (array (0,0,0), array (0,0,1), array (0) , 1,0), массив (1,0,0), массив (0,1,1), массив (1,1,0), массив (1,0,1),); рассчитать сумму срезов $ sum = array_sum ($ slices); преобразовать каждый срез в соответствующий процент от круга из 360 градусов для ($ y = 0; $ y <sizeof ($ slices); $ y ++) {$ градус [$ y] = ($ slices [$ y] / $ sum) * 360; } начать создание дескриптора создания PDF-документа для нового PDF-документа $ pdf = pdf_new (); открыть файл pdf_open_file ($ pdf, "chart.pdf"); начать новую страницу (A4) pdf_begin_page ($ pdf, 500, 500); установить цвет обводки pdf_setcolor ($ pdf, "stroke", "rgb", 1, 1, 0); нарисовать базовую линию pdf_moveto ($ pdf, 250, 250); pdf_lineto ($ pdf, 350, 250); pdf_stroke ($ PDF); for ($ z = 0; $ z <sizeof ($ slices); $ z ++) {установить цвет заливки pdf_setcolor ($ pdf, "fill", "rgb", $ colors [$ z] [0], $ colors [ $ z] [1], $ colors [$ z] [2]); вычислить координату конечной точки каждой дуги, получив длину сегмента и добавив радиус, помните, что cos () и sin () возвращают значение в радианах и должны быть преобразованы обратно в градусы! $ end_x = round (250 + ($ radius * cos ($ last_angle * pi () / 180))); $ end_y = round (250 + ($ radius * sin ($ last_angle * pi () / 180))); разграничить срез со строкой pdf_moveto ($ pdf, 250, 250); pdf_lineto ($ pdf, $ end_x, $ end_y); вычислить и нарисовать дугу, соответствующую каждому срезу pdf_arc ($ pdf, 250, 250, $ radius, $ last_angle, ($ last_angle + $ градусов [$ z])); сохранить последний угол $ last_angle = $ last_angle + $ градусов [$ z]; заполнить срез цветом pdf_fill_stroke ($ pdf); } перерисовать контур круга pdf_circle ($ pdf, 250, 250, 100); pdf_stroke ($ PDF); конечная страница pdf_end_page ($ pdf); закройте и сохраните файл pdf_close ($ pdf); ?>

Данные, введенные в форму, передаются в скрипт «pie.php» через переменную с именем $ data; эти данные затем разделяются на отдельные компоненты с помощью функции explode (), и каждое отдельное значение помещается в массив $ slices. Затем цикл преобразует эти числа в градусы круга и рисует дуги для каждого среза. На каждой итерации цикла также рассчитывается координата конечной точки дуги и рисуется отрезок линии, чтобы отделить дугу от остальной части круга. После того, как круговой сегмент нарисован, функция pdf_fill_stroke () используется для заполнения его цветом; этот цвет получается из массива $ colors.

Я не буду вдаваться в подробности того, как скрипт рассчитывает длину каждой дуги и отрезка - скрипт включает фрагменты кода с комментариями, которые должны объяснить большинство деталей.

Если вы введете пять срезов данных одинакового значения, ваша круговая диаграмма будет выглядеть так,

Если вы введете пять срезов данных одинакового значения, ваша круговая диаграмма будет выглядеть так,

Принимая во внимание, что если вы введете два среза одинакового значения, это будет выглядеть так:

Принимая во внимание, что если вы введете два среза одинакового значения, это будет выглядеть так:

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

Примечание. Все примеры в этой статье были протестированы на Linux / i586 с Apache 1.3.12 и PHP 4.2.0. Примеры являются только иллюстративными и не предназначены для производственной среды. Melonfire не предоставляет никаких гарантий или поддержки для исходного кода, описанного в этой статье. YMMV!
авторское право Melonfire 2000. Все права защищены.

Если вам понравилось читать этот пост, вам понравится Обучающийся ; место, чтобы узнать новые навыки и приемы у мастеров. Участники получают мгновенный доступ ко всем электронным книгам и интерактивным онлайн-курсам SitePoint, таким как Руководство для начинающих по веб-дизайну с WordPress ,

Lt;?
Lt;?
Lt;?
Lt;?