Cette contribution est basée sur celle de Fabrice et Jérôme Fenal (2 octobre 2005) : http://www.spip-contrib.net/Articles-SPIP-au-format-PDF
Elle a pour objet de gérer correctement les liens dans les PDF générés. Tous les types de liens sont pris en charge, à savoir :
- Lien externe : par exemple un site Web ou une adresse courriel.
Exemple : [SPIP-http://www.spip.net/]
- Liens internes de note (note dans le texte vers le bas de page, et note de bas de page vers le texte).
- Lien interne vers un article de votre site. Ces liens sont transformés en lien externe avec la syntaxe suivante :
http://votre nom de domaine/article.php3?id_article=identifiant de l'article
J’ai essayé d’inclure dans un article de test (en local, avec EasyPHP) tous les raccourcis typographiques SPIP possibles. Voici, à titre de démonstration, le fichier pdf correspondant :
Attention : Pour générer les liens de note, je n’ai pas trouvé d’autre solution que d’effectuer deux itérations dans le parsing de l’article. Attendez-vous donc à ce que la génération d’un PDF prenne deux fois plus de temps qu’avec les contributions précédentes.
Installation
Vous trouverez en pièce-jointe (PDFAvecLiens.zip), les fichiers nécessaires à la génération des articles au format PDF :
- Copiez article_pdf.php3 à la racine de votre site SPIP.
- Copiez le fichier mes _fonctions.php3 à la racine de votre site SPIP. Attention, si le fichier mes_fonctions.php3 existe déjà, recopiez le code contenu dans notre fichier mes_fonctions.php3 entre les balises ?php et ? dans votre fichier mes_fonctions.php3.
- Copiez le répertoire pdf dans le répertoire de SPIP contenant vos squelettes ou à la racine de SPIP si vos squelettes se trouvent... à la racine de SPIP.
- Créez un dossier nommé : _article_PDF dans le répertoire IMG et de lui attribuer les permissions à 777 (comme vous l’aviez fait lors de l’installation de SPIP pour le répertoire IMG par exemple).
- Faites un lien dans votre squelette article.html vers article_pdf.php3. Mon lien ressemble à ceci :
<a href="article_pdf.php3?id_article=#ID_ARTICLE">
<img src="#DOSSIER_SQUELETTE/images/pdf.gif"/>
Télécharger</a>
Evidemment, dans mon répertoire de squelettes, j’ai un sous-répertoire nommé images contenant un image pdf.gif.
- Dans article_pdf.html, mettez des valeurs correctes pour les variables $path_pdf (chemin du répertoire où seront sauvés les fichiers pdf), $class_path (emplacement des classes PHP servant à générer les pdf) et $site_logo_path (chemin vers le logo de votre site, si vous en avez un).
- N’oubliez pas d’activer l’extension PHP php_gd2 sur votre serveur, si ce n’est déjà fait.
- Dans le répertoire Code SPIP Demo, vous trouverez aussi le code SPIP ayant servi à générer le PDF de démo. Vous pouvez le réutiliser en local pour vos tests (attention aux numéros des images dans le texte SPIP, qui ne seront probablement pas les mêmes chez vous, par exemple : img07|left).
Explications
Parsing des liens
Le point d’entrée pour construire le PDF se trouve dans article_pdf.html. Il s’agit de Build :
$pdf-Buid($file_out) ;
Build est défini dans la classe PDF du fichier lib_pdf_global.php. On fait deux itérations par des PDF_SPIP::BuildDocument() et ce n’est qu’à la fin qu’on enregistre le document en appelant FPDF::Output().
PDF_SPIP::BuildDocument() appelle PDF_SPIP::GenerateText() qui appelle plusieurs fois PDF::WriteHTML. C’est dans cette dernière méthode que l’on détecte la présence de liens (’HREF’ est positionné à true) et que l’on fait la distinction entre les différents types de liens évoqués au début de ce document.
Les notes de bas de page nécessitent deux itérations. Pourquoi ? Parce que lorsque vous rencontrez le raccourci typographique de note (format SPIP : 2 crochets ouvrants et 2 crochets fermants), vous devez créer deux liens dans la page html générée (et donc le PDF basé sur la page) : celui dans le texte et celui en bas de page. Or, lors du parsing, vous ne connaissez pas l’emplacement de ce dernier lien de bas de page, puisque vous n’avez pas fini de parcourir le texte. On utilise deux tableaux BottomLinkIDArray et TopLinkIDArray pour sauver les identifiants de liens. A la première itération, on ajoute un lien bidon. A la seconde itération, on met un vrai lien en allant chercher son identifiant dans les tableaux.
Modèle de PDF
C’est la classe PDF_SPIP, définie dans le fichier lib_pdf_spip.php qui détermine l’aspect de la page de garde ainsi que les en-têtes et pieds de page. Mon modèle est une version légèrement modifiée du modèle d’origine :
L’entête est simplement constituée du titre.
En haut, on reprend le logo du site auquel on accole son nom et son URL. Attention : dans ce modèle, on ignore les logos de la rubrique et de l’article.
Au centre, le surtitre, le titre et le chemin des rubriques.
Plus bas, les dates de mise en ligne et parution.
En bas, le descriptif suivi d’une notice de copyright.
Le pied de page est constitué d’un copyright avec le nom du site et du numéro de la page sur le nombre total de page.
Problèmes avec Internet Explorer
Dans article_pdf.php3 ont été définis deux modes : Release et Debug.
Le mode Debug force la regénération du fichier pdf, quelque soit la date du fichier préexistant. Il affiche également le pdf directement dans le navigateur. Ce navigateur doit être Firefox. En effet, l’affichage direct semble poser problème sous IE6 (même SP2) : au lieu de lancer l’affichage du contenu du pdf, il affiche un dump du fichier !
Le mode Release, lui fonctionne sous IE (SP2) et Firefox. Il produit une boîte de dialogue demandant à l’internaute s’il souhaite lancer un lecteur de PDF externe ou sauver le pdf sur son disque. Le pdf n’est recréé que si la date de mise à jour dépasse celle du fichier pdf préexistant (ou si aucun fichier pdf n’existe, bien sûr).
Ce qu’il reste à faire
(pour les perfectionnistes...)
- Habillage correct des images avec le texte et les placer correctement sur la page (à gauche, à droite, ou centrée)
- Gestion étendue des tableaux : permettre l’insertion de liens (ignorés pour le moment) et d’images (placées à l’extérieur du tableau pour le moment) à l’intérieur d’une cellule de tableau.
- Quand on insère une ancre dans le texte, créer dans le pdf un lien qui pointe directement vers cette ancre, sans passer par un lien HTTP externe.
- Prendre en compte les citations, pour le moment ignorées.
- Afficher une puce différente par niveau de hiérarchie en cas de puces imbriquées.
- Afficher correctement du code informatique. Actuellement, la première ligne est ignorée.
- Refactoring du code (par exemple, ne garder qu’une classe ou deux classes parmi les trois classes PDF, FPDF et PDF_SPIP)
Discussions par date d’activité
15 discussions
tres bonne contrib
j’ai cependant un chti probleme,
tout fonctionne sauf pour « Date de mise en ligne : vendredi 24 aot 2007 »,
comme vous pouvez le constater pour le mois d’août le « û » est mangé,le mode choisi est utf-8, j’ai essayé avec les iso, mais dans ces cas c’est tout le reste du pdf qui apparait mal
Pouvez vous me donner la solution pour faire apparaitre la date en chiffre du type 24/08/2007 ou encore mieux avec le « û » ?
Encore bravo pour ce code et d’une maniere generale pour cet open-source !!!!
Indepedenza !!
Répondre à ce message
Merci pour cette merveilleuse contrib.
J’ai un problème :
FPDF error : GIF parser : unable to open file IMG/siteon0.gif
alors que j’Ai placé :
$path_pdf = « /IMG/_article_PDF/ » ;
$class_path = $GLOBALS[’dossier_squelettes’] . « #DOSSIER_SQUELETTE/pdf/ » ;
$site_logo_path = $GLOBALS[’dossier_squelettes’] . « IMG/(#LOGO_SITE_SPIP » ;
une idée ?
Par rapport a l’ erreur FPDF error : GIF parser : unable to open file j’ai eu le meme probleme. Ca venait du passage a php5. En effet, dans la librairie gif.php il y a un certain nombre d’ appels de fonction avec une initialisation de variable dans l’ appel : ex :$this->m_img->load($this->m_lpData, $imgLen = 0) Or, ces fonctions doivent retourner une valeur de ce parametre en sortie (passage par reference). En php4, il semble que l’ affectation de la variable se fasse AVANT l’ appel de la fonction alors qu’ en php5 elle se fait APRES... conclusion, $imgLen est remise a zero. Qui plus est, ces affectations dans l’ appel sont inutiles car les fonctions appellees font deja l’ initialisation.
Il suffit donc de supprimer l’ affectation dans l’ appel. Ca revient a modifier comme suit le fichier gif.php :
Répondre à ce message
Bonjour à toutes et à tous,
Je n’arrive pas à faire fonctionner le plugin. Si quelqu’un pouvait m’aider ?
Je suis sous SPIP 1.9.1, avec GD2 activée.
Le plugin est installé dans MON_SITE/plugin/article_pdf_1_9
Il est reconnu et activé sous SPIP
J’ai placé la balise : #ARTICLE_PDF dans le fichier squelette article.htm
Je vois sur mon site en visite dans les articles le logo cliquable du pdf...
Je clique et je reviens à ma page d’acceuil !
Je précise que le dossier sous /IMG/article_pdf est en 777...
OS COURT !
Répondre à ce message
Bonjour,
j’utilise cette contrib pour générer les pdf et je trouve cela trés bien. En revanche je rencontre un probleme avec les carractères accentués ou spéciaux.
J’utilise SPIP 1.9.1 avec codage UTF-8 .
J’ai tenté de remplacer la contrib par le plugin, mais là c’est page blanche ... En même temps le plugin semble etre conçu pour la 1.9 donc je peux comprendre. Peut-être y a t-il quelques modifs à apporter mais cela n’est pas dans mes comptétences.
En tous cas merci aux nombreux contributeurs bénévoles et salariés qui démocratisent l’informatique.
Répondre à ce message
Bonjour,
J’ai plusieurs questions et interrogations :
- dans ’votre’ classe PDF vous faites référence aux fonctions SetCopyright et ResetBuffer qui ne figurent pas dans la classe ’originale’ située sur www.fpdf.org. Pourquoi ne pas les mettre dans la classe dérivée ?
- pourquoi la variable $this->PDFVersion est initialisée à 1.3 alors que c’est la version 1.53 ?
- dans « article_pdf.html », vous appelez $pdf->debug = $debug ; avant d’instancier la classe par $pdf = new PDF_SPIP() ; et de plus la variable $debug n’existe dans aucune classe ? Est-ce normal ?
L’utilisation (en local, désolé pour l’exemple) me génère bien un pdf, mais à l’ouverture, Acrobat (7.0) affiche une fenêtre d’erreur avec la message « Le nouveau format de ce fichier n’est pas pris en charge par ......... » puis affiche les pages 1 et 2. Par contre Acrobat (5.0) n’affiche pas la page 1 ( Zoom 1600% !!!!) et la page 2 est incomplète.
Est-ce que j’ai mélangé des librairies ?
Help !
Cordialement,
Répondre à ce message
Les intertitres dans mes articles, h2 ou h3, ne sont pas pris en compte lors de la generation PDF.
Je suis allé dans le code du fichier lib_pdf_global.php au niveau des fonctions ’open_tag’ et ’clos_tag’ où tout semble pourtant normal.
Quelque chose m’échappe...
Quelqu’un a-t-il déjà eu ce problème ?
Merci d’avance
PS : j’ai modifié la mise en page du document généré (plus de page de garde, nom du site & hierarchie dans l’entete, titre de l’article en haut de page).
Si cela peut intéresser quelqu’un contactez-moi, je vous la ferais parvenir.
Pour la voir >>> ici
desole pour le lien precedent... (??)
Voici le bon >>>
Problème inexistant lorsque le plugin « barre typo enrichie » est desinstallé.
De là à ce qu’il y’ait un lien... ;-)
Je serais intéresser par la suppression de la page de garde
Merci
Pierre Lo Cicero
Désolé pour le retard...
Voici le code modifié du fichier ’lib_pdf_spip.php’ (squelette/pdf) pour enlever la page de garde (et quelques modifs de formattage... voir le lien precedent) :
Voili voilou
Y a t’il une solution existante pour ce problème d’inter-titres ?
Répondre à ce message
Bonjour,
Excellent travail pour les version antérieures à la 1.9, mais vu les chamboulement de cette dernières version serait-il possible d’envisager une mise à jour de cette contrib (si un peu de temps ce qui n’est pas toujours facile...).
Merci quand même pour ce beau boulot ;-)
C’est fait, le plugin existe pour la 1.9
elle se trouve ou ? .. Merci pr tt !
ici :
http://zone.spip.org/files/spip-zone/
Télécharge plugins.zip, il y a plusieurs plugins dont celui qui t’interesse (je connais pas d’adresse où télécharger le plugin seul).
Par contre j’ai essayer de l’utiliser, mais je n’y suis pas parvenu... j’ai eu des erreurs faisant réference a des .php3. Mais mon spip 1.9, il a plus de .php3... j’ai du me planter, mais où ...?
ça marche pas... l’activation du plug in a pour effet... la venue d’une superbe page blanche sur la page d’accueil du site, les autres pages, au mieux, s’affichent partiellement...
le plug in n’est donc pas prêt pour la 1.9, dommage...
Salut, j’ai exactement le même problème que toi une fois le plug in activé, j’ai que des pages blanches ce qui m’a un peu apeuré :( par ce que je voyais ou plutôt ce que je ne voyais plus. C’est dommage mais je vais garder l’ancien méthode qui consisté à tout installer à la main mais mon problème n’est toujours pas résolu car fpdf ne prend pas en compte l’utf-8.
A+
Salut,
Il semblerait que tu aies un conflit avec mes_fonctions ; dans mon cas le plugin est devenu fonctionnel après que j’aie supprimé toute référence au pdf dans la précédente versions de mes_fonctions. En effet, mes_fonctions et mes_options sont maintenant inclues avace le plugin.
A+
Cyril
Répondre à ce message
je suis sur la 1.9 et je voudrais vous feliciter pour ce plugin car il marche super
j’aurais une question est til possible d’associer l’envoi d’un mail au plugin pdf
c’est a dire generer le pdf pour qu’il l’envoi par mail
ou bien faire un mailto du pdf ?
encore bravo et merci
Répondre à ce message
Bonjour,
j’essaye d’integrer le logo de l’article dans la génération de mon pdf, mais sans succès j’ai bien déclaré une variable $logo_article= « (#LOGO_ARTICLE|pdf_first_clean) » ; dans mon fichier _article_pdf mais j’obtient toujours une erreur de squelette sur ma page. quand c’est une image intégrée a l’article ça passe. Est ce un probleme due a la génération des LOgo par GD() ?? quelqu’un as-t’il essayé d’inclure ce type de fonction et pourrais m’éclairé un peut ;-)
merci pour la contrib en tous cas et les réponsses si il y en a.
Répondre à ce message
Bonsoir,
Je viens de tester votre contrib et je la trouve pas mal du tout. J’ai toutefois un problème de taille : l’utf-8 dans lequel mon site est encodé n’est pas reconnu, les pdf générés sont remplis de signes cabalistiques à la place des caractères accentués et autres caractères spéciaux.
Par ailleurs, j’aurais vraiment besoin de pouvoir gérer des citations dans mon texte. Avez-vous prévu d’ajouter le support du raccourci
<quote>
dans un avenir proche ?Un grand merci
François
PS : Est-ce que ça ne voudrait pas le peine de mettre ce code sur la zone (éventuellement sous forme de plugin pour faciliter l’installation par les utilisateurs ?) pour permettre son amélioration collective. C’est vraiment quelque chose d’essentiel pour SPIP que de disposer d’une fonctionnalité de génération de pdf.
Encore moi. L’idée de mettre le truc en plugin est vraiment intéressante, parce qu’elle permettrait en plus de gérer un panneau de config, dans lequel on pourrait notamment :
- Définir la présente du copyright ou pas (c’est franchement pas nécessaire dans tous les cas).
- Définir la présence d’une page de garde ou d’un simple titre. En LaTeX, on dispose de différents modes (livre, article, etc). Est-ce qu’il serait possible de faire quelque chose de ce genre ?
- Choisir la police de caractères utilisées. SPIP permet depuis la version 1.9 de gérer un dossier de polices personnelles (pour le filtre
image_typo
). Ca pourrait être intéressant de brancher la contrib sur ce répertoire aussi.- Vider le cache. Par exemple après avoir modifié une option.
Si c’est utile, je veux bien donner un coup de main pour tout ça (même si je ne connais pas grand chose à pdf) ; j’ai un usage immédiat du truc (un site sur lequel les étudiants de ma fac encodent leurs notes de cours pour les partager ; il est évidemment hyper utile de pouvoir disposer de ces fichiers dans un format imprimable de bonne qualité).
Par ailleurs, j’ai encore une série de remarques/demandes, que je me permets de noter ici :
- Les semi-cadratins semblent ignorés par votre contrib, on se retrouve avec des
—
.- Est-ce qu’il est possible de personnaliser les styles. J’aimerais par exemple avoir du texte en mode justified, définir l’alignement de mes intertitres, ce genre de choses,...
- J’aimerais pouvoir concaténer tous les articles d’une même rubrique dans un même fichier pdf (pour générer un syllabus pour chaque cours, en reprenant simplement tous les articles qui composent ce cours). Possible avec votre contrib ?
Un grand merci pour votre travail et, j’espère, pour vos réponses à mes nombreuses questions :)
François
Cela tient sûrement à l’encodage des polices voir ici : http://www.fpdf.org/fr/tutorial/tuto7.htm
Les polices sont encodées apparemment par défaut en cp1252, pour la 1.9 il faudrait de l’UTF-8.
Mais je n’ai pas encore testé...
En tout cas c’est une excellente contrib. Merci à l’auteur.
Merci pour ces commentaires et remerciements.
L’intégration de cette contrib n’est pas de mon ressort, mais des auteurs SPIP. A eux de voir si elle peut faire l’objet d’un « plug-in ».
Non, je ne l’ai pas prévu. En fait, ça peut être résolu en introduisant un style (voir plus bas).
Rajoutez ce caractère dans la fonction «
pdf_first_clean($texte) » du fichier « mes_fonctions.php3 » (voir le tableau « $trans »)
Oui, dans le principe, c’est faisable ; mais je n’ai pas prévu de le faire. Avis aux amateurs qui ont le temps pour ça ! Ca nécessite d’enrichir pas mal la logique de l’appli...
Je n’ai pas prévu de le faire non plus, mais ça me semble plus simple que le point précédent. Dans le fichier « article_pdf.html », il faut faire une boucle permettant de concaténer les différents éléments des articles à transformer en PDF :
J’espère vous avoir donné des pistes utiles.
Cordialement,
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 : |