Articles SPIP au format PDF avec support des liens

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Gérer correctement les liens dans les PDF générés grâce à FPDF. Tous les types de liens sont supportés (liens externes, lien internes, notes).

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 :

Démo

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)

Archive génération PDF avec liens

Discussion

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

  • 1

    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 :

      612c614
      <                               if(!$this->skipExt($data, $len)) {
      ---
      >  
                                  if(!$this->skipExt($data, $len = 0)) {
      620c622
      <                               if(!$this->m_gih->load($data, $len)) {
      ---
      >
                                    if(!$this->m_gih->load($data, $len = 0)) {
      627c629
      <                               if(!($this->m_data = $this->m_lzw->deCompress($data, $len))) {
      ---
      >                               if(!($this->m_data = $this->m_lzw->deCompress($data, $len = 0))) {
      
      778c780
      <               if(!$this->m_gfh->load($this->m_lpData, $len)) {
      ---
      >               if(!$this->m_gfh->load($this->m_lpData, $len = 0)) {
      
      784c786
      <                       if(!$this->m_img->load($this->m_lpData, $imgLen)) {
      ---
      >                       if(!$this->m_img->load($this->m_lpData, $imgLen = 0)) {
      
      806c808
      <               if(!$gfh->load($data, $len)) {
      ---
      >               if(!$gfh->load($data, $len = 0)) {

    Répondre à ce message

  • corentin garrault

    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

  • Sylvain

    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

  • 5

    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) :

      <?
      
      /**
       * class PDF_SPIP extends PDF : 
       */
       
       
      class PDF_SPIP extends PDF
      {
      
      
      // haut, gauche,  bas, droite
      function SetAllMargins($TopMargin, $LeftMargin, $BottomMargin, $RightMargin)
      {
      	// gauche, haut, droite
      	$this->SetMargins($LeftMargin,$TopMargin,$RightMargin);
      	
      	// bas
      	$this->SetAutoPageBreak(auto, $BottomMargin*3/2);
      }
      
      
      function Header()
      {
      	global $site, $titre, $yahoo, $conf_url_site;
      	
      	$this->SetY($this->tMargin/2);
      	$this->SetLineWidth(0.3);
      	$this->Line($this->lMargin - 3, $this->tMargin, $this->w - $this->rMargin + 3, $this->tMargin);
      	
      	//Extrait du site xxx
      	$this->SetFont('times','',12);
      	$this->SetTextColor(0,0,0);
      
      	$this->Cell(0,$this->tMargin/2, "Extrait du site  ' ".$site." '",0,0,'L',0,$conf_url_site );
      		
      	//hierarchie
      	$this->SetFont('times','',9);
      	$this->SetTextColor(0,0,0);
      	$this->SetX($this->w-$this->rMargin*2-5);
      	$this->Cell(0,$this->tMargin/2, $yahoo." >> ".$titre,0,0,'R',0 );
      
      
      	
      	// $this->tMargin = marge du haut, définie dans FPDF
      	$this->Ln(9);
      }
      
      
      /* /// Pied de page du document) 
      /* ///////////////////////////// */
      function Footer()
      {
      	global $conf_nom_site , $conf_url_site  ;
      	
      	$this->SetY(-$this->bMargin/2);	
      	$this->SetLineWidth(0.3);
      	$this->Line($this->lMargin - 3, $this->GetY(), $this->w - $this->rMargin + 3, $this->GetY());
      	
      	
      	//Police helvetica 8	
      	$this->SetFont('helvetica','I',8);
      	$this->SetTextColor(0,0,0);
      
      	// Copyright
      	$this->Cell(0,6,"Copyright © ".$conf_nom_site ,0,0,'L',0,$conf_url_site );
      	
      	//Numéro de page
      	$this->SetX($this->w-$this->rMargin*2-5);
      	$this ->Cell(0,6,'Page '.$this->PageNo().'/{nb}', 0, 1, 'C');
      }
      
      function GenerateTitlePage()
      {
      	global $site, $rubrique, $yahoo, $surtitre, $titre, $soustitre;
      	global $logo_site, $auteur, $descriptif;
      	global $copyright;
      	global $conf_url_site;
      	global $DateParution,$DateMiseEnLigne;
      	
      	
      	// En-tête
      	if (file_exists($logo_site))
      	{
      		$this->Image($logo_site,$this->rMargin+3,$this->tMargin+2,20,20);
      	}
      	
      	$this->SetFont('times','',12);
      	$this->SetXY($this->rMargin+10,$this->tMargin+6);
      	$this->MultiCell(0,5,"Extrait du site  ' ".$site." '");
      
      	
      	$this->SetXY($this->rMargin+130,$this->tMargin+6);
      	$this->PutLink($conf_url_site,$conf_url_site);
      	
      	
      	
      	//Surtitre (type du document)
      	$this->unhtmlentities($surtitre);
      	$this->SetXY(20,92);
      	$this->SetFont('courier','B',14);
      	$this->MultiCell(170,6,$surtitre,0,'C',0);
      	
      	
      	//Titre centré
      	$this->SetXY(20,100);
      	$this->SetFont('helvetica','B',32);
      	$this->unhtmlentities($titre);
      	$this->MultiCell(170,20,$titre,0,'C',0);
      	
      	
      	// Rubriques
      	$this->Ln(2);
      	$this->SetFont('helvetica','',8);
      	$this->MultiCell(0,5,$yahoo,0,'C',0);
      	
      	
      	//Dates
      	$this->SetFont('times','',10);
      	
      	if ($DateMiseEnLigne) 
      	{
      		$this->SetXY(110,184);
      		$this->unhtmlentities($DateMiseEnLigne);
      		$this->MultiCell(0,6,"Date de mise en ligne : $DateMiseEnLigne",0,'L',0);
      	}
      	
      	if ($DateParution) 
      	{
      		$this->SetXY(110,190);
      		$this->unhtmlentities($DateParution);
      		$this->MultiCell(0,6,"Date de parution : $DateParution",0,'L',0);
      	}
      
      
      	// Descriptif 	
      	if ($descriptif)
      	{
      		
      		$this->SetFont('helvetica','B',10) ;
      		$this->SetXY($this->rMargin+5,220);
      		$this->SetFont('helvetica', 'BU', 10);
      		$this->Write(5, 'Description :');
      		$this->Ln();
      		$this->SetFont('times', '', 8);
      		$this->WriteHTML($descriptif,5) ;
      	}
      	
      	if ($copyright)
      	{
      		$this->SetXY(45,250);
      		$this->SetFont('times', 'B', 10);
      		$this->MultiCell(120,8,$copyright,'TB','C',0);
      	}
      }
      
      function GenerateText()
      {
       	global $titre, $texte, $chapo, $ps, $notes ;
      		
      		//Titre centré
      	$this->SetXY(20,20);
      	$this->SetFont('helvetica','B',22);
      	$this->unhtmlentities($titre);
      	$this->MultiCell(170,20,$titre,0,'C',0);
      
      		
      	$this->SetFont('helvetica');
      	if ($chapo)
      	{
      		// Chapeau
      		$this->SetFont('times','B',13);
      		$this->WriteHTML($chapo,5);
      		$this->Ln(12);
      	}
      	
      	//Texte - justifie
         		$this->SetFont('helvetica','',10);
      		$this->WriteHTML($texte,5);
      		$this->Ln(12);
      	if ($ps) 
      	{
      		//ps
      		$this->SetFont('','I',8);
      		$this->WriteHTML("Post-scriptum : ",4);
      		$this->WriteHTML($ps,4);
      		$this->Ln(8);
      	}
      	if ($notes) {
      		//notes
      		$this->SetFont('','',8);
      		$this->WriteHTML($notes,3);
      		$this->Ln();
      	}
      }
      
      function BuildDocument()
      {
      	/*$this->AddPage();
      	$this->GenerateTitlePage(); <-- page de garde */
      	$this->AddPage();
      	$this->GenerateText();
      	
      	// On repasse en police à la bonne taille pour le nombre de pages.
      	$this->SetFont('helvetica','I',8);
      	$this->AliasNbPages();
      }
      //
      }
      
      ?>

      Voili voilou

    • Y a t’il une solution existante pour ce problème d’inter-titres ?

    Répondre à ce message

  • 6

    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

  • 3

    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 &mdash;.

      -  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 ».

      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 ?

      Non, je ne l’ai pas prévu. En fait, ça peut être résolu en introduisant un style (voir plus bas).

      Les semi-cadratins semblent ignorés par votre contrib, on se retrouve avec des —.

      Rajoutez ce caractère dans la fonction « 
      pdf_first_clean($texte) » du fichier « mes_fonctions.php3 » (voir le tableau « $trans »)

      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,...

      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...

      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 ?

      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 :

      [$surtitre=« (#SURTITRE|pdf_first_clean) » ;]

      [$titre=« (#TITRE|supprimer_numero|pdf_first_clean) » ;]

      [$soustitre=« (#SOUSTITRE|pdf_first_clean) » ;]

      [$chapo=« (#CHAPO|pdf_first_clean) » ;]

      [$descriptif=« (#DESCRIPTIF|pdf_first_clean) » ;]

      [$texte= « (#TEXTE|pdf_first_clean) » ;]

      [$ps=« (#PS|pdf_first_clean) » ;]

      [$notes=« (#NOTES|pdf_first_clean) » ;]

      J’espère vous avoir donné des pistes utiles.

      Cordialement,

    Répondre à ce message

  • 1

    php_gd2 kézako ?

    je sais pas où je peux paramétrer ça sur lautre.net

    le clic sur créer un pdf donne ça chez moi

    Warning : Unknown() : open_basedir restriction in effect. File(/pdf/fpdf.php) is not within the allowed path(s) : (/var/alternc/html/c/couac/ :/usr/share/pear/ :/var/alternc/tmp/ :/tmp/) in /var/alternc/html/c/couac/inc-public.php3(60) : eval()’d code on line 119

    Warning : Unknown(/pdf/fpdf.php) : failed to open stream : Operation not permitted in /var/alternc/html/c/couac/inc-public.php3(60) : eval()’d code on line 119

    Fatal error : (null)() : Failed opening required ’/pdf/fpdf.php’ (include_path=’. :/usr/share/php :/usr/share/pear’) in /var/alternc/html/c/couac/inc-public.php3(60) : eval()’d code on line 119

    • en fait, ça y est, c’est bon pour php_gd2, j’ai trouvé, par contre le reste merdoume...

      j’ai pris le correctif (supprimer_numero en minuscules), et les adresses $path_pdf , $class_path et $site_logo_path sont normalement valides mais, d’une part ça met des plombes à créer un fichier pdf qui ensuite ne s’ouvre pas...

    Répondre à ce message

  • 2

    Bonjour,

    Faut-il absolument configurer Spip avec gd2 précisément pour utiliser cette contrib ?

    Sinon, les améliorations concernant la gestion des images et des liens dans les tableaux m’intéressent beaucoup (mais je ne suis pas compétant).

    • Faut-il absolument configurer Spip avec gd2 précisément pour utiliser cette contrib ?

      Les contributeurs précédents se sont appuyés sur cette librairie pour supporter les images gif. Donc si vos documents ne contiennent que des jpg ou des png (conseillés de préférence au gif), cette contrib devrait passer en désactivant gd2.

      Mais auparavant, il faut aller dans le fichier “fpdf.php” et mettre en commentaires la ligne
      « $readgif= gd_info() ; » (l.957).

      Ensuite, il faut court-circuiter les appels relatifs au .gif. Pas si simple, ça requiert de mettre les mains dans le code...

    • Meme erreur que precedement indiqué des que l’on a une image dans l’article, qu’elle soit en .jpg, .png ou en .gif.
      j’ai tenté de faire afficher la valeur de $type pour savoir ce que le fpdf.php trouvait ... cela me donne un « blanc ».

      J’utilise aussi le filtre réduire_image, de ce fait le chemin de l’image en est d’autant rallongé.
      Pourtant qd j’affiche le code généré par ma page le nom de mon image se termine bien par une extension comme il faut.

      Du coup je bloque.

      Cordialement

      eric

    Répondre à ce message

  • 1

    Bonjour,

    Pour simplifier l’intégration de cette contribution je propose les correctifs suivants :

    	$class_path = "#DOSSIER_SQUELETTE/pdf/" ;
    	$site_logo_path = "[IMG/(#LOGO_SITE_SPIP|fichier)]";

    et d’utiliser plutôt le lien suivant :

    <a href="page.php3?fond=article_pdf&id_article=#ID_ARTICLE">
    <img src="#DOSSIER_SQUELETTE/images/pdf.gif"/>
    Télécharger</a>

    Ainsi on peut virer le fichier article_pdf.php3 de la racine et ne laisser que article_pdf et le répertoire /pdf dans notre répertoire de squelettes.

    Enfin le fichier mes_fonctions.php3 n’est pas obligatoirement à la racine du site mais il peut également prendre place dans le répertoire des squelettes.

    Cela permet de ne présenter qu’une seule modif hors répertoire des squelettes, à savoir la création du répertoire /IMG/_article_PDF .

    En espérant que cela puisse servir,

    Bien cordialement

    Bug :

    il faut corriger

    [$titre="(#TITRE|SUPPRIMER_NUMERO|pdf_first_clean)";]

    en

    [$titre="(#TITRE|supprimer_numero|pdf_first_clean)";]
    • Merci beaucoup, Bionet pour ces très remarques utiles.

      Apparemment, vous avez repris tout ou partie de la contrib pour BioSPIP (la nouvelle version), et ça me fait très plaisir ! C’était fait pour ça.

      « Spipment » vôtre,

    Répondre à ce message

  • Bonjour,

    Pour simplifier l’intégration de cette contribution je propose les correctifs suivants :

    	$class_path = "#DOSSIER_SQUELETTE/pdf/" ;
    	$site_logo_path = "[IMG/(#LOGO_SITE_SPIP|fichier)]";

    et d’utiliser plutôt le lien suivant :

    <a href="page.php3?fond=article_pdf&id_article=#ID_ARTICLE">
    <img src="#DOSSIER_SQUELETTE/images/pdf.gif"/>
    Télécharger</a>

    Ainsi on peut virer le fichier article_pdf.php3 de la racine et ne laisser que article_pdf et le répertoire /pdf dans notre répertoire de squelettes.

    Enfin le fichier mes_fonctions.php3 n’est pas obligatoirement à la racine du site mais il peut également prendre place dans le répertoire des squelettes.

    Cela permet de ne présenter qu’une seule modif hors répertoire des squelettes, à savoir la création du répertoire /IMG/_article_PDF .

    En espérant que cela puisse servir,

    Bien cordialement

    Bug :

    il faut corriger [$titre=« (#TITRE|SUPPRIMER_NUMERO|pdf_first_clean) » ;]
    en
    [$titre=« (#TITRE|supprimer_numero|pdf_first_clean) » ;]

    Répondre à ce message

  • 3

    Bonjour,

    Merci pour cette contrib !
    ça marche très bien !

    enfin ça marchait bien avec l’encodage latin-1 (iso-8859-1) mais de puis que je suis passé en utf-8 ben les accents déconnent grave !

    bref, l’arabe n’est supporté !

    apparemment c’est dû à la bibliothèque fpdf qui ne supporte pas unicode (utf-8) il faudrait lu iasocié un script (une sorte de plugin) heureusement en lgpl (tcpdf).

    si j’arive à l’intégré je vous fais signe ! (sinon faites moi signe !)

    • salut

      qui peut me dire sur les chemins :$class_path et $path_pdf ?

      exemple:j’ai mis

      $path_pdf=« IMG/_article_pdf/ » ;

      $class_path=$GLOBALS[’dossier_squelettes’].« /../../pdf/ » ;

      car j’ai mis mon squelette « cypher » dans le répertoire « squelettes »

      voilà j’espère avoir vos réponses

      car lemessage d’erreur m’est retourné :

      Warning : Unknown() : Restriction in effect. Access to this file (/pdf/fpdf.php) is not allowed in /var/www/free.fr/f/4/bouchonneau.gilles/inc-public.php3(60) : eval()’d code on line 78

      Warning : Unknown(/pdf/fpdf.php) : failed to open stream : Operation not permitted in /var/www/free.fr/f/4/bouchonneau.gilles/inc-public.php3(60) : eval()’d code on line 78

      Fatal error : (null)() : Failed opening required ’/pdf/fpdf.php’ (include_path=’/var/www/free.fr/f/4/bouchonneau.gilles/include :.’) in /var/www/free.fr/f/4/bouchonneau.gilles/inc-public.php3(60) : eval()’d code on line 78

    • Merci pour cette contrib ! ça marche très bien !

      Merci, ça prend un peu de temps de faire une contrib, et c’est toujours agréable de voir que quelqu’un la lit et l’utilise :-)

      apparemment c’est dû à la bibliothèque fpdf qui ne supporte pas unicode (utf-8) il faudrait lu iasocié un script (une sorte de plugin) heureusement en lgpl (tcpdf).

      En fait, j’avoue m’être limité au français (et je n’irai pas plus loin, car cette langue me suffit) ; c’est vrai que pour un travail « propre » un encodage occidental ne suffit pas (SPIP est internationalisé depuis un certain temps)

      si j’arive à l’intégré je vous fais signe ! (sinon faites moi signe !)

      Vous pouvez toujours faire signe aussi à l’auteur de FPDF ou poster un message sur son forum (c’est peut-être déjà fait ?). Les langues asiatiques sont supportées, tout espoir n’est pas perdu.

    • qui peut me dire sur les chemins :$class_path et $path_pdf ?

      exemple :j’ai mis

      $path_pdf=« IMG/_article_pdf/ » ;

      $class_path=$GLOBALS[’dossier_squelettes’].« /../../pdf/ » ;

      car j’ai mis mon squelette « cypher » dans le répertoire « squelettes »

      Vous avez peut-être créé un répertoire « squelettes » à la racine de SPIP, puis un sous-répertoire « cypher ». Dans ce cas , vous devez mettre :

      $path_pdf=« IMG/_article_pdf/ » ;

      $class_path=« squelettes/cypher/pdf/ » ;

      Ces deux chemins ont pour référence la racine de SPIP.

      Voilà, j’espère vous avoir aidé...

    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 :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

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.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom