Previous Next

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 :

$width  = $pdfPage->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é :

// $grayLevel (float). 0.0 (noir) - 1.0 (blanc)
$color1 = new Zend_Pdf_Color_GrayScale($grayLevel);

// $r, $g, $b (float).
// 0.0 (intensité mimimum) - 1.0 (intensité maximum)
$color2 = new Zend_Pdf_Color_RGB($r, $g, $b);

// $c, $m, $y, $k (float).
// 0.0 (intensité mimimum) - 1.0 (intensité maximum)
$color3 = new Zend_Pdf_Color_CMYK($c, $m, $y, $k);

Les différentes couleurs HTML sont aussi fourni avec la classe Zend_Pdf_Color_Html :

$color1 = new Zend_Pdf_Color_Html('#3366FF');
$color2 = new Zend_Pdf_Color_Html('silver');
$color3 = new Zend_Pdf_Color_Html('forestgreen');

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 :

/**
 * Dessine une ligne de x1,y1 à x2,y2.
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @return Zend_Pdf_Page
 */
public function drawLine($x1, $y1, $x2, $y2);

/**
 * Draw a rounded rectangle.
 *
 * Fill types:
 * Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - fill rectangle
                                               and stroke (default)
 * Zend_Pdf_Page::SHAPE_DRAW_STROKE      - stroke rectangle
 * Zend_Pdf_Page::SHAPE_DRAW_FILL        - fill rectangle
 *
 * radius is an integer representing radius of the four corners, or an array
 * of four integers representing the radius starting at top left, going
 * clockwise
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @param integer|array $radius
 * @param integer $fillType
 * @return Zend_Pdf_Page
 */
public function drawRoundedRectangle($x1, $y1, $x2, $y2, $radius,
                       $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);

/**
 * Dessine un rectangle.
 *
 * Type de remplissage:
 * Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE
 * - remplit le rectangle et dessine le contour (par défaut)
 * Zend_Pdf_Page::SHAPE_DRAW_STROKE
 * - trace uniquement le contour du rectangle
 * Zend_Pdf_Page::SHAPE_DRAW_FILL
 * - remplit le rectangle
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @return Zend_Pdf_Page
 * @param integer $fillType
 * @return Zend_Pdf_Page
 */
public function drawRectangle(
    $x1, $y1, $x2, $y2, $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);

/**
 * Dessine un polygone.
 *
 * Si $fillType est Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE
 * ou Zend_Pdf_Page::SHAPE_DRAW_FILL,
 * le polygone est automatiquement fermé.
 * Regardez la description détaillée de ces méthodes dans la
 * documentation du format PDF
 * (section 4.4.2 Path painting Operators, Filling)
 *
 * @param array $x  - tableau de float (les coordonnés X des sommets)
 * @param array $y  - tableau de float (les coordonnés Y des sommets)
 * @param integer $fillType
 * @param integer $fillMethod
 * @return Zend_Pdf_Page
 */
public function drawPolygon(
    $x, $y,
    $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE,
    $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);

/**
 * Dessine un cercle avec comme centre  x, y et comme rayon radius.
 *
 * Les angles sont en radian
 *
 * Signatures des méthodes:
 * drawCircle($x, $y, $radius);
 * drawCircle($x, $y, $radius, $fillType);
 * drawCircle($x, $y, $radius, $startAngle, $endAngle);
 * drawCircle($x, $y, $radius, $startAngle, $endAngle, $fillType);
 *
 *
 * Ce n'est pas réellement un cercle, car le format supporte
 * uniquement des courbe de Bezier cubique.
 * Mais c'est une très bonne approximation.
 * La différence avec un vrai cercle est de au maximum 0.00026 radians
 * (avec les angles PI/8, 3*PI/8, 5*PI/8, 7*PI/8, 9*PI/8, 11*PI/8,
 * 13*PI/8 et 15*PI/8).
 * Avec les angles 0, PI/4, PI/2, 3*PI/4, PI, 5*PI/4, 3*PI/2 et 7*PI/4
 * c'est exactement la tangente d'un cercle.
 *
 * @param float $x
 * @param float $y
 * @param float $radius
 * @param mixed $param4
 * @param mixed $param5
 * @param mixed $param6
 * @return Zend_Pdf_Page
 */
