Avertissement de sécurité
Présentation
Le plugin génère des fichiers PDF à partir d’un squelette écrit au format HTML 4.
Il vous permet donc de créer un PDF réellement sur mesure sans d’autre compétence que de connaître le HTML 4 et CSS.
Que ce soit un squelette pour vos articles, vos rubriques, votre plan de site ou d’autres éléments plus spécifiques, spiPDF génère le contenu en PDF.
Plusieurs librairies, plusieurs possibilités
Le plugin [1] se base - au choix de l’utilisateur - sur plusieurs classes de génération de PDF à partir de HTML :
Par défaut, le plugin utilise mPDF. Vous verrez plus bas dans cet article comment utilisez un autre librairie à la place.
Chacune des classes à ses avantages et ses inconvénients. On notera par exemple que mPDF gére le positionnement flottant (“float”) des éléments ce qui est indéniablement un plus pour de la génération d’article contenant des images.
N’hésitez pas à donner votre avis et vos expériences sur les différentes librairies dans les commentaires de l’article.
Pré-requis
A partir de la version v2.0.2 (compatible SPIP 4)
il est nécessaire d’avoir PHP 8.0 ou plus (pour la compatibilité avec les librairies embarquées)
Pour les versions v1.2.0 et précédentes, le plugin requiert :
- PHP 5
- d’installer manuellement dans le répertoire /lib/ une librairie (voir chapitre précédent)
Téléchargement et installation des librairies requises
A partir de la version v2.0.2 (compatible SPIP 4)
Il n’est plus nécessaire d’intégrer les librairies d’une facon externe, elles sont intégrées dans le répertoire vendor
du plugin
Dans les anciennes versions
Vous devez les télécharger sur leurs sites respectifs et les décompresser dans un répertoire lib/ à la racine de votre site ou dans un répertoire lib/ dans le répertoire du plugin :
Les dossiers doivent se nommer exactement respectivement mpdf, html2pdf ou dompdf (sans majuscules).
Rendu obtenu avec les différentes librairies
Après un test simple de chacune des librairies, voici les résultats que j’ai obtenu :
- mPDF version 6.0 du 01/03/2015 : bon rendu général
- HTML2PDF version 4.03 du 27/05/2011 : rendu du texte correct, problème avec certains positionnements d’images
- domPDF version 0.6.0 beta2 de 02/2011 : problème d’encodage des caractères
Utilisation
Une étape supplémentaire suffit pour commencer à utiliser le plugin.
Ajoutez un lien hypertexte vers le squelette du plugin, typiquement dans votre squelette article.html. Voici à quoi doit ressembler ce lien pour un article :
[<a href="[(#URL_PAGE{spipdf}
|parametre_url{spipdf,spipdf_article}
|parametre_url{id_article,#ID_ARTICLE}
|parametre_url{nom_fichier,article_#ID_ARTICLE})]">
télécharger l'article au format PDF</a>]
Mise en page personnalisée
C’est tout l’intérêt du plugin : permettre une mise en page personnalisée sans connaître le PHP.
Pour obtenir un PDF sur mesure, vous pouvez :
- soit modifier le squelette qui se trouve dans le répertoire du plugin : spipdf_article.html
- soir créer votre propre squelette et modifier la balise #URL_PAGE pour qu’elle appelle bien votre squelette à la place de spipdf_article (remplacer spipdf_article par le nom de votre squelette)
Par exemple, vous avez dans votre répertoire squelette, un squelette plan_site_pdf.html que vous souhaitez utiliser pour générer une sortie PDF de votre plan de site.
Il vous suffira d’appeler ce squelette/PDF de la façon suivante :
[<a href="[(#URL_PAGE{spipdf}
|parametre_url{spipdf,plan_site_pdf}
|parametre_url{nom_fichier,plan_site_pdf})]">
télécharger le plan de site au format PDF</a>]
Ce qui donnera l’URL : http://monsite.tld/spip.php?page=spipdf&spipdf=plan_site_pdf.html
Liens vers des articles SPIP dans le PDF
Si vous utilisez des liens internes du type [->art2] dans vos articles,
il est nécessaire d’utiliser le filtre abs_url sur les balises
DESCRIPTIF, CHAPO, TEXTE, PS et NOTES pour que les liens dans votre PDF pointent bien sur votre site.
Nom de fichier personnalisé
Par défaut, les fichiers PDF se nommeront document.pdf.
Si vous souhaitez préciser un nom particulier pour votre fichier, vous devrez préciser, comme dans les exemples ci-dessus, le paramètre nom_fichier dans la balise #URL_PAGE.
Choix de la librairie de génération
Pour sélectionner l’une ou l’autre des librairies supportées, vous devez changer la valeur de l’attribut lib_pdf dans la balise
Les valeurs possibles sont mpdf / html2pdf / dompdf
Vous pouvez utiliser une librairie différente par type de squelette.
Format, orientation des pages et autres subtilités
Chaque librairies autorisent la mise en page directement depuis le squelette HTML mais pas de la même façon.
Pour plus de simplicité, le format (A4, A5, Letter...) est cependant gérés par le plugin depuis cette balise page pour toutes les librairies.
Pour le reste (marge, bordure, header, footer...) chaque outils à son propre fonctionnement mais tout ceci sans toucher au code du plugin.
mPDF
La librairie utilise le sélecteur CSS @page. Ceci est également explicité dans la documentation (en anglais) de la bibliothèque.
HTML2PDF
La librairie utilise les paramètres précisés via la balise
Vous trouverez plus d’informations sur le wiki de la librairie et plus particulièrement sur la section concernant la fameuse balise page.
dompdf
Le support étant expérimental, je n’ai pas plus d’informations pour l’instant à fournir. A voir sur le site de cette librairie.
Contraintes et bugs connus
Certaines balises HTML peuvent ne pas être gérées par le plugin
C’est notamment le cas de balises qui ne sont pas gérées par la librairie que vous avez choisi d’utiliser. Dans ce cas, vous devriez obtenir une erreur à la génération du PDF ou un affichage dégradé. Dans cette situation, 2 solutions :
- le HTML qui pose problème est dans votre squelette ? et bien... trouvez autre chose en attendant mieux (mais signalez-le quand même dans les commentaires)
- le HTML est généré par SPIP ? Signalez-le dans les commentaires pour une mise à jour du plugin
Certaines balises CSS ne sont pas gérées par le plugin
Bien entendu, dans ce cas, l’affichage au format PDF sera différent de l’affichage au format HTML. On notera par exemple que le positionnement float est géré en partie par mPDF et pas du tout par HTML2PDF.
Vous devrez palier à certaines contraintes de positionnement en utilisant des tableaux imbriqués (snif !)
Encore une fois, toutes ces contraintes sont explicitées sur les site et les forums des librairies respectives.
Changer l’encodage utilisé pour la génération de PDF
Le plugin génère les PDF en UTF-8. Certaines personnes ont rencontré des problèmes de génération des contenus dans cet encodage.
Pour changer ce comportement, et utiliser ISO-8859-15, vous devez changer la constante suivante dans votre fichier d’options :
define('SPIPDF_CHARSET', 'ISO-8859-15');
Aide au développement
Pour pré-visualiser la page au lieu de générer le PDF, vous pouvez ajouter le paramètre debug_spipdf à l’URL
Par exemple : spip.php?page=spipdf&spipdf=spipdf_article&id_article=1249&nom_fichier=article-1249&debug_spipdf
Discussions par date d’activité
96 discussions
Bonjour,
j’essaye d’utiliser votre plugin avec mpdf, et j’ai besoin d’appeler certaines fonctions de mpdf pour la mise en page, mais comment inclure cet appel dans mon code html ?
j’ai essayé ça mais j’ai une erreur :
Merci de votre aide.
Ce n’est pas prévu avec ce plugin. Mais pouquoi ne pas ajouter le footer directement dans le squelette qui sert de base à la génération du PDF ?
Sinon, il faut jouer avec spipdf.php vers la ligne 269
Yves
Aie, problème.
Le footer doit être inséré dans chaque page A4, avec pagination.
Je dois aussi faite des appels pour imposer un retour à la page suivante, à inclure quand je le souhaite dans mon code HTML.
Sinon, je peux essayer d’utiliser directement mpdf sans plugin ?
Merci quand même.
Tu peux tout essayer :)
Ceci étant, j’ai du mal à saisir ce qui te pose problème. Avec mpdf, tu peux ajouter un certain nombre de paramètres dans le squelette html.
A titre d’exemple, j’ai ajouté :
dans spipdf_article.html, après et j’ai un joli pied de page.
Ceci est documenté : http://mpdf1.com/manual/index.php?tid=176
Merci, les footer et header marchent avec cette méthode, par contre le
<pagebreak />
ne fonctionne pas du tout, et si je mets un<tocpagebreak />
, il me rajoute une page vide !J’utilise la dernière version 5.3 de mpdf.
Re-bonjour,
j’ai essayé en utilisant
<pagebreak />
directement dans le code mpdf (donc sans utiliser spipdf, et ça marche.Je suppose donc que spipdf filtre ce code qui m’est indispensable pour aller à la page suivante (je dois créer un manuel complet en pdf).
Je ne vois pas dans spipdf.php comment enlever ce ’nettoyage’.
Merci beaucoup de votre aide.
Bon,
j’ai trouvé la cause du problème... et la solution !
Dans le fichier spipdf.php lignes 165 et 177 faut remplacer « page » par « page » (rajouter un espace après page), car sinon il vire tous les tags qui commencent par page (donc pagebreak aussi).
Bonjour,
OK, je penserais à ajouter l’espace ;)
Répondre à ce message
Bonjour,
ce plugin me plait pour pouvoir générer des pdf avec le contenu d’un article + du contenu annexe mais j’ai 2 problèmes.. voici mon lien :
ce qui donne l’URL pour les article : spip.php ?page=spipdf&spipdf=spipdf_article&document=article_
donc il me manque l’ID de l’article. Que dois-je changer ?
mon lien est dans le pied de page : lorsque je l’entoure de
il disparaît (sur une page article) et si je ne l’entoure pas il apparaît sur toutes les pages du site.
merci
Bonjour,
C’était de ma faute, j’avais oublié id_article dans l’appel au modèle.
j’ai un autre problème mais je ne sais pas si cela peut être résolu : j’ai des cartes Google insérées en iframe dans mes articles et elles ne s’impriment pas.
Par contre si j’utilise la fonction « imprimer » du navigateur elles le sont (imprimées.)
dd
Répondre à ce message
oups, j’avais posté sur le forum de la V0.1 du plugin. je re-poste donc ici, désolée.
Je suis en train de tester le plugin sur un site en local (mamp, php5, spip 2.1.10, plugin 0.2.1 [44725]). ça marche globalement sur tous les articles, sauf sur les articles dans lequel le rédacteur a rentré deux images à la suite dans le champ texte, par exemple :
Dans ce cas le pdf est vide, blanc. Si j’enlève l’une des deux images, le pdf s’affiche bien. Comment faire pour régler le pb ?
merci !
Bonsoir,
Ca doit-être une des expressions régulières qui merdouille. Je vais regarde ça...
En attendant, si tu connais un peu le PHP, tu peux commenter une par une les expressions de la fonction spipdf_nettoyer_html dans spipdf.php (les lignes qui commencent par $html = preg_replace...)
merci pour ta réponse,
j’ai commenté les expressions une par une et ce sont ces deux-là qui semblent poser problème :
(lignes 120 et 130 du fichier spipdf.php)
En les commentant, le pdf n’est plus blanc. (par contre, et ça doit être logique j’imagine, les float des images ne sont plus pris en compte dans le pdf produit).
Répondre à ce message
Bonjour Yves,
Je pense qu’il y a un bug avec spipdf 0.2.1 rev 44725 et spip 2.1.10, 2.1.9, ......
cette version modifie le traitement de la puce graphique de spip, si je saisie le raccourcis typo tiret - ça remplace l’image de la puce par une liste non ordonnée
c’est peu être dans cette fonction de spipdf.php qu’il y a une collision entre le squelette de spipdf et celui de spip non ?
cordialement
Bonjour,
Je vais regarder ça dès que j’ai 5 minutes. Il y a aussi un souci quand les articles sont très long. Ca vient de quelques expressions régulières.
++ Yves
Bonjour, je suis justement confronté au problème.
Des pistes pour la résolution ?
Bonjour,
Je ne sais plus pour quelle raison j’avais activé le remplacement des puces de spip... je crois que ça posait un pb mais impossible de me souvenir duquel ;)
En attendant mieux, il suffit de commenter dans spipdf.php :
Bonjour,
Mon problème n’était pas celui-là, j’ai commenté ces 2 filtres pour avoir une génération correcte.
// replacer id par name pour les notes
$patterns_note = ’//iUms’ ;
function remplaceIdParName($matches) return str_replace(’id=\’’, ’name=\’’, $matches[0]) ;
//$html = preg_replace_callback($patterns_note, ’remplaceIdParName’, $html) ;
// float sur les puces graphiques
$patterns_puce = ’//iUms’ ;
function remplaceFloatPuce($matches) return str_replace(’style=\’’, ’style=\’float:left ;’, $matches[0]) ;
//$html = preg_replace_callback($patterns_puce, ’remplaceFloatPuce’, $html) ;
Répondre à ce message
(en réponse à un message de yonnel posté sur le forum de la version précédente)
Je poste ici car je pense que vous utilisez la version 0.2.0 du plugin...
Merci pour votre retour. A vrai dire, je n’ai pas tout compris à votre problème... Vous voulez dire qu’aucune feuille de style ne fonctionne chez vous sans cette modification ?
Parce que quand je teste une feuille de style personnalisée (exemple : auteur.css dans squelettes-dist), de mon côté ça fonctionne.
Dans ce cas, pouvez-vous me préciser votre configuration (Linux, Windows, Mac ? PHP4, PHP5 ?) ? Merci.
Bonjour,
Je suis sous windows VISTA, en appli locale sous XAMPP, PHP Version 5.3.1
Je teste avant de livrer mon appli sur un serveur sous LINUX
Rien ne fonctionnait sans cela chez moi.
J’ai même été obligé de faire la même chose pour les images en background en ligne 20256 :
$CSSstr = str_replace('localhost','127.0.0.1',$CSSstr);
Malgré tout, alors que cela ne bloque plus, certaines images en background, style :
#ColContenu .tabbox .contenu .inner ul.liste-mail { background: #FFF url(../images/picto_liste_mail.jpg) no-repeat top center; width:385px; padding:10px 0 5px 35px; margin:0;}
n’apparaissent pas, alors que $this->cacasadeCSS en ligne 20356 fait bien apparaître l’image :
Mais est-ce lié au pdf ?
yonnel
Est-ce que le pb se pose sous Vista et sous Linux ?
Je vais tester dès que possible les backgrounds...
Répondre à ce message
Bonjour, je suis le développeur le plus actif actuellement du projet dompdf (et je suis français).
Je profite de cet article pour vous dire que si vous avez des questions sur cette bibliothèque, ou des suggestions, n’hésitez pas à m’en faire part, j’y répondrais avec plaisir.
Suivez le projet sur Twitter pour être au courant des dernières nouveautés.
Une remarque concernant le CSS float : je vais travailler sérieusement sur son support dans très peu de temps, et j’en parlerais pas tweet très certainement, ainsi que sur le tracker.
Bonjour,
Merci Fabien pour cette infos et pour le boulot sur dompdf. Je crois être déjà abonné au tracker concernant la gestion du float ;)
Répondre à ce message
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |