Страницы документа Document pages.

Рисование

Геометрия

PDF использует ту же самую геометрию, что и PostScript. Она начинается с нижнего левого угла страницы и по умолчанию измеряется в пойнтах (1/72 дюйма).

Размер страницы может быть получен из объекта страницы:

  1.  

Цвета

PDF имеет мощные возможности для представления цветов. Модуль Zend_Pdf поддерживает шкалу серого цвета, цветовые пространства RGB и CMYK. Они могут использоваться в любом месте, где требуется объект Zend_Pdf_Color. Классы Zend_Pdf_Color_GrayScale, Zend_Pdf_Color_RGB и Zend_Pdf_Color_CMYK предоставляют этот функционал:

  1. span style="color: #808080; font-style: italic;">// $grayLevel (число с плавающей точкой)
  2. // 0.0 (черный) - 1.0 (белый)
  3. // $r, $g, $b (числа с плавающей точкой)
  4. // 0.0 (минимальная интенсивность) - 1.0 (максимальная интенсивность)
  5. // $c, $m, $y, $k (числа с плавающей точкой)
  6. // 0.0 (минимальная интенсивность) - 1.0 (максимальная интенсивность)

Рисование фигур

Все операции прорисовки могут быть выполнены в контексте страницы PDF.

Класс Zend_Pdf_Page предоставляет набор примитивов для рисования:

  1. span style="color: #808080; font-style: italic;">/**
  2. * Рисует линию от x1,y1 до x2,y2.
  3. *
  4. * @param float $x1
  5. * @param float $y1
  6. * @param float $x2
  7. * @param float $y2
  8. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Рисует прямоугольник.
  3. *
  4. * Fill types:
  5. * Zend_Pdf_Const::SHAPEDRAW_FILLNSTROKE - заполнить прямоугольник и заштриховать (значение по умолчанию)
  6. * Zend_Pdf_Const::SHAPEDRAW_STROKE      - заштриховать прямоугольник
  7. * Zend_Pdf_Const::SHAPEDRAW_FILL        - заполнить прямоугольник
  8. *
  9. * @param float $x1
  10. * @param float $y1
  11. * @param float $x2
  12. * @param float $y2
  13. * @param integer $fillType
  14. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Риcует многоугольник.
  3. *
  4. * Если $fillType (тип заполнения) равен Zend_Pdf_Const::SHAPEDRAW_FILLNSTROKE
  5. * или Zend_Pdf_Const::SHAPEDRAW_FILL, то многоугольник будет автоматически замкнут.
  6. * См. более подробное описание этих методов в документации PDF
  7. * (section 4.4.2 Path painting Operators, Filling)
  8. *
  9. * @param array $x  - массив чисел с плавающей точкой (X-координаты вершин)
  10. * @param array $y  - массив чисел с плавающей точкой (Y-координаты вершин)
  11. * @param integer $fillType
  12. * @param integer $fillMethod
  13. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Рисует окружность, центр которой находится в точке с координатами x и y,
  3. * с радиусом radius.
  4. *
  5. * Углы задаются в радианах.
  6. *
  7. * Сигнатуры метода:
  8. * drawCircle($x, $y, $radius);
  9. * drawCircle($x, $y, $radius, $fillType);
  10. * drawCircle($x, $y, $radius, $startAngle, $endAngle);
  11. * drawCircle($x, $y, $radius, $startAngle, $endAngle, $fillType);
  12. *
  13. *
  14. * Это не настоящая окружность, так как PDF поддерживает только кубические кривые Безье.
  15. * Но в очень хорошем приближении.
  16. * Она отличается от реальной окружности максимум на 0.00026 доли радиуса
  17. * (на углах PI/8, 3*PI/8, 5*PI/8, 7*PI/8, 9*PI/8, 11*PI/8, 13*PI/8 и 15*PI/8).
  18. * На углах 0, PI/4, PI/2, 3*PI/4, PI, 5*PI/4, 3*PI/2 и 7*PI/4 это точная касательная к окружности.
  19. *
  20. * @param float $x
  21. * @param float $y
  22. * @param float $radius
  23. * @param mixed $param4
  24. * @param mixed $param5
  25. * @param mixed $param6
  26. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Рисует эллипс внутри заданного прямоугольника.
  3. *
  4. * Сигнатуры метода:
  5. * drawEllipse($x1, $y1, $x2, $y2);
  6. * drawEllipse($x1, $y1, $x2, $y2, $fillType);
  7. * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
  8. * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle, $fillType);
  9. *
  10. * Углы задаются в радианах.
  11. *
  12. * @param float $x1
  13. * @param float $y1
  14. * @param float $x2
  15. * @param float $y2
  16. * @param mixed $param5
  17. * @param mixed $param6
  18. * @param mixed $param7
  19. */

