1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 21992 -->
4 <sect1 id="zend.pdf.drawing">
5 <title>Dessiner</title>
7 <sect2 id="zend.pdf.drawing.geometry">
8 <title>Géométrie</title>
11 Le format <acronym>PDF</acronym> utilise la même géométrie que le format PostScript. Elle démarre
12 d'en bas à gauche et est mesuré en points (1/72 inch soit 0,352778 mm).
15 <para>La taille d'une page peut-être récupéré depuis un objet page :</para>
18 <programlisting language="php"><![CDATA[
19 $width = $pdfPage->getWidth();
20 $height = $pdfPage->getHeight();
21 ]]></programlisting></para>
24 <sect2 id="zend.pdf.drawing.color">
25 <title>Couleurs</title>
28 Le format <acronym>PDF</acronym> a d'excellentes capacités dans la représentation des couleurs. Le
29 module <classname>Zend_Pdf</classname> supporte les espaces de couleur : niveaux de
30 gris, RGB et CMJN. Chacun d'entre eux peut-être utilisé à chaque fois qu'un objet
31 <classname>Zend_Pdf_Color</classname> est requis. Les classes
32 <classname>Zend_Pdf_Color_GrayScale</classname>,
33 <classname>Zend_Pdf_Color_RGB</classname> et <classname>Zend_Pdf_Color_CMYK</classname>
34 fournissent cette fonctionnalité :
37 <programlisting language="php"><![CDATA[
38 // $grayLevel (float). 0.0 (noir) - 1.0 (blanc)
39 $color1 = new Zend_Pdf_Color_GrayScale($grayLevel);
41 // $r, $g, $b (float).
42 // 0.0 (intensité mimimum) - 1.0 (intensité maximum)
43 $color2 = new Zend_Pdf_Color_RGB($r, $g, $b);
45 // $c, $m, $y, $k (float).
46 // 0.0 (intensité mimimum) - 1.0 (intensité maximum)
47 $color3 = new Zend_Pdf_Color_CMYK($c, $m, $y, $k);
51 Les différentes couleurs HTML sont aussi fourni avec la classe
52 <classname>Zend_Pdf_Color_Html</classname> :
55 <programlisting language="php"><![CDATA[
56 $color1 = new Zend_Pdf_Color_Html('#3366FF');
57 $color2 = new Zend_Pdf_Color_Html('silver');
58 $color3 = new Zend_Pdf_Color_Html('forestgreen');
62 <sect2 id="zend.pdf.drawing.shape-drawing">
63 <title>Dessiner des formes</title>
66 Toutes les opérations de dessins peuvent être réalisées dans le contexte d'une
67 page <acronym>PDF</acronym>.
71 La classe <classname>Zend_Pdf_Page</classname> fournit les outils de dessins
76 <programlisting language="php"><![CDATA[
78 * Dessine une ligne de x1,y1 à x2,y2.
84 * @return Zend_Pdf_Page
86 public function drawLine($x1, $y1, $x2, $y2);
87 ]]></programlisting></para>
89 <programlisting language="php"><![CDATA[
91 * Draw a rounded rectangle.
94 * Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - fill rectangle
96 * Zend_Pdf_Page::SHAPE_DRAW_STROKE - stroke rectangle
97 * Zend_Pdf_Page::SHAPE_DRAW_FILL - fill rectangle
99 * radius is an integer representing radius of the four corners, or an array
100 * of four integers representing the radius starting at top left, going
107 * @param integer|array $radius
108 * @param integer $fillType
109 * @return Zend_Pdf_Page
111 public function drawRoundedRectangle($x1, $y1, $x2, $y2, $radius,
112 $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);
116 <programlisting language="php"><![CDATA[
118 * Dessine un rectangle.
120 * Type de remplissage:
121 * Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE
122 * - remplit le rectangle et dessine le contour (par défaut)
123 * Zend_Pdf_Page::SHAPE_DRAW_STROKE
124 * - trace uniquement le contour du rectangle
125 * Zend_Pdf_Page::SHAPE_DRAW_FILL
126 * - remplit le rectangle
132 * @return Zend_Pdf_Page
133 * @param integer $fillType
134 * @return Zend_Pdf_Page
136 public function drawRectangle(
137 $x1, $y1, $x2, $y2, $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);
138 ]]></programlisting></para>
141 <programlisting language="php"><![CDATA[
143 * Dessine un polygone.
145 * Si $fillType est Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE
146 * ou Zend_Pdf_Page::SHAPE_DRAW_FILL,
147 * le polygone est automatiquement fermé.
148 * Regardez la description détaillée de ces méthodes dans la
149 * documentation du format PDF
150 * (section 4.4.2 Path painting Operators, Filling)
152 * @param array $x - tableau de float (les coordonnés X des sommets)
153 * @param array $y - tableau de float (les coordonnés Y des sommets)
154 * @param integer $fillType
155 * @param integer $fillMethod
156 * @return Zend_Pdf_Page
158 public function drawPolygon(
160 $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE,
161 $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);
162 ]]></programlisting></para>
165 <programlisting language="php"><![CDATA[
167 * Dessine un cercle avec comme centre x, y et comme rayon radius.
169 * Les angles sont en radian
171 * Signatures des méthodes:
172 * drawCircle($x, $y, $radius);
173 * drawCircle($x, $y, $radius, $fillType);
174 * drawCircle($x, $y, $radius, $startAngle, $endAngle);
175 * drawCircle($x, $y, $radius, $startAngle, $endAngle, $fillType);
178 * Ce n'est pas réellement un cercle, car le format supporte
179 * uniquement des courbe de Bezier cubique.
180 * Mais c'est une très bonne approximation.
181 * La différence avec un vrai cercle est de au maximum 0.00026 radians
182 * (avec les angles PI/8, 3*PI/8, 5*PI/8, 7*PI/8, 9*PI/8, 11*PI/8,
183 * 13*PI/8 et 15*PI/8).
184 * Avec les angles 0, PI/4, PI/2, 3*PI/4, PI, 5*PI/4, 3*PI/2 et 7*PI/4
185 * c'est exactement la tangente d'un cercle.
189 * @param float $radius
190 * @param mixed $param4
191 * @param mixed $param5
192 * @param mixed $param6
193 * @return Zend_Pdf_Page
195 public function drawCircle(
196 $x, $y, $radius, $param4 = null, $param5 = null, $param6 = null);
197 ]]></programlisting></para>
200 <programlisting language="php"><![CDATA[
202 * Dessine une ellipse dans le rectangle spécifié.
204 * Signatures des méthodes:
205 * drawEllipse($x1, $y1, $x2, $y2);
206 * drawEllipse($x1, $y1, $x2, $y2, $fillType);
207 * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
208 * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle, $fillType);
210 * Les angles sont en radians
216 * @param mixed $param5
217 * @param mixed $param6
218 * @param mixed $param7
219 * @return Zend_Pdf_Page
221 public function drawEllipse(
222 $x1, $y1, $x2, $y2, $param5 = null, $param6 = null, $param7 = null);
223 ]]></programlisting></para>
226 <sect2 id="zend.pdf.drawing.text-drawing">
227 <title>Dessiner du texte</title>
230 Les opérations de dessins existent bien sûr dans le contexte d'une page <acronym>PDF</acronym>. Vous
231 pouvez dessiner une seule ligne de texte à n'importe quelle endroit dans la page en
232 fournissant les coordonnées x et y de la ligne de base. La police courant ainsi que sa
233 taille seront utilisées pour le dessin (voir la description ci-dessous).
237 <programlisting language="php"><![CDATA[
239 * Dessine une ligne de texte à la position x,y.
241 * @param string $text
244 * @param string $charEncoding (optionnel) encodage des caractères du texte.
245 * Par défaut le réglage système est utilisé.
246 * @throws Zend_Pdf_Exception
247 * @return Zend_Pdf_Page
249 public function drawText($text, $x, $y, $charEncoding = '');
250 ]]></programlisting></para>
252 <example id="zend.pdf.drawing.text-drawing.example-1">
253 <title>Dessiner une ligne dans la page</title>
255 <programlisting language="php"><![CDATA[
257 $pdfPage->drawText('Bonjour le monde!', 72, 720);
263 Par défaut, les chaînes de texte sont interprétées en utilisant l'encodage du
264 système. Si vous avez une chaîne qui utilise un encodage différent (comme les chaînes
265 UTF-8 lues depuis une fichier sur le disque, ou une chaîne MacRoman obtenue depuis une
266 base de données), vous pouvez indiquer l'encodage au moment du dessin et Zend_Pdf gérera
267 la conversion pour vous. Vous pouvez fournir des chaînes dans n'importe quel encodage
268 supporté par la fonction <code><ulink
269 url="http://www.php.net/manual/function.iconv.php">iconv()</ulink></code> de <acronym>PHP</acronym>:
272 <example id="zend.pdf.drawing.text-drawing.example-2">
273 <title>Dessiner une chaîne UTF-8 sur une page</title>
275 <programlisting language="php"><![CDATA[
277 // Lit une chaîne UTF-8 à partir du disque
278 $unicodeString = fread($fp, 1024);
280 // Dessine une chaîne dans la page
281 $pdfPage->drawText($unicodeString, 72, 720, 'UTF-8');
287 <sect2 id="zend.pdf.drawing.using-fonts">
288 <title>Utiliser des polices de caractères</title>
291 <methodname>Zend_Pdf_Page::drawText()</methodname> utilise la police courante ainsi
292 que sa taille, qui sont définies avec la méthode
293 <methodname>Zend_Pdf_Page::setFont()</methodname> :
297 <programlisting language="php"><![CDATA[
299 * Choisit la police courante.
301 * @param Zend_Pdf_Resource_Font $font
302 * @param float $fontSize
303 * @return Zend_Pdf_Page
305 public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);
306 ]]></programlisting></para>
309 Les documents <acronym>PDF</acronym> supportent PostScript Type 1 et les polices TrueType, mais
310 également deux types spécifiques <acronym>PDF</acronym>, Type3 et les polices composites. Il y a aussi 14
311 polices Type 1 standard intégré dans tout lecteur de <acronym>PDF</acronym> : Courier (4 styles), Helvetica
312 (4 styles), Times (4 styles), Symbol, et Zapf Dingbats.
316 Zend_Pdf supporte actuellement les 14 polices standard mais également vos propres
317 police TrueType. Les objets de police obtenus via une des deux fabriques méthodes :
318 <methodname>Zend_Pdf_Font::fontWithName($fontName)</methodname> pour les 14 polices <acronym>PDF</acronym>
319 standard ou <methodname>Zend_Pdf_Font::fontWithPath($filePath)</methodname> pour les
320 polices personnalisées.
323 <example id="zend.pdf.drawing.using-fonts.example-1">
324 <title>Créer une police standard</title>
326 <programlisting language="php"><![CDATA[
328 // Crée une nouvelle police
329 $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
331 // Applique la police
332 $pdfPage->setFont($font, 36);
338 Les constantes pour les 14 polices standard sont définis dans la classe
339 <classname>Zend_Pdf_Font</classname> : <itemizedlist>
341 <para>Zend_Pdf_Font::FONT_COURIER</para>
345 <para>Zend_Pdf_Font::FONT_COURIER_BOLD</para>
349 <para>Zend_Pdf_Font::FONT_COURIER_ITALIC</para>
353 <para>Zend_Pdf_Font::FONT_COURIER_BOLD_ITALIC</para>
357 <para>Zend_Pdf_Font::FONT_TIMES</para>
361 <para>Zend_Pdf_Font::FONT_TIMES_BOLD</para>
365 <para>Zend_Pdf_Font::FONT_TIMES_ITALIC</para>
369 <para>Zend_Pdf_Font::FONT_TIMES_BOLD_ITALIC</para>
373 <para>Zend_Pdf_Font::FONT_HELVETICA</para>
377 <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD</para>
381 <para>Zend_Pdf_Font::FONT_HELVETICA_ITALIC</para>
385 <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD_ITALIC</para>
389 <para>Zend_Pdf_Font::FONT_SYMBOL</para>
393 <para>Zend_Pdf_Font::FONT_ZAPFDINGBATS</para>
399 Vous pouvez aussi prendre n'importe quelle police TrueType (extension habituelle
400 ".ttf") ou OpenType (".otf") si elles ont une silhouette TrueType. Pour l'instant non
401 supportée, les polices Mac Os X ".dfont" et les collections TrueType Microsoft (".ttc")
402 seront intégrées dans une version future.
406 Pour utiliser une police TrueType, vous devez fournir le chemin de fichier complet
407 vers cette police. Si la police ne peut pas être lue pour une quelconque raison, ou si
408 ce n'est pas une police TrueType, la méthode lèvera une exception :
411 <example id="zend.pdf.drawing.using-fonts.example-2">
412 <title>Créer une police TrueType</title>
414 <programlisting language="php"><![CDATA[
416 // Crée la nouvelle police
417 $goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/chemin/vers/GOODDC__.TTF');
419 // Applique cette police
420 $pdfPage->setFont($goodDogCoolFont, 36);
426 Par défaut, les polices personnalisées seront incorporées dans le document <acronym>PDF</acronym>
427 résultant. Cela permet aux destinataires de voir la page comme prévu, même s'ils ne font
428 pas installer les polices appropriées sur leur système. En cas de problème avec la
429 taille du fichier généré, vous pouvez demander que la police ne soit pas incorporé en
430 passant l'option 'ne pas inclure' à la méthode de création :
433 <example id="zend.pdf.drawing.using-fonts.example-3">
434 <title>Créer une police TrueType sans l'incorporer dans le document PDF</title>
436 <programlisting language="php"><![CDATA[
438 // Crée la nouvelle police
440 Zend_Pdf_Font::fontWithPath('/chemin/vers/GOODDC__.TTF',
441 Zend_Pdf_Font::EMBED_DONT_EMBED);
443 // Applique cette police
444 $pdfPage->setFont($goodDogCoolFont, 36);
450 Si les polices ne sont pas incorporées mais que le destinataire du fichier <acronym>PDF</acronym> a
451 ces polices installées sur son système, il verra le document comme prévu. Si la police
452 correcte n'est pas installée, l'application de visualisation du <acronym>PDF</acronym> fera de son mieux
453 pour synthétiser une police de remplacement.
457 Quelques polices ont les règles de licence très spécifiques qui les empêchent
458 d'être incorporées dans des documents <acronym>PDF</acronym>. Donc vous devez faire attention, si vous
459 essayez d'utiliser une police qui ne peut pas être incorporée, la méthode de création
460 lèvera une exception.
464 Vous pouvez toujours utiliser ces polices, mais vous devez passer le paramètre 'ne
465 pas inclure' comme décrit ci-dessous, ou vous pouvez simplement bloquer l'exception
469 <example id="zend.pdf.drawing.using-fonts.example-4">
470 <title>Ne pas lever d'exception pour les polices ne pouvant être incorporées</title>
472 <programlisting language="php"><![CDATA[
475 Zend_Pdf_Font::fontWithPath('/chemin/vers/PoliceNonIncorporable.ttf',
476 Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION);
482 Cette technique de suppression est préférée si vous permettez aux utilisateurs de
483 choisir leurs propres polices. Les polices qui peuvent être incorporées dans le document
484 <acronym>PDF</acronym> le seront ; les autres ne le seront pas.
488 Les fichiers de police peuvent être assez grands, certains peuvent atteindre des
489 dizaines de méga-octets. Par défaut, toutes les polices incorporées sont comprimées en
490 utilisant le schéma de compression Flate, ayant pour résultat un gain d'espace de 50% en
491 moyenne. Si, pour une quelconque raison, vous ne voulez pas comprimer la police, vous
492 pouvez le neutraliser avec une option :
495 <example id="zend.pdf.drawing.using-fonts.example-5">
496 <title>Ne pas compresser une police incorporée</title>
498 <programlisting language="php"><![CDATA[
501 Zend_Pdf_Font::fontWithPath('/chemin/vers/PoliceDeGrandeTaille.ttf',
502 Zend_Pdf_Font::EMBED_DONT_COMPRESS);
508 En conclusion, si nécessaire, vous pouvez combiner les options d'incorporation en
509 employant l'opérateur binaire OR :
512 <example id="zend.pdf.drawing.using-fonts.example-6">
513 <title>Combiner les options de polices incorporées</title>
515 <programlisting language="php"><![CDATA[
517 $font = Zend_Pdf_Font::fontWithPath(
518 $cheminVersPoliceQuelconque,
519 (Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION |
520 Zend_Pdf_Font::EMBED_DONT_COMPRESS));
526 <sect2 id="zend.pdf.drawing.standard-fonts-limitations">
527 <title>Limitations des polices standard PDF</title>
530 Les polices standard <acronym>PDF</acronym> emploient en interne plusieurs encodages sur un seul
532 url="http://www.adobe.com/devnet/acrobat/pdfs/pdf_reference_1-7.pdf">PDF Reference,
533 Sixth Edition, version 1.7</ulink> - Annexe D pour plus de détails). Elles sont
534 généralement avec un jeu de caractère de type Latin1(excepté les polices Symbol and
539 <classname>Zend_Pdf</classname> utilise l'encodage CP1252 (WinLatin1) pour tracer
540 les textes avec les polices standard.
544 Le texte peut encore être fourni dans n'importe quel autre encodage, qui doit être
545 spécifié s'il diffère de celui en cours. Seulement les caractères WinLatin1 seront
549 <example id="zend.pdf.drawing.using-fonts.example-7">
550 <title>Combiner les options de polices embarqués</title>
552 <programlisting language="php"><![CDATA[
554 $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_COURIER);
555 $pdfPage->setFont($font, 36)
556 ->drawText('Euro sign - €', 72, 720, 'UTF-8')
557 ->drawText('Text with umlauts - à è ì', 72, 650, 'UTF-8');
563 <sect2 id="zend.pdf.drawing.extracting-fonts">
564 <title>Extraction des polices</title>
567 Depuis la version 1.5, <classname>Zend_Pdf</classname> fournit la possibilité
568 d'extraire les polices des documents chargés.
572 Ceci peut être utile lors des mises à jour de document avec ajout de texte. Sans
573 cette fonctionnalité vous devez attacher et probablement intégrer la police dans le
574 document chaque fois que vous voulez le mettre à jour.
578 Les objets <classname>Zend_Pdf</classname> et <classname>Zend_Pdf_Page</classname>
579 fournissent une méthode spéciale pour extraire toutes les polices mentionnés à
580 l'intérieur d'un document ou d'une page :
583 <example id="zend.pdf.drawing.extracting-fonts.example-1">
584 <title>Extraction de polices à partir d'un document chargé</title>
586 <programlisting language="php"><![CDATA[
588 $pdf = Zend_Pdf::load($cheminVersDocument);
590 // Récupère toutes les polices du document
591 $listePolice = $pdf->extractFonts();
592 $pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));
594 foreach ($listePolice as $police) {
595 $page->setFont($police, 15);
597 $police->getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT, 'fr', 'UTF-8')
598 . ': Le renard brun rapide saute par-dessus le chien paresseux',
605 // Récupère toutes les polices référencées dans la première page du document
606 $firstPage = reset($pdf->pages);
607 $firstPageFonts = $firstPage->extractFonts();
612 <example id="zend.pdf.drawing.extracting-fonts.example-2">
613 <title>Extraction d'une police à partir d'un document chargé en spécifiant le nom de
616 <programlisting language="php"><![CDATA[
618 $pdf = new Zend_Pdf();
620 $pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));
622 $police = Zend_Pdf_Font::fontWithPath($cheminVersPolices);
623 $page->setFont($police, $taillePolice);
624 $page->drawText($texte, $x, $y);
626 // Ce nom de police peut être stocké quelquepart...
627 $fontName = $font->getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT, 'fr', 'UTF-8');
629 $pdf->save($cheminVersDocument);
633 <programlisting language="php"><![CDATA[
635 $pdf = Zend_Pdf::load($cheminVersDocument);
637 $pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));
639 $police = $pdf->extractFont($nomPolice);
640 /* $pageSource->extractFont($nomPolice) peut aussi être utilisé ici */
641 $page->setFont($police, $taillePolice);
642 $page->drawText($texte, $x, $y);
644 $pdf->save($cheminVersDocument, true /* mise à jour de type incrémental */);
650 Les polices extraites peuvent être utilisées à la place de n'importe quelle autre
651 police avec les limitations suivantes : <itemizedlist>
654 La police extraite peut être employée seulement dans le cadre du
655 document à partir duquel elle a été extraite.
661 Les possibles programmes de polices incorporées ne sont pas extraits
662 réellement. La police ainsi extraite ne peut pas fournir la métrique
663 correcte de police et la police originale doit être utilisée pour les
664 calculs de largeur des textes : <programlisting language="php"><![CDATA[
666 $police = $pdf->extractFont($fontName);
667 $policeOriginal = Zend_Pdf_Font::fontWithPath($cheminVersPolices);
669 /* utilisation d'une police extraite */
670 $page->setFont($police, $taillePolice);
672 for ($charIndex = 0; $charIndex < strlen($text); $charIndex++) {
673 $page->drawText($text[$charIndex], $xPosition, $y);
675 // Use original font for text width calculation
676 $width = $originalFont->widthForGlyph(
677 $originalFont->glyphNumberForCharacter($text[$charIndex])
679 $xPosition += $width / $originalFont->getUnitsPerEm() * $taillePolice;
682 ]]></programlisting></para>
688 <sect2 id="zend.pdf.drawing.image-drawing">
689 <title>Insertion d'images</title>
692 La classe <classname>Zend_Pdf_Page</classname> fournis la méthode
693 <methodname>drawImage()</methodname> pour dessiner une image :
697 <programlisting language="php"><![CDATA[
699 * Insère une image à la position spécifiée dans la page
701 * @param Zend_Pdf_Resource_Image $image
706 * @return Zend_Pdf_Page
708 public function drawImage(Zend_Pdf_Resource_Image $image, $x1, $y1, $x2, $y2);
709 ]]></programlisting></para>
712 Les objets Image peuvent être créés avec la méthode
713 <methodname>Zend_Pdf_Image::imageWithPath($filePath)</methodname> (les images JPG, PNG et
714 TIFF sont maintenant supportées) :
717 <example id="zend.pdf.drawing.image-drawing.example-1">
718 <title>Insertion d'images</title>
720 <programlisting language="php"><![CDATA[
723 $image = Zend_Pdf_Image::imageWithPath('mon_image.jpg');
725 $pdfPage->drawImage($image, 100, 100, 400, 300);
731 <emphasis>Important ! Le support JPEG nécessite que l'extension <acronym>PHP</acronym> GD soit
732 installé.</emphasis> <emphasis>Important ! Le support PNG nécessite que l'extension ZLIB
733 soit configuré pour accepter les images avec canaux Alpha.</emphasis>
737 Lisez la documentation de <acronym>PHP</acronym> pour plus d'informations (<ulink
738 url="http://www.php.net/manual/fr/ref.image.php">http://www.php.net/manual/fr/ref.image.php</ulink>
740 url="http://www.php.net/manual/fr/ref.zlib.php">http://www.php.net/manual/fr/ref.zlib.php</ulink>).
744 <sect2 id="zend.pdf.drawing.line-drawing-style">
745 <title>Style de lignes</title>
748 Le style de ligne est définit par l'épaisseur, la couleur et le style de tiret.
749 Tout ces paramètres peuvent être assignés par les méthodes de la classe
750 <classname>Zend_Pdf_Page</classname> :
754 <programlisting language="php"><![CDATA[
755 /** Choisit la couleur de ligne. */
756 public function setLineColor(Zend_Pdf_Color $color);
758 /** Choisit l'épaisseur de ligne. */
759 public function setLineWidth(float $width);
762 * Choisit le modèle de tiret.
764 * modele est un tableau de floats: array(longueur_visible,
765 * longueur_invisible, longueur_visible, longueur_invisible,
767 * phase est le décalage à partir du début de la ligne.
769 * @param array $modele
770 * @param array $phase
771 * @return Zend_Pdf_Page
773 public function setLineDashingPattern($pattern, $phase = 0);
774 ]]></programlisting></para>
777 <sect2 id="zend.pdf.drawing.fill-style">
778 <title>Style de remplissage</title>
781 Les méthodes <methodname>Zend_Pdf_Page::drawRectangle()</methodname>,
782 <methodname>Zend_Pdf_Page::drawPoligon()</methodname>,
783 <methodname>Zend_Pdf_Page::drawCircle()</methodname> et
784 <methodname>Zend_Pdf_Page::drawEllipse()</methodname> prennent en argument optionnel le
785 type de remplissage: <varname>$fillType</varname>. Il peut être :
790 <para>Zend_Pdf_Page::SHAPE_DRAW_STROKE - trace le contour de la forme</para>
794 <para>Zend_Pdf_Page::SHAPE_DRAW_FILL - remplit uniquement la forme</para>
799 Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - remplissage et contour (par
806 La méthode <methodname>Zend_Pdf_Page::drawPoligon()</methodname> prend aussi
807 paramètre supplémentaire <varname>$fillMethod</varname> :
813 $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING (par
818 La <citetitle>référence du format <acronym>PDF</acronym></citetitle> décrit la règle comme
821 The nonzero winding number rule determines whether a given point
822 is inside a path by conceptually drawing a ray from that point to
823 infinity in any direction and then examining the places where a segment
824 of the path crosses the ray. Starting with a count of 0, the rule adds 1
825 each time a path segment crosses the ray from left to right and
826 subtracts 1 each time a segment crosses from right to left. After
827 counting all the crossings, if the result is 0 then the point is outside
828 the path; otherwise it is inside. Note: The method just described does
829 not specify what to do if a path segment coincides with or is tangent to
830 the chosen ray. Since the direction of the ray is arbitrary, the rule
831 simply chooses a ray that does not encounter such problem intersections.
832 For simple convex paths, the nonzero winding number rule defines the
833 inside and outside as one would intuitively expect. The more interesting
834 cases are those involving complex or self-intersecting paths like the
835 ones shown in Figure 4.10 (in a <acronym>PDF</acronym> Reference). For a path consisting of
836 a five-pointed star, drawn with five connected straight line segments
837 intersecting each other, the rule considers the inside to be the entire
838 area enclosed by the star, including the pentagon in the center. For a
839 path composed of two concentric circles, the areas enclosed by both
840 circles are considered to be inside, provided that both are drawn in the
841 same direction. If the circles are drawn in opposite directions, only
842 the "doughnut" shape between them is inside, according to the rule; the
843 "doughnut hole" is outside.
850 <para>Zend_Pdf_Page::FILL_METHOD_EVEN_ODD</para>
853 La <citetitle>référence du format <acronym>PDF</acronym></citetitle> décrit la règle comme
856 An alternative to the nonzero winding number rule is the even-odd
857 rule. This rule determines the "insideness" of a point by drawing a ray
858 from that point in any direction and simply counting the number of path
859 segments that cross the ray, regardless of direction. If this number is
860 odd, the point is inside; if even, the point is outside. This yields the
861 same results as the nonzero winding number rule for paths with simple
862 shapes, but produces different results for more complex shapes. Figure
863 4.11 (in a <acronym>PDF</acronym> Reference) shows the effects of applying the even-odd
864 rule to complex paths. For the five-pointed star, the rule considers the
865 triangular points to be inside the path, but not the pentagon in the
866 center. For the two concentric circles, only the "doughnut" shape
867 between the two circles is considered inside, regardless of the
868 directions in which the circles are drawn.
876 <sect2 id="zend.pdf.drawing.linear-transformations">
877 <title>Transformations linéaires</title>
879 <sect3 id="zend.pdf.drawing.linear-transformations.rotations">
880 <title>Rotations</title>
883 La page <acronym>PDF</acronym> page peut être tourné avant d'appliquer toute opération de dessin.
884 Ceci peut être fait avec la méthode <methodname>Zend_Pdf_Page::rotate()</methodname>
888 <programlisting language="php"><![CDATA[
890 * Rotation de la page
892 * @param float $x - la coordonnée X du point de rotation
893 * @param float $y - la coordonnée X du point de rotation
894 * @param float $angle - angle de rotation
895 * @return Zend_Pdf_Page
897 public function rotate($x, $y, $angle);
901 <sect3 id="zend.pdf.drawing.linear-transformations.scale">
902 <title>A partir de Zend Framework 1.8, mise à l'échelle</title>
905 La mise à l'échelle est fournie par la méthode
906 <methodname>Zend_Pdf_Page::scale()</methodname> :
909 <programlisting language="php"><![CDATA[
913 * @param float $xScale - X dimention scale factor
914 * @param float $yScale - Y dimention scale factor
915 * @return Zend_Pdf_Page
917 public function scale($xScale, $yScale);
921 <sect3 id="zend.pdf.drawing.linear-transformations.translate">
922 <title>A partir de Zend Framework 1.8, décalage</title>
925 Le décalage du système de coordonnées est réalisé par la méthode
926 <methodname>Zend_Pdf_Page::translate()</methodname> :
929 <programlisting language="php"><![CDATA[
931 * Décalage du système de coordonnées
933 * @param float $xShift - coordonnées X du décalage
934 * @param float $yShift - coordonnées Y du décalage
935 * @return Zend_Pdf_Page
937 public function translate($xShift, $yShift);
941 <sect3 id="zend.pdf.drawing.linear-transformations.skew">
942 <title>A partir de Zend Framework 1.8, mise en biais</title>
945 La mise en biais de la page peut être réalisé par la méthode
946 <methodname>Zend_Pdf_Page::skew()</methodname> :
949 <programlisting language="php"><![CDATA[
951 * Mise en biais du système de coordonnées
953 * @param float $x - the X co-ordinate of axis skew point
954 * @param float $y - the Y co-ordinate of axis skew point
955 * @param float $xAngle - X axis skew angle
956 * @param float $yAngle - Y axis skew angle
957 * @return Zend_Pdf_Page
959 public function skew($x, $y, $xAngle, $yAngle);
964 <sect2 id="zend.pdf.drawing.save-restore">
965 <title>Sauvegarder et restaurer l'état graphique</title>
968 L'état graphique (police courante, taille de caractère, couleur de ligne, couleur
969 de remplissage, style de ligne, sens de la page, zone de dessin) peut-être sauvegarder à
970 tout moment. L'opération de sauvegarde empile le contexte dans une pile de contexte
971 graphique, l'opération de restauration récupère le contexte depuis la pile.
975 Il y a deux méthodes dans la classe <classname>Zend_Pdf_Page</classname> pour
976 réaliser ces opérations :
980 <programlisting language="php"><![CDATA[
982 * Sauvegarde l'état graphique de la page.
983 * Cela prend un instantané des styles courants, des zones de dessins
984 * et de toutes les rotations/translations/changements de taille appliqués.
986 * @return Zend_Pdf_Page
988 public function saveGS();
991 * Restaure le dernier état graphique sauvegarder avec saveGS().
993 * @return Zend_Pdf_Page
995 public function restoreGS();
996 ]]></programlisting></para>
999 <sect2 id="zend.pdf.drawing.clipping">
1000 <title>Zone de dessin</title>
1003 Le format <acronym>PDF</acronym> et le module Zend_Pdf supporte le découpage de la zone de dessin. La
1004 zone de dessin courante limite la zone de la page affectée par l'utilisation des
1005 opérateurs de dessins. Initialement c'est toute la page.
1009 La classe <classname>Zend_Pdf_Page</classname> fournit des méthodes pour les
1010 opérations de découpage.
1014 <programlisting language="php"><![CDATA[
1016 * Découpe la zone courante avec un rectangle.
1022 * @return Zend_Pdf_Page
1024 public function clipRectangle($x1, $y1, $x2, $y2);
1025 ]]></programlisting></para>
1028 <programlisting language="php"><![CDATA[
1030 * Découpe la zone courante avec un polygone.
1032 * @param array $x - tableau de float (les coordonnées X des sommets)
1033 * @param array $y - tableau de float (les coordonnées Y des sommets)
1034 * @param integer $fillMethod
1035 * @return Zend_Pdf_Page
1037 public function clipPolygon(
1038 $x, $y, $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);
1039 ]]></programlisting></para>
1042 <programlisting language="php"><![CDATA[
1044 * Découpe la zone courante avec un cercle.
1048 * @param float $radius
1049 * @param float $startAngle
1050 * @param float $endAngle
1051 * @return Zend_Pdf_Page
1053 public function clipCircle(
1054 $x, $y, $radius, $startAngle = null, $endAngle = null);
1055 ]]></programlisting></para>
1058 <programlisting language="php"><![CDATA[
1060 * Découpe la zone courante avec une ellipse.
1062 * Signatures des méthodes:
1063 * drawEllipse($x1, $y1, $x2, $y2);
1064 * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
1066 * @todo s'occuper des cas spéciaux avec $x2-$x1 == 0 ou $y2-$y1 == 0
1072 * @param float $startAngle
1073 * @param float $endAngle
1074 * @return Zend_Pdf_Page
1076 public function clipEllipse(
1077 $x1, $y1, $x2, $y2, $startAngle = null, $endAngle = null);
1078 ]]></programlisting></para>
1081 <sect2 id="zend.pdf.drawing.styles">
1082 <title>Styles</title>
1085 La classe <classname>Zend_Pdf_Style</classname> fournit les fonctionnalités de
1090 Les styles peuvent être utilisés pour stocker des paramètre d'état graphique et de
1091 les appliquer à une page <acronym>PDF</acronym> en une seule opération :
1095 <programlisting language="php"><![CDATA[
1097 * Choisit le style à utiliser pour les futures opérations
1098 * de dessin sur cette page
1100 * @param Zend_Pdf_Style $style
1101 * @return Zend_Pdf_Page
1103 public function setStyle(Zend_Pdf_Style $style);
1106 * Renvoie le style appliqué à la page.
1108 * @return Zend_Pdf_Style|null
1110 public function getStyle();
1111 ]]></programlisting></para>
1114 La classe <classname>Zend_Pdf_Style</classname> fournit des méthodes pour choisir
1115 ou récupérer différents paramètres de l'état graphique :
1119 <programlisting language="php"><![CDATA[
1121 * Choisit la couleur de ligne.
1123 * @param Zend_Pdf_Color $color
1124 * @return Zend_Pdf_Page
1126 public function setLineColor(Zend_Pdf_Color $color);
1127 ]]></programlisting></para>
1130 <programlisting language="php"><![CDATA[
1132 * Récupère la couleur de ligne.
1134 * @return Zend_Pdf_Color|null
1135 * @return Zend_Pdf_Page
1137 public function getLineColor();
1138 ]]></programlisting></para>
1141 <programlisting language="php"><![CDATA[
1143 * Choisit l'épaisseur de ligne.
1145 * @param float $width
1146 * @return Zend_Pdf_Page
1148 public function setLineWidth($width);
1149 ]]></programlisting></para>
1152 <programlisting language="php"><![CDATA[
1154 * Récupère l'épaisseur de ligne.
1157 * @return Zend_Pdf_Page
1159 public function getLineWidth($width);
1160 ]]></programlisting></para>
1163 <programlisting language="php"><![CDATA[
1165 * Choisit le style de tiret
1167 * @param array $pattern
1168 * @param float $phase
1169 * @return Zend_Pdf_Page
1171 public function setLineDashingPattern($pattern, $phase = 0);
1172 ]]></programlisting></para>
1175 <programlisting language="php"><![CDATA[
1177 * Récupère le style de tiret
1181 public function getLineDashingPattern();
1182 ]]></programlisting></para>
1185 <programlisting language="php"><![CDATA[
1187 * Récupère le modèle de tiret
1191 public function getLineDashingPhase();
1192 ]]></programlisting></para>
1195 <programlisting language="php"><![CDATA[
1197 * Choisit la couleur de remplissage.
1199 * @param Zend_Pdf_Color $color
1200 * @return Zend_Pdf_Page
1202 public function setFillColor(Zend_Pdf_Color $color);
1203 ]]></programlisting></para>
1206 <programlisting language="php"><![CDATA[
1208 * Récupère la couleur de remplissage.
1210 * @return Zend_Pdf_Color|null
1212 public function getFillColor();
1213 ]]></programlisting></para>
1216 <programlisting language="php"><![CDATA[
1218 * Choisit la police.
1220 * @param Zend_Pdf_Font $font
1221 * @param Zend_Pdf_Resource_Font $font
1222 * @param float $fontSize
1224 public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);
1225 ]]></programlisting></para>
1228 <programlisting language="php"><![CDATA[
1230 * Modifie la taille de police.
1232 * @param float $fontSize
1233 * @return Zend_Pdf_Page
1235 public function setFontSize($fontSize);
1236 ]]></programlisting></para>
1239 <programlisting language="php"><![CDATA[
1241 * Récupère la police courante
1243 * @return Zend_Pdf_Resource_Font $font
1245 public function getFont();
1246 ]]></programlisting></para>
1249 <programlisting language="php"><![CDATA[
1251 * Récupère la taille de la police
1253 * @return float $fontSize
1255 public function getFontSize();
1256 ]]></programlisting></para>
1259 <sect2 id="zend.pdf.drawing.alpha">
1260 <title>Transparence</title>
1263 Le module <classname>Zend_Pdf</classname> supporte la gestion de la
1268 La transparence peut être paramétré en utilisant la méthode
1269 <methodname>Zend_Pdf_Page::setAlpha()</methodname> : <programlisting language="php"><![CDATA[
1271 * Règle la transparence
1273 * $alpha == 0 - transparent
1274 * $alpha == 1 - opaque
1276 * Transparency modes, supported by PDF:
1277 * Normal (default), Multiply, Screen, Overlay, Darken,
1278 * Lighten, ColorDodge, ColorBurn, HardLight,
1279 * SoftLight, Difference, Exclusion
1281 * @param float $alpha
1282 * @param string $mode
1283 * @throws Zend_Pdf_Exception
1284 * @return Zend_Pdf_Page
1286 public function setAlpha($alpha, $mode = 'Normal');
1287 ]]></programlisting></para>