Articles SPIP au format PDF Nouvelle version

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

Cette contribution est largement inspirée de celle-ci : Génération améliorée de fichiers PDF
et de celle-ci :Génération de PDF pour SPIP - Drop Zone City

Je vous invite donc à lire ces contributions avant la mienne.

Installation

Vous trouverez en pièce-jointe (prenez l’archive intitulée PDF Nouvelle Version), les fichiers nécessaires à la génération des articles au format PDF.
N’oubliez pas de créer 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).

Ensuite, vous installez les fichiers joints à la racine de votre site SPIP.

Attention : Si vous utilisez déjà un fichier mes _fonctions.php3, recopiez le code contenu dans notre fichier mes_fonctions.php3 entre les balises

<?php et ?>

dans votre fichier mes_fonctions.php3.

Puis, faîtes un lien dans votre squelette article.html vers article_pdf.php3 comme ceci :

<a href="article_pdf.php3?id_article=#ID_ARTICLE" target="_blank">Voir au format PDF</a>

Démo articles SPIP au format PDF

Voici un récapitulatif des fonctionnalités ajoutées aux PDF :

-  Les PDF se régénèrent automatiquement quand vous modifiez un article, alors qu’avec les contrib. proposées vous devez effacer à la main les pdf dans votre dossier IMG/_article_PDF à chaque fois que vous modifiez un article.

-  Le problème de titre trop long qui était coupé et donc qui ne revenait pas à la ligne a été corrigé.

-  Amélioration de la génération de certains caractères spéciaux.

-  Les logos d’articles apparaissent correctement, par contre il faut que je règle le problème de liens sur les logos, pour l’instant, j’ai tout simplement retiré les liens qui finalement ne servent à rien.

-  Les images insérées dans les articles apparaissent correctement.

-  Cette contribution est compatible avec la contribution : Découper un article en plusieurs pages et lui ajouter un sommaire, ainsi les <hr> générés n’apparaissent pas dans le pdf.

-  Les fichiers au format GIF sont gérés de 2 façons. Soit en pur PHP et le résultat n’est pas terrible bien qu’il reste utilisable. Soit, avec utilisation de la librairie GD dans une version capable de manipuler les GIF, et la, vous aurez un resultat parfait.

-  Les fichiers PNG avec couche Alpha sont gérés mais le fichier PNG généré dans le PDF aura forcément un fond blanc ### On peut peut être ressortir la couleur dans une variable en tête de fichier si qq1 veut pouvoir la changer facilement ###

-  Nous utilisons la dernière version de FPDF qui est à l’heure où parait cet article la 1.53. Pour plus d’infos sur l’historique des versions, il faut se rendre ici.

Un PDF simplifié sans page de garde

Vous trouverez aussi en pièce-jointe le fichier permettant de générer un article au format PDF, de présentation plus simple, sans page de garde.

Installation :

Pour cela, vous installez comme décrit précédemment le « package PDF Nouvelle Version », puis il suffit de remplacer le fichier lib_pdf_spip.php qui se situe
dans le répertoire : lib/class_pdf
par celui fourni en pièce jointe (dont le titre du zip est PDF simple sans page de garde).

Vous obtiendrez alors un fichier simple sans page de garde, avec un footer (pied de page) où l’on retrouve l’auteur, le nombre de pages, la date de publication et le nom du site.

Vous pourrez facilement modifier la taille et le type de police et les espaces entre chaque balise surtitre, titre sous-titre et texte.

Exemple :

//Titre
$this->SetFont(’helvetica’,’B’,12) ;
$this->WriteHTML($titre) ;
$this->Ln(12) ;

-  SetFont permet de définir la police B=Gras 12=Taille (comme d’habitude)
-  WriteHTML sert à transformer les balises html en codes interprétables par le PDF
-  Ln(12) = Effectue un saut de ligne, et 12 = amplitude du saut de ligne.

Pour plus d’infos, aller sur http://www.fpdf.org

Pour aller plus loin : ajouter des champs extra dans la génération des PDF

Pour ce qui est des champs extras, il faut les déclarer dans le fichier : lib_pdf_spip.php comme ceci :

ligne 137 remplacer : global $texte, $chapo, $ps, $notes ; par : global $texte, $chapo, $extra, $ps, $notes ;

