[ZF-10089] Zend_Log
[zend.git] / documentation / manual / fr / module_specs / Zend_Pdf-Drawing.xml
blob8d3d64e8f4dba188ce4f08b1ab1a6e33a3ed1dd4
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 21992 -->
3 <!-- Reviewed: no -->
4 <sect1 id="zend.pdf.drawing">
5     <title>Dessiner</title>
7     <sect2 id="zend.pdf.drawing.geometry">
8         <title>Géométrie</title>
10         <para>
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).
13         </para>
15         <para>La taille d'une page peut-être récupéré depuis un objet page :</para>
17         <para>
18             <programlisting language="php"><![CDATA[
19 $width  = $pdfPage->getWidth();
20 $height = $pdfPage->getHeight();
21 ]]></programlisting></para>
22         </sect2>
24         <sect2 id="zend.pdf.drawing.color">
25             <title>Couleurs</title>
27         <para>
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é :
35         </para>
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);
48 ]]></programlisting>
50         <para>
51             Les différentes couleurs HTML sont aussi fourni avec la classe
52             <classname>Zend_Pdf_Color_Html</classname> :
53         </para>
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');
59 ]]></programlisting>
60     </sect2>
62     <sect2 id="zend.pdf.drawing.shape-drawing">
63         <title>Dessiner des formes</title>
65         <para>
66             Toutes les opérations de dessins peuvent être réalisées dans le contexte d'une
67             page <acronym>PDF</acronym>.
68         </para>
70         <para>
71             La classe <classname>Zend_Pdf_Page</classname> fournit les outils de dessins
72             :
73         </para>
75         <para>
76             <programlisting language="php"><![CDATA[
77 /**
78  * Dessine une ligne de x1,y1 à x2,y2.
79  *
80  * @param float $x1
81  * @param float $y1
82  * @param float $x2
83  * @param float $y2
84  * @return Zend_Pdf_Page
85  */
86 public function drawLine($x1, $y1, $x2, $y2);
87 ]]></programlisting></para>
89          <programlisting language="php"><![CDATA[
90  /**
91  * Draw a rounded rectangle.
92  *
93  * Fill types:
94  * Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - fill rectangle
95                                                and stroke (default)
96  * Zend_Pdf_Page::SHAPE_DRAW_STROKE      - stroke rectangle
97  * Zend_Pdf_Page::SHAPE_DRAW_FILL        - fill rectangle
98  *
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
101  * clockwise
103  * @param float $x1
104  * @param float $y1
105  * @param float $x2
106  * @param float $y2
107  * @param integer|array $radius
108  * @param integer $fillType
109  * @return Zend_Pdf_Page
110  */
111 public function drawRoundedRectangle($x1, $y1, $x2, $y2, $radius,
112                        $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);
113 ]]></programlisting>
115         <para>
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
128  * @param float $x1
129  * @param float $y1
130  * @param float $x2
131  * @param float $y2
132  * @return Zend_Pdf_Page
133  * @param integer $fillType
134  * @return Zend_Pdf_Page
135  */
136 public function drawRectangle(
137     $x1, $y1, $x2, $y2, $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);
138 ]]></programlisting></para>
140         <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
157  */
158 public function drawPolygon(
159     $x, $y,
160     $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE,
161     $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);
162 ]]></programlisting></para>
164         <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.
187  * @param float $x
188  * @param float $y
189  * @param float $radius
190  * @param mixed $param4
191  * @param mixed $param5
192  * @param mixed $param6
193  * @return Zend_Pdf_Page
194  */
195 public function drawCircle(
196     $x, $y, $radius, $param4 = null, $param5 = null, $param6 = null);
197 ]]></programlisting></para>
199         <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
212  * @param float $x1
213  * @param float $y1
214  * @param float $x2
215  * @param float $y2
216  * @param mixed $param5
217  * @param mixed $param6
218  * @param mixed $param7
219  * @return Zend_Pdf_Page
220  */
221 public function drawEllipse(
222     $x1, $y1, $x2, $y2, $param5 = null, $param6 = null, $param7 = null);
223 ]]></programlisting></para>
224         </sect2>
226         <sect2 id="zend.pdf.drawing.text-drawing">
227             <title>Dessiner du texte</title>
229         <para>
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).
234         </para>
236         <para>
237             <programlisting language="php"><![CDATA[
239  * Dessine une ligne de texte à la position x,y.
241  * @param string $text
242  * @param float $x
243  * @param float $y
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
248  */
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);
259 ]]></programlisting>
260             </example>
262         <para>
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>:
270         </para>
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');
283 ]]></programlisting>
284         </example>
285     </sect2>
287     <sect2 id="zend.pdf.drawing.using-fonts">
288         <title>Utiliser des polices de caractères</title>
290         <para>
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> :
294         </para>
296         <para>
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
304  */
305 public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);
306 ]]></programlisting></para>
308         <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.
313         </para>
315         <para>
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.
321         </para>
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);
334 ]]></programlisting>
335         </example>
337         <para>
338             Les constantes pour les 14 polices standard sont définis dans la classe
339             <classname>Zend_Pdf_Font</classname> : <itemizedlist>
340                     <listitem>
341                         <para>Zend_Pdf_Font::FONT_COURIER</para>
342                     </listitem>
344                     <listitem>
345                         <para>Zend_Pdf_Font::FONT_COURIER_BOLD</para>
346                     </listitem>
348                     <listitem>
349                         <para>Zend_Pdf_Font::FONT_COURIER_ITALIC</para>
350                     </listitem>
352                     <listitem>
353                         <para>Zend_Pdf_Font::FONT_COURIER_BOLD_ITALIC</para>
354                     </listitem>
356                     <listitem>
357                         <para>Zend_Pdf_Font::FONT_TIMES</para>
358                     </listitem>
360                     <listitem>
361                         <para>Zend_Pdf_Font::FONT_TIMES_BOLD</para>
362                     </listitem>
364                     <listitem>
365                         <para>Zend_Pdf_Font::FONT_TIMES_ITALIC</para>
366                     </listitem>
368                     <listitem>
369                         <para>Zend_Pdf_Font::FONT_TIMES_BOLD_ITALIC</para>
370                     </listitem>
372                     <listitem>
373                         <para>Zend_Pdf_Font::FONT_HELVETICA</para>
374                     </listitem>
376                     <listitem>
377                         <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD</para>
378                     </listitem>
380                     <listitem>
381                         <para>Zend_Pdf_Font::FONT_HELVETICA_ITALIC</para>
382                     </listitem>
384                     <listitem>
385                         <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD_ITALIC</para>
386                     </listitem>
388                     <listitem>
389                         <para>Zend_Pdf_Font::FONT_SYMBOL</para>
390                     </listitem>
392                     <listitem>
393                         <para>Zend_Pdf_Font::FONT_ZAPFDINGBATS</para>
394                     </listitem>
395                 </itemizedlist>
396             </para>
398         <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.
403         </para>
405         <para>
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 :
409         </para>
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);
422 ]]></programlisting>
423         </example>
425         <para>
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 :
431         </para>
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
439 $goodDogCoolFont =
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);
446 ]]></programlisting>
447         </example>
449         <para>
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.
454         </para>
456         <para>
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.
461         </para>
463         <para>
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
466             :
467         </para>
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[
474 $font =
475     Zend_Pdf_Font::fontWithPath('/chemin/vers/PoliceNonIncorporable.ttf',
476                                 Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION);
478 ]]></programlisting>
479         </example>
481         <para>
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.
485         </para>
487         <para>
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 :
493         </para>
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[
500 $font =
501     Zend_Pdf_Font::fontWithPath('/chemin/vers/PoliceDeGrandeTaille.ttf',
502                                 Zend_Pdf_Font::EMBED_DONT_COMPRESS);
504 ]]></programlisting>
505         </example>
507         <para>
508             En conclusion, si nécessaire, vous pouvez combiner les options d'incorporation en
509             employant l'opérateur binaire OR :
510         </para>
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));
522 ]]></programlisting>
523         </example>
524     </sect2>
526     <sect2 id="zend.pdf.drawing.standard-fonts-limitations">
527         <title>Limitations des polices standard PDF</title>
529         <para>
530             Les polices standard <acronym>PDF</acronym> emploient en interne plusieurs encodages sur un seul
531             octet (voir <ulink
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
535             ZapfDingbats).
536         </para>
538         <para>
539             <classname>Zend_Pdf</classname> utilise l'encodage CP1252 (WinLatin1) pour tracer
540             les textes avec les polices standard.
541         </para>
543         <para>
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
546             tracés réellement.
547         </para>
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');
559 ]]></programlisting>
560         </example>
561     </sect2>
563     <sect2 id="zend.pdf.drawing.extracting-fonts">
564         <title>Extraction des polices</title>
566         <para>
567             Depuis la version 1.5, <classname>Zend_Pdf</classname> fournit la possibilité
568             d'extraire les polices des documents chargés.
569         </para>
571         <para>
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.
575         </para>
577         <para>
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 :
581         </para>
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));
593 $yPosition = 700;
594 foreach ($listePolice as $police) {
595     $page->setFont($police, 15);
596     $page->drawText(
597         $police->getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT, 'fr', 'UTF-8')
598       . ': Le renard brun rapide saute par-dessus le chien paresseux',
599         100,
600         $yPosition,
601         'UTF-8');
602     $yPosition -= 30;
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();
609 ]]></programlisting>
610         </example>
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
614             police</title>
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);
631 ]]></programlisting>
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 */);
646 ]]></programlisting>
647         </example>
649         <para>
650             Les polices extraites peuvent être utilisées à la place de n'importe quelle autre
651             police avec les limitations suivantes : <itemizedlist>
652                     <listitem>
653                     <para>
654                         La police extraite peut être employée seulement dans le cadre du
655                         document à partir duquel elle a été extraite.
656                     </para>
657                 </listitem>
659                 <listitem>
660                     <para>
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);
671 $xPosition = $x;
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])
678              );
679     $xPosition += $width / $originalFont->getUnitsPerEm() * $taillePolice;
682 ]]></programlisting></para>
683                     </listitem>
684                 </itemizedlist>
685             </para>
686     </sect2>
688     <sect2 id="zend.pdf.drawing.image-drawing">
689         <title>Insertion d'images</title>
691         <para>
692             La classe <classname>Zend_Pdf_Page</classname> fournis la méthode
693             <methodname>drawImage()</methodname> pour dessiner une image :
694         </para>
696         <para>
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
702  * @param float $x1
703  * @param float $y1
704  * @param float $x2
705  * @param float $y2
706  * @return Zend_Pdf_Page
707  */
708 public function drawImage(Zend_Pdf_Resource_Image $image, $x1, $y1, $x2, $y2);
709 ]]></programlisting></para>
711         <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) :
715         </para>
717         <example id="zend.pdf.drawing.image-drawing.example-1">
718             <title>Insertion d'images</title>
720             <programlisting language="php"><![CDATA[
722 //Charger une image
723 $image = Zend_Pdf_Image::imageWithPath('mon_image.jpg');
725 $pdfPage->drawImage($image, 100, 100, 400, 300);
727 ]]></programlisting>
728         </example>
730         <para>
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>
734         </para>
736         <para>
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>
739             et <ulink
740             url="http://www.php.net/manual/fr/ref.zlib.php">http://www.php.net/manual/fr/ref.zlib.php</ulink>).
741         </para>
742     </sect2>
744     <sect2 id="zend.pdf.drawing.line-drawing-style">
745         <title>Style de lignes</title>
747         <para>
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> :
751         </para>
753         <para>
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,
766  * ...)
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
772  */
773 public function setLineDashingPattern($pattern, $phase = 0);
774 ]]></programlisting></para>
775         </sect2>
777         <sect2 id="zend.pdf.drawing.fill-style">
778             <title>Style de remplissage</title>
780         <para>
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 :
786         </para>
788         <itemizedlist>
789             <listitem>
790                 <para>Zend_Pdf_Page::SHAPE_DRAW_STROKE - trace le contour de la forme</para>
791             </listitem>
793             <listitem>
794                 <para>Zend_Pdf_Page::SHAPE_DRAW_FILL - remplit uniquement la forme</para>
795             </listitem>
797             <listitem>
798                 <para>
799                     Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - remplissage et contour (par
800                     défaut)
801                 </para>
802             </listitem>
803         </itemizedlist>
805         <para>
806             La méthode <methodname>Zend_Pdf_Page::drawPoligon()</methodname> prend aussi
807             paramètre supplémentaire <varname>$fillMethod</varname> :
808         </para>
810         <itemizedlist>
811             <listitem>
812                 <para>
813                     $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING (par
814                     défaut)
815                 </para>
817                 <para>
818                     La <citetitle>référence du format <acronym>PDF</acronym></citetitle> décrit la règle comme
819                     ceci : <blockquote>
820                         <para>
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.
844                         </para>
845                         </blockquote>
846                     </para>
847             </listitem>
849             <listitem>
850                 <para>Zend_Pdf_Page::FILL_METHOD_EVEN_ODD</para>
852                 <para>
853                     La <citetitle>référence du format <acronym>PDF</acronym></citetitle> décrit la règle comme
854                     ceci : <blockquote>
855                         <para>
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.
869                         </para>
870                         </blockquote>
871                     </para>
872             </listitem>
873         </itemizedlist>
874     </sect2>
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>
882             <para>
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>
885                 :
886             </para>
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
896  */
897 public function rotate($x, $y, $angle);
898 ]]></programlisting>
899         </sect3>
901         <sect3 id="zend.pdf.drawing.linear-transformations.scale">
902             <title>A partir de Zend Framework 1.8, mise à l'échelle</title>
904             <para>
905                 La mise à l'échelle est fournie par la méthode
906                 <methodname>Zend_Pdf_Page::scale()</methodname> :
907             </para>
909             <programlisting language="php"><![CDATA[
911  * Mise à l'échelle
913  * @param float $xScale - X dimention scale factor
914  * @param float $yScale - Y dimention scale factor
915  * @return Zend_Pdf_Page
916  */
917 public function scale($xScale, $yScale);
918 ]]></programlisting>
919         </sect3>
921         <sect3 id="zend.pdf.drawing.linear-transformations.translate">
922             <title>A partir de Zend Framework 1.8, décalage</title>
924             <para>
925                 Le décalage du système de coordonnées est réalisé par la méthode
926                 <methodname>Zend_Pdf_Page::translate()</methodname> :
927             </para>
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
936  */
937 public function translate($xShift, $yShift);
938 ]]></programlisting>
939         </sect3>
941         <sect3 id="zend.pdf.drawing.linear-transformations.skew">
942             <title>A partir de Zend Framework 1.8, mise en biais</title>
944             <para>
945                 La mise en biais de la page peut être réalisé par la méthode
946                 <methodname>Zend_Pdf_Page::skew()</methodname> :
947             </para>
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
958  */
959 public function skew($x, $y, $xAngle, $yAngle);
960 ]]></programlisting>
961         </sect3>
962     </sect2>
964     <sect2 id="zend.pdf.drawing.save-restore">
965         <title>Sauvegarder et restaurer l'état graphique</title>
967         <para>
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.
972         </para>
974         <para>
975             Il y a deux méthodes dans la classe <classname>Zend_Pdf_Page</classname> pour
976             réaliser ces opérations :
977         </para>
979         <para>
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
987  */
988 public function saveGS();
991  * Restaure le dernier état graphique sauvegarder avec saveGS().
993  * @return Zend_Pdf_Page
994  */
995 public function restoreGS();
996 ]]></programlisting></para>
997         </sect2>
999         <sect2 id="zend.pdf.drawing.clipping">
1000             <title>Zone de dessin</title>
1002         <para>
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.
1006         </para>
1008         <para>
1009             La classe <classname>Zend_Pdf_Page</classname> fournit des méthodes pour les
1010             opérations de découpage.
1011         </para>
1013         <para>
1014             <programlisting language="php"><![CDATA[
1016  * Découpe la zone courante avec un rectangle.
1018  * @param float $x1
1019  * @param float $y1
1020  * @param float $x2
1021  * @param float $y2
1022  * @return Zend_Pdf_Page
1023  */
1024 public function clipRectangle($x1, $y1, $x2, $y2);
1025 ]]></programlisting></para>
1027         <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
1036  */
1037 public function clipPolygon(
1038     $x, $y, $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);
1039 ]]></programlisting></para>
1041         <para>
1042             <programlisting language="php"><![CDATA[
1044  * Découpe la zone courante avec un cercle.
1046  * @param float $x
1047  * @param float $y
1048  * @param float $radius
1049  * @param float $startAngle
1050  * @param float $endAngle
1051  * @return Zend_Pdf_Page
1052  */
1053 public function clipCircle(
1054     $x, $y, $radius, $startAngle = null, $endAngle = null);
1055 ]]></programlisting></para>
1057         <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
1068  * @param float $x1
1069  * @param float $y1
1070  * @param float $x2
1071  * @param float $y2
1072  * @param float $startAngle
1073  * @param float $endAngle
1074  * @return Zend_Pdf_Page
1075  */
1076 public function clipEllipse(
1077     $x1, $y1, $x2, $y2, $startAngle = null, $endAngle = null);
1078 ]]></programlisting></para>
1079         </sect2>
1081         <sect2 id="zend.pdf.drawing.styles">
1082             <title>Styles</title>
1084         <para>
1085             La classe <classname>Zend_Pdf_Style</classname> fournit les fonctionnalités de
1086             style.
1087         </para>
1089         <para>
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 :
1092         </para>
1094         <para>
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
1102  */
1103 public function setStyle(Zend_Pdf_Style $style);
1106  * Renvoie le style appliqué à la page.
1108  * @return Zend_Pdf_Style|null
1109  */
1110 public function getStyle();
1111 ]]></programlisting></para>
1113         <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 :
1116         </para>
1118         <para>
1119             <programlisting language="php"><![CDATA[
1121  * Choisit la couleur de ligne.
1123  * @param Zend_Pdf_Color $color
1124  * @return Zend_Pdf_Page
1125  */
1126 public function setLineColor(Zend_Pdf_Color $color);
1127 ]]></programlisting></para>
1129         <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
1136  */
1137 public function getLineColor();
1138 ]]></programlisting></para>
1140         <para>
1141             <programlisting language="php"><![CDATA[
1143  * Choisit l'épaisseur de ligne.
1145  * @param float $width
1146  * @return Zend_Pdf_Page
1147  */
1148 public function setLineWidth($width);
1149 ]]></programlisting></para>
1151         <para>
1152             <programlisting language="php"><![CDATA[
1154  * Récupère l'épaisseur de ligne.
1156  * @return float
1157  * @return Zend_Pdf_Page
1158  */
1159 public function getLineWidth($width);
1160 ]]></programlisting></para>
1162         <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
1170  */
1171 public function setLineDashingPattern($pattern, $phase = 0);
1172 ]]></programlisting></para>
1174         <para>
1175             <programlisting language="php"><![CDATA[
1177  * Récupère le style de tiret
1179  * @return array
1180  */
1181 public function getLineDashingPattern();
1182 ]]></programlisting></para>
1184         <para>
1185             <programlisting language="php"><![CDATA[
1187  * Récupère le modèle de tiret
1189  * @return float
1190  */
1191 public function getLineDashingPhase();
1192 ]]></programlisting></para>
1194         <para>
1195             <programlisting language="php"><![CDATA[
1197  * Choisit la couleur de remplissage.
1199  * @param Zend_Pdf_Color $color
1200  * @return Zend_Pdf_Page
1201  */
1202 public function setFillColor(Zend_Pdf_Color $color);
1203 ]]></programlisting></para>
1205         <para>
1206             <programlisting language="php"><![CDATA[
1208  * Récupère la couleur de remplissage.
1210  * @return Zend_Pdf_Color|null
1211  */
1212 public function getFillColor();
1213 ]]></programlisting></para>
1215         <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
1223  */
1224 public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);
1225 ]]></programlisting></para>
1227         <para>
1228             <programlisting language="php"><![CDATA[
1230  * Modifie la taille de police.
1232  * @param float $fontSize
1233  * @return Zend_Pdf_Page
1234  */
1235 public function setFontSize($fontSize);
1236 ]]></programlisting></para>
1238         <para>
1239             <programlisting language="php"><![CDATA[
1241  * Récupère la police courante
1243  * @return Zend_Pdf_Resource_Font $font
1244  */
1245 public function getFont();
1246 ]]></programlisting></para>
1248         <para>
1249             <programlisting language="php"><![CDATA[
1251  * Récupère la taille de la police
1253  * @return float $fontSize
1254  */
1255 public function getFontSize();
1256 ]]></programlisting></para>
1257         </sect2>
1259         <sect2 id="zend.pdf.drawing.alpha">
1260             <title>Transparence</title>
1262         <para>
1263             Le module <classname>Zend_Pdf</classname> supporte la gestion de la
1264             transparence.
1265         </para>
1267         <para>
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
1285  */
1286 public function setAlpha($alpha, $mode = 'Normal');
1287 ]]></programlisting></para>
1288         </sect2>
1289     </sect1>