public function drawCircle(
    $x, $y, $radius, $param4 = null, $param5 = null, $param6 = null);

/**
 * Dessine une ellipse dans le rectangle spécifié.
 *
 * Signatures des méthodes:
 * drawEllipse($x1, $y1, $x2, $y2);
 * drawEllipse($x1, $y1, $x2, $y2, $fillType);
 * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
 * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle, $fillType);
 *
 * Les angles sont en radians
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @param mixed $param5
 * @param mixed $param6
 * @param mixed $param7
 * @return Zend_Pdf_Page
 */
public function drawEllipse(
    $x1, $y1, $x2, $y2, $param5 = null, $param6 = null, $param7 = null);

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 quelle endroit dans la page en fournissant les coordonnées x et y de la ligne de base. La police courant ainsi que sa taille seront utilisées pour le dessin (voir la description ci-dessous).

/**
 * Dessine une ligne de texte à la position x,y.
 *
 * @param string $text
 * @param float $x
 * @param float $y
 * @param string $charEncoding (optionnel) encodage des caractères du texte.
 * Par défaut le réglage système est utilisé.
 * @throws Zend_Pdf_Exception
 * @return Zend_Pdf_Page
 */
public function drawText($text, $x, $y, $charEncoding = '');

Exemple #1 Dessiner une ligne dans la page

...
$pdfPage->drawText('Bonjour le monde!', 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:

Exemple #2 Dessiner une chaîne UTF-8 sur une page

...
// Lit une chaîne UTF-8 à partir du disque
$unicodeString = fread($fp, 1024);

// Dessine une chaîne dans la page
$pdfPage->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() :

/**
 * Choisit la police courante.
 *
 * @param Zend_Pdf_Resource_Font $font
 * @param float $fontSize
 * @return Zend_Pdf_Page
 */
public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);

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.

Exemple #3 Créer une police standard

...
// Crée une nouvelle police
$font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);

// Applique la police
$pdfPage->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 :

Exemple #4 Créer une police TrueType

...
// Crée la nouvelle police
$goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/chemin/vers/GOODDC__.TTF');

// Applique cette police
$pdfPage->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 :

Exemple #5 Créer une police TrueType sans l'incorporer dans le document PDF

...
// Crée la nouvelle police
$goodDogCoolFont =
    Zend_Pdf_Font::fontWithPath('/chemin/vers/GOODDC__.TTF',
                                Zend_Pdf_Font::EMBED_DONT_EMBED);

// Applique cette police
$pdfPage->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 :

Exemple #6 Ne pas lever d'exception pour les polices ne pouvant être incorporées

...
$font =
    Zend_Pdf_Font::fontWithPath('/chemin/vers/PoliceNonIncorporable.ttf',
                                Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION);
...

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 :

Exemple #7 Ne pas compresser une police incorporée

...
$font =
    Zend_Pdf_Font::fontWithPath('/chemin/vers/PoliceDeGrandeTaille.ttf',
                                Zend_Pdf_Font::EMBED_DONT_COMPRESS);
...

En conclusion, si nécessaire, vous pouvez combiner les options d'incorporation en employant l'opérateur binaire OR :

Exemple #8 Combiner les options de polices incorporées

...
$font = Zend_Pdf_Font::fontWithPath(
    $cheminVersPoliceQuelconque,
    (Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION |
     Zend_Pdf_Font::EMBED_DONT_COMPRESS));
...

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.

Exemple #9 Combiner les options de polices embarqués

...
$font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_COURIER);
$pdfPage->setFont($font, 36)
        ->drawText('Euro sign - €', 72, 720, 'UTF-8')
        ->drawText('Text with umlauts - à è ì', 72, 650, 'UTF-8');
...

Extraction des polices

Depuis la version 1.5, Zend_Pdf fournit la possibilité d'extraire les polices des documents chargés.

Ceci peut être utile lors des mises à jour de document avec ajout de texte. Sans cette fonctionnalité vous devez attacher et probablement intégrer la police dans le document chaque fois que vous voulez le mettre à jour.