Написание текста

Операции по написанию текста также существуют в контексте страницы PDF.

  1. span style="color: #808080; font-style: italic;">/**
  2. * Выводит строку текста в заданной позиции.
  3. *
  4. * @param string $text
  5. * @param float $x
  6. * @param float $y
  7. * @throws Zend_Pdf_Exception
  8. */

Для написания текста используются текущий шрифт и его текущий размер. См. подробное описание ниже.

Применение шрифтов

Метод Zend_Pdf_Page::drawText() использует текущий шрифт, который может быть установлен методом Zend_Pdf_Page::setFont():

  1. span style="color: #808080; font-style: italic;">/**
  2. * Устанавливает текущий шрифт.
  3. *
  4. * @param Zend_Pdf_Font $font
  5. * @param float $fontSize
  6. */

PDF поддерживает Type1, TrueType, Type3 и составные шрифты. Он предоставляет еще 14 стандартных шрифтов Type1. На данный момент модуль Zend_Pdf предусматривает только эти стандартные шрифты. Они могут быть получены с помощью класса Zend_Pdf_Font_Standard. Конкретный шрифт указывается в качестве аргумента конструктора.

Example #1 Создание стандартного шрифта

  1. span style="color: #808080; font-style: italic;">// Создание нового шрифта
  2. // Применение шрифта

Константы для 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() для рисования изображений.

  1. span style="color: #808080; font-style: italic;">/**
  2. * Рисует изображение в заданной позиции на странице.
  3. *
  4. * @param Zend_Pdf_Resource_Image $image
  5. * @param float $x1
  6. * @param float $y1
  7. * @param float $x2
  8. * @param float $y2
  9. */

Объекты изображений должны создаваться через метод Zend_Pdf_Image::imageWithPath($filePath) (сейчас поддерживаются изображения JPG, PNG и TIFF):

Example #2 Рисование изображения

  1. span style="color: #808080; font-style: italic;">// Загрузка изображения
  2. 'my_image.jpg'

Важно! Для поддержки 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.

  1. span style="color: #808080; font-style: italic;">/** Установка цвета линии. *//** Установка толщины линии. *//**
  2. * Установка шаблона пунктира.
  3. *
  4. * $pattern (шаблон) является массивом чисел с плавающей точкой:
  5. * array(on_length, off_length, on_length, off_length, ...)
  6. * $phase (фаза) является сдвигом от начала линии.
  7. *
  8. * @param array $pattern
  9. * @param array $phase
  10. */

Стиль заполнения

Методы 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():

  1. span style="color: #808080; font-style: italic;">/**
  2. * Поворачивает страницу вокруг точки ($x, $y) на заданный угол (в радианах).
  3. *
  4. * @param float $angle
  5. */

Сохранение/восстановление графического состояния

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

