Manuel PHP
Précédent |  | Suivant

# XCVII. PDF

# Introduction

Les fonctions PDF permettent de créer des fichiers PDF en utilisant la bibliothèque PDFlib créée par Thomas Merz.

La documentation de cette section est uniquement destinée à être une introduction aux fonctions disponibles, et ne doit pas être considérée comme une référence exaustive. Reportez-vous à la documentation inclue dans la distribution de PDFlib pour plus de détails et d'explications. Elle fournit une excellente référence des capacités de PDFlib, et contient la documentation la plus à jour.

Toutes les fonctions de la PDFlib et du module PHP ont des noms et des arguments identiques. Vous aurez à comprendre quelques concepts basiques de PDF et PostScript pour l'utiliser efficacement. Toutes les longueurs et coordonnées sont mesurées en points PostScript. Il y a généralement 72 points PostScript pour faire un pouche (2.54 cm), mais cela dépend de la résolution de sortie. Reportez-vous à la documentation PDFlib inclue dans la distribution pour plus de détails sur le système de coordonnées.

Notez que la plupart des fonctions PDF requièrent une ressource pdf object comme premier paramètre. Voyez les exemples ci-dessous pour plus de détails.

> Note : Si vous êtes intéressé par des alternatives gratuites pour générer des PDF, sans passer par des bibliothèques PDF, voyez cette entrée de la FAQ.

> Note : Cette extension a été déplacée dans PECL depuis PHP 4.3.9.

# Pré-requis

PDFlib est disponible en téléchargement à http://www.pdflib.com/products/pdflib/index.html, mais impose l'achat d'une license pour l'utiliser commercialement. Les bibliothèques JPEG et TIFF sont nécessaires pour faire fonctionner cette bibliothèque.

## Problèmes avec les anciennes versions de PDFlib

Toutes les versions de PHP 4 éditées après le 9 Mars 2000 ne suportent pas les versions de PDFlib plus anciennes que PDFlib 3.0.

PDFlib 3.0 et plus récent est supporté par PHP 3.0.19 et plus récent.

# Installation

Cette extension PECL n'est pas intégrée à PHP. Des informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : http://pecl.php.net/package/pdflib.

Pour inclure le support de la PDFlib dans votre PHP < 4.3.9, il faut compiler PHP avec l'option --with-pdflib[=DIR]. DIR est le dossier d'installation de PDFlib et, par défaut, il vaut `/usr/local`. De plus, vous pouvez aussi spécifier les dossiers des libariries jpeg, tiff et png que vous voulez utiliser avec la PDFlib. Ceci est optionnel pour PDFlib 4.x. Pour cela, ajoutez les lignes suivantes à votre script de configuration : --with-jpeg-dir[=DIR], --with-png-dir[=DIR] et --with-tiff-dir[=DIR].

Lorsque vous utilisez les versions 3.x de PDFlib, vous devez configurer PDFlib avec l'option --enable-shared-pdflib.

Depuis PHP 4.3.9, voous devez installer cette extension via PEAR, en utilisant la commande suivante : pear install pdflib.

# Configuration à l'exécution

Cette extension ne définit aucune directive de configuration.

# Confusion entre les vieilles versions de PDFLib

Depuis le début du support de PDF sous PHP, (commençant avec la version PDFLib 0.6), il y a eu des milliers de modifications dans les API de PDFLib. La plupart de ces modifications ont été suivies par PHP, et parfois même au prix de modifications des API PHP. Depuis la version 3.x, ces API semblent s'être stabilisées, et PHP 4 a adopté cette version comme le minimum nécessaire pour supporter PDF. En conséquence de quoi, un grand nombre de fonctions vont disparaître, ou être remplacées. Le support de PDFLib 0.6 est complètement abandonné. La liste suivante indique quelles sont les fonctions obsolètes en PHP 4.02, et qui devraient être remplacées par de nouvelles versions.

Tableau 1. Fonctions obsolètes et leur remplacement