Les objets Zend_Pdf et Zend_Pdf_Page fournissent une méthode spéciale pour extraire toutes les polices mentionnés à l'intérieur d'un document ou d'une page :

Exemple #10 Extraction de polices à partir d'un document chargé

...
$pdf = Zend_Pdf::load($cheminVersDocument);
...
// Récupère toutes les polices du document
$listePolice = $pdf->extractFonts();
$pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));
$yPosition = 700;
foreach ($listePolice as $police) {
    $page->setFont($police, 15);
    $page->drawText(
        $police->getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT, 'fr', 'UTF-8')
      . ': Le renard brun rapide saute par-dessus le chien paresseux',
        100,
        $yPosition,
        'UTF-8');
    $yPosition -= 30;
}
...
// Récupère toutes les polices référencées dans la première page du document
$firstPage = reset($pdf->pages);
$firstPageFonts = $firstPage->extractFonts();
...

Exemple #11 Extraction d'une police à partir d'un document chargé en spécifiant le nom de police

...
$pdf = new Zend_Pdf();
...
$pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));

$police = Zend_Pdf_Font::fontWithPath($cheminVersPolices);
$page->setFont($police, $taillePolice);
$page->drawText($texte, $x, $y);
...
// Ce nom de police peut être stocké quelquepart...
$fontName = $font->getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT, 'fr', 'UTF-8');
...
$pdf->save($cheminVersDocument);
...
...
$pdf = Zend_Pdf::load($cheminVersDocument);
...
$pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));

$police = $pdf->extractFont($nomPolice);
/* $pageSource->extractFont($nomPolice) peut aussi être utilisé ici */
$page->setFont($police, $taillePolice);
$page->drawText($texte, $x, $y);
...
$pdf->save($cheminVersDocument, true /* mise à jour de type incrémental */);
...

Les polices extraites peuvent être utilisées à la place de n'importe quelle autre police avec les limitations suivantes :

  • La police extraite peut être employée seulement dans le cadre du document à partir duquel elle a été extraite.

  • Les possibles programmes de polices incorporées ne sont pas extraits réellement. La police ainsi extraite ne peut pas fournir la métrique correcte de police et la police originale doit être utilisée pour les calculs de largeur des textes :

    ...
    $police = $pdf->extractFont($fontName);
    $policeOriginal = Zend_Pdf_Font::fontWithPath($cheminVersPolices);
    
    /* utilisation d'une police extraite */
    $page->setFont($police, $taillePolice);
    $xPosition = $x;
    for ($charIndex = 0; $charIndex < strlen($text); $charIndex++) {
        $page->drawText($text[$charIndex], $xPosition, $y);
    
        // Use original font for text width calculation
        $width = $originalFont->widthForGlyph(
                    $originalFont->glyphNumberForCharacter($text[$charIndex])
                 );
        $xPosition += $width / $originalFont->getUnitsPerEm() * $taillePolice;
    }
    ...

Insertion d'images

La classe Zend_Pdf_Page fournis la méthode drawImage() pour dessiner une image :

/**
 * Insère une image à la position spécifiée dans la page
 *
 * @param Zend_Pdf_Resource_Image $image
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @return Zend_Pdf_Page
 */
public function drawImage(Zend_Pdf_Resource_Image $image, $x1, $y1, $x2, $y2);

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) :

Exemple #12 Insertion d'images

...
//Charger une image
$image = Zend_Pdf_Image::imageWithPath('mon_image.jpg');

$pdfPage->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 :

/** Choisit la couleur de ligne. */
public function setLineColor(Zend_Pdf_Color $color);

/** Choisit l'épaisseur de ligne. */
public function setLineWidth(float $width);

/**
 * Choisit le modèle de tiret.
 *
 * modele est un tableau de floats: array(longueur_visible,
 * longueur_invisible, longueur_visible, longueur_invisible,
 * ...)
 * phase est le décalage à partir du début de la ligne.
 *
 * @param array $modele
 * @param array $phase
 * @return Zend_Pdf_Page
 */
public function setLineDashingPattern($pattern, $phase = 0);

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() :

