Dessiner
Géométrie
Le format PDF utilise la même géométrie que le format PostScript. Elle démarre
d'en bas à gauche et est mesuré en points (1/72 inch soit 0,352778 mm).
La taille d'une page peut-être récupéré depuis un objet page :
getWidth();
$height = $pdfPage->getHeight();
]]>
Couleurs
Le format PDF a d'excellentes capacités dans la représentation des couleurs. Le
module Zend_Pdf supporte les espaces de couleur : niveaux de
gris, RGB et CMJN. Chacun d'entre eux peut-être utilisé à chaque fois qu'un objet
Zend_Pdf_Color est requis. Les classes
Zend_Pdf_Color_GrayScale,
Zend_Pdf_Color_RGB et Zend_Pdf_Color_CMYK
fournissent cette fonctionnalité :
Les différentes couleurs HTML sont aussi fourni avec la classe
Zend_Pdf_Color_Html :
Dessiner des formes
Toutes les opérations de dessins peuvent être réalisées dans le contexte d'une
page PDF.
La classe Zend_Pdf_Page fournit les outils de dessins
:
Dessiner du texte
Les opérations de dessins existent bien sûr dans le contexte d'une page
PDF. Vous pouvez dessiner une seule ligne de texte à n'importe quel
endroit dans la page en fournissant les coordonnées x et y de la ligne de base. La
police courant ainsi que sa taille et la couleur de remplissage seront utilisées pour
le dessin (voir la description ci-dessous).
Dessiner une ligne dans la page
drawText('Bonjour le monde!', 72, 720);
...
]]>
Régler la couleur du texte
setFillColor(Zend_Pdf_Color_Html::color('#990000'))
->drawText('Bonjour le monde (en rouge) !', 72, 720);
....
]]>
Par défaut, les chaînes de texte sont interprétées en utilisant l'encodage du
système. Si vous avez une chaîne qui utilise un encodage différent (comme les chaînes
UTF-8 lues depuis une fichier sur le disque, ou une chaîne MacRoman obtenue depuis une
base de données), vous pouvez indiquer l'encodage au moment du dessin et Zend_Pdf gérera
la conversion pour vous. Vous pouvez fournir des chaînes dans n'importe quel encodage
supporté par la fonction iconv() de PHP:
Dessiner une chaîne UTF-8 sur une page
drawText($unicodeString, 72, 720, 'UTF-8');
...
]]>
Utiliser des polices de caractères
Zend_Pdf_Page::drawText() utilise la police courante ainsi
que sa taille, qui sont définies avec la méthode
Zend_Pdf_Page::setFont() :
Les documents PDF supportent PostScript Type 1 et les polices TrueType, mais
également deux types spécifiques PDF, Type3 et les polices composites. Il y a aussi 14
polices Type 1 standard intégré dans tout lecteur de PDF : Courier (4 styles), Helvetica
(4 styles), Times (4 styles), Symbol, et Zapf Dingbats.
Zend_Pdf supporte actuellement les 14 polices standard mais également vos propres
police TrueType. Les objets de police obtenus via une des deux fabriques méthodes :
Zend_Pdf_Font::fontWithName($fontName) pour les 14 polices PDF
standard ou Zend_Pdf_Font::fontWithPath($filePath) pour les
polices personnalisées.
Créer une police standard
setFont($font, 36);
...
]]>
Les constantes pour les 14 polices standard sont définis dans la classe
Zend_Pdf_Font :
Zend_Pdf_Font::FONT_COURIER
Zend_Pdf_Font::FONT_COURIER_BOLD
Zend_Pdf_Font::FONT_COURIER_ITALIC
Zend_Pdf_Font::FONT_COURIER_BOLD_ITALIC
Zend_Pdf_Font::FONT_TIMES
Zend_Pdf_Font::FONT_TIMES_BOLD
Zend_Pdf_Font::FONT_TIMES_ITALIC
Zend_Pdf_Font::FONT_TIMES_BOLD_ITALIC
Zend_Pdf_Font::FONT_HELVETICA
Zend_Pdf_Font::FONT_HELVETICA_BOLD
Zend_Pdf_Font::FONT_HELVETICA_ITALIC
Zend_Pdf_Font::FONT_HELVETICA_BOLD_ITALIC
Zend_Pdf_Font::FONT_SYMBOL
Zend_Pdf_Font::FONT_ZAPFDINGBATS
Vous pouvez aussi prendre n'importe quelle police TrueType (extension habituelle
".ttf") ou OpenType (".otf") si elles ont une silhouette TrueType. Pour l'instant non
supportée, les polices Mac Os X ".dfont" et les collections TrueType Microsoft (".ttc")
seront intégrées dans une version future.
Pour utiliser une police TrueType, vous devez fournir le chemin de fichier complet
vers cette police. Si la police ne peut pas être lue pour une quelconque raison, ou si
ce n'est pas une police TrueType, la méthode lèvera une exception :
Créer une police TrueType
setFont($goodDogCoolFont, 36);
...
]]>
Par défaut, les polices personnalisées seront incorporées dans le document PDF
résultant. Cela permet aux destinataires de voir la page comme prévu, même s'ils ne font
pas installer les polices appropriées sur leur système. En cas de problème avec la
taille du fichier généré, vous pouvez demander que la police ne soit pas incorporé en
passant l'option 'ne pas inclure' à la méthode de création :
Créer une police TrueType sans l'incorporer dans le document PDF
setFont($goodDogCoolFont, 36);
...
]]>
Si les polices ne sont pas incorporées mais que le destinataire du fichier PDF a
ces polices installées sur son système, il verra le document comme prévu. Si la police
correcte n'est pas installée, l'application de visualisation du PDF fera de son mieux
pour synthétiser une police de remplacement.
Quelques polices ont les règles de licence très spécifiques qui les empêchent
d'être incorporées dans des documents PDF. Donc vous devez faire attention, si vous
essayez d'utiliser une police qui ne peut pas être incorporée, la méthode de création
lèvera une exception.
Vous pouvez toujours utiliser ces polices, mais vous devez passer le paramètre 'ne
pas inclure' comme décrit ci-dessous, ou vous pouvez simplement bloquer l'exception
:
Ne pas lever d'exception pour les polices ne pouvant être incorporées
Cette technique de suppression est préférée si vous permettez aux utilisateurs de
choisir leurs propres polices. Les polices qui peuvent être incorporées dans le document
PDF le seront ; les autres ne le seront pas.
Les fichiers de police peuvent être assez grands, certains peuvent atteindre des
dizaines de méga-octets. Par défaut, toutes les polices incorporées sont comprimées en
utilisant le schéma de compression Flate, ayant pour résultat un gain d'espace de 50% en
moyenne. Si, pour une quelconque raison, vous ne voulez pas comprimer la police, vous
pouvez le neutraliser avec une option :
Ne pas compresser une police incorporée
En conclusion, si nécessaire, vous pouvez combiner les options d'incorporation en
employant l'opérateur binaire OR :
Combiner les options de polices incorporées
Limitations des polices standard PDF
Les polices standard PDF emploient en interne plusieurs encodages sur un seul
octet (voir PDF Reference,
Sixth Edition, version 1.7 - Annexe D pour plus de détails). Elles sont
généralement avec un jeu de caractère de type Latin1(excepté les polices Symbol and
ZapfDingbats).
Zend_Pdf utilise l'encodage CP1252 (WinLatin1) pour tracer
les textes avec les polices standard.
Le texte peut encore être fourni dans n'importe quel autre encodage, qui doit être
spécifié s'il diffère de celui en cours. Seulement les caractères WinLatin1 seront
tracés réellement.
Combiner les options de polices embarqués
setFont($font, 36)
->drawText('Euro sign - €', 72, 720, 'UTF-8')
->drawText('Text with umlauts - à è ì', 72, 650, 'UTF-8');
...
]]>
Insertion d'images
La classe Zend_Pdf_Page fournis la méthode
drawImage() pour dessiner une image :
Les objets Image peuvent être créés avec la méthode
Zend_Pdf_Image::imageWithPath($filePath) (les images JPG, PNG et
TIFF sont maintenant supportées) :
Insertion d'images
drawImage($image, 100, 100, 400, 300);
...
]]>
Important ! Le support JPEG nécessite que l'extension PHP GD soit
installé. Important ! Le support PNG nécessite que l'extension ZLIB
soit configuré pour accepter les images avec canaux Alpha.
Lisez la documentation de PHP pour plus d'informations (http://www.php.net/manual/fr/ref.image.php
et http://www.php.net/manual/fr/ref.zlib.php).
Style de lignes
Le style de ligne est définit par l'épaisseur, la couleur et le style de tiret.
Tout ces paramètres peuvent être assignés par les méthodes de la classe
Zend_Pdf_Page :
Style de remplissage
Les méthodes Zend_Pdf_Page::drawRectangle(),
Zend_Pdf_Page::drawPoligon(),
Zend_Pdf_Page::drawCircle() et
Zend_Pdf_Page::drawEllipse() prennent en argument optionnel le
type de remplissage: $fillType. Il peut être :
Zend_Pdf_Page::SHAPE_DRAW_STROKE - trace le contour de la forme
Zend_Pdf_Page::SHAPE_DRAW_FILL - remplit uniquement la forme
Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - remplissage et contour (par
défaut)
La méthode Zend_Pdf_Page::drawPoligon() prend aussi
paramètre supplémentaire $fillMethod :
$fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING (par
défaut)
La référence du format PDF décrit la règle comme
ceci :
The nonzero winding number rule determines whether a given point
is inside a path by conceptually drawing a ray from that point to
infinity in any direction and then examining the places where a segment
of the path crosses the ray. Starting with a count of 0, the rule adds 1
each time a path segment crosses the ray from left to right and
subtracts 1 each time a segment crosses from right to left. After
counting all the crossings, if the result is 0 then the point is outside
the path; otherwise it is inside. Note: The method just described does
not specify what to do if a path segment coincides with or is tangent to
the chosen ray. Since the direction of the ray is arbitrary, the rule
simply chooses a ray that does not encounter such problem intersections.
For simple convex paths, the nonzero winding number rule defines the
inside and outside as one would intuitively expect. The more interesting
cases are those involving complex or self-intersecting paths like the
ones shown in Figure 4.10 (in a PDF Reference). For a path consisting of
a five-pointed star, drawn with five connected straight line segments
intersecting each other, the rule considers the inside to be the entire
area enclosed by the star, including the pentagon in the center. For a
path composed of two concentric circles, the areas enclosed by both
circles are considered to be inside, provided that both are drawn in the
same direction. If the circles are drawn in opposite directions, only
the "doughnut" shape between them is inside, according to the rule; the
"doughnut hole" is outside.
Zend_Pdf_Page::FILL_METHOD_EVEN_ODD
La référence du format PDF décrit la règle comme
ceci :
An alternative to the nonzero winding number rule is the even-odd
rule. This rule determines the "insideness" of a point by drawing a ray
from that point in any direction and simply counting the number of path
segments that cross the ray, regardless of direction. If this number is
odd, the point is inside; if even, the point is outside. This yields the
same results as the nonzero winding number rule for paths with simple
shapes, but produces different results for more complex shapes. Figure
4.11 (in a PDF Reference) shows the effects of applying the even-odd
rule to complex paths. For the five-pointed star, the rule considers the
triangular points to be inside the path, but not the pentagon in the
center. For the two concentric circles, only the "doughnut" shape
between the two circles is considered inside, regardless of the
directions in which the circles are drawn.
Transformations linéaires
Rotations
La page PDF page peut être tourné avant d'appliquer toute opération de dessin.
Ceci peut être fait avec la méthode Zend_Pdf_Page::rotate()
:
A partir de Zend Framework 1.8, mise à l'échelle
La mise à l'échelle est fournie par la méthode
Zend_Pdf_Page::scale() :
A partir de Zend Framework 1.8, décalage
Le décalage du système de coordonnées est réalisé par la méthode
Zend_Pdf_Page::translate() :
A partir de Zend Framework 1.8, mise en biais
La mise en biais de la page peut être réalisé par la méthode
Zend_Pdf_Page::skew() :
Sauvegarder et restaurer l'état graphique
L'état graphique (police courante, taille de caractère, couleur de ligne, couleur
de remplissage, style de ligne, sens de la page, zone de dessin) peut-être sauvegarder à
tout moment. L'opération de sauvegarde empile le contexte dans une pile de contexte
graphique, l'opération de restauration récupère le contexte depuis la pile.
Il y a deux méthodes dans la classe Zend_Pdf_Page pour
réaliser ces opérations :
Zone de dessin
Le format PDF et le module Zend_Pdf supporte le découpage de la zone de dessin. La
zone de dessin courante limite la zone de la page affectée par l'utilisation des
opérateurs de dessins. Initialement c'est toute la page.
La classe Zend_Pdf_Page fournit des méthodes pour les
opérations de découpage.
Styles
La classe Zend_Pdf_Style fournit les fonctionnalités de
style.
Les styles peuvent être utilisés pour stocker des paramètre d'état graphique et de
les appliquer à une page PDF en une seule opération :
La classe Zend_Pdf_Style fournit des méthodes pour choisir
ou récupérer différents paramètres de l'état graphique :
Transparence
Le module Zend_Pdf supporte la gestion de la
transparence.
La transparence peut être paramétré en utilisant la méthode
Zend_Pdf_Page::setAlpha() :