Ancienne fonction | Remplacement
--- | ---
pdf_put_image() | Désormais inutile.
pdf_execute_image() | Désormais inutile.
pdf_get_annotation() | pdf_get_bookmark() en utilisant les mêmes paramètres.
pdf_get_font() | pdf_get_value() en passant "font" comme second paramètre.
pdf_get_fontsize() | pdf_get_value() en passant "fontsize" comme second paramètre.
pdf_get_fontname() | pdf_get_parameter() en passant "fontname" comme second paramètre.
pdf_set_info_creator() | pdf_set_info() en passant "Creator" comme second paramètre.
pdf_set_info_title() | pdf_set_info() en passant "Title" comme second paramètre.
pdf_set_info_subject() | pdf_set_info() en passant "Subject" comme second paramètre.
pdf_set_info_author() | pdf_set_info() en passant "Author" comme second paramètre.
pdf_set_info_keywords() | pdf_set_info() en passant "Keywords" comme second paramètre.
pdf_set_leading() | pdf_set_value() en passant "leading" comme second paramètre.
pdf_set_text_rendering() | pdf_set_value() en passant "textrendering" comme second paramètre.
pdf_set_text_rise() | pdf_set_value() en passant "textrise" comme second paramètre.
pdf_set_horiz_scaling() | pdf_set_value() en passant "horizscaling" comme second paramètre.
pdf_set_text_matrix() | Désormais abandonnée.
pdf_set_char_spacing() | pdf_set_value() en passant "charspacing" comme second paramètre.
pdf_set_word_spacing() | pdf_set_value() en passant "wordspacing" comme second paramètre.
pdf_set_transition() | pdf_set_parameter() en passant "transition" comme second paramètre.
pdf_open() | pdf_new() suivie d'un appel à pdf_open_file()
pdf_set_font() | pdf_findfont() suivie d'un appel à pdf_setfont()
pdf_set_duration() | pdf_set_value() en passant "duration" comme second paramètre.
pdf_open_gif() | pdf_open_image_file() en passant "gif" comme second paramètre.
pdf_open_jpeg() | pdf_open_image_file() en passant "jpeg" comme second paramètre.
pdf_open_tiff() | pdf_open_image_file() en passant "tiff" comme second paramètre.
pdf_open_png() | pdf_open_image_file() en passant "png" comme second paramètre.
pdf_get_image_width() | pdf_get_value() en passant "imagewidth" comme second paramètre et l'image en troisième paramètre.
pdf_get_image_height() | pdf_get_value() en passant "imageheight" comme second paramètre et l'image en troisième paramètre.

# Exemples

La plupart des fonctions sont simples d'emploi. Le plus difficile est probablement de créer un fichier PDF simple. L'exemple suivant devrait vous mettre sur les rails. Il crée un fichier `test.pdf` d'une page. La page contient du texte "Times Roman outlined", d'une taille de 30pt. Le texte est aussi souligné.

Exemple 1. Création d'un document PDF avec PDFlib

`<?php
$pdf = pdf_new();
pdf_open_file($pdf, "test.pdf");
pdf_set_info($pdf, "Author", "Uwe Steinmann");
pdf_set_info($pdf, "Title", "Test for PHP wrapper of PDFlib 2.0");
pdf_set_info($pdf, "Creator", "See Author");
pdf_set_info($pdf, "Subject", "Testing");
pdf_begin_page($pdf, 595, 842);
pdf_add_outline($pdf, "Page 1");
$font = pdf_findfont($pdf, "Times New Roman", "winansi", 1);
pdf_setfont($pdf, $font, 10);
pdf_set_value($pdf, "textrendering", 1);
pdf_show_xy($pdf, "Times Roman outlined", 50, 750);
pdf_moveto($pdf, 50, 740);
pdf_lineto($pdf, 330, 740);
pdf_stroke($pdf);
pdf_end_page($pdf);
pdf_close($pdf);
pdf_delete($pdf);
echo '<a href="getpdf.php">terminé</a>';
?>`

Le script `getpdf.php` ne fait que retourner le document PDF.

Exemple 2. Affichage d'un PDF précalculé

`<?php $len = filesize($filename); header("Content-type: application/pdf"); header("Content-Length: $len"); header("Content-Disposition: inline; filename=foo.pdf"); readfile($filename); ?>`