/**
 * Rotation de la page
 *
 * @param float $x  - la coordonnée X du point de rotation
 * @param float $y  - la coordonnée X du point de rotation
 * @param float $angle - angle de rotation
 * @return Zend_Pdf_Page
 */
public function rotate($x, $y, $angle);

A partir de Zend Framework 1.8, mise à l'échelle

La mise à l'échelle est fournie par la méthode Zend_Pdf_Page::scale() :

/**
 * Mise à l'échelle
 *
 * @param float $xScale - X dimention scale factor
 * @param float $yScale - Y dimention scale factor
 * @return Zend_Pdf_Page
 */
public function scale($xScale, $yScale);

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() :

/**
 * Décalage du système de coordonnées
 *
 * @param float $xShift - coordonnées X du décalage
 * @param float $yShift - coordonnées Y du décalage
 * @return Zend_Pdf_Page
 */
public function translate($xShift, $yShift);

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() :

/**
 * Mise en biais du système de coordonnées
 *
 * @param float $x  - the X co-ordinate of axis skew point
 * @param float $y  - the Y co-ordinate of axis skew point
 * @param float $xAngle - X axis skew angle
 * @param float $yAngle - Y axis skew angle
 * @return Zend_Pdf_Page
 */
public function skew($x, $y, $xAngle, $yAngle);

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 :

/**
 * Sauvegarde l'état graphique de la page.
 * Cela prend un instantané des styles courants, des zones de dessins
 * et de toutes les rotations/translations/changements de taille appliqués.
 *
 * @return Zend_Pdf_Page
 */
public function saveGS();

/**
 * Restaure le dernier état graphique sauvegarder avec saveGS().
 *
 * @return Zend_Pdf_Page
 */
public function restoreGS();

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.

/**
 * Découpe la zone courante avec un rectangle.
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @return Zend_Pdf_Page
 */
public function clipRectangle($x1, $y1, $x2, $y2);

/**
 * Découpe la zone courante avec un polygone.
 *
 * @param array $x  - tableau de float (les coordonnées X des sommets)
 * @param array $y  - tableau de float (les coordonnées Y des sommets)
 * @param integer $fillMethod
 * @return Zend_Pdf_Page
 */
public function clipPolygon(
    $x, $y, $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);

/**
 * Découpe la zone courante avec un cercle.
 *
 * @param float $x
 * @param float $y
 * @param float $radius
 * @param float $startAngle
 * @param float $endAngle
 * @return Zend_Pdf_Page
 */
public function clipCircle(
    $x, $y, $radius, $startAngle = null, $endAngle = null);

/**
 * Découpe la zone courante avec une ellipse.
 *
 * Signatures des méthodes:
 * drawEllipse($x1, $y1, $x2, $y2);
 * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
 *
 * @todo s'occuper des cas spéciaux avec $x2-$x1 == 0 ou $y2-$y1 == 0
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @param float $startAngle
 * @param float $endAngle
 * @return Zend_Pdf_Page
 */
public function clipEllipse(
    $x1, $y1, $x2, $y2, $startAngle = null, $endAngle = null);

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 :

/**
 * Choisit le style à utiliser pour les futures opérations
 * de dessin sur cette page
 *
 * @param Zend_Pdf_Style $style
 * @return Zend_Pdf_Page
 */
public function setStyle(Zend_Pdf_Style $style);

/**
 * Renvoie le style appliqué à la page.
 *
 * @return Zend_Pdf_Style|null
 */
public function getStyle();

La classe Zend_Pdf_Style fournit des méthodes pour choisir ou récupérer différents paramètres de l'état graphique :

/**
 * Choisit la couleur de ligne.
 *
 * @param Zend_Pdf_Color $color
 * @return Zend_Pdf_Page
 */
public function setLineColor(Zend_Pdf_Color $color);

/**
 * Récupère la couleur de ligne.
 *
 * @return Zend_Pdf_Color|null
 * @return Zend_Pdf_Page
 */
public function getLineColor();

/**
 * Choisit l'épaisseur de ligne.
 *
 * @param float $width
 * @return Zend_Pdf_Page
 */
public function setLineWidth($width);

/**
 * Récupère l'épaisseur de ligne.
 *
 * @return float
 * @return Zend_Pdf_Page
 */
