Zend_Pdf-Drawing.xml 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785
  1. <sect1 id="zend.pdf.drawing">
  2. <title>Drawing.</title>
  3. <sect2 id="zend.pdf.drawing.geometry">
  4. <title>Geometria.</title>
  5. <para>
  6. O formato de arquivo PDF usa a mesma geometria do PostScript. A geometria começa no canto inferior esquerdo da página
  7. e, por padrão, é medida em pontos (1/72 polegada).
  8. </para>
  9. <para>
  10. O tamanho da página pode ser recuperado de um objeto página:
  11. </para>
  12. <para>
  13. <programlisting role="php"><![CDATA[<?php
  14. $width = $pdfPage->getWidth();
  15. $height = $pdfPage->getHeight();]]>
  16. </programlisting>
  17. </para>
  18. </sect2>
  19. <sect2 id="zend.pdf.drawing.color">
  20. <title>Colors.</title>
  21. <para>
  22. O PDF possui uma poderosa capacidade para a representação de cores. O módulo Zend_Pdf dá suporte à Escala de Cinza,
  23. RGB e CMYK. Qualquer um deles pode ser usado em qualquer lugar onde um <code>Zend_Pdf_Color</code> for requisitado.
  24. As classes <code>Zend_Pdf_Color_GrayScale</code>, <code>Zend_Pdf_Color_Rgb</code> e
  25. <code>Zend_Pdf_Color_Cmyk</code> fornecem a seguinte funcionalidade:
  26. </para>
  27. <programlisting role="php"><![CDATA[<?php
  28. // $grayLevel (float number). 0.0 (black) - 1.0 (white)
  29. $color1 = new Zend_Pdf_Color_GrayScale($grayLevel);
  30. // $r, $g, $b (float numbers). 0.0 (minimum intensity) - 1.0 (maximum intensity)
  31. $color2 = new Zend_Pdf_Color_Rgb($r, $g, $b);
  32. // $c, $m, $y, $k (float numbers). 0.0 (minimum intensity) - 1.0 (maximum intensity)
  33. $color3 = new Zend_Pdf_Color_Cmyk($c, $m, $y, $k);]]>
  34. </programlisting>
  35. <para>
  36. O estilo de cores do HTML também são fornecidos na classe <code>Zend_Pdf_Color_Html</code>:
  37. </para>
  38. <programlisting role="php"><![CDATA[<?php
  39. $color1 = new Zend_Pdf_Color_Html('#3366FF');
  40. $color2 = new Zend_Pdf_Color_Html('silver');
  41. $color3 = new Zend_Pdf_Color_Html('forestgreen');]]>
  42. </programlisting>
  43. </sect2>
  44. <sect2 id="zend.pdf.drawing.shape-drawing">
  45. <title>Desenhando Formas.</title>
  46. <para>
  47. Todas as operações de desenho podem ser feitas no contexto de uma página PDF.
  48. </para>
  49. <para>
  50. A classe <code>Zend_Pdf_Page</code> provê um conjunto de formas básicas para desenho:
  51. </para>
  52. <programlisting role="php"><![CDATA[<?php
  53. /**
  54. * Draw a line from x1,y1 to x2,y2.
  55. *
  56. * @param float $x1
  57. * @param float $y1
  58. * @param float $x2
  59. * @param float $y2
  60. */
  61. public function drawLine($x1, $y1, $x2, $y2);]]>
  62. </programlisting>
  63. <programlisting role="php"><![CDATA[<?php
  64. /**
  65. * Draw a rectangle.
  66. *
  67. * Fill types:
  68. * Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - fill rectangle and stroke (default)
  69. * Zend_Pdf_Page::SHAPE_DRAW_STROKE - stroke rectangle
  70. * Zend_Pdf_Page::SHAPE_DRAW_FILL - fill rectangle
  71. *
  72. * @param float $x1
  73. * @param float $y1
  74. * @param float $x2
  75. * @param float $y2
  76. * @param integer $fillType
  77. */
  78. public function drawRectangle($x1, $y1, $x2, $y2, $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);]]>
  79. </programlisting>
  80. <programlisting role="php"><![CDATA[<?php
  81. /**
  82. * Draw a polygon.
  83. *
  84. * If $fillType is Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE or Zend_Pdf_Page::SHAPE_DRAW_FILL,
  85. * then polygon is automatically closed.
  86. * See detailed description of these methods in a PDF documentation
  87. * (section 4.4.2 Path painting Operators, Filling)
  88. *
  89. * @param array $x - array of float (the X co-ordinates of the vertices)
  90. * @param array $y - array of float (the Y co-ordinates of the vertices)
  91. * @param integer $fillType
  92. * @param integer $fillMethod
  93. */
  94. public function drawPolygon($x, $y,
  95. $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE,
  96. $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);]]>
  97. </programlisting>
  98. <programlisting role="php"><![CDATA[<?php
  99. /**
  100. * Draw a circle centered on x, y with a radius of radius.
  101. *
  102. * Angles are specified in radians
  103. *
  104. * Method signatures:
  105. * drawCircle($x, $y, $radius);
  106. * drawCircle($x, $y, $radius, $fillType);
  107. * drawCircle($x, $y, $radius, $startAngle, $endAngle);
  108. * drawCircle($x, $y, $radius, $startAngle, $endAngle, $fillType);
  109. *
  110. *
  111. * It's not a really circle, because PDF supports only cubic Bezier curves.
  112. * But very good approximation.
  113. * It differs from a real circle on a maximum 0.00026 radiuses
  114. * (at PI/8, 3*PI/8, 5*PI/8, 7*PI/8, 9*PI/8, 11*PI/8, 13*PI/8 and 15*PI/8 angles).
  115. * At 0, PI/4, PI/2, 3*PI/4, PI, 5*PI/4, 3*PI/2 and 7*PI/4 it's exactly a tangent to a circle.
  116. *
  117. * @param float $x
  118. * @param float $y
  119. * @param float $radius
  120. * @param mixed $param4
  121. * @param mixed $param5
  122. * @param mixed $param6
  123. */
  124. public function drawCircle($x, $y, $radius, $param4 = null, $param5 = null, $param6 = null);]]>
  125. </programlisting>
  126. <programlisting role="php"><![CDATA[<?php
  127. /**
  128. * Draw an ellipse inside the specified rectangle.
  129. *
  130. * Method signatures:
  131. * drawEllipse($x1, $y1, $x2, $y2);
  132. * drawEllipse($x1, $y1, $x2, $y2, $fillType);
  133. * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
  134. * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle, $fillType);
  135. *
  136. * Angles are specified in radians
  137. *
  138. * @param float $x1
  139. * @param float $y1
  140. * @param float $x2
  141. * @param float $y2
  142. * @param mixed $param5
  143. * @param mixed $param6
  144. * @param mixed $param7
  145. */
  146. public function drawEllipse($x1, $y1, $x2, $y2, $param5 = null, $param6 = null, $param7 = null);]]>
  147. </programlisting>
  148. </sect2>
  149. <sect2 id="zend.pdf.drawing.text-drawing">
  150. <title>Desenhando Texto.</title>
  151. <para>
  152. As operações de desenho de texto também existem no contexto de uma página PDF. Você pode desenhar uma linha de texto em
  153. qualquer posição da página ao fornecer as coordenadas x e y. A fonte e o tamanho da fonte atuais são usadaos para a
  154. operação de desenho (veja a descrição detalhada abaixo).
  155. </para>
  156. <programlisting role="php"><![CDATA[<?php
  157. /**
  158. * Draw a line of text at the specified position.
  159. *
  160. * @param string $text
  161. * @param float $x
  162. * @param float $y
  163. * @param string $charEncoding (optional) Character encoding of source text.
  164. * Defaults to current locale.
  165. * @throws Zend_Pdf_Exception
  166. */
  167. public function drawText($text, $x, $y, $charEncoding = '');]]>
  168. </programlisting>
  169. <example id="zend.pdf.drawing.text-drawing.example-1">
  170. <title>Desenhar um texo na página.</title>
  171. <programlisting role="php"><![CDATA[<?php
  172. ...
  173. $pdfPage->drawText('Hello world!', 72, 720);
  174. ...]]>
  175. </programlisting>
  176. </example>
  177. <para>
  178. Por padrão, as strings de texto são interpretadas usando o método de decodificação e caracteres local. Se você tiver
  179. uma string que use um método de codificação diferente (como uma string UTF-8 sendo lida de um arquivo no disco,
  180. ou uma string MacRoman obtida de um bando de dados legado), você pode a codificação na hora de desenhar e a Zend_Pdf
  181. irá tratar a comunicação para você. Você pode fornecer as strings em qualquer método de codificação suportada pela função <code><ulink url="http://www.php.net/manual/function.iconv.php">iconv()</ulink></code> do PHP:
  182. </para>
  183. <example id="zend.pdf.drawing.text-drawing.example-2">
  184. <title>Desenhar uma string codificada em UTF-8 em uma página.</title>
  185. <programlisting role="php"><![CDATA[<?php
  186. ...
  187. // Read a UTF-8-encoded string from disk
  188. $unicodeString = fread($fp, 1024);
  189. // Draw the string on the page
  190. $pdfPage->drawText($unicodeString, 72, 720, 'UTF-8');
  191. ...]]>
  192. </programlisting>
  193. </example>
  194. </sect2>
  195. <sect2 id="zend.pdf.drawing.using-fonts">
  196. <title>Using fonts.</title>
  197. <para>
  198. O método <code>Zend_Pdf_Page::drawText()</code> usa a fonte atual da página, que é configurada através do
  199. método <code>Zend_Pdf_Page::setFont()</code>:
  200. </para>
  201. <programlisting role="php"><![CDATA[<?php
  202. /**
  203. * Set current font.
  204. *
  205. * @param Zend_Pdf_Resource_Font $font
  206. * @param float $fontSize
  207. */
  208. public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);]]>
  209. </programlisting>
  210. <para>
  211. Documentos PDF suportam as fontes PostScript Type 1 e TrueType, assim como dois tipos especiais do PDF types,
  212. o Type 3 e as fontes compostas. Existem também 14 fontes padrão Type 1 inclusas em todos os visualizadores de PDF:
  213. Courier (4 estilos), Helvetica (4 estilos), Times (4 estilos), Symbol, e Zapf Dingbats.
  214. </para>
  215. <para>
  216. Zend_Pdf atualmente dá suporte às 14 fontes PDF padrão, assim como às suas fontes personalizadas TrueType.
  217. Objetos do tipo Font são obtidos via um dos dois métodos fábrica(factory):
  218. <code>Zend_Pdf_Font::fontWithName($fontName)</code> para as 14 fontes padrão ou
  219. <code>end_Pdf_Font::fontWithPath($filePath)</code> para fontes personalizadas.
  220. </para>
  221. <example id="zend.pdf.drawing.using-fonts.example-1">
  222. <title>Criar uma fonte padrão.</title>
  223. <programlisting role="php"><![CDATA[<?php
  224. ...
  225. // Create new font
  226. $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
  227. // Apply font
  228. $pdfPage->setFont($font, 36);
  229. ...]]>
  230. </programlisting>
  231. </example>
  232. <para>
  233. As constantes para as 14 fontes PDF padrão são definidas na classe <code>Zend_Pdf_Font</code>:
  234. <itemizedlist>
  235. <listitem>
  236. <para>Zend_Pdf_Font::FONT_COURIER</para>
  237. </listitem>
  238. <listitem>
  239. <para>Zend_Pdf_Font::FONT_COURIER_BOLD</para>
  240. </listitem>
  241. <listitem>
  242. <para>Zend_Pdf_Font::FONT_COURIER_ITALIC</para>
  243. </listitem>
  244. <listitem>
  245. <para>Zend_Pdf_Font::FONT_COURIER_BOLD_ITALIC</para>
  246. </listitem>
  247. <listitem>
  248. <para>Zend_Pdf_Font::FONT_TIMES</para>
  249. </listitem>
  250. <listitem>
  251. <para>Zend_Pdf_Font::FONT_TIMES_BOLD</para>
  252. </listitem>
  253. <listitem>
  254. <para>Zend_Pdf_Font::FONT_TIMES_ITALIC</para>
  255. </listitem>
  256. <listitem>
  257. <para>Zend_Pdf_Font::FONT_TIMES_BOLD_ITALIC</para>
  258. </listitem>
  259. <listitem>
  260. <para>Zend_Pdf_Font::FONT_HELVETICA</para>
  261. </listitem>
  262. <listitem>
  263. <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD</para>
  264. </listitem>
  265. <listitem>
  266. <para>Zend_Pdf_Font::FONT_HELVETICA_ITALIC</para>
  267. </listitem>
  268. <listitem>
  269. <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD_ITALIC</para>
  270. </listitem>
  271. <listitem>
  272. <para>Zend_Pdf_Font::FONT_SYMBOL</para>
  273. </listitem>
  274. <listitem>
  275. <para>Zend_Pdf_Font::FONT_ZAPFDINGBATS</para>
  276. </listitem>
  277. </itemizedlist>
  278. </para>
  279. <para>
  280. Você também pode usar qualquer fonte individual TrueType font (que normalmente possui a extensão '.ttf') ou uma fonte
  281. OpenType (de extansão '.otf') se ela contiver o mesmo contorno das TrueType. Atualmente sem suporte, mas planejadas
  282. para um lancçamento futuro são os arquivos do Mac OS X .dfont e os Microsoft TrueType Collection
  283. (extensão '.ttc' ).
  284. </para>
  285. <para>
  286. Para usar uma fonte TrueType, você deve fornecer o caminho completo para a fonte. Se a fonte não puder ser lida por algum
  287. motivo, ou se ela não for uma fonte, a o método fábrica irá lanãr uma exceção:
  288. </para>
  289. <example id="zend.pdf.drawing.using-fonts.example-2">
  290. <title>Criar uma fonte TrueType.</title>
  291. <programlisting role="php"><![CDATA[<?php
  292. ...
  293. // Create new font
  294. $goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/path/to/GOODDC__.TTF');
  295. // Apply font
  296. $pdfPage->setFont($goodDogCoolFont, 36);
  297. ...]]>
  298. </programlisting>
  299. </example>
  300. <para>
  301. Por padrão, fontes personalizadas serão embarcadas no documento PDF resultante. Isso permite que as
  302. pessoas que receberem o arquivo poderão visualiza-lo corretamente, mesmo que não possuam as fontes apropriadas
  303. instaladas em seus sistemas. Se você estiver preocupado com o tamanho do arquivo você pode solicitar que a fonte não
  304. seja incluída através de uma opção 'não embarque' do método fábrica:
  305. </para>
  306. <example id="zend.pdf.drawing.using-fonts.example-3">
  307. <title>Criar uma fonte TrueType, mas não embarca-la no documento PDF.</title>
  308. <programlisting role="php"><![CDATA[<?php
  309. ...
  310. // Create new font
  311. $goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/path/to/GOODDC__.TTF',
  312. Zend_Pdf_Font::EMBED_DONT_EMBED);
  313. // Apply font
  314. $pdfPage->setFont($goodDogCoolFont, 36);
  315. ...]]>
  316. </programlisting>
  317. </example>
  318. <para>
  319. Se o programa da fonte não for embarcado, mas o recebedor do arquivo PDF tiver a fonte instalada em seu sistema
  320. ele irá ver o documento corretamente. Caso ele não possua a fonte correta instalada, o visualizador PDF fará o melhor
  321. para sintetizar uma substituição.
  322. </para>
  323. <para>
  324. Algumas fontes possuem regras de licença específicas que evitam que elas sejam embarcadas em documentos PDF.
  325. Então, para que você não seja pego de surpresa por isso, se você tentar usar uma fonte que não pode ser embarcada,
  326. o método fábrica irá lançar uma exceção.
  327. </para>
  328. <para>
  329. Você ainda pode usar estas fontes, mas deve passar a opção 'não embarque' como foi descrito acima,
  330. ou então você pode simplesmente suprimir a exceção:
  331. </para>
  332. <example id="zend.pdf.drawing.using-fonts.example-4">
  333. <title>Não lançar uma exceção para fontes que não podem ser embarcadas.</title>
  334. <programlisting role="php"><![CDATA[<?php
  335. ...
  336. $font = Zend_Pdf_Font::fontWithPath('/path/to/unEmbeddableFont.ttf',
  337. Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION);
  338. ...]]>
  339. </programlisting>
  340. </example>
  341. <para>
  342. Esta técnica de supressão é preferível se você permitir que o usuário final escolha sua própria fonte. Fontes
  343. que podem ser embarcadas no documento PDF vão ser; aquelas que não puderem, não serão.
  344. </para>
  345. <para>
  346. Programas de fonte podem ser um tanto grandes, alguns alcançam dezenas e megabytes. Por padrão todas as fontes
  347. embarcadas são comprimidas usando o esquema de compressão Flate, resultando, em média, em uma economia de espaço de
  348. 50%. Se, por alguma razão, você não quer comprimir o programa da fonte, você pode desabilitar isso através de uya opção:
  349. </para>
  350. <example id="zend.pdf.drawing.using-fonts.example-5">
  351. <title>Não comprimir uma fonte embarcada.</title>
  352. <programlisting role="php"><![CDATA[<?php
  353. ...
  354. $font = Zend_Pdf_Font::fontWithPath('/path/to/someReallyBigFont.ttf',
  355. Zend_Pdf_Font::EMBED_DONT_COMPRESS);
  356. ...]]>
  357. </programlisting>
  358. </example>
  359. <para>
  360. Finalmente, quando necessário, você pode combinar as opções de embarque usando o operador binário OR:
  361. </para>
  362. <example id="zend.pdf.drawing.using-fonts.example-6">
  363. <title>Combinando opções de embarque de fonte.</title>
  364. <programlisting role="php"><![CDATA[<?php
  365. ...
  366. $font = Zend_Pdf_Font::fontWithPath($someUserSelectedFontPath,
  367. (Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION |
  368. Zend_Pdf_Font::EMBED_DONT_COMPRESS));
  369. ...]]>
  370. </programlisting>
  371. </example>
  372. </sect2>
  373. <sect2 id="zend.pdf.drawing.image-drawing">
  374. <title>Desenhando Imagens.</title>
  375. <para>
  376. A classe <code>Zend_Pdf_Page</code> fornece o método drawImage() para o desenho de imagens:
  377. </para>
  378. <programlisting role="php"><![CDATA[<?php
  379. /**
  380. * Draw an image at the specified position on the page.
  381. *
  382. * @param Zend_Pdf_Resource_Image $image
  383. * @param float $x1
  384. * @param float $y1
  385. * @param float $x2
  386. * @param float $y2
  387. */
  388. public function drawImage(Zend_Pdf_Resource_Image $image, $x1, $y1, $x2, $y2);]]>
  389. </programlisting>
  390. <para>
  391. Objetos de imagem devem ser criaos com o método <code>Zend_Pdf_Image::imageWithPath($filePath)</code> (imagens JPG, PNG e
  392. TIFF são suportadas agora):
  393. </para>
  394. <example id="zend.pdf.drawing.image-drawing.example-1">
  395. <title>Desenhando imagens.</title>
  396. <programlisting role="php"><![CDATA[<?php
  397. ...
  398. // load image
  399. $image = Zend_Pdf_Image::imageWithPath('my_image.jpg');
  400. $pdfPage->drawImage($image, 100, 100, 400, 300);
  401. ...]]>
  402. </programlisting>
  403. </example>
  404. <para>
  405. <emphasis>Importante! O suporte a JPEG requer que a extensão PHP GD esteja configurada.</emphasis>
  406. <emphasis>Importante! O suporte a PNG requer que extensão ZLIB esteja configurada para trabalhar com
  407. imagens com canal Alpha.</emphasis>
  408. </para>
  409. <para>
  410. Consulte a documentação PHP informações detalhadas
  411. (<ulink url="http://www.php.net/manual/en/ref.image.php">http://www.php.net/manual/en/ref.image.php</ulink>).
  412. (<ulink url="http://www.php.net/manual/en/ref.zlib.php">http://www.php.net/manual/en/ref.zlib.php</ulink>).
  413. </para>
  414. </sect2>
  415. <sect2 id="zend.pdf.drawing.line-drawing-style">
  416. <title>Estilo de desenho de linhas.</title>
  417. <para>
  418. O desenho de linhas é definido pela largura, cor e padrão de traços.
  419. Todos estes parâmetros podem ser atribuídos pelos seguintes métodos da classe <code>Zend_Pdf_Page</code>:
  420. </para>
  421. <programlisting role="php"><![CDATA[<?php
  422. /** Set line color. */
  423. public function setLineColor(Zend_Pdf_Color $color);
  424. /** Set line width. */
  425. public function setLineWidth(float $width);
  426. /**
  427. * Set line dashing pattern.
  428. *
  429. * Pattern is an array of floats: array(on_length, off_length, on_length, off_length, ...)
  430. * Phase is shift from the beginning of line.
  431. *
  432. * @param array $pattern
  433. * @param array $phase
  434. */
  435. public function setLineDashingPattern($pattern, $phase = 0);]]>
  436. </programlisting>
  437. </sect2>
  438. <sect2 id="zend.pdf.drawing.fill-style">
  439. <title>Estilo de preenchimento.</title>
  440. <para>
  441. Os métodos <code>Zend_Pdf_Page::drawRectangle()</code>, <code>Zend_Pdf_Page::drawPoligon()</code>,
  442. <code>Zend_Pdf_Page::drawCircle()</code> e <code>Zend_Pdf_Page::drawEllipse()</code> usam o argumento
  443. <code>$fillType</code> como um parâmetro opcional. Ele pode ser:
  444. </para>
  445. <itemizedlist>
  446. <listitem>
  447. <para>Zend_Pdf_Page::SHAPE_DRAW_STROKE - pincelamento</para>
  448. </listitem>
  449. <listitem>
  450. <para>Zend_Pdf_Page::SHAPE_DRAW_FILL - apenas preenchimento</para>
  451. </listitem>
  452. <listitem>
  453. <para>Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - preenchimento e pincelamento (comportamento padrão)</para>
  454. </listitem>
  455. </itemizedlist>
  456. <para>
  457. Os métodos <code>Zend_Pdf_Page::drawPoligon()</code> também recebem um parâmetro adicional <code>$fillMethod</code>:
  458. </para>
  459. <itemizedlist>
  460. <listitem>
  461. <para>Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING (comportamento padrão)</para>
  462. <para>
  463. A <citetitle>PDF reference</citetitle> escreve esta regra como:
  464. <blockquote>
  465. <para>
  466. A regra "nonzero winding number" determina se um dado ponto está dentro de um caminho por
  467. conceitualmente desenhar um raio a partir desse ponto até o infinito em qualquer direção e,
  468. em seguida, analisar os lugares onde um segmento do caminho atravessa o raio. Começando a
  469. contagem do 0, a regra acrescenta 1 cada vez que um segmento cruza o raio da esquerda para
  470. a direita e subtrai 1 cada vez que um segmento cruza da direita para a esquerda. Após a
  471. contagem de todos os cruzamentos, se o resultado for 0 então o ponto está fora do caminho;
  472. de outra forma está dentro.
  473. Nota: O método descrito não especifica o que fazer se um caminho segmento coincide
  474. ou é tangente ao escolhido raio. Uma vez que a direcção do raio é arbitrária,
  475. a regra simplesmente escolhe um raio que não encontra tais problemas de interseção .
  476. Para simples caminhos convexos, a regra "nonzero winding number" define o interior
  477. e o exterior como esperado intuitivamente. Os casos mais interessantes são os envolvem
  478. caminhos complexos ou com auto-intersecção, como os que são apresentados na Figura 4.10
  479. (Em uma Referência PDF).
  480. Para um caminho que consiste em uma estrela de cinco pontas, desenhada com cinco linhas retas
  481. conectadas interseccionando-se, a regra considera como sendo o interior toda a área delimitada
  482. pela estrela, incluindo o pentágono no centro. Para um caminho composto de dois círculos
  483. concêntricos, as áreas delimitadas por ambos os círculos são consideradas como sendo o interior,
  484. desde que ambos os círculos sejam desenhados na mesma direção. Se os círculos forem desenhados
  485. em direções opostas, apenas a forma do "donut" entre eles está no interior, de acordo
  486. com a regra; o "buraco do donut" está no exterior.
  487. </para>
  488. </blockquote>
  489. </para>
  490. </listitem>
  491. <listitem>
  492. <para>Zend_Pdf_Page::FILL_METHOD_EVEN_ODD</para>
  493. <para>
  494. <citetitle>PDF reference</citetitle> describes this rule as follows:
  495. <blockquote>
  496. <para>
  497. Uma alternativa à regra "nonzero winding number" é a regra "even-odd". Esta regra
  498. determina a "interiorização" de um ponto através do desenho de um raio daquele ponto
  499. em qualquer direção e simplesmente contando a quantidade de segmentos de caminhos que
  500. cruzam o raio, independentemente da direção. Se a quantidade for impar, o ponto está
  501. no interior; se for par está no exterior. Isto gera os mesmos resultados da regra
  502. "nonzero winding number" para caminhos com formas simples, mas produz resultados
  503. diferentes para os mais de forma mais complexa.
  504. A Figura 4.11 (em uma Referência PDF) mostra os efeitos da aplicação da regra "even-odd"
  505. para caminhos complexos. Para a estrela de cinco pontas, a regra considera os pontos
  506. triangulares como estando no interior do caminho, mas não o pentágono no centro. Para os
  507. dois círculos concântricos, apenas a forma do "donut" entre os círculos é considerada como
  508. interior, independentemente das direções em que eles foram desenhados.
  509. </para>
  510. </blockquote>
  511. </para>
  512. </listitem>
  513. </itemizedlist>
  514. </sect2>
  515. <sect2 id="zend.pdf.drawing.rotations">
  516. <title>Rotações.</title>
  517. <para>
  518. A página PDF pode ser rotacionada antes do uso de qualquer operação de desenho.
  519. Isso pode ser feito pelo método <code>Zend_Pdf_Page::rotate()</code>:
  520. </para>
  521. <programlisting role="php"><![CDATA[<?php
  522. /**
  523. * Rotate the page around ($x, $y) point by specified angle (in radians).
  524. *
  525. * @param float $angle
  526. */
  527. public function rotate($x, $y, $angle);]]>
  528. </programlisting>
  529. </sect2>
  530. <sect2 id="zend.pdf.drawing.save-restore">
  531. <title>Salvar/restaurar estados gráficos.</title>
  532. <para>
  533. A qualquer hora os estados gráficos de uma págiuna (fonte atual, tamanho da fonte, cor das linhas, cor de
  534. preenchimento, estilo de linha, rotação da página, e área de clip) podem ser salvos e então restaurados.
  535. Operações "Salvar" colocam os dados em uma pilha, as restaurações recuperam os estados da pilha.
  536. </para>
  537. <para>
  538. Existem dois métodos na classe <code>Zend_Pdf_Page</code> para essas operações:
  539. </para>
  540. <programlisting role="php"><![CDATA[<?php
  541. /**
  542. * Save the graphics state of this page.
  543. * This takes a snapshot of the currently applied style, position, clipping area and
  544. * any rotation/translation/scaling that has been applied.
  545. */
  546. public function saveGS();
  547. /**
  548. * Restore the graphics state that was saved with the last call to saveGS().
  549. */
  550. public function restoreGS();]]>
  551. </programlisting>
  552. </sect2>
  553. <sect2 id="zend.pdf.drawing.clipping">
  554. <title>Recorte de área de desenho .</title>
  555. <para>
  556. O PDF e o módulo Zend_Pdf dão suporte ao recorte de áreas de desenho. O recorte da área atual
  557. limita as regiões da página que serão afetadas por operações de pintura. Inicialmente é a página toda.
  558. </para>
  559. <para>
  560. A classe <code>Zend_Pdf_Page</code> fornece um conjunto de métodos para operações de recorte.
  561. </para>
  562. <programlisting role="php"><![CDATA[<?php
  563. /**
  564. * Intersect current clipping area with a rectangle.
  565. *
  566. * @param float $x1
  567. * @param float $y1
  568. * @param float $x2
  569. * @param float $y2
  570. */
  571. public function clipRectangle($x1, $y1, $x2, $y2);]]>
  572. </programlisting>
  573. <programlisting role="php"><![CDATA[<?php
  574. /**
  575. * Intersect current clipping area with a polygon.
  576. *
  577. * @param array $x - array of float (the X co-ordinates of the vertices)
  578. * @param array $y - array of float (the Y co-ordinates of the vertices)
  579. * @param integer $fillMethod
  580. */
  581. public function clipPolygon($x, $y, $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);]]>
  582. </programlisting>
  583. <programlisting role="php"><![CDATA[<?php
  584. /**
  585. * Intersect current clipping area with a circle.
  586. *
  587. * @param float $x
  588. * @param float $y
  589. * @param float $radius
  590. * @param float $startAngle
  591. * @param float $endAngle
  592. */
  593. public function clipCircle($x, $y, $radius, $startAngle = null, $endAngle = null);]]>
  594. </programlisting>
  595. <programlisting role="php"><![CDATA[<?php
  596. /**
  597. * Intersect current clipping area with an ellipse.
  598. *
  599. * Method signatures:
  600. * drawEllipse($x1, $y1, $x2, $y2);
  601. * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
  602. *
  603. * @todo process special cases with $x2-$x1 == 0 or $y2-$y1 == 0
  604. *
  605. * @param float $x1
  606. * @param float $y1
  607. * @param float $x2
  608. * @param float $y2
  609. * @param float $startAngle
  610. * @param float $endAngle
  611. */
  612. public function clipEllipse($x1, $y1, $x2, $y2, $startAngle = null, $endAngle = null);]]>
  613. </programlisting>
  614. </sect2>
  615. <sect2 id="zend.pdf.drawing.styles">
  616. <title>Estilos.</title>
  617. <para>
  618. A classe <code>Zend_Pdf_Style</code> fornece funcionalidades de estilo.
  619. </para>
  620. <para>
  621. Estilos podem ser usados para o armazenamento de um conjunto de parâmetros do estado gráfico e
  622. aplicá-los à uma página PDF com uma operação:
  623. </para>
  624. <programlisting role="php"><![CDATA[<?php
  625. /**
  626. * Set the style to use for future drawing operations on this page
  627. *
  628. * @param Zend_Pdf_Style $style
  629. */
  630. public function setStyle(Zend_Pdf_Style $style);
  631. /**
  632. * Return the style, applied to the page.
  633. *
  634. * @return Zend_Pdf_Style|null
  635. */
  636. public function getStyle();]]>
  637. </programlisting>
  638. <para>
  639. A classe <code>Zend_Pdf_Style</code> fornece um conjunto de métodos para configurar ou recuperar
  640. diferentes parâmetros do estado gráfico:
  641. </para>
  642. <programlisting role="php"><![CDATA[<?php
  643. /**
  644. * Set line color.
  645. *
  646. * @param Zend_Pdf_Color $color
  647. */
  648. public function setLineColor(Zend_Pdf_Color $color);]]>
  649. </programlisting>
  650. <programlisting role="php"><![CDATA[<?php
  651. /**
  652. * Get line color.
  653. *
  654. * @return Zend_Pdf_Color|null
  655. */
  656. public function getLineColor();]]>
  657. </programlisting>
  658. <programlisting role="php"><![CDATA[<?php
  659. /**
  660. * Set line width.
  661. *
  662. * @param float $width
  663. */
  664. public function setLineWidth($width);]]>
  665. </programlisting>
  666. <programlisting role="php"><![CDATA[<?php
  667. /**
  668. * Get line width.
  669. *
  670. * @return float
  671. */
  672. public function getLineWidth();]]>
  673. </programlisting>
  674. <programlisting role="php"><![CDATA[<?php
  675. /**
  676. * Set line dashing pattern
  677. *
  678. * @param array $pattern
  679. * @param float $phase
  680. */
  681. public function setLineDashingPattern($pattern, $phase = 0);]]>
  682. </programlisting>
  683. <programlisting role="php"><![CDATA[<?php
  684. /**
  685. * Get line dashing pattern
  686. *
  687. * @return array
  688. */
  689. public function getLineDashingPattern();]]>
  690. </programlisting>
  691. <programlisting role="php"><![CDATA[<?php
  692. /**
  693. * Get line dashing phase
  694. *
  695. * @return float
  696. */
  697. public function getLineDashingPhase();]]>
  698. </programlisting>
  699. <programlisting role="php"><![CDATA[<?php
  700. /**
  701. * Set fill color.
  702. *
  703. * @param Zend_Pdf_Color $color
  704. */
  705. public function setFillColor(Zend_Pdf_Color $color);]]>
  706. </programlisting>
  707. <programlisting role="php"><![CDATA[<?php
  708. /**
  709. * Get fill color.
  710. *
  711. * @return Zend_Pdf_Color|null
  712. */
  713. public function getFillColor();]]>
  714. </programlisting>
  715. <programlisting role="php"><![CDATA[<?php
  716. /**
  717. * Set current font.
  718. *
  719. * @param Zend_Pdf_Resource_Font $font
  720. * @param float $fontSize
  721. */
  722. public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);]]>
  723. </programlisting>
  724. <programlisting role="php"><![CDATA[<?php
  725. /**
  726. * Modify current font size
  727. *
  728. * @param float $fontSize
  729. */
  730. public function setFontSize($fontSize);]]>
  731. </programlisting>
  732. <programlisting role="php"><![CDATA[<?php
  733. /**
  734. * Get current font.
  735. *
  736. * @return Zend_Pdf_Resource_Font $font
  737. */
  738. public function getFont();]]>
  739. </programlisting>
  740. <programlisting role="php"><![CDATA[<?php
  741. /**
  742. * Get current font size
  743. *
  744. * @return float $fontSize
  745. */
  746. public function getFontSize();]]>
  747. </programlisting>
  748. </sect2>
  749. </sect1>
  750. <!--
  751. vim:se ts=4 sw=4 et:
  752. -->