Zend_Pdf-Drawing.xml 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835
  1. <sect1 id="zend.pdf.drawing">
  2. <title>Рисование<!-- Drawing. --></title>
  3. <sect2 id="zend.pdf.drawing.geometry">
  4. <title>Геометрия<!-- Geometry.--></title>
  5. <para>
  6. PDF использует ту же самую геометрию, что и PostScript. Она начинается с
  7. нижнего левого угла страницы и по умолчанию измеряется в пойнтах (1/72 дюйма).
  8. <!--
  9. PDF uses the same geometry as PostScript. It starts from bottom-left corner of page
  10. and by default is measured in points (1/72 of an inch).
  11. -->
  12. </para>
  13. <para>
  14. Размер страницы может быть получен из объекта страницы:
  15. <!--
  16. Page size can be retrieved from a page object:
  17. -->
  18. </para>
  19. <programlisting language="php"><![CDATA[<?php
  20. $width = $pdfPage->getWidth();
  21. $height = $pdfPage->getHeight();]]>
  22. </programlisting>
  23. </sect2>
  24. <sect2 id="zend.pdf.drawing.color">
  25. <title>Цвета<!-- Colors. --></title>
  26. <para>
  27. PDF имеет мощные возможности для представления цветов. Модуль Zend_Pdf
  28. поддерживает шкалу серого цвета, цветовые пространства RGB и CMYK.
  29. Они могут использоваться в любом месте, где требуется объект
  30. <code>Zend_Pdf_Color</code>. Классы <code>Zend_Pdf_Color_GrayScale</code>,
  31. <code>Zend_Pdf_Color_RGB</code> и <code>Zend_Pdf_Color_CMYK</code>
  32. предоставляют этот функционал:
  33. <!--
  34. PDF has a powerful capabilities for colors representation. Zend_Pdf module supports Gray Scale,
  35. RGB and CMYK color spaces. Any of them can be used in any place, where <code>Zend_Pdf_Color</code>
  36. object is required. <code>Zend_Pdf_Color_GrayScale</code>, <code>Zend_Pdf_Color_RGB</code> and
  37. <code>Zend_Pdf_Color_CMYK</code> classes provide this functionality:
  38. -->
  39. </para>
  40. <programlisting language="php"><![CDATA[<?php
  41. // $grayLevel (число с плавающей точкой)
  42. // 0.0 (черный) - 1.0 (белый)
  43. $color1 = new Zend_Pdf_Color_GrayScale($grayLevel);
  44. // $r, $g, $b (числа с плавающей точкой)
  45. // 0.0 (минимальная интенсивность) - 1.0 (максимальная интенсивность)
  46. $color2 = new Zend_Pdf_Color_RGB($r, $g, $b);
  47. // $c, $m, $y, $k (числа с плавающей точкой)
  48. // 0.0 (минимальная интенсивность) - 1.0 (максимальная интенсивность)
  49. $color3 = new Zend_Pdf_Color_CMYK($c, $m, $y, $k);]]>
  50. </programlisting>
  51. </sect2>
  52. <sect2 id="zend.pdf.drawing.shape-drawing">
  53. <title>Рисование фигур<!-- Shape Drawing. --></title>
  54. <para>
  55. Все операции прорисовки могут быть выполнены в контексте страницы PDF.
  56. <!--
  57. All drawing operations can be done in a context of PDF page.
  58. -->
  59. </para>
  60. <para>
  61. Класс <code>Zend_Pdf_Page</code> предоставляет набор примитивов для рисования:
  62. <!--
  63. <code>Zend_Pdf_Page</code> class provides a set of drawing primitives:
  64. -->
  65. </para>
  66. <programlisting language="php"><![CDATA[<?php
  67. /**
  68. * Рисует линию от x1,y1 до x2,y2.
  69. *
  70. * @param float $x1
  71. * @param float $y1
  72. * @param float $x2
  73. * @param float $y2
  74. */
  75. public function drawLine($x1, $y1, $x2, $y2);]]>
  76. </programlisting>
  77. <programlisting language="php"><![CDATA[<?php
  78. /**
  79. * Рисует прямоугольник.
  80. *
  81. * Fill types:
  82. * Zend_Pdf_Const::SHAPEDRAW_FILLNSTROKE - заполнить прямоугольник и заштриховать (значение по умолчанию)
  83. * Zend_Pdf_Const::SHAPEDRAW_STROKE - заштриховать прямоугольник
  84. * Zend_Pdf_Const::SHAPEDRAW_FILL - заполнить прямоугольник
  85. *
  86. * @param float $x1
  87. * @param float $y1
  88. * @param float $x2
  89. * @param float $y2
  90. * @param integer $fillType
  91. */
  92. public function drawRectangle($x1, $y1, $x2, $y2, $fillType = Zend_Pdf_Const::SHAPEDRAW_FILLNSTROKE);]]>
  93. </programlisting>
  94. <programlisting language="php"><![CDATA[<?php
  95. /**
  96. * Риcует многоугольник.
  97. *
  98. * Если $fillType (тип заполнения) равен Zend_Pdf_Const::SHAPEDRAW_FILLNSTROKE
  99. * или Zend_Pdf_Const::SHAPEDRAW_FILL, то многоугольник будет автоматически замкнут.
  100. * См. более подробное описание этих методов в документации PDF
  101. * (section 4.4.2 Path painting Operators, Filling)
  102. *
  103. * @param array $x - массив чисел с плавающей точкой (X-координаты вершин)
  104. * @param array $y - массив чисел с плавающей точкой (Y-координаты вершин)
  105. * @param integer $fillType
  106. * @param integer $fillMethod
  107. */
  108. public function drawPolygon($x, $y,
  109. $fillType = Zend_Pdf_Const::SHAPEDRAW_FILLNSTROKE,
  110. $fillMethod = Zend_Pdf_Const::FILLMETHOD_NONZEROWINDING);]]>
  111. </programlisting>
  112. <programlisting language="php"><![CDATA[<?php
  113. /**
  114. * Рисует окружность, центр которой находится в точке с координатами x и y,
  115. * с радиусом radius.
  116. *
  117. * Углы задаются в радианах.
  118. *
  119. * Сигнатуры метода:
  120. * drawCircle($x, $y, $radius);
  121. * drawCircle($x, $y, $radius, $fillType);
  122. * drawCircle($x, $y, $radius, $startAngle, $endAngle);
  123. * drawCircle($x, $y, $radius, $startAngle, $endAngle, $fillType);
  124. *
  125. *
  126. * Это не настоящая окружность, так как PDF поддерживает только кубические кривые Безье.
  127. * Но в очень хорошем приближении.
  128. * Она отличается от реальной окружности максимум на 0.00026 доли радиуса
  129. * (на углах PI/8, 3*PI/8, 5*PI/8, 7*PI/8, 9*PI/8, 11*PI/8, 13*PI/8 и 15*PI/8).
  130. * На углах 0, PI/4, PI/2, 3*PI/4, PI, 5*PI/4, 3*PI/2 и 7*PI/4 это точная касательная к окружности.
  131. *
  132. * @param float $x
  133. * @param float $y
  134. * @param float $radius
  135. * @param mixed $param4
  136. * @param mixed $param5
  137. * @param mixed $param6
  138. */
  139. public function drawCircle($x, $y, $radius, $param4 = null, $param5 = null, $param6 = null);]]>
  140. </programlisting>
  141. <programlisting language="php"><![CDATA[<?php
  142. /**
  143. * Рисует эллипс внутри заданного прямоугольника.
  144. *
  145. * Сигнатуры метода:
  146. * drawEllipse($x1, $y1, $x2, $y2);
  147. * drawEllipse($x1, $y1, $x2, $y2, $fillType);
  148. * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
  149. * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle, $fillType);
  150. *
  151. * Углы задаются в радианах.
  152. *
  153. * @param float $x1
  154. * @param float $y1
  155. * @param float $x2
  156. * @param float $y2
  157. * @param mixed $param5
  158. * @param mixed $param6
  159. * @param mixed $param7
  160. */
  161. public function drawEllipse($x1, $y1, $x2, $y2, $param5 = null, $param6 = null, $param7 = null);]]>
  162. </programlisting>
  163. </sect2>
  164. <sect2 id="zend.pdf.drawing.text-drawing">
  165. <title>Написание текста<!-- Text Drawing.--></title>
  166. <para>
  167. Операции по написанию текста также существуют в контексте страницы PDF.
  168. <!--
  169. Text drawing operations are also exist in a context of PDF page:
  170. -->
  171. </para>
  172. <programlisting language="php"><![CDATA[<?php
  173. /**
  174. * Выводит строку текста в заданной позиции.
  175. *
  176. * @param string $text
  177. * @param float $x
  178. * @param float $y
  179. * @throws Zend_Pdf_Exception
  180. */
  181. public function drawText($text, $x, $y );]]>
  182. </programlisting>
  183. <para>
  184. Для написания текста используются текущий шрифт и его текущий размер. См.
  185. подробное описание ниже.
  186. <!--
  187. Current font and current font size are used for text drawing operations. See detailed description below.
  188. -->
  189. </para>
  190. </sect2>
  191. <sect2 id="zend.pdf.drawing.using-fonts">
  192. <title>Применение шрифтов<!-- Using fonts. --></title>
  193. <para>
  194. Метод <code>Zend_Pdf_Page::drawText()</code> использует текущий шрифт,
  195. который может быть установлен методом <code>Zend_Pdf_Page::setFont()</code>:
  196. <!--
  197. <code>Zend_Pdf_Page::drawText()</code> method uses current font, which can be assigned
  198. by <code>Zend_Pdf_Page::setFont()</code> method:
  199. -->
  200. </para>
  201. <programlisting language="php"><![CDATA[<?php
  202. /**
  203. * Устанавливает текущий шрифт.
  204. *
  205. * @param Zend_Pdf_Font $font
  206. * @param float $fontSize
  207. */
  208. public function setFont(Zend_Pdf_Font $font, $fontSize);]]>
  209. </programlisting>
  210. <para>
  211. PDF поддерживает Type1, TrueType, Type3 и составные шрифты. Он предоставляет еще
  212. 14 стандартных шрифтов Type1. На данный момент модуль <code>Zend_Pdf</code>
  213. предусматривает только эти стандартные шрифты. Они могут быть получены
  214. с помощью класса <code>Zend_Pdf_Font_Standard</code>. Конкретный шрифт
  215. указывается в качестве аргумента конструктора.
  216. <!--
  217. PDF supports Type1, TrueType, Type3 and composite fonts. There are also 14 standard Type1 fonts
  218. provided by PDF. Zend_Pdf module provides only these standard fonts now. They can be obtained by using
  219. <code>Zend_Pdf_Font_Standard</code> class. Concrete font is specified as a constructor argument:
  220. -->
  221. </para>
  222. <example>
  223. <title>Создание стандартного шрифта<!-- Create standard font.--></title>
  224. <programlisting language="php"><![CDATA[<?php
  225. ...
  226. // Создание нового шрифта
  227. $font = new Zend_Pdf_Font_Standard(Zend_Pdf_Const::FONT_HELVETICA);
  228. // Применение шрифта
  229. $pdfPage->setFont($font, 36);
  230. ...
  231. ?>]]>
  232. </programlisting>
  233. </example>
  234. <para>
  235. Константы для 14 стандартных шрифтов определены с помощью
  236. класса <code>Zend_Pdf_Const</code>:
  237. <!--
  238. Font constants for 14 standard fonts are defined within <code>Zend_Pdf_Const</code> class:
  239. -->
  240. <itemizedlist>
  241. <listitem>
  242. <para>Zend_Pdf_Const::FONT_TIMES_ROMAN</para>
  243. </listitem>
  244. <listitem>
  245. <para>Zend_Pdf_Const::FONT_TIMES_BOLD</para>
  246. </listitem>
  247. <listitem>
  248. <para>Zend_Pdf_Const::FONT_TIMES_ITALIC</para>
  249. </listitem>
  250. <listitem>
  251. <para>Zend_Pdf_Const::FONT_TIMES_BOLDITALIC</para>
  252. </listitem>
  253. <listitem>
  254. <para>Zend_Pdf_Const::FONT_HELVETICA</para>
  255. </listitem>
  256. <listitem>
  257. <para>Zend_Pdf_Const::FONT_HELVETICA_BOLD</para>
  258. </listitem>
  259. <listitem>
  260. <para>Zend_Pdf_Const::FONT_HELVETICA_ITALIC</para>
  261. </listitem>
  262. <listitem>
  263. <para>Zend_Pdf_Const::FONT_HELVETICA_BOLDITALIC</para>
  264. </listitem>
  265. <listitem>
  266. <para>Zend_Pdf_Const::FONT_COURIER</para>
  267. </listitem>
  268. <listitem>
  269. <para>Zend_Pdf_Const::FONT_COURIER_BOLD</para>
  270. </listitem>
  271. <listitem>
  272. <para>Zend_Pdf_Const::FONT_COURIER_ITALIC</para>
  273. </listitem>
  274. <listitem>
  275. <para>Zend_Pdf_Const::FONT_COURIER_BOLDITALIC</para>
  276. </listitem>
  277. <listitem>
  278. <para>Zend_Pdf_Const::FONT_SYMBOL</para>
  279. </listitem>
  280. <listitem>
  281. <para>Zend_Pdf_Const::FONT_ZAPFDINGBATS</para>
  282. </listitem>
  283. </itemizedlist>
  284. </para>
  285. </sect2>
  286. <sect2 id="zend.pdf.drawing.image-drawing">
  287. <title>Рисование изображений<!-- Image Drawing. --></title>
  288. <para>
  289. Класс предоставляет метод <code>drawImage()</code> для рисования изображений.
  290. <!--
  291. <code>Zend_Pdf_Page</code> class provides drawImage() method to draw image:
  292. -->
  293. </para>
  294. <programlisting language="php"><![CDATA[<?php
  295. /**
  296. * Рисует изображение в заданной позиции на странице.
  297. *
  298. * @param Zend_Pdf_Resource_Image $image
  299. * @param float $x1
  300. * @param float $y1
  301. * @param float $x2
  302. * @param float $y2
  303. */
  304. public function drawImage(Zend_Pdf_Resource_Image $image, $x1, $y1, $x2, $y2);]]>
  305. </programlisting>
  306. <para>
  307. Объекты изображений должны создаваться через метод
  308. <code>Zend_Pdf_Image::imageWithPath($filePath)</code>
  309. (сейчас поддерживаются изображения JPG, PNG и TIFF):
  310. <!--
  311. Image objects should be created with <code>Zend_Pdf_Image::imageWithPath($filePath)</code> method
  312. (JPG, PNG and TIFF images are supported now):
  313. -->
  314. </para>
  315. <example>
  316. <title>Рисование изображения<!-- Image drawing.--></title>
  317. <programlisting language="php"><![CDATA[<?php
  318. ...
  319. // Загрузка изображения
  320. $image = Zend_Pdf_Image::imageWithPath('my_image.jpg');
  321. $pdfPage->drawImage($image, 100, 100, 400, 300);
  322. ...
  323. ?>]]>
  324. </programlisting>
  325. </example>
  326. <para>
  327. <emphasis>Важно! Для поддержки JPEG необходимо сконфигурировать
  328. расширение GD.</emphasis>
  329. <emphasis>Важно! Для поддержки PNG необходимо сконфигурировать
  330. расширение ZLIB для работы с изображениями с Альфа-каналом.</emphasis>
  331. <!--
  332. <emphasis>Important! JPEG support requires PHP GD extension to be configured.</emphasis>
  333. <emphasis>Important! PNG support requires ZLIB extension to be configured to work with Alpha channel images.</emphasis>
  334. -->
  335. </para>
  336. <para>
  337. См. документацию PHP за более подробной информацией
  338. (<ulink url="http://www.php.net/manual/en/ref.image.php">http://www.php.net/manual/en/ref.image.php</ulink>).
  339. (<ulink url="http://www.php.net/manual/en/ref.zlib.php">http://www.php.net/manual/en/ref.zlib.php</ulink>).
  340. <!--
  341. Refer to the PHP documentation for detailed information
  342. (<ulink url="http://www.php.net/manual/en/ref.image.php">http://www.php.net/manual/en/ref.image.php</ulink>).
  343. (<ulink url="http://www.php.net/manual/en/ref.zlib.php">http://www.php.net/manual/en/ref.zlib.php</ulink>).
  344. -->
  345. </para>
  346. </sect2>
  347. <sect2 id="zend.pdf.drawing.line-drawing-style">
  348. <title>Стили рисования линий<!-- Line drawing style.--></title>
  349. <para>
  350. Стили рисования линий определяются толщиной линии, цветом линии и шаблоном
  351. пунктира. Все эти параметры могут быть определены методами класса
  352. <code>Zend_Pdf_Page</code>.
  353. <!--
  354. Line drawing style is defined by line width, line color and line dashing pattern.
  355. All of this parameters can be assigned by <code>Zend_Pdf_Page</code>
  356. class methods:
  357. -->
  358. </para>
  359. <programlisting language="php"><![CDATA[<?php
  360. /** Установка цвета линии. */
  361. public function setLineColor(Zend_Pdf_Color $color);
  362. /** Установка толщины линии. */
  363. public function setLineWidth(float $width);
  364. /**
  365. * Установка шаблона пунктира.
  366. *
  367. * $pattern (шаблон) является массивом чисел с плавающей точкой:
  368. * array(on_length, off_length, on_length, off_length, ...)
  369. * $phase (фаза) является сдвигом от начала линии.
  370. *
  371. * @param array $pattern
  372. * @param array $phase
  373. */
  374. public function setLineDashingPattern($pattern, $phase = 0);]]>
  375. </programlisting>
  376. </sect2>
  377. <sect2 id="zend.pdf.drawing.fill-style">
  378. <title>Стиль заполнения<!-- Fill style.--></title>
  379. <para>
  380. Методы <code>Zend_Pdf_Page::drawRectangle()</code>, <code>Zend_Pdf_Page::drawPoligon()</code>,
  381. <code>Zend_Pdf_Page::drawCircle()</code> и <code>Zend_Pdf_Page::drawEllipse()</code>
  382. принимают аргумент <varname>$fillType</varname> как необязательный параметр.
  383. Это может быть:
  384. <!--
  385. <code>Zend_Pdf_Page::drawRectangle()</code>, <code>Zend_Pdf_Page::drawPoligon()</code>,
  386. <code>Zend_Pdf_Page::drawCircle()</code> and <code>Zend_Pdf_Page::drawEllipse()</code> methods take
  387. <varname>$fillType</varname> argument as an optional parameter. It can be:
  388. -->
  389. </para>
  390. <itemizedlist>
  391. <listitem>
  392. <para>
  393. Zend_Pdf_Const::SHAPEDRAW_STROKE - штрихует фигуру <!-- stroke shape -->
  394. </para>
  395. </listitem>
  396. <listitem>
  397. <para>
  398. Zend_Pdf_Const::SHAPEDRAW_FILL - заполняет фигуру <!-- only fill shape-->
  399. </para>
  400. </listitem>
  401. <listitem>
  402. <para>
  403. Zend_Pdf_Const::SHAPEDRAW_FILLNSTROKE - заполняет и штрихует (поведение по умолчанию)
  404. <!-- fill and stroke (default behavior)-->
  405. </para>
  406. </listitem>
  407. </itemizedlist>
  408. <para>
  409. Метод <code>Zend_Pdf_Page::drawPoligon()</code> принимает дополнительный
  410. параметр <varname>$fillMethod</varname>:
  411. <!--
  412. <code>Zend_Pdf_Page::drawPoligon()</code> methods also takes an additional parameter
  413. <varname>$fillMethod</varname>:
  414. -->
  415. </para>
  416. <itemizedlist>
  417. <listitem>
  418. <para>
  419. Zend_Pdf_Const::FILLMETHOD_NONZEROWINDING (поведение по умолчанию)
  420. <!-- (default behavior)-->
  421. </para>
  422. <para>
  423. <citetitle>Справка по PDF</citetitle> описывает это правило
  424. следующим образом:
  425. <blockquote>
  426. <para>
  427. Правило ненулевого количества витков определяет, находится ли
  428. данная точка внутри траектории путем мысленного
  429. проведения луча из этой точки в бесконечность в любом направлении
  430. и последующего определения мест, где участок траектории пересекает луч.
  431. Начиная отсчет с нуля, правило добавляет 1 каждый раз, когда
  432. участок траектории пересекает луч слева направо и отнимает 1
  433. каждый раз, когда участок траектории пересекает участок справа налево.
  434. Если после подсчета всех пересечений результатом будет 0, то точка
  435. находится вне траектории, иначе — внутри траектории.
  436. Примечание: Метод не указывает, что делать, если участок траектории
  437. совпадает или является касательной к выбранному лучу. Поскольку
  438. направление луча является произвольным, правило просто выбирает
  439. луч, который не создает таких пересечений. Для простых выпуклых
  440. траекторий правило ненулевого количества витков определяет
  441. внутреннюю и внешнюю части так, как это интуитивно предполагается.
  442. Более интересными случаями являются те, которые включают в себя
  443. сложные или самопересекающиеся траектории, как, например,
  444. на Рис. 4.10 (в справке по PDF).
  445. Для траектории, представляющую собой пятиконечную звезду,
  446. состоящую из пяти соединенных отрезков, правило считает внутренней
  447. частью всю площадь, окруженную звездой, включая пятиугольник в
  448. центре. Для траектории, состоящей из двух концентрических
  449. окружностей, площадь, окруженная обеими окружностями,
  450. считается внутренней в том случае, если обе окружности нарисованы
  451. в одном и том же направлении. Если окружности нарисованы в противоположных
  452. направлениях, то, согласно правилу, только фигура в виде
  453. баранки между ними будет внутренней частью, "дырка"
  454. будет внешней частью.
  455. </para>
  456. </blockquote>
  457. <!--
  458. <citetitle>PDF reference</citetitle> describes this rule as follows:
  459. <blockquote>
  460. The nonzero winding number rule determines whether a given point is inside a
  461. path by conceptually drawing a ray from that point to infinity in any direction
  462. and then examining the places where a segment of the path crosses the ray. Starting
  463. with a count of 0, the rule adds 1 each time a path segment crosses the ray
  464. from left to right and subtracts 1 each time a segment crosses from right to left.
  465. After counting all the crossings, if the result is 0 then the point is outside the path;
  466. otherwise it is inside.
  467. Note: The method just described does not specify what to do if a path segment coincides
  468. with or is tangent to the chosen ray. Since the direction of the ray is arbitrary,
  469. the rule simply chooses a ray that does not encounter such problem intersections.
  470. For simple convex paths, the nonzero winding number rule defines the inside
  471. and outside as one would intuitively expect. The more interesting cases are those
  472. involving complex or self-intersecting paths like the ones shown in Figure 4.10
  473. (in a PDF Reference).
  474. For a path consisting of a five-pointed star, drawn with five connected straight
  475. line segments intersecting each other, the rule considers the inside to be the entire
  476. area enclosed by the star, including the pentagon in the center. For a path composed
  477. of two concentric circles, the areas enclosed by both circles are considered
  478. to be inside, provided that both are drawn in the same direction. If the circles are
  479. drawn in opposite directions, only the "doughnut" shape between them is inside,
  480. according to the rule; the "doughnut hole" is outside.
  481. </blockquote>
  482. -->
  483. </para>
  484. </listitem>
  485. <listitem>
  486. <para>Zend_Pdf_Const::FILLMETHOD_EVENODD</para>
  487. <para>
  488. <citetitle>Справка по PDF</citetitle> описывает это правило
  489. следующим образом:
  490. <blockquote>
  491. <para>
  492. Альтернативой правилу ненулевого количества витков является правило
  493. чета-нечета. Это правило определяет нахождение точки
  494. проведением луча из этой точки в любом направлении и простым подсчетом
  495. количества пересечений частей траектории с этим лучом, независимо от
  496. направления пересечения. Если число нечетное, то точка находится
  497. во внутренней части; если четное, то точка находится снаружи. Это
  498. правило дает такой же результат, как и правило ненулевого
  499. количества витков для траекторий с простыми фигурами, но дает
  500. разные результаты в случае более сложных фигур.
  501. Рис. 4.11 (в справке по PDF) показывает результаты применения
  502. правила чета-нечета к сложным фигурам. В случае пятиконечной
  503. звезды правило считает точки треугольников находящимися
  504. внутри траектории, но не пятиугольник в центре. Для двух
  505. концентрических окружностей только фигура в виде баранки будет
  506. считаться внутренней частью, независимо от направлений, в которых
  507. нарисованы окружности.
  508. </para>
  509. </blockquote>
  510. <!--
  511. <citetitle>PDF reference</citetitle> describes this rule as follows:
  512. <blockquote>
  513. An alternative to the nonzero winding number rule is the even-odd rule. This rule
  514. determines the "insideness" of a point by drawing a ray from that point in any
  515. direction and simply counting the number of path segments that cross the ray,
  516. regardless of direction. If this number is odd, the point is inside; if even, the point
  517. is outside. This yields the same results as the nonzero winding number rule for
  518. paths with simple shapes, but produces different results for more complex
  519. shapes.
  520. Figure 4.11 (in a PDF Reference) shows the effects of applying the even-odd rule
  521. to complex paths. For the five-pointed star, the rule considers the triangular
  522. points to be inside the path, but not the pentagon in the center. For the two
  523. concentric circles, only the "doughnut" shape between the two circles is considered inside,
  524. regardless of the directions in which the circles are drawn.
  525. </blockquote>
  526. -->
  527. </para>
  528. </listitem>
  529. </itemizedlist>
  530. </sect2>
  531. <sect2 id="zend.pdf.drawing.rotations">
  532. <title>Поворот<!-- Rotations. --></title>
  533. <para>
  534. Страница PDF может быть повернута перед применением любых операций рисования.
  535. Это может быть сделано методом <code>Zend_Pdf_Page::rotate()</code>:
  536. <!--
  537. PDF page can be rotated before applying any draw operation.
  538. It can be done by <code>Zend_Pdf_Page::rotate()</code> method:
  539. -->
  540. </para>
  541. <programlisting language="php"><![CDATA[<?php
  542. /**
  543. * Поворачивает страницу вокруг точки ($x, $y) на заданный угол (в радианах).
  544. *
  545. * @param float $angle
  546. */
  547. public function rotate($x, $y, $angle);]]>
  548. </programlisting>
  549. </sect2>
  550. <sect2 id="zend.pdf.drawing.save-restore">
  551. <title>Сохранение/восстановление графического состояния<!-- Save/restore graphics state.--></title>
  552. <para>
  553. В любое время графическое состояние страницы (текущий шрифт, размер шрифта,
  554. цвет линии, цвет заполнения, стиль линии, поворот страницы, область ограничения) может
  555. быть сохранено и после восстановлено. Операция сохранения сохраняет данные
  556. в стек графического состояния, операция восстановления извлекает данные из стека.
  557. <!--
  558. At any time page graphics state (current font, font size, line color, fill color,
  559. line style, page rotation, clip area) can be saved and then restored. Save operation puts
  560. data to a graphics state stack, restore operation retrieves it from there.
  561. -->
  562. </para>
  563. <para>
  564. Методы в классе <code>Zend_Pdf_Page</code> для этих операций:
  565. <!--
  566. There are to methods in <code>Zend_Pdf_Page</code> class for these operations:
  567. -->
  568. </para>
  569. <programlisting language="php"><![CDATA[<?php
  570. /**
  571. * Сохраняет графическое состояние данной страницы.
  572. * Выполняет снимок используемых на данный момент стилей, положений, ... и всех
  573. * поворотов/преобразований/масштабирований которые были применены.
  574. * This takes a snapshot of the currently applied style, position, clipping area and
  575. * any rotation/translation/scaling that has been applied.
  576. */
  577. public function saveGS();
  578. /**
  579. * Восстанавливает графическое состояние, которое было сохранено последним
  580. * вызовом saveGS().
  581. */
  582. public function restoreGS();]]>
  583. </programlisting>
  584. </sect2>
  585. <sect2 id="zend.pdf.drawing.clipping">
  586. <title>Ограничение области рисования<!-- Clipping draw area. --></title>
  587. <para>
  588. PDF и модуль Zend_Pdf поддерживают ограничение области рисования.
  589. Ограничение определяет область страницы, затрагиваемой
  590. операциями рисования. Вначале эта область представляет собой всю
  591. страницу.
  592. <!--
  593. PDF and Zend_Pdf module support clipping of draw area.
  594. Current clip area limits the regions of the page affected by painting operators. It's a whole page initially.
  595. -->
  596. </para>
  597. <para>
  598. Класс <code>Zend_Pdf_Page</code> предоставляет набор методов для операций ограничения.
  599. <!--
  600. <code>Zend_Pdf_Page</code> class provides a set of methods for clipping operations.
  601. -->
  602. </para>
  603. <programlisting language="php"><![CDATA[<?php
  604. /**
  605. * Делит текущую площадь ограничения с помощью прямоугольника.
  606. *
  607. * @param float $x1
  608. * @param float $y1
  609. * @param float $x2
  610. * @param float $y2
  611. */
  612. public function clipRectangle($x1, $y1, $x2, $y2);]]>
  613. </programlisting>
  614. <programlisting language="php"><![CDATA[<?php
  615. /**
  616. * Делит текущую площадь ограничения с помощью многоугольника.
  617. *
  618. * @param array $x - массив чисел с плавающей точкой (X-координаты верхушек)
  619. * @param array $y - массив чисел с плавающей точкой (Y-координаты верхушек)
  620. * @param integer $fillMethod
  621. */
  622. public function clipPolygon($x, $y, $fillMethod = Zend_Pdf_Const::FILLMETHOD_NONZEROWINDING);]]>
  623. </programlisting>
  624. <programlisting language="php"><![CDATA[<?php
  625. /**
  626. * Делит текущую площадь ограничения с помощью окружности.
  627. *
  628. * @param float $x
  629. * @param float $y
  630. * @param float $radius
  631. * @param float $startAngle
  632. * @param float $endAngle
  633. */
  634. public function clipCircle($x, $y, $radius, $startAngle = null, $endAngle = null);]]>
  635. </programlisting>
  636. <programlisting language="php"><![CDATA[<?php
  637. /**
  638. * Делит текущую площадь ограничения с помощью эллипса.
  639. *
  640. * Сигнатуры метода:
  641. * drawEllipse($x1, $y1, $x2, $y2);
  642. * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
  643. *
  644. * @todo обрабатывать случаи, когда $x2-$x1 == 0 или $y2-$y1 == 0
  645. *
  646. * @param float $x1
  647. * @param float $y1
  648. * @param float $x2
  649. * @param float $y2
  650. * @param float $startAngle
  651. * @param float $endAngle
  652. */
  653. public function clipEllipse($x1, $y1, $x2, $y2, $startAngle = null, $endAngle = null);]]>
  654. </programlisting>
  655. </sect2>
  656. <sect2 id="zend.pdf.drawing.styles">
  657. <title>Стили<!-- Styles. --></title>
  658. <para>
  659. Класс <code>Zend_Pdf_Style</code> предоставляет набор функциональных
  660. возможностей для работы со стилями.
  661. <!--
  662. <code>Zend_Pdf_Style</code> class provides styles functionality.
  663. -->
  664. </para>
  665. <para>
  666. Стили могут использоваться для сохранения набора параметров графического
  667. состояния и применять их к странице PDF одной операцией:
  668. <!--
  669. Styles can be used to store a set of graphic state parameters and apply it to a PDF page by one operation:
  670. -->
  671. </para>
  672. <programlisting language="php"><![CDATA[<?php
  673. /**
  674. * Установить стиль для будущих операций рисования на данной странице
  675. *
  676. * @param Zend_Pdf_Style $style
  677. */
  678. public function setStyle(Zend_Pdf_Style $style);
  679. /**
  680. * Возвращает стили, используемые на странице
  681. *
  682. * @return Zend_Pdf_Style|null
  683. */
  684. public function getStyle();]]>
  685. </programlisting>
  686. <para>
  687. Класс <code>Zend_Pdf_Style</code> предоставляет набор методов для установки
  688. или получения различных параметров графического состояния:
  689. <!--
  690. <code>Zend_Pdf_Style</code> class provides a set of methods to set or get different graphics state parameters:
  691. -->
  692. </para>
  693. <programlisting language="php"><![CDATA[<?php
  694. /**
  695. * Устанавливает цвет линии.
  696. *
  697. * @param Zend_Pdf_Color $color
  698. */
  699. public function setLineColor(Zend_Pdf_Color $color);]]>
  700. </programlisting>
  701. <programlisting language="php"><![CDATA[<?php
  702. /**
  703. * Возвращает цвет линии.
  704. *
  705. * @return Zend_Pdf_Color|null
  706. */
  707. public function getLineColor();]]>
  708. </programlisting>
  709. <programlisting language="php"><![CDATA[<?php
  710. /**
  711. * Устанавливает толщину линии.
  712. *
  713. * @param float $width
  714. */
  715. public function setLineWidth($width);]]>
  716. </programlisting>
  717. <programlisting language="php"><![CDATA[<?php
  718. /**
  719. * Возвращает толщину линии.
  720. *
  721. * @return float
  722. */
  723. public function getLineWidth();]]>
  724. </programlisting>
  725. <programlisting language="php"><![CDATA[<?php
  726. /**
  727. * Устанавливает шаблон пунктира.
  728. *
  729. * @param array $pattern
  730. * @param float $phase
  731. */
  732. public function setLineDashingPattern($pattern, $phase = 0);]]>
  733. </programlisting>
  734. <programlisting language="php"><![CDATA[<?php
  735. /**
  736. * Возвращает шаблон пунктира.
  737. *
  738. * @return array
  739. */
  740. public function getLineDashingPattern();]]>
  741. </programlisting>
  742. <programlisting language="php"><![CDATA[<?php
  743. /**
  744. * Возвращает фазу пунктира.
  745. *
  746. * @return float
  747. */
  748. public function getLineDashingPhase();]]>
  749. </programlisting>
  750. <programlisting language="php"><![CDATA[<?php
  751. /**
  752. * Устанавливает цвет заполнения.
  753. *
  754. * @param Zend_Pdf_Color $color
  755. */
  756. public function setFillColor(Zend_Pdf_Color $color);]]>
  757. </programlisting>
  758. <programlisting language="php"><![CDATA[<?php
  759. /**
  760. * Возвращает цвет заполнения.
  761. *
  762. * @return Zend_Pdf_Color|null
  763. */
  764. public function getFillColor();]]>
  765. </programlisting>
  766. <programlisting language="php"><![CDATA[<?php
  767. /**
  768. * Устанавливает текущий шрифт.
  769. *
  770. * @param Zend_Pdf_Font $font
  771. * @param float $fontSize
  772. */
  773. public function setFont(Zend_Pdf_Font $font, $fontSize);]]>
  774. </programlisting>
  775. <programlisting language="php"><![CDATA[<?php
  776. /**
  777. * Изменяет текущий размер шрифта
  778. *
  779. * @param float $fontSize
  780. */
  781. public function setFontSize($fontSize);]]>
  782. </programlisting>
  783. <programlisting language="php"><![CDATA[<?php
  784. /**
  785. * Возвращает текущий шрифт.
  786. *
  787. * @return Zend_Pdf_Font $font
  788. */
  789. public function getFont();]]>
  790. </programlisting>
  791. <programlisting language="php"><![CDATA[<?php
  792. /**
  793. * Возвращает текущий размер шрифта.
  794. *
  795. * @return float $fontSize
  796. */
  797. public function getFontSize();]]>
  798. </programlisting>
  799. </sect2>
  800. </sect1>
  801. <!--
  802. vim:se ts=4 sw=4 et:
  803. -->