public function getLineWidth($width);

/**
 * Choisit le style de tiret
 *
 * @param array $pattern
 * @param float $phase
 * @return Zend_Pdf_Page
 */
public function setLineDashingPattern($pattern, $phase = 0);

/**
 * Récupère le style de tiret
 *
 * @return array
 */
public function getLineDashingPattern();

/**
 * Récupère le modèle de tiret
 *
 * @return float
 */
public function getLineDashingPhase();

/**
 * Choisit la couleur de remplissage.
 *
 * @param Zend_Pdf_Color $color
 * @return Zend_Pdf_Page
 */
public function setFillColor(Zend_Pdf_Color $color);

/**
 * Récupère la couleur de remplissage.
 *
 * @return Zend_Pdf_Color|null
 */
public function getFillColor();

/**
 * Choisit la police.
 *
 * @param Zend_Pdf_Font $font
 * @param Zend_Pdf_Resource_Font $font
 * @param float $fontSize
 */
public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);

/**
 * Modifie la taille de police.
 *
 * @param float $fontSize
 * @return Zend_Pdf_Page
 */
public function setFontSize($fontSize);

/**
 * Récupère la police courante
 *
 * @return Zend_Pdf_Resource_Font $font
 */
public function getFont();

/**
 * Récupère la taille de la police
 *
 * @return float $fontSize
 */
public function getFontSize();

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() :

/**
 * Règle la transparence
 *
 * $alpha == 0  - transparent
 * $alpha == 1  - opaque
 *
 * Transparency modes, supported by PDF:
 * Normal (default), Multiply, Screen, Overlay, Darken,
 * Lighten, ColorDodge, ColorBurn, HardLight,
 * SoftLight, Difference, Exclusion
 *
 * @param float $alpha
 * @param string $mode
 * @throws Zend_Pdf_Exception
 * @return Zend_Pdf_Page
 */
public function setAlpha($alpha, $mode = 'Normal');

