Zend_Pdf-Drawing.xml 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 13910 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.pdf.drawing">
  5. <title>Dessiner</title>
  6. <sect2 id="zend.pdf.drawing.geometry">
  7. <title>Géométrie</title>
  8. <para>Le format PDF utilise la même géométrie que le format PostScript. Elle démarre d'en bas à gauche et est
  9. mesuré en points (1/72 inch soit 0,352778 mm).</para>
  10. <para>La taille d'une page peut-être récupéré depuis un objet page :</para>
  11. <para><programlisting role="php"><![CDATA[
  12. $width = $pdfPage->getWidth();
  13. $height = $pdfPage->getHeight();
  14. ]]></programlisting></para>
  15. </sect2>
  16. <sect2 id="zend.pdf.drawing.color">
  17. <title>Couleurs</title>
  18. <para>Le format PDF a d'excellentes capacités dans la représentation des couleurs. Le module
  19. <classname>Zend_Pdf</classname> supporte les espaces de couleur : niveaux de gris, RGB et CMJN. Chacun d'entre eux
  20. peut-être utilisé à chaque fois qu'un objet <classname>Zend_Pdf_Color</classname> est requis. Les classes
  21. <classname>Zend_Pdf_Color_GrayScale</classname>, <classname>Zend_Pdf_Color_RGB</classname> et <classname>Zend_Pdf_Color_CMYK</classname>
  22. fournissent cette fonctionnalité :</para>
  23. <programlisting role="php"><![CDATA[
  24. // $grayLevel (float). 0.0 (noir) - 1.0 (blanc)
  25. $color1 = new Zend_Pdf_Color_GrayScale($grayLevel);
  26. // $r, $g, $b (float).
  27. // 0.0 (intensité mimimum) - 1.0 (intensité maximum)
  28. $color2 = new Zend_Pdf_Color_RGB($r, $g, $b);
  29. // $c, $m, $y, $k (float).
  30. // 0.0 (intensité mimimum) - 1.0 (intensité maximum)
  31. $color3 = new Zend_Pdf_Color_CMYK($c, $m, $y, $k);
  32. ]]></programlisting>
  33. <para>Les différentes couleurs HTML sont aussi fourni avec la classe <classname>Zend_Pdf_Color_Html</classname> :</para>
  34. <programlisting role="php"><![CDATA[
  35. $color1 = new Zend_Pdf_Color_Html('#3366FF');
  36. $color2 = new Zend_Pdf_Color_Html('silver');
  37. $color3 = new Zend_Pdf_Color_Html('forestgreen');
  38. ]]></programlisting>
  39. </sect2>
  40. <sect2 id="zend.pdf.drawing.shape-drawing">
  41. <title>Dessiner des formes</title>
  42. <para>Toutes les opérations de dessins peuvent être réalisées dans le contexte d'une page PDF.</para>
  43. <para>La classe <classname>Zend_Pdf_Page</classname> fournit les outils de dessins :</para>
  44. <para><programlisting role="php"><![CDATA[
  45. /**
  46. * Dessine une ligne de x1,y1 à x2,y2.
  47. *
  48. * @param float $x1
  49. * @param float $y1
  50. * @param float $x2
  51. * @param float $y2
  52. * @return Zend_Pdf_Page
  53. */
  54. public function drawLine($x1, $y1, $x2, $y2);
  55. ]]></programlisting></para>
  56. <para><programlisting role="php"><![CDATA[
  57. /**
  58. * Dessine un rectangle.
  59. *
  60. * Type de remplissage:
  61. * Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE
  62. * - remplit le rectangle et dessine le contour (par défaut)
  63. * Zend_Pdf_Page::SHAPE_DRAW_STROKE
  64. * - trace uniquement le contour du rectangle
  65. * Zend_Pdf_Page::SHAPE_DRAW_FILL
  66. * - remplit le rectangle
  67. *
  68. * @param float $x1
  69. * @param float $y1
  70. * @param float $x2
  71. * @param float $y2
  72. * @return Zend_Pdf_Page
  73. * @param integer $fillType
  74. * @return Zend_Pdf_Page
  75. */
  76. public function drawRectangle(
  77. $x1, $y1, $x2, $y2, $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);
  78. ]]></programlisting></para>
  79. <para><programlisting role="php"><![CDATA[
  80. /**
  81. * Dessine un polygone.
  82. *
  83. * Si $fillType est Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE
  84. * ou Zend_Pdf_Page::SHAPE_DRAW_FILL,
  85. * le polygone est automatiquement fermé.
  86. * Regardez la description détaillée de ces méthodes dans la
  87. * documentation du format PDF
  88. * (section 4.4.2 Path painting Operators, Filling)
  89. *
  90. * @param array $x - tableau de float (les coordonnés X des sommets)
  91. * @param array $y - tableau de float (les coordonnés Y des sommets)
  92. * @param integer $fillType
  93. * @param integer $fillMethod
  94. * @return Zend_Pdf_Page
  95. */
  96. public function drawPolygon(
  97. $x, $y,
  98. $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE,
  99. $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);
  100. ]]></programlisting></para>
  101. <para><programlisting role="php"><![CDATA[
  102. /**
  103. * Dessine un cercle avec comme centre x, y et comme rayon radius.
  104. *
  105. * Les angles sont en radian
  106. *
  107. * Signatures des méthodes:
  108. * drawCircle($x, $y, $radius);
  109. * drawCircle($x, $y, $radius, $fillType);
  110. * drawCircle($x, $y, $radius, $startAngle, $endAngle);
  111. * drawCircle($x, $y, $radius, $startAngle, $endAngle, $fillType);
  112. *
  113. *
  114. * Ce n'est pas réellement un cercle, car le format supporte
  115. * uniquement des courbe de Bezier cubique.
  116. * Mais c'est une très bonne approximation.
  117. * La différence avec un vrai cercle est de au maximum 0.00026 radians
  118. * (avec les angles PI/8, 3*PI/8, 5*PI/8, 7*PI/8, 9*PI/8, 11*PI/8,
  119. * 13*PI/8 et 15*PI/8).
  120. * Avec les angles 0, PI/4, PI/2, 3*PI/4, PI, 5*PI/4, 3*PI/2 et 7*PI/4
  121. * c'est exactement la tangente d'un cercle.
  122. *
  123. * @param float $x
  124. * @param float $y
  125. * @param float $radius
  126. * @param mixed $param4
  127. * @param mixed $param5
  128. * @param mixed $param6
  129. * @return Zend_Pdf_Page
  130. */
  131. public function drawCircle(
  132. $x, $y, $radius, $param4 = null, $param5 = null, $param6 = null);
  133. ]]></programlisting></para>
  134. <para><programlisting role="php"><![CDATA[
  135. /**
  136. * Dessine une ellipse dans le rectangle spécifié.
  137. *
  138. * Signatures des méthodes:
  139. * drawEllipse($x1, $y1, $x2, $y2);
  140. * drawEllipse($x1, $y1, $x2, $y2, $fillType);
  141. * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
  142. * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle, $fillType);
  143. *
  144. * Les angles sont en radians
  145. *
  146. * @param float $x1
  147. * @param float $y1
  148. * @param float $x2
  149. * @param float $y2
  150. * @param mixed $param5
  151. * @param mixed $param6
  152. * @param mixed $param7
  153. * @return Zend_Pdf_Page
  154. */
  155. public function drawEllipse(
  156. $x1, $y1, $x2, $y2, $param5 = null, $param6 = null, $param7 = null);
  157. ]]></programlisting></para>
  158. </sect2>
  159. <sect2 id="zend.pdf.drawing.text-drawing">
  160. <title>Dessiner du texte</title>
  161. <para>Les opérations de dessins existent bien sûr dans le contexte d'une page PDF. Vous pouvez dessiner une
  162. seule ligne de texte à n'importe quelle endroit dans la page en fournissant les coordonnées x et y de la ligne
  163. de base. La police courant ainsi que sa taille seront utilisées pour le dessin (voir la description
  164. ci-dessous).</para>
  165. <para><programlisting role="php"><![CDATA[
  166. /**
  167. * Dessine une ligne de texte à la position x,y.
  168. *
  169. * @param string $text
  170. * @param float $x
  171. * @param float $y
  172. * @param string $charEncoding (optionnel) encodage des caractères du texte.
  173. * Par défaut le réglage système est utilisé.
  174. * @throws Zend_Pdf_Exception
  175. * @return Zend_Pdf_Page
  176. */
  177. public function drawText($text, $x, $y, $charEncoding = '');
  178. ]]></programlisting></para>
  179. <example id="zend.pdf.drawing.text-drawing.example-1">
  180. <title>Dessiner une ligne dans la page</title>
  181. <programlisting role="php"><![CDATA[
  182. ...
  183. $pdfPage->drawText('Bonjour le monde!', 72, 720);
  184. ...
  185. ]]></programlisting>
  186. </example>
  187. <para>Par défaut, les chaînes de texte sont interprétées en utilisant l'encodage du système. Si vous avez une
  188. chaîne qui utilise un encodage différent (comme les chaînes UTF-8 lues depuis une fichier sur le disque, ou une
  189. chaîne MacRoman obtenue depuis une base de données), vous pouvez indiquer l'encodage au moment du dessin et
  190. Zend_Pdf gérera la conversion pour vous. Vous pouvez fournir des chaînes dans n'importe quel encodage supporté
  191. par la fonction <code><ulink url="http://www.php.net/manual/function.iconv.php">iconv()</ulink></code> de
  192. PHP:</para>
  193. <example id="zend.pdf.drawing.text-drawing.example-2">
  194. <title>Dessiner une chaîne UTF-8 sur une page</title>
  195. <programlisting role="php"><![CDATA[
  196. ...
  197. // Lit une chaîne UTF-8 à partir du disque
  198. $unicodeString = fread($fp, 1024);
  199. // Dessine une chaîne dans la page
  200. $pdfPage->drawText($unicodeString, 72, 720, 'UTF-8');
  201. ...
  202. ]]></programlisting>
  203. </example>
  204. </sect2>
  205. <sect2 id="zend.pdf.drawing.using-fonts">
  206. <title>Utiliser des polices de caractères</title>
  207. <para><classname>Zend_Pdf_Page::drawText()</classname> utilise la police courante ainsi que sa taille, qui sont définies
  208. avec la méthode <classname>Zend_Pdf_Page::setFont()</classname> :</para>
  209. <para><programlisting role="php"><![CDATA[
  210. /**
  211. * Choisit la police courante.
  212. *
  213. * @param Zend_Pdf_Resource_Font $font
  214. * @param float $fontSize
  215. * @return Zend_Pdf_Page
  216. */
  217. public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);
  218. ]]></programlisting></para>
  219. <para>Les documents PDF supportent PostScript Type 1 et les polices TrueType, mais également deux types
  220. spécifiques PDF, Type3 et les polices composites. Il y a aussi 14 polices Type 1 standard intégré dans tout
  221. lecteur de PDF : Courier (4 styles), Helvetica (4 styles), Times (4 styles), Symbol, et Zapf Dingbats.</para>
  222. <para>Zend_Pdf supporte actuellement les 14 polices standard mais également vos propres police TrueType. Les
  223. objets de police obtenus via une des deux fabriques méthodes :
  224. <classname>Zend_Pdf_Font::fontWithName($fontName)</classname> pour les 14 polices PDF standard ou
  225. <classname>Zend_Pdf_Font::fontWithPath($filePath)</classname> pour les polices personnalisées.</para>
  226. <example id="zend.pdf.drawing.using-fonts.example-1">
  227. <title>Créer une police standard</title>
  228. <programlisting role="php"><![CDATA[
  229. ...
  230. // Crée une nouvelle police
  231. $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
  232. // Applique la police
  233. $pdfPage->setFont($font, 36);
  234. ...
  235. ]]></programlisting>
  236. </example>
  237. <para>Les constantes pour les 14 polices standard sont définis dans la classe <classname>Zend_Pdf_Font</classname> :
  238. <itemizedlist>
  239. <listitem>
  240. <para>Zend_Pdf_Font::FONT_COURIER</para>
  241. </listitem>
  242. <listitem>
  243. <para>Zend_Pdf_Font::FONT_COURIER_BOLD</para>
  244. </listitem>
  245. <listitem>
  246. <para>Zend_Pdf_Font::FONT_COURIER_ITALIC</para>
  247. </listitem>
  248. <listitem>
  249. <para>Zend_Pdf_Font::FONT_COURIER_BOLD_ITALIC</para>
  250. </listitem>
  251. <listitem>
  252. <para>Zend_Pdf_Font::FONT_TIMES</para>
  253. </listitem>
  254. <listitem>
  255. <para>Zend_Pdf_Font::FONT_TIMES_BOLD</para>
  256. </listitem>
  257. <listitem>
  258. <para>Zend_Pdf_Font::FONT_TIMES_ITALIC</para>
  259. </listitem>
  260. <listitem>
  261. <para>Zend_Pdf_Font::FONT_TIMES_BOLD_ITALIC</para>
  262. </listitem>
  263. <listitem>
  264. <para>Zend_Pdf_Font::FONT_HELVETICA</para>
  265. </listitem>
  266. <listitem>
  267. <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD</para>
  268. </listitem>
  269. <listitem>
  270. <para>Zend_Pdf_Font::FONT_HELVETICA_ITALIC</para>
  271. </listitem>
  272. <listitem>
  273. <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD_ITALIC</para>
  274. </listitem>
  275. <listitem>
  276. <para>Zend_Pdf_Font::FONT_SYMBOL</para>
  277. </listitem>
  278. <listitem>
  279. <para>Zend_Pdf_Font::FONT_ZAPFDINGBATS</para>
  280. </listitem>
  281. </itemizedlist></para>
  282. <para>Vous pouvez aussi prendre n'importe quelle police TrueType (extension habituelle ".ttf") ou OpenType
  283. (".otf") si elles ont une silhouette TrueType. Pour l'instant non supportée, les polices Mac Os X ".dfont" et
  284. les collections TrueType Microsoft (".ttc") seront intégrées dans une version future.</para>
  285. <para>Pour utiliser une police TrueType, vous devez fournir le chemin de fichier complet vers cette police. Si
  286. la police ne peut pas être lue pour une quelconque raison, ou si ce n'est pas une police TrueType, la méthode
  287. lèvera une exception :</para>
  288. <example id="zend.pdf.drawing.using-fonts.example-2">
  289. <title>Créer une police TrueType</title>
  290. <programlisting role="php"><![CDATA[
  291. ...
  292. // Crée la nouvelle police
  293. $goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/chemin/vers/GOODDC__.TTF');
  294. // Applique cette police
  295. $pdfPage->setFont($goodDogCoolFont, 36);
  296. ...
  297. ]]></programlisting>
  298. </example>
  299. <para>Par défaut, les polices personnalisées seront incorporées dans le document PDF résultant. Cela permet aux
  300. destinataires de voir la page comme prévu, même s'ils ne font pas installer les polices appropriées sur leur
  301. système. En cas de problème avec la taille du fichier généré, vous pouvez demander que la police ne soit pas
  302. incorporé en passant l'option 'ne pas inclure' à la méthode de création :</para>
  303. <example id="zend.pdf.drawing.using-fonts.example-3">
  304. <title>Créer une police TrueType sans l'incorporer dans le document PDF</title>
  305. <programlisting role="php"><![CDATA[
  306. ...
  307. // Crée la nouvelle police
  308. $goodDogCoolFont =
  309. Zend_Pdf_Font::fontWithPath('/chemin/vers/GOODDC__.TTF',
  310. Zend_Pdf_Font::EMBED_DONT_EMBED);
  311. // Applique cette police
  312. $pdfPage->setFont($goodDogCoolFont, 36);
  313. ...
  314. ]]></programlisting>
  315. </example>
  316. <para>Si les polices ne sont pas incorporées mais que le destinataire du fichier PDF a ces polices installées
  317. sur son système, il verra le document comme prévu. Si la police correcte n'est pas installée, l'application de
  318. visualisation du PDF fera de son mieux pour synthétiser une police de remplacement.</para>
  319. <para>Quelques polices ont les règles de licence très spécifiques qui les empêchent d'être incorporées dans des
  320. documents PDF. Donc vous devez faire attention, si vous essayez d'utiliser une police qui ne peut pas être
  321. incorporée, la méthode de création lèvera une exception.</para>
  322. <para>Vous pouvez toujours utiliser ces polices, mais vous devez passer le paramètre 'ne pas inclure' comme
  323. décrit ci-dessous, ou vous pouvez simplement bloquer l'exception :</para>
  324. <example id="zend.pdf.drawing.using-fonts.example-4">
  325. <title>Ne pas lever d'exception pour les polices ne pouvant être incorporées</title>
  326. <programlisting role="php"><![CDATA[
  327. ...
  328. $font =
  329. Zend_Pdf_Font::fontWithPath('/chemin/vers/PoliceNonIncorporable.ttf',
  330. Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION);
  331. ...
  332. ]]></programlisting>
  333. </example>
  334. <para>Cette technique de suppression est préférée si vous permettez aux utilisateurs de choisir leurs propres
  335. polices. Les polices qui peuvent être incorporées dans le document PDF le seront ; les autres ne le seront
  336. pas.</para>
  337. <para>Les fichiers de police peuvent être assez grands, certains peuvent atteindre des dizaines de méga-octets.
  338. Par défaut, toutes les polices incorporées sont comprimées en utilisant le schéma de compression Flate, ayant
  339. pour résultat un gain d'espace de 50% en moyenne. Si, pour une quelconque raison, vous ne voulez pas comprimer
  340. la police, vous pouvez le neutraliser avec une option :</para>
  341. <example id="zend.pdf.drawing.using-fonts.example-5">
  342. <title>Ne pas compresser une police incorporée</title>
  343. <programlisting role="php"><![CDATA[
  344. ...
  345. $font =
  346. Zend_Pdf_Font::fontWithPath('/chemin/vers/PoliceDeGrandeTaille.ttf',
  347. Zend_Pdf_Font::EMBED_DONT_COMPRESS);
  348. ...
  349. ]]></programlisting>
  350. </example>
  351. <para>En conclusion, si nécessaire, vous pouvez combiner les options d'incorporation en employant l'opérateur
  352. binaire OR :</para>
  353. <example id="zend.pdf.drawing.using-fonts.example-6">
  354. <title>Combiner les options de polices incorporées</title>
  355. <programlisting role="php"><![CDATA[
  356. ...
  357. $font = Zend_Pdf_Font::fontWithPath(
  358. $cheminVersPoliceQuelconque,
  359. (Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION |
  360. Zend_Pdf_Font::EMBED_DONT_COMPRESS));
  361. ...
  362. ]]></programlisting>
  363. </example>
  364. </sect2>
  365. <sect2 id="zend.pdf.drawing.standard-fonts-limitations">
  366. <title>Limitations des polices standard PDF</title>
  367. <para>Les polices standard PDF emploient en interne plusieurs encodages sur un seul octet (voir <ulink
  368. url="http://www.adobe.com/devnet/acrobat/pdfs/pdf_reference_1-7.pdf">PDF Reference, Sixth Edition, version
  369. 1.7</ulink> - Annexe D pour plus de détails). Elles sont généralement avec un jeu de caractère de type
  370. Latin1(excepté les polices Symbol and ZapfDingbats).</para>
  371. <para><classname>Zend_Pdf</classname> utilise l'encodage CP1252 (WinLatin1) pour tracer les textes avec les polices
  372. standard.</para>
  373. <para>Le texte peut encore être fourni dans n'importe quel autre encodage, qui doit être spécifié s'il diffère
  374. de celui en cours. Seulement les caractères WinLatin1 seront tracés réellement.</para>
  375. <example id="zend.pdf.drawing.using-fonts.example-7">
  376. <title>Combiner les options de polices embarqués.</title>
  377. <programlisting role="php"><![CDATA[
  378. ...
  379. $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_COURIER);
  380. $pdfPage->setFont($font, 36)
  381. ->drawText('Euro sign - €', 72, 720, 'UTF-8')
  382. ->drawText('Text with umlauts - à è ì', 72, 650, 'UTF-8');
  383. ...
  384. ]]></programlisting>
  385. </example>
  386. </sect2>
  387. <sect2 id="zend.pdf.drawing.extracting-fonts">
  388. <title>Extraction des polices</title>
  389. <para>Depuis la version 1.5, <classname>Zend_Pdf</classname> fournit la possibilité d'extraire les polices des documents
  390. chargés.</para>
  391. <para>Ceci peut être utile lors des mises à jour de document avec ajout de texte. Sans cette fonctionnalité vous
  392. devez attacher et probablement intégrer la police dans le document chaque fois que vous voulez le mettre à
  393. jour.</para>
  394. <para>Les objets <classname>Zend_Pdf</classname> et <classname>Zend_Pdf_Page</classname> fournissent une méthode spéciale pour
  395. extraire toutes les polices mentionnés à l'intérieur d'un document ou d'une page :</para>
  396. <example id="zend.pdf.drawing.extracting-fonts.example-1">
  397. <title>Extraction de polices à partir d'un document chargé.</title>
  398. <programlisting role="php"><![CDATA[
  399. ...
  400. $pdf = Zend_Pdf::load($cheminVersDocument);
  401. ...
  402. // Récupère toutes les polices du document
  403. $listePolice = $pdf->extractFonts();
  404. $pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));
  405. $yPosition = 700;
  406. foreach ($listePolice as $police) {
  407. $page->setFont($police, 15);
  408. $page->drawText(
  409. $police->getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT, 'fr', 'UTF-8')
  410. . ': Le renard brun rapide saute par-dessus le chien paresseux',
  411. 100,
  412. $yPosition,
  413. 'UTF-8');
  414. $yPosition -= 30;
  415. }
  416. ...
  417. // Récupère toutes les polices référencées dans la première page du document
  418. $firstPage = reset($pdf->pages);
  419. $firstPageFonts = $firstPage->extractFonts();
  420. ...
  421. ]]></programlisting>
  422. </example>
  423. <example id="zend.pdf.drawing.extracting-fonts.example-2">
  424. <title>Extraction d'une police à partir d'un document chargé en spécifiant le nom de police.</title>
  425. <programlisting role="php"><![CDATA[
  426. ...
  427. $pdf = new Zend_Pdf();
  428. ...
  429. $pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));
  430. $police = Zend_Pdf_Font::fontWithPath($cheminVersPolices);
  431. $page->setFont($police, $taillePolice);
  432. $page->drawText($texte, $x, $y);
  433. ...
  434. // Ce nom de police peut être stocké quelquepart...
  435. $fontName = $font->getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT, 'fr', 'UTF-8');
  436. ...
  437. $pdf->save($cheminVersDocument);
  438. ...
  439. ]]></programlisting>
  440. <programlisting role="php"><![CDATA[
  441. ...
  442. $pdf = Zend_Pdf::load($cheminVersDocument);
  443. ...
  444. $pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));
  445. $police = $pdf->extractFont($nomPolice);
  446. /* $pageSource->extractFont($nomPolice) peut aussi être utilisé ici */
  447. $page->setFont($police, $taillePolice);
  448. $page->drawText($texte, $x, $y);
  449. ...
  450. $pdf->save($cheminVersDocument, true /* mise à jour de type incrémental */);
  451. ...
  452. ]]></programlisting>
  453. </example>
  454. <para>Les polices extraites peuvent être utilisées à la place de n'importe quelle autre police avec les
  455. limitations suivantes : <itemizedlist>
  456. <listitem>
  457. <para>La police extraite peut être employée seulement dans le cadre du document à partir duquel elle
  458. a été extraite.</para>
  459. </listitem>
  460. <listitem>
  461. <para>Les possibles programmes de polices incorporées ne sont pas extraits réellement. La police
  462. ainsi extraite ne peut pas fournir la métrique correcte de police et la police originale doit être
  463. utilisée pour les calculs de largeur des textes : <programlisting role="php"><![CDATA[
  464. ...
  465. $police = $pdf->extractFont($fontName);
  466. $policeOriginal = Zend_Pdf_Font::fontWithPath($cheminVersPolices);
  467. /* utilisation d'une police extraite */
  468. $page->setFont($police, $taillePolice);
  469. $xPosition = $x;
  470. for ($charIndex = 0; $charIndex < strlen($text); $charIndex++) {
  471. $page->drawText($text[$charIndex], $xPosition, $y);
  472. // Use original font for text width calculation
  473. $width = $originalFont->widthForGlyph(
  474. $originalFont->glyphNumberForCharacter($text[$charIndex])
  475. );
  476. $xPosition += $width / $originalFont->getUnitsPerEm() * $taillePolice;
  477. }
  478. ...
  479. ]]></programlisting></para>
  480. </listitem>
  481. </itemizedlist></para>
  482. </sect2>
  483. <sect2 id="zend.pdf.drawing.image-drawing">
  484. <title>Insertion d'images</title>
  485. <para>La classe <classname>Zend_Pdf_Page</classname> fournis la méthode <code>drawImage()</code> pour dessiner une image
  486. :</para>
  487. <para><programlisting role="php"><![CDATA[
  488. /**
  489. * Insère une image à la position spécifiée dans la page
  490. *
  491. * @param Zend_Pdf_Resource_Image $image
  492. * @param float $x1
  493. * @param float $y1
  494. * @param float $x2
  495. * @param float $y2
  496. * @return Zend_Pdf_Page
  497. */
  498. public function drawImage(Zend_Pdf_Resource_Image $image, $x1, $y1, $x2, $y2);
  499. ]]></programlisting></para>
  500. <para>Les objets Image peuvent être créés avec la méthode <classname>Zend_Pdf_Image::imageWithPath($filePath)</classname>
  501. (les images JPG, PNG et TIFF sont maintenant supportées) :</para>
  502. <example id="zend.pdf.drawing.image-drawing.example-1">
  503. <title>Insertion d'images</title>
  504. <programlisting role="php"><![CDATA[
  505. ...
  506. //Charger une image
  507. $image = Zend_Pdf_Image::imageWithPath('mon_image.jpg');
  508. $pdfPage->drawImage($image, 100, 100, 400, 300);
  509. ...
  510. ]]></programlisting>
  511. </example>
  512. <para><emphasis>Important ! Le support JPEG nécessite que l'extension PHP GD soit installé.</emphasis>
  513. <emphasis>Important ! Le support PNG nécessite que l'extension ZLIB soit configuré pour accepter les images avec
  514. canaux Alpha.</emphasis></para>
  515. <para>Lisez la documentation de PHP pour plus d'informations (<ulink
  516. url="http://www.php.net/manual/fr/ref.image.php">http://www.php.net/manual/fr/ref.image.php</ulink> et <ulink
  517. url="http://www.php.net/manual/fr/ref.zlib.php">http://www.php.net/manual/fr/ref.zlib.php</ulink>).</para>
  518. </sect2>
  519. <sect2 id="zend.pdf.drawing.line-drawing-style">
  520. <title>Style de lignes</title>
  521. <para>Le style de ligne est définit par l'épaisseur, la couleur et le style de tiret. Tout ces paramètres
  522. peuvent être assignés par les méthodes de la classe <classname>Zend_Pdf_Page</classname> :</para>
  523. <para><programlisting role="php"><![CDATA[
  524. /** Choisit la couleur de ligne. */
  525. public function setLineColor(Zend_Pdf_Color $color);
  526. /** Choisit l'épaisseur de ligne. */
  527. public function setLineWidth(float $width);
  528. /**
  529. * Choisit le modèle de tiret.
  530. *
  531. * modele est un tableau de floats: array(longueur_visible,
  532. * longueur_invisible, longueur_visible, longueur_invisible,
  533. * ...)
  534. * phase est le décalage à partir du début de la ligne.
  535. *
  536. * @param array $modele
  537. * @param array $phase
  538. * @return Zend_Pdf_Page
  539. */
  540. public function setLineDashingPattern($pattern, $phase = 0);
  541. ]]></programlisting></para>
  542. </sect2>
  543. <sect2 id="zend.pdf.drawing.fill-style">
  544. <title>Style de remplissage</title>
  545. <para>Les méthodes <classname>Zend_Pdf_Page::drawRectangle()</classname>, <classname>Zend_Pdf_Page::drawPoligon()</classname>,
  546. <classname>Zend_Pdf_Page::drawCircle()</classname> et <classname>Zend_Pdf_Page::drawEllipse()</classname> prennent en argument
  547. optionnel le type de remplissage: <code>$fillType</code>. Il peut être :</para>
  548. <itemizedlist>
  549. <listitem>
  550. <para>Zend_Pdf_Page::SHAPE_DRAW_STROKE - trace le contour de la forme</para>
  551. </listitem>
  552. <listitem>
  553. <para>Zend_Pdf_Page::SHAPE_DRAW_FILL - remplit uniquement la forme</para>
  554. </listitem>
  555. <listitem>
  556. <para>Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - remplissage et contour (par défaut)</para>
  557. </listitem>
  558. </itemizedlist>
  559. <para>La méthode <classname>Zend_Pdf_Page::drawPoligon()</classname> prend aussi paramètre supplémentaire
  560. <code>$fillMethod</code> :</para>
  561. <itemizedlist>
  562. <listitem>
  563. <para>$fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING (par défaut)</para>
  564. <para>La <citetitle>référence du format PDF</citetitle> décrit la règle comme ceci : <blockquote>
  565. <para>The nonzero winding number rule determines whether a given point is inside a path by
  566. conceptually drawing a ray from that point to infinity in any direction and then examining the
  567. places where a segment of the path crosses the ray. Starting with a count of 0, the rule adds 1
  568. each time a path segment crosses the ray from left to right and subtracts 1 each time a segment
  569. crosses from right to left. After counting all the crossings, if the result is 0 then the point
  570. is outside the path; otherwise it is inside. Note: The method just described does not specify
  571. what to do if a path segment coincides with or is tangent to the chosen ray. Since the direction
  572. of the ray is arbitrary, the rule simply chooses a ray that does not encounter such problem
  573. intersections. For simple convex paths, the nonzero winding number rule defines the inside and
  574. outside as one would intuitively expect. The more interesting cases are those involving complex
  575. or self-intersecting paths like the ones shown in Figure 4.10 (in a PDF Reference). For a path
  576. consisting of a five-pointed star, drawn with five connected straight line segments intersecting
  577. each other, the rule considers the inside to be the entire area enclosed by the star, including
  578. the pentagon in the center. For a path composed of two concentric circles, the areas enclosed by
  579. both circles are considered to be inside, provided that both are drawn in the same direction. If
  580. the circles are drawn in opposite directions, only the "doughnut" shape between them is inside,
  581. according to the rule; the "doughnut hole" is outside.</para>
  582. </blockquote></para>
  583. </listitem>
  584. <listitem>
  585. <para>Zend_Pdf_Page::FILL_METHOD_EVEN_ODD</para>
  586. <para>La <citetitle>référence du format PDF</citetitle> décrit la règle comme ceci : <blockquote>
  587. <para>An alternative to the nonzero winding number rule is the even-odd rule. This rule
  588. determines the "insideness" of a point by drawing a ray from that point in any direction and
  589. simply counting the number of path segments that cross the ray, regardless of direction. If this
  590. number is odd, the point is inside; if even, the point is outside. This yields the same results
  591. as the nonzero winding number rule for paths with simple shapes, but produces different results
  592. for more complex shapes. Figure 4.11 (in a PDF Reference) shows the effects of applying the
  593. even-odd rule to complex paths. For the five-pointed star, the rule considers the triangular
  594. points to be inside the path, but not the pentagon in the center. For the two concentric
  595. circles, only the "doughnut" shape between the two circles is considered inside, regardless of
  596. the directions in which the circles are drawn.</para>
  597. </blockquote></para>
  598. </listitem>
  599. </itemizedlist>
  600. </sect2>
  601. <sect2 id="zend.pdf.drawing.linear-transformations">
  602. <title>Transformations linéaires</title>
  603. <sect3 id="zend.pdf.drawing.linear-transformations.rotations">
  604. <title>Rotations</title>
  605. <para>La page PDF page peut être tourné avant d'appliquer toute opération de dessin. Ceci peut être fait
  606. avec la méthode <classname>Zend_Pdf_Page::rotate()</classname> :</para>
  607. <programlisting role="php"><![CDATA[
  608. /**
  609. * Rotation de la page
  610. *
  611. * @param float $x - la coordonnée X du point de rotation
  612. * @param float $y - la coordonnée X du point de rotation
  613. * @param float $angle - angle de rotation
  614. * @return Zend_Pdf_Page
  615. */
  616. public function rotate($x, $y, $angle);
  617. ]]></programlisting>
  618. </sect3>
  619. <sect3 id="zend.pdf.drawing.linear-transformations.scale">
  620. <title>A partir de Zend Framework 1.8, mise à l'échelle</title>
  621. <para>La mise à l'échelle est fournie par la méthode <classname>Zend_Pdf_Page::scale()</classname> :</para>
  622. <programlisting role="php"><![CDATA[
  623. /**
  624. * Mise à l'échelle
  625. *
  626. * @param float $xScale - X dimention scale factor
  627. * @param float $yScale - Y dimention scale factor
  628. * @return Zend_Pdf_Page
  629. */
  630. public function scale($xScale, $yScale);
  631. ]]></programlisting>
  632. </sect3>
  633. <sect3 id="zend.pdf.drawing.linear-transformations.translate">
  634. <title>A partir de Zend Framework 1.8, décalage</title>
  635. <para>Le décalage du système de coordonnées est réalisé par la méthode
  636. <classname>Zend_Pdf_Page::translate()</classname> :</para>
  637. <programlisting role="php"><![CDATA[
  638. /**
  639. * Décalage du système de coordonnées
  640. *
  641. * @param float $xShift - coordonnées X du décalage
  642. * @param float $yShift - coordonnées Y du décalage
  643. * @return Zend_Pdf_Page
  644. */
  645. public function translate($xShift, $yShift);
  646. ]]></programlisting>
  647. </sect3>
  648. <sect3 id="zend.pdf.drawing.linear-transformations.skew">
  649. <title>A partir de Zend Framework 1.8, mise en biais.</title>
  650. <para>La mise en biais de la page peut être réalisé par la méthode <classname>Zend_Pdf_Page::skew()</classname>
  651. :</para>
  652. <programlisting role="php"><![CDATA[
  653. /**
  654. * Mise en biais du système de coordonnées
  655. *
  656. * @param float $x - the X co-ordinate of axis skew point
  657. * @param float $y - the Y co-ordinate of axis skew point
  658. * @param float $xAngle - X axis skew angle
  659. * @param float $yAngle - Y axis skew angle
  660. * @return Zend_Pdf_Page
  661. */
  662. public function skew($x, $y, $xAngle, $yAngle);
  663. ]]></programlisting>
  664. </sect3>
  665. </sect2>
  666. <sect2 id="zend.pdf.drawing.save-restore">
  667. <title>Sauvegarder et restaurer l'état graphique.</title>
  668. <para>L'état graphique (police courante, taille de caractère, couleur de ligne, couleur de remplissage, style de
  669. ligne, sens de la page, zone de dessin) peut-être sauvegarder à tout moment. L'opération de sauvegarde empile le
  670. contexte dans une pile de contexte graphique, l'opération de restauration récupère le contexte depuis la
  671. pile.</para>
  672. <para>Il y a deux méthodes dans la classe <classname>Zend_Pdf_Page</classname> pour réaliser ces opérations :</para>
  673. <para><programlisting role="php"><![CDATA[
  674. /**
  675. * Sauvegarde l'état graphique de la page.
  676. * Cela prend un instantané des styles courants, des zones de dessins
  677. * et de toutes les rotations/translations/changements de taille appliqués.
  678. *
  679. * @return Zend_Pdf_Page
  680. */
  681. public function saveGS();
  682. /**
  683. * Restaure le dernier état graphique sauvegarder avec saveGS().
  684. *
  685. * @return Zend_Pdf_Page
  686. */
  687. public function restoreGS();
  688. ]]></programlisting></para>
  689. </sect2>
  690. <sect2 id="zend.pdf.drawing.clipping">
  691. <title>Zone de dessin</title>
  692. <para>Le format PDF et le module Zend_Pdf supporte le découpage de la zone de dessin. La zone de dessin courante
  693. limite la zone de la page affectée par l'utilisation des opérateurs de dessins. Initialement c'est toute la
  694. page.</para>
  695. <para>La classe <classname>Zend_Pdf_Page</classname> fournit des méthodes pour les opérations de découpage.</para>
  696. <para><programlisting role="php"><![CDATA[
  697. /**
  698. * Découpe la zone courante avec un rectangle.
  699. *
  700. * @param float $x1
  701. * @param float $y1
  702. * @param float $x2
  703. * @param float $y2
  704. * @return Zend_Pdf_Page
  705. */
  706. public function clipRectangle($x1, $y1, $x2, $y2);
  707. ]]></programlisting></para>
  708. <para><programlisting role="php"><![CDATA[
  709. /**
  710. * Découpe la zone courante avec un polygone.
  711. *
  712. * @param array $x - tableau de float (les coordonnées X des sommets)
  713. * @param array $y - tableau de float (les coordonnées Y des sommets)
  714. * @param integer $fillMethod
  715. * @return Zend_Pdf_Page
  716. */
  717. public function clipPolygon(
  718. $x, $y, $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);
  719. ]]></programlisting></para>
  720. <para><programlisting role="php"><![CDATA[
  721. /**
  722. * Découpe la zone courante avec un cercle.
  723. *
  724. * @param float $x
  725. * @param float $y
  726. * @param float $radius
  727. * @param float $startAngle
  728. * @param float $endAngle
  729. * @return Zend_Pdf_Page
  730. */
  731. public function clipCircle(
  732. $x, $y, $radius, $startAngle = null, $endAngle = null);
  733. ]]></programlisting></para>
  734. <para><programlisting role="php"><![CDATA[
  735. /**
  736. * Découpe la zone courante avec une ellipse.
  737. *
  738. * Signatures des méthodes:
  739. * drawEllipse($x1, $y1, $x2, $y2);
  740. * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
  741. *
  742. * @todo s'occuper des cas spéciaux avec $x2-$x1 == 0 ou $y2-$y1 == 0
  743. *
  744. * @param float $x1
  745. * @param float $y1
  746. * @param float $x2
  747. * @param float $y2
  748. * @param float $startAngle
  749. * @param float $endAngle
  750. * @return Zend_Pdf_Page
  751. */
  752. public function clipEllipse(
  753. $x1, $y1, $x2, $y2, $startAngle = null, $endAngle = null);
  754. ]]></programlisting></para>
  755. </sect2>
  756. <sect2 id="zend.pdf.drawing.styles">
  757. <title>Styles</title>
  758. <para>La classe <classname>Zend_Pdf_Style</classname> fournit les fonctionnalités de style.</para>
  759. <para>Les styles peuvent être utilisés pour stocker des paramètre d'état graphique et de les appliquer à une
  760. page PDF en une seule opération :</para>
  761. <para><programlisting role="php"><![CDATA[
  762. /**
  763. * Choisit le style à utiliser pour les futures opérations
  764. * de dessin sur cette page
  765. *
  766. * @param Zend_Pdf_Style $style
  767. * @return Zend_Pdf_Page
  768. */
  769. public function setStyle(Zend_Pdf_Style $style);
  770. /**
  771. * Renvoie le style appliqué à la page.
  772. *
  773. * @return Zend_Pdf_Style|null
  774. */
  775. public function getStyle();
  776. ]]></programlisting></para>
  777. <para>La classe <classname>Zend_Pdf_Style</classname> fournit des méthodes pour choisir ou récupérer différents paramètres
  778. de l'état graphique :</para>
  779. <para><programlisting role="php"><![CDATA[
  780. /**
  781. * Choisit la couleur de ligne.
  782. *
  783. * @param Zend_Pdf_Color $color
  784. * @return Zend_Pdf_Page
  785. */
  786. public function setLineColor(Zend_Pdf_Color $color);
  787. ]]></programlisting></para>
  788. <para><programlisting role="php"><![CDATA[
  789. /**
  790. * Récupère la couleur de ligne.
  791. *
  792. * @return Zend_Pdf_Color|null
  793. * @return Zend_Pdf_Page
  794. */
  795. public function getLineColor();
  796. ]]></programlisting></para>
  797. <para><programlisting role="php"><![CDATA[
  798. /**
  799. * Choisit l'épaisseur de ligne.
  800. *
  801. * @param float $width
  802. * @return Zend_Pdf_Page
  803. */
  804. public function setLineWidth($width);
  805. ]]></programlisting></para>
  806. <para><programlisting role="php"><![CDATA[
  807. /**
  808. * Récupère l'épaisseur de ligne.
  809. *
  810. * @return float
  811. * @return Zend_Pdf_Page
  812. */
  813. public function getLineWidth($width);
  814. ]]></programlisting></para>
  815. <para><programlisting role="php"><![CDATA[
  816. /**
  817. * Choisit le style de tiret
  818. *
  819. * @param array $pattern
  820. * @param float $phase
  821. * @return Zend_Pdf_Page
  822. */
  823. public function setLineDashingPattern($pattern, $phase = 0);
  824. ]]></programlisting></para>
  825. <para><programlisting role="php"><![CDATA[
  826. /**
  827. * Récupère le style de tiret
  828. *
  829. * @return array
  830. */
  831. public function getLineDashingPattern();
  832. ]]></programlisting></para>
  833. <para><programlisting role="php"><![CDATA[
  834. /**
  835. * Récupère le modèle de tiret
  836. *
  837. * @return float
  838. */
  839. public function getLineDashingPhase();
  840. ]]></programlisting></para>
  841. <para><programlisting role="php"><![CDATA[
  842. /**
  843. * Choisit la couleur de remplissage.
  844. *
  845. * @param Zend_Pdf_Color $color
  846. * @return Zend_Pdf_Page
  847. */
  848. public function setFillColor(Zend_Pdf_Color $color);
  849. ]]></programlisting></para>
  850. <para><programlisting role="php"><![CDATA[
  851. /**
  852. * Récupère la couleur de remplissage.
  853. *
  854. * @return Zend_Pdf_Color|null
  855. */
  856. public function getFillColor();
  857. ]]></programlisting></para>
  858. <para><programlisting role="php"><![CDATA[
  859. /**
  860. * Choisit la police.
  861. *
  862. * @param Zend_Pdf_Font $font
  863. * @param Zend_Pdf_Resource_Font $font
  864. * @param float $fontSize
  865. */
  866. public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);
  867. ]]></programlisting></para>
  868. <para><programlisting role="php"><![CDATA[
  869. /**
  870. * Modifie la taille de police.
  871. *
  872. * @param float $fontSize
  873. * @return Zend_Pdf_Page
  874. */
  875. public function setFontSize($fontSize);
  876. ]]></programlisting></para>
  877. <para><programlisting role="php"><![CDATA[
  878. /**
  879. * Récupère la police courante
  880. *
  881. * @return Zend_Pdf_Resource_Font $font
  882. */
  883. public function getFont();
  884. ]]></programlisting></para>
  885. <para><programlisting role="php"><![CDATA[
  886. /**
  887. * Récupère la taille de la police
  888. *
  889. * @return float $fontSize
  890. */
  891. public function getFontSize();
  892. ]]></programlisting></para>
  893. </sect2>
  894. <sect2 id="zend.pdf.drawing.alpha">
  895. <title>Transparence.</title>
  896. <para>Le module <classname>Zend_Pdf</classname> supporte la gestion de la transparence.</para>
  897. <para>La transparence peut être paramétré en utilisant la méthode <classname>Zend_Pdf_Page::setAlpha()</classname> :
  898. <programlisting role="php"><![CDATA[
  899. /**
  900. * Règle la transparence
  901. *
  902. * $alpha == 0 - transparent
  903. * $alpha == 1 - opaque
  904. *
  905. * Transparency modes, supported by PDF:
  906. * Normal (default), Multiply, Screen, Overlay, Darken,
  907. * Lighten, ColorDodge, ColorBurn, HardLight,
  908. * SoftLight, Difference, Exclusion
  909. *
  910. * @param float $alpha
  911. * @param string $mode
  912. * @throws Zend_Pdf_Exception
  913. * @return Zend_Pdf_Page
  914. */
  915. public function setAlpha($alpha, $mode = 'Normal');
  916. ]]></programlisting></para>
  917. </sect2>
  918. </sect1>