Est-ce qu'un client vous a déjà demandé de générer un PDF par PHP alors que vous n'aviez pas sous la main la librairie FPDF ou PDFlib (lite ou la licence commerciale à 1000$ pour serveur) ? Parfois, les moyens sont limités mais on doit quand même livrer quelque chose de fonctionnel, que ce soit pour générer un reçu ou une facture autrement que par HTML.
À quelques reprises, je me suis servi d'un petit script gratuit nommé DOMpdf qui s'est avéré suffisant pour mes besoins. Ce package est constitué d'un ensemble de script PHP pour générer des PDF de base à partir d'une simple structure de document HTML (d'où son nom DOM). Il supporte l'inclusion d'images et tente du mieux possible de suivre les règles CSS.
Il ne faut pas s'attendre à la perfection alors je recommande de construire son gabarit HTML le plus simplement possible pour éviter les mauvaises surprises. Pour ma part, j'ai pu mettre sans effort une image d'entête (logo), des tableaux et un peu de CSS pour la mise en page (beaucoup de règles ne sont pas supportées). Le résultat est assez fidèle aux attentes du client.
Comme il ne nécessite aucune installation d'extension sur le serveur, il suffit de télécharger le fichier compressé et de le dézipper dans le répertoire de son projet. J'ai utilisé la version stable 0.5.1 disponible sur Google Code, la version 0.6 étant encore en beta (depuis mai 2010).
Ce que je voulais arriver à faire, c'était de personnaliser un gabarit HTML en utilisant des substitutions (identifiées par des balises de commentaires), générer un PDF automatiquement sans même à avoir à le stocker sur disque et l'envoyer en attachement par courriel.
Pour ce faire, DomPDF m'a permis de convertir le document HTML en format PDF et le composant Zend_Mail de Zend Framework a été pratique car il possède la capacité de créer un attachement de fichier à partir de son contenu binaire et de l'envoyer par email.
Quelques lignes de code PHP ont suffi pour arriver à mes fins et c'est étonnamment assez performant (1 page générée à la volée - temps d'exécution pratiquement instantané) :
# Étape 1Explications par étapes :
require_once('Zend/Mail.php');
require_once('dompdf-0.5.1/dompdf_config.inc.php');
# Étape 2
$html = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/template.htm');
$html = str_replace('<!-- name -->', 'Code 18', $html);
// autres substitutions...
# Étape 3
$dompdf = new DOMPDF();
$dompdf->load_html($html);
# Étape 4
$dompdf->render();
# Étape 5
// si on veut le faire afficher en attachement "save as"
// $dompdf->stream('nom-du-document.pdf');
$pdfBinary = $dompdf->output();
# Étape 6
$mail = new Zend_Mail('UTF-8');
// propriétés
$mail->setFrom('code18.blogspot@gmail.com');
$mail->addTo('code18.blogspot@gmail.com');
$mail->setSubject('Document PDF');
$mail->setBodyText('Voici votre document PDF personnalisé');
# Étape 7 : créer l'attachement
$file = $mail->createAttachment($pdfBinary);
$file->type = 'application/pdf';
$file->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
$file->filename = 'nom-du-document.pdf';
// envoyer le message
$mail->send();
- J'inclus d'abord les deux librairies. C'est bel et bien le fichier dompdf_config.inc.php qu'on doit inclure et non dompdf.php. Curieux mais c'est comme ça.
- Je lis la source HTML du gabarit et j'effectue les remplacements.
- Je crée un objet DOMPDF et je lui passe la variable qui contient le contenu HTML en utilisant la fonction load_html(). D'autres configurations peuvent être faites ici, comme par exemple indiquer le chemin de base des images ou d'une feuille de style externe (avec set_base_path).
- Appeler la méthode render() est obligatoire. À ce stade-ci, le PDF est généré en mémoire seulement.
- Pour récupérer le fichier PDF, on peut utiliser stream() pour l'envoyer à l'utilisateur (sous forme de fenêtre "Enregistrer sous") ou encore, comme c'est le cas pour moi, récupérer le contenu binaire du fichier en appelant la fonction output().
- J'instancie un objet Zend_Mail pour construire le email à envoyer.
- Je crée un fichier en attachement en passant en paramètre la variable contenant le binaire du PDF, qui sera automatiquement lié à l'objet $mail par l'appel à createAttachment().
Les capacités de DOMpdf sont assez rudimentaires. On pourrait compléter le traitement et la manipulation à l'aide d'autres outils. Par exemple, une fois le PDF généré, s'il était enregistré sur le disque du serveur, on pourrait appeler des fonctions de PDFtk (toolkit), un outil gratuit et polyvalent, accessible à partir du shell (shell_exec en PHP) qui permettra de fusionner le PDF nouvellement créé à un autre document PDF, l'encrypter contre l'édition (avec un mot de passe), appliquer un filigrane ou un arrière-plan, etc.
Excellent article, très clair et facile à mettre en oeuvre.
En revanche, je ne parviens toujours pas à insérer une image (dompdf m’intègre le contenu du fichier public/index.php, alors que le .htaccess est bien configuré) ni de header ou footer, malgré de multiples tentatives.
En tout cas, déjà merci pour ce sympathique tuto.