Previous Next
Introduction au Zend Framework
Présentation
Installation
Apprendre Zend Framework
Démarrez rapidement avec Zend Framework
Zend Framework & Introduction MVC
Créer votre projet
Créer une layout
Créer un modèle et une table en base de données
Créer un formulaire
Félicitations !
Chargement automatique avec Zend Framework
Introduction
Architecture et buts
Utilisation de base de l'autoloader
Auto-chargement de resources
Conclusion
Les plugins dans Zend Framework
Introduction
Utiliser des Plugins
Conclusion
Bien démarrer avec Zend_Layout
Introduction
Utiliser Zend_Layout
Zend_Layout: Conclusions
Bien démarrer avec Zend_View
Introduction
Utilisation de base des Placeholders
Placeholders standards
View Placeholders: Conclusion
Bien comprendre et utiliser les décorateurs Zend Form
Introduction
Les bases des décorateurs
Chainer les décorateurs
Rendu individuel des décorateurs
Créer et rendre des éléments composites
Conclusion
Bien démarrer avec Zend_Session, Zend_Auth, et Zend_Acl
Fabrique une application Multi-Utilisateurs avec Zend Framework
Gérer les sessions dans ZF
Authentification d'utilisateurs dans Zend Framework
Fabriquer un système de gestion d'autorisations avec Zend Framework
Bien démarrer avec Zend_Search_Lucene
Introduction à Zend_Search_Lucene
Structure d'index Lucene
Ouverture et création d'index
Indexation
Recherche
Requêtes supportées
Pagination de résultat de recherche
Bien démarrer avec Zend_Paginator
Introduction
Exemples simples
Contrôles de la pagination et styles de défilement
Assembler le tout
Guide de référence Zend Framework
Zend_Acl
Introduction
Affiner les Contrôles d'Accès
Utilisation avancée
Zend_Amf
Introduction
Zend_Amf_Server
Zend_Application
Introduction
Zend_Application démarrage rapide
Théorie générale
Exemples
Fonctionnalités principales
Plugins de ressources disponibles
Zend_Auth
Introduction
Authentification avec une table de base de données
Authentification "Digest"
Adaptateur d'authentification HTTP
LDAP Authentication
Authentification OpenID
Zend_Barcode
Introduction
Création de code-barres avec la classe Zend_Barcode
Zend_Barcode Objects
Zend_Barcode Renderers
Zend_Cache
Introduction
Aspect théorique
Les frontends Zend_Cache
Les backends Zend_Cache
Le gestionnaire de Cache
Zend_Captcha
Introduction
Opération Captcha
Adaptateurs CAPTCHA
SimpleCloud API: Zend_Cloud
Document Service Introduction
Queue Service Introduction
StorageService Introduction
Zend_CodeGenerator
Introduction
Exemples Zend_CodeGenerator
Zend_CodeGenerator Réference
Zend_Config
Introduction
Aspect théorique
Zend_Config_Ini
Zend_Config_Json
Zend_Config_Xml
Zend_Config_Yaml
Zend_Config_Writer
Zend_Config_Writer
Zend_Console_Getopt
Introduction
Déclarer les règles Getopt
Extraire les options et les arguments
Configurer Zend_Console_Getopt
Zend_Controller
Zend_Controller - Démarrage rapide
Fondations de Zend_Controller
Le contrôleur frontal (Front Controller)
L'objet Requête
Routeur Standard
Le distributeur
Contrôleurs d'action
Aides d'action (Helper)
Objet de réponse
Plugins
Utilisation de conventions de dossiers modulaires
Exceptions avec MVC
Zend_Currency
Introduction à Zend_Currency
Utiliser Zend_Currency
Options des monnaies
Qu'est ce qui définit une monnaie?
Où est le symbole monnétaire?
A quoi ressemble une monnaie?
Travailler avec les valeurs des monnaies (les montants)
Calculs avec les monnaies
Echanger (convertir) des monnaies
Informations complémentaires pour Zend_Currency
Zend_Date
Introduction
Aspect théorique
Méthodes de base
Zend_Date API Overview
Créer des dates
Constants for General Date Functions
Exemples concrets
Zend_Db
Zend_Db_Adapter
Zend_Db_Statement
Zend_Db_Profiler
Zend_Db_Select
Zend_Db_Table
Zend_Db_Table_Row
Zend_Db_Table_Rowset
Relations Zend_Db_Table
Zend_Db_Table_Definition
Zend_Debug
Afficher des informations
Zend_Dojo
Introduction
Zend_Dojo_Data: dojo.data Envelopes
Les aides de vues Dojo
Les éléments de formulaire et les décorateurs Dojo
Zend_Dojo build layer support
Zend_Dom
Introduction
Zend_Dom_Query
Zend_Exception
Utiliser les exceptions
Utilisation classique
Exceptions précédentes
Zend_Feed
Introduction
Importer des flux
Obtenir des flux à partir de pages Web
Consommer un flux RSS
Consommer un flux Atom
Consommer une entrée Atom particulière
Modifier la structure du flux ou des entrées
Classes personnalisées pour les flux et entrées
Zend_Feed_Reader
Zend_Feed_Writer
Zend_Feed_Pubsubhubbub
Zend_File
Zend_File_Transfer
Validateurs pour Zend_File_Transfer
Filtres pour Zend_File_Transfer
Zend_Filter
Introduction
Classes de filtre standards
Chaînes de filtrage
Écriture de filtres
Zend_Filter_Input
Zend_Filter_Inflector
Zend_Form
Zend_Form
Zend_Form démarrage rapide
Creating Form Elements Using Zend_Form_Element
Creating Forms Using Zend_Form
Créer un visuel personnalisé en utilisant Zend_Form_Decorator
Les éléments standards fournis avec Zend Framework
Décorateurs standards fournis avec Zend Framework
Internationaliser un formulaire Zend_Form
Advanced Zend_Form Usage
Zend_Gdata
Introduction
Authentification par procédé AuthSub
Using the Book Search Data API
Authentification avec ClientLogin
Using Google Calendar
Using Google Documents List Data API
Using Google Health
Using Google Spreadsheets
Using Google Apps Provisioning
Using Google Base
Utilisation des albums Web Picasa
Using the YouTube Data API
Attraper les exceptions Gdata
Zend_Http
Introduction
Zend_Http_Client - Utilisation avancée
Zend_Http_Client - Adaptateurs de connexion
Zend_Http_Cookie and Zend_Http_CookieJar
Zend_Http_Response
Zend_Http_UserAgent
The UserAgent Device Interface
The UserAgent Features Adapter
The WURFL UserAgent Features Adapter
The DeviceAtlas UserAgent Features Adapter
The TeraWurfl UserAgent Features Adapter
The UserAgent Storage Interface
The Session UserAgent Storage Adapter
Zend_InfoCard
Introduction
Zend_Json
Introduction
Utilisation de base
Utilisation avancée de Zend_Json
XML to JSON conversion
Zend_Json_Server - JSON-RPC server
Zend_Layout
Introduction
Zend_Layout - Démarrage rapide
Zend_Layout options de configuration
Zend_Layout, utilisation avancée
Zend_Ldap
Introduction
API overview
Scénarios d'utilisation
Outils
Accès à l'arbre LDAP de manière orientée objet avec Zend_Ldap_Node
Récupérer des informations depuis un serveur LDAP
Serialiser des données LDAP depuis/vers LDIF
Zend_Loader
Charger les fichiers et les classes dynamiquement
L'autoloader
Autoloaders de ressources
Chargeur de Plugins
Zend_Locale
Introduction
Using Zend_Locale
Normalization and Localization
Working with Dates and Times
Supported locales
Zend_Log
Présentation
Rédacteurs (Writers)
Formateurs (mise en forme)
Filtres
Utiliser la fabrique pour créer des logs
Zend_Mail
Introduction
Envoyer des courriels en utilisant SMTP
Envoyer plusieurs courriels par connexion SMTP
Utiliser différents transports
Courriel HTML
Fichiers joints
Ajouter des destinataires
Contrôler les limites MIME
En-têtes additionnels
Jeux de caractères
Encodage
Authentification SMTP
Sécuriser les transports SMTP
Lire des courriels
Zend_Markup
Introduction
Guide de démarrage avec Zend_Markup
Analyseurs Zend_Markup (parsers)
Moteurs de rendu Zend_Markup
Zend_Measure
Introduction
Création d'une mesure
Récupérer des mesures
Manipuler des mesures
Types de mesures
Zend_Memory
Présentation
Manager de mémoire
Objet mémoire
Zend_Mime
Zend_Mime
Zend_Mime_Message
Zend_Mime_Part
Zend_Navigation
Introduction
Pages
Containers
Zend_Oauth
Introduction to OAuth
Zend_OpenId
Introduction
Zend_OpenId_Consumer Basics
Zend_OpenId_Provider
Zend_Paginator
Introduction
Utilisation
Configuration
Utilisation avancée
Zend_Pdf
Introduction
Créer et charger des documents PDF
Sauvegarder les changement dans un document PDF
Les pages d'un document
Dessiner
Interactive Features
Informations du document et métadonnées
Exemple d'utilisation du module Zend_Pdf
Zend_ProgressBar
Zend_ProgressBar
Zend_Queue
Introduction
Example usage
Framework
Adapters
Customizing Zend_Queue
Stomp
Zend_Reflection
Introduction
Zend_Reflection Exemples
Réference de Zend_Reflection
Zend_Registry
Utiliser le registre
Zend_Rest
Introduction
Zend_Rest_Client
Zend_Rest_Server
Zend_Search_Lucene
Vue d'ensemble
Créer des index
Chercher dans un index
Langage de requêtes
API de construction de requêtes
Jeu de caractères
Extensibilité
Agir avec Lucene Java
Avancé
Bonnes pratiques
Zend_Serializer
Introduction
Zend_Serializer_Adapter
Zend_Server
Introduction
Zend_Server_Reflection
Zend_Service
Introduction
Zend_Service_Akismet
Zend_Service_Amazon
Zend_Service_Amazon_Ec2
Zend_Service_Amazon_Ec2: Instances
Zend_Service_Amazon_Ec2: Windows Instances
Zend_Service_Amazon_Ec2: Reserved Instances
Zend_Service_Amazon_Ec2: CloudWatch Monitoring
Zend_Service_Amazon_Ec2: Amazon Machine Images (AMI)
Zend_Service_Amazon_Ec2: Elastic Block Storage (EBS)
Zend_Service_Amazon_Ec2: Elastic IP Addresses
Zend_Service_Amazon_Ec2: Keypairs
Zend_Service_Amazon_Ec2: Regions and Availability Zones
Zend_Service_Amazon_Ec2: Security Groups
Zend_Service_Amazon_S3
Zend_Service_Amazon_Sqs
Zend_Service_Audioscrobbler
Zend_Service_Delicious
Zend_Service_DeveloperGarden
Zend_Service_Ebay
Zend_Service_Ebay_Finding
Zend_Service_Flickr
Zend_Service_LiveDocx
Zend_Service_Nirvanix
Zend_Service_ReCaptcha
Zend_Service_ShortUrl
Zend_Service_Simpy
Zend_Service_SlideShare
Zend_Service_StrikeIron
Zend_Service_StrikeIron: Bundled Services
Zend_Service_StrikeIron: Advanced Uses
Zend_Service_Technorati
Zend_Service_Twitter
Zend_Service_WindowsAzure
Zend_Service_WindowsAzure_Storage_Blob
Zend_Service_WindowsAzure_Diagnostics_Manager
Zend_Service_WindowsAzure_Storage_Queue
Zend_Service_WindowsAzure_Storage_Table
Zend_Service_Yahoo
Zend_Session
Introduction
Usage basique
Utilisation avancée
Gestion générale de la session
Zend_Session_SaveHandler_DbTable
Zend_Soap
Zend_Soap_Server
Zend_Soap_Client
WSDL
Auto découverte
Zend_Tag
Introduction
Zend_Tag_Cloud
Zend_Test
Introduction
Zend_Test_PHPUnit
Zend_Test_PHPUnit_Db
Zend_Text
Zend_Text_Figlet
Zend_Text_Table
Zend_TimeSync
Introduction
Utiliser Zend_TimeSync
Zend_Tool
Using Zend_Tool On The Command Line
Extending Zend_Tool
Zend_Tool_Framework
Introduction
Using the CLI Tool
Architecture
Creating Providers to use with Zend_Tool_Framework
Shipped System Providers
Extending and Configuring Zend_Tool_Framework
Zend_Tool_Project
Introduction
Créer un projet
Fournisseurs de Zend_Tool_Project
Rouages internes de Zend_Tool_Project
Zend_Translate
Introduction
Adaptateurs pour Zend_Translate
Utiliser les adaptateurs de traduction
Creating source files
Additional features for translation
Notation des pluriels pour Translation
Zend_Uri
Zend_Uri
Zend_Validate
Introduction
Classes de validation standard
Chaînes de validation
Écrire des validateurs
Messages de validation
Zend_Version
Lire la version de Zend Framework
Zend_View
Introduction
Scripts de contrôleur
Scripts de vue
Aides de vue
Zend_View_Abstract
Zend_Wildfire
Zend_Wildfire
Zend_XmlRpc
Introduction
Zend_XmlRpc_Client
Zend_XmlRpc_Server
ZendX_Console_Process_Unix
ZendX_Console_Process_Unix
ZendX_JQuery
Introduction
ZendX_JQuery View Helpers
ZendX_JQuery Form Elements and Decorators
Configuration système requise par Zend Framework
Introduction
Notes de migration de Zend Framework
Zend Framework 1.10
Zend Framework 1.9
Zend Framework 1.8
Zend Framework 1.7
Zend Framework 1.6
Zend Framework 1.5
Zend Framework 1.0
Zend Framework 0.9
Zend Framework 0.8
Zend Framework 0.6
Convention de codage PHP de Zend Framework
Vue d'ensemble
Formatage des fichiers PHP
Conventions de nommage
Style de codage
Recommandation sur la documentation de Zend Framework
Présentation
Format des fichiers de documentation
Recommendations
Recommended Project Structure for Zend Framework MVC Applications
Overview
Recommended Project Directory Structure
Module Structure
Rewrite Configuration Guide
Guide de performance Zend Framework
Introduction
Chargement des classes
Performance de Zend_Db
Internationalisation (i18n) and Localisation (l10n)
View Rendering
Informations de copyright