La distribution de la PDFlib contient des exemples plus complexes, qui créent une page avec une horloge à aiguille. Ici, nous utilisons la création de pages en mémoire, pour éviter l'utilisation de fichiers temporaires. L'exemple a été adapté à PHP. (Cet exemple est disponible dans la documentation CLibPDF.)

Exemple 3. Exemple pdfclock de PDFlib

`<?php
$radius = 200;
$margin = 20;
$pagecount = 10;
$pdf = pdf_new();
if (!pdf_open_file($pdf, "")) {
echo error;
exit;
};
pdf_set_parameter($pdf, "warning", "true");
pdf_set_info($pdf, "Creator", "pdf_clock.php");
pdf_set_info($pdf, "Author", "Uwe Steinmann");
pdf_set_info($pdf, "Title", "Analog Clock");
while ($pagecount-- > 0) {
pdf_begin_page($pdf, 2 * ($radius + $margin), 2 * ($radius + $margin));
pdf_set_parameter($pdf, "transition", "wipe");
pdf_set_value($pdf, "duration", 0.5);
pdf_translate($pdf, $radius + $margin, $radius + $margin);
pdf_save($pdf);
pdf_setrgbcolor($pdf, 0.0, 0.0, 1.0);
/* les marques des minutes */
pdf_setlinewidth($pdf, 2.0);
for ($alpha = 0; $alpha < 360; $alpha += 6) {
pdf_rotate($pdf, 6.0);
pdf_moveto($pdf, $radius, 0.0);
pdf_lineto($pdf, $radius-$margin/3, 0.0);
pdf_stroke($pdf);
}
pdf_restore($pdf);
pdf_save($pdf);
/* les marques des 5 minutes */
pdf_setlinewidth($pdf, 3.0);
for ($alpha = 0; $alpha < 360; $alpha += 30) {
pdf_rotate($pdf, 30.0);
pdf_moveto($pdf, $radius, 0.0);
pdf_lineto($pdf, $radius-$margin, 0.0);
pdf_stroke($pdf);
}
$ltime = getdate();
/* l'aiguille des heures */
pdf_save($pdf);
pdf_rotate($pdf,-(($ltime['minutes']/60.0)+$ltime['hours']-3.0)*30.0);
pdf_moveto($pdf, -$radius/10, -$radius/20);
pdf_lineto($pdf, $radius/2, 0.0);
pdf_lineto($pdf, -$radius/10, $radius/20);
pdf_closepath($pdf);
pdf_fill($pdf);
pdf_restore($pdf);
/* l'aiguille des minutes */
pdf_save($pdf);
pdf_rotate($pdf,-(($ltime['seconds']/60.0)+$ltime['minutes']-15.0)*6.0);
pdf_moveto($pdf, -$radius/10, -$radius/20);
pdf_lineto($pdf, $radius * 0.8, 0.0);
pdf_lineto($pdf, -$radius/10, $radius/20);
pdf_closepath($pdf);
pdf_fill($pdf);
pdf_restore($pdf);
/* l'aiguille des secondes */
pdf_setrgbcolor($pdf, 1.0, 0.0, 0.0);
pdf_setlinewidth($pdf, 2);
pdf_save($pdf);
pdf_rotate($pdf, -(($ltime['seconds'] - 15.0) * 6.0));
pdf_moveto($pdf, -$radius/5, 0.0);
pdf_lineto($pdf, $radius, 0.0);
pdf_stroke($pdf);
pdf_restore($pdf);
/* Dessin d'un petit cercle dans le centre */
pdf_circle($pdf, 0, 0, $radius/30);
pdf_fill($pdf);
pdf_restore($pdf);
pdf_end_page($pdf);
// pour voir la différence
sleep(1);
}
pdf_close($pdf);
$buf = pdf_get_buffer($pdf);
$len = strlen($buf);
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=foo.pdf");
echo $buf;
pdf_delete($pdf);
?>`

# Voir aussi

> Note : Une alternative au module module PDFlib est le module de FastIO : ClibPDF. Voyez la section ClibPDF pour plus de détails. Notez que ClibPDF disponse d'une API différente de PDFlib.

Précédent | Sommaire | Suivant
preg_split | Niveau supérieur | pdf_add_annotation