Previous Next

Dessiner

Geométrie

Le format PDF utilise la même geomé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 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).



        

Example #1 Dessiner une ligne dans la page

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:

Example #2 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 factory méthodes : Zend_Pdf_Font::fontWithName($fontName) pour les 14 polices PDF standard ou Zend_Pdf_Font::fontWithPath($filePath) pour les polices personnalisées.

Example #3 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 uune quelconque raison, ou si ce n'est pas une police TrueType, la méthode lèvera une exception :

Example #4 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 :

Example #5 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 visualiseur 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 :

Example #6 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 de 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 :

Example #7 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 :

Example #8 Combiner les options de polices incorporées



        

A partir de ZF 1.5, 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 :

Example #9 Extraction de polices à partir d'un document chargé.

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();
...

Example #10 Extraction d'une police à partir d'un document chargé en spécifiant le nom de police.

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

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

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

Example #11 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.

Rotations.

Les pages PDF peuvent être tourner avant appliquer les opérations de dessin. Cela peut-être fait en utilisant la méthode Zend_Pdf_Page::rotate() :



        

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 :



        



        



        



        



        



        



        



        



        



        



        



        



        

Previous Next
Introduction to Zend Framework
Présentation
Installation
Zend_Acl
Introduction
Affiner les Contrôles d'Accès
Utilisation avancée
Zend_Auth
Introduction
Authentification avec une table de base de données
Authentification "Digest"
Adaptateur d'authentification HTTP
LDAP Authentication
Authentification OpenID
Zend_Cache
Introduction
La théorie du cache
Les frontends Zend_Cache
Les backends Zend_Cache
Zend_Captcha
Introduction
Captcha Operation
Captcha Adapters
Zend_Config
Introduction
Point de vue théorique
Zend_Config_Ini
Zend_Config_Xml
Zend_Console_Getopt
Introduction à Getopt
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 : Zend_Controller_Router_Rewrite
Le dispatcheur
Contrôleurs d'action
Aides d'action (Helper)
Objet de réponse
Plugins
Utilisation de conventions de dossiers modulaires
Exceptions avec MVC
Migrer depuis des versions précédentes
Zend_Currency
Introduction à Zend_Currency
How to work with currencies
Migrer depuis des versions antérieures
Zend_Date
Introduction
Point de vue 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_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_Dom
Introduction
Zend_Dom_Query
Zend_Exception
Utiliser les exceptions
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_File
Zend_File_Transfer
Validators for 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 Quick Start
Creating Form Elements Using Zend_Form_Element
Creating Forms Using Zend_Form
Creating Custom Form Markup Using Zend_Form_Decorator
Standard Form Elements Shipped With Zend Framework
Standard Form Decorators Shipped With Zend Framework
Internationalization of Zend_Form
Advanced Zend_Form Usage
Zend_Gdata
Introduction à Gdata
Authentification par procédé AuthSub
Authentification avec ClientLogin
Using Google Calendar
Using Google Documents List Data API
Using Google Spreadsheets
Using Google Apps Provisioning
Using Google Base
Utiliser l'API YouTube
Utilisation des albums Web Picasa
Attraper les exceptions Gdata
Zend_Http
Zend_Http_Client - Introduction
Zend_Http_Client - Utilisation avancée
Zend_Http_Client - Adaptateurs de connexion
Zend_Http_Cookie and Zend_Http_CookieJar
Zend_Http_Response
Zend_InfoCard
Introduction
Zend_Json
Introduction
Utilisation de base
Objets 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
Zend_Loader
Charger les fichiers et les classes dynamiquement
Chargeur de Plugins
Zend_Locale
Introduction
Using Zend_Locale
Normalization and Localization
Working with Dates and Times
Supported Languages for Locales
Supported Regions for Locales
Zend_Log
Présentation
Rédacteurs (Writers)
Formateurs (mise en forme)
Filtres
Zend_Mail
Introduction
Envoyer des emails en utilisant SMTP
Envoyer plusieurs emails par connexion SMTP
Utiliser différents transports
Email HTML
Fichiers joints
Ajouter des destinataires
Contrôler les limites MIME
Entêtes additionnelles
Jeux de caractères
Encodage
Authentification SMTP
Sécuriser les transports SMTP
Lire des emails
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_OpenId
Introduction
Zend_OpenId_Consumer Basics
Zend_OpenId_Provider
Zend_Paginator
Introduction
Usage
Configuration
Advanced usage
Zend_Pdf
Introduction.
Créer et charger des documents PDF
Sauvegarder les changement dans un document PDF
Les pages d'un document
Dessiner
Informations du document et métadonnées.
Exemple d'utilisation du module Zend_Pdf
Zend_Registry
Utiliser le registre
Zend_Rest
Introduction
Zend_Rest_Client
Zend_Rest_Server
Zend_Search_Lucene
Overview
Building Indexes
Searching an Index
Query Language
Query Construction API
Character Set
Extensibility
Interoperating with Java Lucene
Advanced
Best Practices
Zend_Server
Introduction
Zend_Server_Reflection
Zend_Service
Introduction
Zend_Service_Akismet
Zend_Service_Amazon
Zend_Service_Audioscrobbler
Zend_Service_Delicious
Zend_Service_Flickr
Zend_Service_Nirvanix
Zend_Service_ReCaptcha
Zend_Service_Simpy
Introduction
Zend_Service_StrikeIron
Zend_Service_StrikeIron: Bundled Services
Zend_Service_StrikeIron: Advanced Uses
Zend_Service_Technorati
Zend_Service_Yahoo
Zend_Session
Introduction
Usage basique
Utilisation avancée
Global Session Management
Zend_Session_SaveHandler_DbTable
Zend_Soap
Zend_Soap_Server
Zend_Soap_Client
WSDL Accessor
AutoDiscovery. Introduction
Class autodiscovering.
Functions autodiscovering.
Autodiscovering. Datatypes.
Zend_Test
Introduction
Zend_Test_PHPUnit
Zend_Text
Zend_Text_Figlet
Zend_TimeSync
Introduction
Utiliser Zend_TimeSync
Zend_Translate
Introduction
Adaptateurs pour Zend_Translate
Utiliser les adaptateurs de traduction
Zend_Uri
Zend_Uri
Zend_Validate
Introduction
Classes de validation standard
Chaînes de validation
Ecrire des validateurs
Zend_Version
Lire la version du 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
Configuration système requise par le Zend Framework
Version de PHP requise
Extensions PHP
Les composants du Zend Framework
Dépendances internes du Zend Framework
Convention de codage PHP du Zend Framework
Vue d'ensemble
Formatage des fichiers PHP
Conventions de nommage
Style de codage
Informations de copyright