Рисование
Геометрия
PDF использует ту же самую геометрию, что и PostScript. Она начинается с
нижнего левого угла страницы и по умолчанию измеряется в пойнтах (1/72 дюйма).
Размер страницы может быть получен из объекта страницы:
getWidth();
$height = $pdfPage->getHeight();]]>
Цвета
PDF имеет мощные возможности для представления цветов. Модуль Zend_Pdf
поддерживает шкалу серого цвета, цветовые пространства RGB и CMYK.
Они могут использоваться в любом месте, где требуется объект
Zend_Pdf_Color. Классы Zend_Pdf_Color_GrayScale,
Zend_Pdf_Color_RGB и Zend_Pdf_Color_CMYK
предоставляют этот функционал:
Рисование фигур
Все операции прорисовки могут быть выполнены в контексте страницы PDF.
Класс Zend_Pdf_Page предоставляет набор примитивов для рисования:
Написание текста
Операции по написанию текста также существуют в контексте страницы PDF.
Для написания текста используются текущий шрифт и его текущий размер. См.
подробное описание ниже.
Применение шрифтов
Метод Zend_Pdf_Page::drawText() использует текущий шрифт,
который может быть установлен методом Zend_Pdf_Page::setFont():
PDF поддерживает Type1, TrueType, Type3 и составные шрифты. Он предоставляет еще
14 стандартных шрифтов Type1. На данный момент модуль Zend_Pdf
предусматривает только эти стандартные шрифты. Они могут быть получены
с помощью класса Zend_Pdf_Font_Standard. Конкретный шрифт
указывается в качестве аргумента конструктора.
Создание стандартного шрифта
setFont($font, 36);
...
?>]]>
Константы для 14 стандартных шрифтов определены с помощью
класса Zend_Pdf_Const:
Zend_Pdf_Const::FONT_TIMES_ROMAN
Zend_Pdf_Const::FONT_TIMES_BOLD
Zend_Pdf_Const::FONT_TIMES_ITALIC
Zend_Pdf_Const::FONT_TIMES_BOLDITALIC
Zend_Pdf_Const::FONT_HELVETICA
Zend_Pdf_Const::FONT_HELVETICA_BOLD
Zend_Pdf_Const::FONT_HELVETICA_ITALIC
Zend_Pdf_Const::FONT_HELVETICA_BOLDITALIC
Zend_Pdf_Const::FONT_COURIER
Zend_Pdf_Const::FONT_COURIER_BOLD
Zend_Pdf_Const::FONT_COURIER_ITALIC
Zend_Pdf_Const::FONT_COURIER_BOLDITALIC
Zend_Pdf_Const::FONT_SYMBOL
Zend_Pdf_Const::FONT_ZAPFDINGBATS
Рисование изображений
Класс предоставляет метод drawImage() для рисования изображений.
Объекты изображений должны создаваться через метод
Zend_Pdf_Image::imageWithPath($filePath)
(сейчас поддерживаются изображения JPG, PNG и TIFF):
Рисование изображения
drawImage($image, 100, 100, 400, 300);
...
?>]]>
Важно! Для поддержки JPEG необходимо сконфигурировать
расширение GD.
Важно! Для поддержки PNG необходимо сконфигурировать
расширение ZLIB для работы с изображениями с Альфа-каналом.
См. документацию PHP за более подробной информацией
(http://www.php.net/manual/en/ref.image.php).
(http://www.php.net/manual/en/ref.zlib.php).
Стили рисования линий
Стили рисования линий определяются толщиной линии, цветом линии и шаблоном
пунктира. Все эти параметры могут быть определены методами класса
Zend_Pdf_Page.
Стиль заполнения
Методы Zend_Pdf_Page::drawRectangle(), Zend_Pdf_Page::drawPoligon(),
Zend_Pdf_Page::drawCircle() и Zend_Pdf_Page::drawEllipse()
принимают аргумент $fillType как необязательный параметр.
Это может быть:
Zend_Pdf_Const::SHAPEDRAW_STROKE - штрихует фигуру
Zend_Pdf_Const::SHAPEDRAW_FILL - заполняет фигуру
Zend_Pdf_Const::SHAPEDRAW_FILLNSTROKE - заполняет и штрихует (поведение по умолчанию)
Метод Zend_Pdf_Page::drawPoligon() принимает дополнительный
параметр $fillMethod:
Zend_Pdf_Const::FILLMETHOD_NONZEROWINDING (поведение по умолчанию)
Справка по PDF описывает это правило
следующим образом:
Правило ненулевого количества витков определяет, находится ли
данная точка внутри траектории путем мысленного
проведения луча из этой точки в бесконечность в любом направлении
и последующего определения мест, где участок траектории пересекает луч.
Начиная отсчет с нуля, правило добавляет 1 каждый раз, когда
участок траектории пересекает луч слева направо и отнимает 1
каждый раз, когда участок траектории пересекает участок справа налево.
Если после подсчета всех пересечений результатом будет 0, то точка
находится вне траектории, иначе — внутри траектории.
Примечание: Метод не указывает, что делать, если участок траектории
совпадает или является касательной к выбранному лучу. Поскольку
направление луча является произвольным, правило просто выбирает
луч, который не создает таких пересечений. Для простых выпуклых
траекторий правило ненулевого количества витков определяет
внутреннюю и внешнюю части так, как это интуитивно предполагается.
Более интересными случаями являются те, которые включают в себя
сложные или самопересекающиеся траектории, как, например,
на Рис. 4.10 (в справке по PDF).
Для траектории, представляющую собой пятиконечную звезду,
состоящую из пяти соединенных отрезков, правило считает внутренней
частью всю площадь, окруженную звездой, включая пятиугольник в
центре. Для траектории, состоящей из двух концентрических
окружностей, площадь, окруженная обеими окружностями,
считается внутренней в том случае, если обе окружности нарисованы
в одном и том же направлении. Если окружности нарисованы в противоположных
направлениях, то, согласно правилу, только фигура в виде
баранки между ними будет внутренней частью, "дырка"
будет внешней частью.
Zend_Pdf_Const::FILLMETHOD_EVENODD
Справка по PDF описывает это правило
следующим образом:
Альтернативой правилу ненулевого количества витков является правило
чета-нечета. Это правило определяет нахождение точки
проведением луча из этой точки в любом направлении и простым подсчетом
количества пересечений частей траектории с этим лучом, независимо от
направления пересечения. Если число нечетное, то точка находится
во внутренней части; если четное, то точка находится снаружи. Это
правило дает такой же результат, как и правило ненулевого
количества витков для траекторий с простыми фигурами, но дает
разные результаты в случае более сложных фигур.
Рис. 4.11 (в справке по PDF) показывает результаты применения
правила чета-нечета к сложным фигурам. В случае пятиконечной
звезды правило считает точки треугольников находящимися
внутри траектории, но не пятиугольник в центре. Для двух
концентрических окружностей только фигура в виде баранки будет
считаться внутренней частью, независимо от направлений, в которых
нарисованы окружности.
Поворот
Страница PDF может быть повернута перед применением любых операций рисования.
Это может быть сделано методом Zend_Pdf_Page::rotate():
Сохранение/восстановление графического состояния
В любое время графическое состояние страницы (текущий шрифт, размер шрифта,
цвет линии, цвет заполнения, стиль линии, поворот страницы, область ограничения) может
быть сохранено и после восстановлено. Операция сохранения сохраняет данные
в стек графического состояния, операция восстановления извлекает данные из стека.
Методы в классе Zend_Pdf_Page для этих операций:
Ограничение области рисования
PDF и модуль Zend_Pdf поддерживают ограничение области рисования.
Ограничение определяет область страницы, затрагиваемой
операциями рисования. Вначале эта область представляет собой всю
страницу.
Класс Zend_Pdf_Page предоставляет набор методов для операций ограничения.
Стили
Класс Zend_Pdf_Style предоставляет набор функциональных
возможностей для работы со стилями.
Стили могут использоваться для сохранения набора параметров графического
состояния и применять их к странице PDF одной операцией:
Класс Zend_Pdf_Style предоставляет набор методов для установки
или получения различных параметров графического состояния: