Manuel PHP
Précédent |  | Suivant

# LXXXIV. 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és par des alternatives gratuites pour générer des PDF, sans passer par des bibliothèques PDF, voyez cette entrée de la FAQ.

# 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

Pour inclure le support de la PDFlib dans votre PHP, 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, ajouter 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.

# 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ée 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() suivi d'un appel à pdf_open_file()
pdf_set_font() | pdf_findfont() suivi 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", de 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 un 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
overload | Niveau supérieur | pdf_add_annotation