Методы в классе Zend_Pdf_Page для этих операций:

  1. span style="color: #808080; font-style: italic;">/**
  2. * Сохраняет графическое состояние данной страницы.
  3. * Выполняет снимок используемых на данный момент стилей, положений, ... и всех
  4. * поворотов/преобразований/масштабирований которые были применены.
  5. * This takes a snapshot of the currently applied style, position, clipping area and
  6. * any rotation/translation/scaling that has been applied.
  7. *//**
  8. * Восстанавливает графическое состояние, которое было сохранено последним
  9. * вызовом saveGS().
  10. */

Ограничение области рисования

PDF и модуль Zend_Pdf поддерживают ограничение области рисования. Ограничение определяет область страницы, затрагиваемой операциями рисования. Вначале эта область представляет собой всю страницу.

Класс Zend_Pdf_Page предоставляет набор методов для операций ограничения.

  1. span style="color: #808080; font-style: italic;">/**
  2. * Делит текущую площадь ограничения с помощью прямоугольника.
  3. *
  4. * @param float $x1
  5. * @param float $y1
  6. * @param float $x2
  7. * @param float $y2
  8. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Делит текущую площадь ограничения с помощью многоугольника.
  3. *
  4. * @param array $x  - массив чисел с плавающей точкой (X-координаты верхушек)
  5. * @param array $y  - массив чисел с плавающей точкой (Y-координаты верхушек)
  6. * @param integer $fillMethod
  7. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Делит текущую площадь ограничения с помощью окружности.
  3. *
  4. * @param float $x
  5. * @param float $y
  6. * @param float $radius
  7. * @param float $startAngle
  8. * @param float $endAngle
  9. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Делит текущую площадь ограничения с помощью эллипса.
  3. *
  4. * Сигнатуры метода:
  5. * drawEllipse($x1, $y1, $x2, $y2);
  6. * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
  7. *
  8. * @todo обрабатывать случаи, когда $x2-$x1 == 0 или $y2-$y1 == 0
  9. *
  10. * @param float $x1
  11. * @param float $y1
  12. * @param float $x2
  13. * @param float $y2
  14. * @param float $startAngle
  15. * @param float $endAngle
  16. */

Стили

Класс Zend_Pdf_Style предоставляет набор функциональных возможностей для работы со стилями.

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

  1. span style="color: #808080; font-style: italic;">/**
  2. * Установить стиль для будущих операций рисования на данной странице
  3. *
  4. * @param Zend_Pdf_Style $style
  5. *//**
  6. * Возвращает стили, используемые на странице
  7. *
  8. * @return Zend_Pdf_Style|null
  9. */

Класс Zend_Pdf_Style предоставляет набор методов для установки или получения различных параметров графического состояния:

  1. span style="color: #808080; font-style: italic;">/**
  2. * Устанавливает цвет линии.
  3. *
  4. * @param Zend_Pdf_Color $color
  5. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Возвращает цвет линии.
  3. *
  4. * @return Zend_Pdf_Color|null
  5. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Устанавливает толщину линии.
  3. *
  4. * @param float $width
  5. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Возвращает толщину линии.
  3. *
  4. * @return float
  5. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Устанавливает шаблон пунктира.
  3. *
  4. * @param array $pattern
  5. * @param float $phase
  6. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Возвращает шаблон пунктира.
  3. *
  4. * @return array
  5. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Возвращает фазу пунктира.
  3. *
  4. * @return float
  5. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Устанавливает цвет заполнения.
  3. *
  4. * @param Zend_Pdf_Color $color
  5. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Возвращает цвет заполнения.
  3. *
  4. * @return Zend_Pdf_Color|null
  5. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Устанавливает текущий шрифт.
  3. *
  4. * @param Zend_Pdf_Font $font
  5. * @param float $fontSize
  6. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Изменяет текущий размер шрифта
  3. *
  4. * @param float $fontSize
  5. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Возвращает текущий шрифт.
  3. *
  4. * @return Zend_Pdf_Font $font
  5. */
  1. span style="color: #808080; font-style: italic;">/**
  2. * Возвращает текущий размер шрифта.
  3. *
  4. * @return float $fontSize
  5. */

Страницы документа Document pages.