ligne 146 environ, ajoutez en dessous de ce code :

//Texte - justifie $this->SetFont('helvetica','',10) ; $this->WriteHTML($texte) ; $this->Ln(12) ;

le code suivant :

if ($extra) // extra $this->SetFont('helvetica','',10) ; $this->WriteHTML($extra) ; $this->Ln(12) ; 

Dans cet exemple, les champs extra apparaitront dans vos pdf sous le texte de l’article et avant le Post-scriptum de l’article.
Vous pouvez donc positionner le code ci-dessous ailleurs, avant le texte de l’article, avant le chapo, après le PS...

et dans article_pdf.html : ligne 11 : insérez en dessous de :

$conf_nom_site = "[(#NOM_SITE_SPIP|pdf_first_clean)]" ;

Les champs extras que vous voulez faire apparaitre, ici un exemple avec 2 champs extra (Mission, Competences) :

$extra = "Missions : "."[(#EXTRA|Mission|pdf_first_clean)]"."
"."Compétences : "."[(#EXTRA|Competences|pdf_first_clean)] ;

Vous ajoutez ainsi autant de champs extra que vous le souhaitez.

Pour plus d’infos sur les champs extra, allez dans la partie privé de spip-contrib.net et faites une recherche sur extra, vous trouverez toute la doc sur les champs extra et leur utilisation.

Voilà, je crois que je n’ai rien oublié, à part vous dire que cette contribution n’est qu’une collecte d’infos glanées sur spip-contrib et ses forums.
Donc je ne suis qu’un assembleur de ce que j’ai trouvé et non le créateur (juste des petits bouts ici et là). Merci à Chag qui a complété cette contrib. en améliorant la gestion des images, des tableaux et en intégrant la dernière version de FPDF.

Intégration des images dans les PDF grâce à la librairie GD

Commençons par rendre à César ce qui appartient à César. Ces modifications sont inspirées de ce commentaire.Cette librairie de manipulation d’images permet d’améliorer la qualité de certaines images intégrées dans les PDF. Les formats de fichiers concernés sont :

-  GIF (Graphics Interchange Format). Ce format d’image était soumis à licence. Afin de ne pas risquer de poursuites et pour ne pas payer, la librairie GD ne manipulait plus les fichiers GIF entre sa version 1.6.0 (correspondant à la date à laquelle UNISYS a commencé à vouloir faire payer les utilisateurs) et la version 2.0.28 (date à laquelle son algorithme principal est passé dans le domaine public). L’avantage de la librairie GD est qu’elle manipule très bien les images au format GIF. Pour savoir si vous pouvez l’utiliser, utilisez la commande <?PHP phpinfo(); ?>dans une page. Vous devriez obtenir plusieurs rubriques dont une qui concerne GD et qui pourrait ressembler à ca :

GD Support enabled
GD Version bundled (2.0.28 compatible)
FreeType Support enabled
FreeType Linkage with freetype
GIF Read Support enabled
GIF Create Support enabled
JPG Support enabled
PNG Support enabled
WBMP Support enabled
XBM Support enabled

Il faut au moins que le support des GIF en lecture soit possible pour pouvoir utiliser la librairie GD.

Que ce soit le cas ou pas, notre modification pourra inclure dans le fichier PDF une image au format GIF. Mais elle sera plus belle avec l’utilisation de GD :)

-  PNG (Portable Network Graphics) : Quand UNISYS a commencé à vouloir faire payer des licences pour le format GIF, le format PNG a émmergé. La librairie FPDF utilisée pour créer les PDF de cette contribution sait déjà gérer les fichier PNG. Mais pas les PNG avec couche alpha. Pour résumer, la couche Alpha, c’est une méthode de transparence sur les images qui permet d’avoir des parties plus ou moins transparentes. Notre modification dans la librairie permet de gérer les fichiers PNG avec couche Alpha. le fichier sera obligatoirement replacé sur un fond blanc.

Même si vous n’avez pas l’impression/l’intention d’utiliser d’images PNG avec canal alpha, sachez par exemple que, si vous ajoutez un document PDF à un article, son icône est un PNG avec canal Alpha.

Sur l’image suivante, vous pouvez comparer 2 captures d’écran de PDF générés à partir de SPIP. Le premier ne gère pas correctement le canal alpha. Le second, si.

Chag http://www.gaiaservice.fr

Paul http://www.netdeveloppeur.com

En pièces-jointes se trouvent 3 archives, utilisez celle intitulée : PDF Nouvelle Version, si elle ne fonctionne pas chez vous, testez celle intitulée PDF Ancienne Version.

Discussion

32 discussions

  • 2

    Ca serait bien d’avoir aussi un squelette rubrique_pdf pour mettre dans un même fichier PDF tous les articles rattachés à une rubrique. C’est compliqué à faire ?

    • Non c’est pas compliqué mais ça prend du temps, on est en train de s’y pencher (à consulter ici dans les prochaines semaines).

    • Ce développement pour mettre en pdf une rubrique dans sa totalité n’a finalement jamais été fait ?

    Répondre à ce message

  • 2

    Salut,
    moi se ne marche pas, j’ai une erreur :

    Fatal error : Call to undefined function : gd_info() in /www/sites/1/ifrance.com/d/e/deltadzeta/site/spip/lib/class_pdf/fpdf.php on line 933

    Que faire ?

    • J’ai exactement le même problème sous beespip.

    • la libraiie GD ne semble pas installée. creez une page nommée ’info.php’ et collez y ce code :

      <?php
      phpinfo();
      ?>

      ouvrez ensuite cette page dans votre navigateur et cherchez cette ligne

      GD Support enabled

      Si elle n’est pas presente ou si vous avez ’disabled’ a la place de ’enabled’, c’est que GD n’est pas installé. Comme c’est cette libririe qui permet de traiter les images des pdf, c’est la raison de votre message d’erreur.

      Chag

    Répondre à ce message

  • 2

    Bonjour et bravo pour cette contribution,

    Cependant, j’ai deux difficultés avec :

    -  dés qu’il y a des images, ca ne marche pas. Exemple avec cet article qui contient 3 ou 4 JPG : http://ethnographiques.org/article.php3?id_article=121

    La génration en PDF me donne l’erreur suivante :
    FPDF error : Image file has no extension and no type was specified :

    Voilà le lien : http://ethnographiques.org/article_pdf.php3?id_article=121

    D’autre part, les textes ne sont absolument pas justifiés et je ne trouve pas comment je peux modifier ça.

    Merci ++
    Yves

    • moi aussi j’ai le meme probleme avec mes articles qui ont des images en jpeg (IMG/jpg/image.jpg)

      La génération en PDF me donne l’erreur suivante : FPDF error : Image file has no extension and no type was specified :

      pour mes artcicles sans images aucun problem..
      merci si vous avez la solution...... ;
      sic

    • hello,

      Je ne vois pas vraiment de raisons pour lesquelles ca ne marcherait pas. j’ai genere des PDF avec images JPG il y a a peine quelques jours sans aucun probleme. en regardant vite fait, voici un bout de code qui doit generer l’erreur :

      		
        $pos=strrpos($file,'.');
          if(!$pos)
            $this->Error('Image file has no extension and no type was specified: '.$file);
          $type=substr($file,$pos+1);

      grosso modo, cela signifie que si il n’y a pas de . dans le nom du fichier, cela genere une erreur. Assurez vous bien que vos fichiers ont nom du type : ’monimage.jpg’
      et pas ’monimage_jpg’ ni ’monimage’

      Sam

    Répondre à ce message

  • Bonjour - tout d’abord merci pour cette extension magnifique !

    Petite question : quand je génère le pdf, le titre et le soustitre sont identiques. Est-ce un fait connu ?

    thx

    Répondre à ce message

  • 2

    Merci pour cette contrib qui fonctionne parfaitement.

    Par contre je ne saisi pas comment on peut changer l’apparence du resultat comment le presenter autrement.

    Merci

    • Eh bien, il te suffit d’éditer le fichier lib_pdf_global.php : tu peux ajouter d’autres balises (par exemple, h1 et h2), définir les styles correspondants (fonction SetStyle), sauter des lignes (fonction Ln), etc.

    Répondre à ce message

  • 1

    En reprenant les messages ci-dessous, je n’ai pas pu résoudre un problème bizarre :

    Lorsque j’essaie d’avoir des liens correctes dans les fichiers PDF produits avec [$texte= "(#TEXTE|liens_absolus|pdf_first_clean)";]
    alors je n’ai de page PDF qui s’affiche (ni ne se crée) s’il y a des puces à l’intérieur du fichier.

    Si j’essaie de modifier les puces (puce-gif) par un simple tiret, cela n’empêche pas le problème de se produire.

    Est-ce que quelqu’un aurait la solution afin d’avoir des liens valides dans les fichiers PDF produits ?

    Sinon, il semble fonctionner à merveille (sauf sous Apinc avec les .gif, mais c’est une autre histoire !)

    • J’ai même essayé de résoudre le problème des puces en ajoutant

       
      $puce = "<img src='http://www.biotechno.org/biospip/biopics/puce.png' alt='-' class='spip_puce' />";

      dans mon fichier mes_fonctions.php3 mais rien n’y fait... J’ai toujours la puce de SPIP qui s’affiche alors que cela fonctionnait très bien sur le même site avec SPIP 1.7... Serait-ce un bug de SPIP 1.8.2e ou une incompatibilité entre la $puce et d’autres fonctionnalités (j’utilise la fonction pagination et pdf-firt-clean uniquement dans mes_fonctions et la fonction url propres2 et le repertoire de squelette = biospip dans ecrire/mes_options.php3)

      Si quelqu’un à une idée

    Répondre à ce message

  • Bonjour,

    Merci pour cette superbe contrib, un bonheur !

    J’ai 2 questions à vous poser :

    -  Comment centrer (et encadrer) la légende en-dessous d’une image, comme sur l’exemple http://www.netdeveloppeur.com/emploi/article.php3?id_article=269 mentionné dans cette contrib ?

    -  Serait-il possible d’indenter la première ligne d’un paragraphe, pour reprendre un style journalistique ?

    Merci d’avance !

    Répondre à ce message

  • 2

    Bonjour,

    je voudrais utiliser votre contrib, mais j’ai deux problèmes, l’un plus important que l’autre.

    1. Comment pourrais-je avoir un texte PDF justifié (important)

    2. la transformation en PDF garde l’italique, mais perd le gras des paragraphes d’introduction

    Il y a sans doute une solution simple (ajouter une ligne à mes_fonctions.php3 ?), mais je n’y connais pas grand chose

    Merci d’avance.

    Nicolas

    • 1. Comment pourrais-je avoir un texte PDF justifié (important)

      Ah, justifier ou pas, telle est la question... que je me suis posée aussi. D’après mes recherches, c’est un problème plus complexe qu’il n’y paraît. Seul un script (http://www.fpdf.org/fr/script/script23.php) permet de le résoudre, en triturant le code. Mais il est à utiliser avec parcimonie car le temps d’exécution augmente dangereusement. Du coup, je vais me résoudre à abandonner la justification du texte (la performance prime sur la qualité).

      En conclusion, il faut tester !

    • Je confirme après comparaison des deux : WriteHTML est beaucoup plus efficace, en vitesse et en poids de fichier, que WriteTag (http://www.fpdf.org/fr/script/script76.php), mieux vaut donc privilégier ce premier... et abandonner la justification du texte jusqu’à nouvel ordre.

    Répondre à ce message

  • Salut,

    superbe script qui marche pas trop mal, je voulais juste savoir s’il etait possible de limiter la taille des images comme je le fait dans les articles.
    Et j’ai découvert un bug lors de la creation de tableaux contenant des images, les images sortent en premier puis le tableau est à la suite...

    merci pour votre aide

    Christophe

    http://www.helidoc.com

    Répondre à ce message

  • 2

    Le caractère « N° 82 » est traduit sur la page de garde par

    n & # 176 ; 82

    Par ailleurs un tableau en 3 colonnes n’est pas correctement généré.
    Merci

    • Concernant le caractère ° il faut ajouter dans mes_fonctions.php3 sous la ligne :

      $trans['<-'] = '«-';

      la ligne suivante :

      $trans["&#176;"] = "°";

      Concernant la justification du texte c’est plus complexe et j’ai pas trop le temps de voir ça pour le moment.

      Paul
      http://www.netdeveloppeur.com

    • Heu pardon la justification du texte concerne le message de Nicolas, ci-dessous.

    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