[archive] spiPDF v0.1.0 : des contenus sur mesure en PDF

Une nouvelle version 0.2.0 du plugin spiPDF est disponible

Le plugin spiPDF génère des fichiers au format PDF d’article ou de tout autre élément SPIP, simplement à partir d’un squelette construit au format HTML 4 et facile à modifier.

Présentation

Ce plugin génère des fichiers PDF à partir d’un squelette défini 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.

Le plugin utilise la classe HTML2PDF (qui elle même utilise grandement TCPDF. Vous pouvez vous rendre sur le site de HTML2PDF pour un aperçu des possibilités (notamment la page des exemples ).

Pré-requis

PHP 5 est requis ! (sérieusement, il y a encore des gens avec PHP4 ?!) pour un fonctionnement optimal. Cependant, vous pouvez télécharger séparément une version plus ancienne de HTML2PDF, compatible avec PHP4 et remplacer le répertoire.

Téléchargement

  • A télécharger sur la zone via SVN
  • Ou téléchargement du ZIP généré automatiquement toutes les heures.
    spiPDF v0.1.0

    Le plugin est relativement volumineux parce qu’il intègre un certain nombre de polices de caractères utilisées pour la génération des PDF

Utilisation

Pour utiliser ce plugin, outre son installation des plus classique (téléchargement, installation dans le répertoire plugins/ et activation via l’interface privée), une étape suffit.

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 utilisé 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 url_abs 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.

Format, orientation des pages et autres subtilités

HTML2PDF, vous permet, via la balise <page> (voir le squelette spipdf_article.html pour l’exemple), de régler :

  • l’orientation : paysage “L”, ou portrait “P”
  • le format : A4, A5, Letter
  • les marges

Vous trouverez plus d’informations sur le wiki de la librairie et plus particulièrement sur la section concernant la fameuse balise page

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 HTML2PDF. Dans ce cas, vous devriez avoir une erreur à la génération du PDF.

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

Note : actuellement testé avec pratiquement tous les raccourcis typographiques, il n’a pas été signalé d’incompatibilité entre les balises HTML générées par SPIP et HTML2PDF [1].

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 n’est pas géré.

Vous devrez palier à cette contrainte de positionnement en utilisant des tableaux imbriqués (snif !)

Encore une fois, toutes ces contraintes sont explicitées sur le site de HTML2PDF et sur son forum.

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 :

  1. define('SPIPDF_CHARSET', 'ISO-8859-15');

Footnotes

[1Le forum de la librairie vous donnera plus d’informations sur les balises non supportées

updated on 2 October 2019

Discussion

17 discussions

  • 1

    argh je suis en 2.1.2 et j’ai une erreure

    Parse error: syntax error, unexpected ’’ in /homepages/43/d347159104/htdocs/plugins/auto/spipdf/spipdf.php on line 132

    je suis chez 1and1 en hebergement mutualise.

    une idee de ce qui plante ?

    • Il me faut plus d’infos. au minimum :

      -  la version de PHP
      -  ce que tu as à la ligne 132 de spipdf.php

      Et éventuellement :

      -  le type de serveur
      -  est-ce que tu utilises le squelette de base
      -  est-ce que l’erreur se produit avec un article simple ou complexe avec plein de raccourci typographique

    Reply to this message

  • freebsnet

    bonjour,
    pour les notes de bas de page fonctionnent je suis obliger de renommer l’attribut id=’xyz’ en name=’xyz" dans les balises <a> pour que la navigation dans le pdf soit possible, est-ce normal ?
    html2pdf ou tcpdf ne supporte pas l’attribut id= ?
    modifications que j’ai faite dans spipdf_article.html

    [(#DESCRIPTIF|replace{id=',name='})]
    [(#CHAPO|replace{id=',name='})]
    [(#TEXTE|replace{id=',name='})]
    [(#PS|replace{id=',name='})]
    [(#NOTES|replace{id=',name='})]

    Reply to this message

  • 5

    Bonjour,
    et merci pour ce plugin !

    Testé avec SPIP 2.1.2 sur hébergement OVH mutualisé, PHP5. Avec le squelette par défaut du plugin.

    La génération du pdf d’un article fonctionne mais il y a certains caractères spéciaux qui s’affichent mal dans le pdf comme par exemple :
    -  les apostrophes (le pdf affiche par exemple “aujourd’hui”),
    -  les tirets dans une phrase (qui s’affichent “–”)
    -  le œ (qui s’affiche “œuvre”)
    -  les points de suite (qui s’affichent “…”)
    En notant tout ça je me rends compte que dans le chapeau y’a une apostrophe qui passe bien, du coup ces problèmes de caractères spéciaux apparaissent peut-être juste dans le texte.

    Et dernier truc, les notes de bas de page semblent superposées (cf capture ci-joint).

    Comment est-ce que je peux corriger ça ?

    • j’ai mal codé mon message du coup les caractères spéciaux html s’affichent bien ici :)
      mais il fallait comprendre que les caractères spéciaux suivants s’affichent mal, c-à-d tel quel, dans le pdf généré :

      &#8217;
      
      &#339;
      
      &#8211;
      
      &#8230;
    • freebsnet

      bonjour,
      j’ai aussi galéré avec les caractères spéciaux en iso-8859-15, j’ai remarqhé que spip ne les transforme pas en entité html ou en référence numérique, pour cela j’ai modifié le fichier spipdf.php en ajoutant ceci :

      $trans['&deg;']='°';
      $trans['œ']='oe';
      $trans['Œ']='OE';
      $trans['…']='...';
      $trans['&euro;']='Euros';
      $trans['€']='Euros';
      $trans['&copy;'] ='©';

      ensuite les valeurs de la variable $trans qui sont encadrées par des doubles quote, je les ai remplacé par des simples quote. ce qui donne cette liste de variables à étendre au besoin.

      if(SPIPDF_CHARSET=='ISO-8859-15' || SPIPDF_CHARSET=='iso-8859-15') {
              $trans['°'] = '°';
              $trans['&deg;']='°';
              $trans['œ'] = 'oe';
              $trans['œ']='oe';
              $trans['Œ']='OE';
              $trans['–'] = '-';
              $trans['‘'] = '\'';
              $trans['’'] = '\'';
              $trans['“'] = '"';
              $trans['”'] = '"';
              $trans['…'] = '...';
              $trans['…'] = '…';
              $trans['…'] = '...';
              $trans['…']='...';
              $trans['€'] = 'Euros';
              $trans['&euro;']='Euros';
              $trans['&ucirc;'] = 'û';
              $trans['->'] = '-»';
              $trans['<-'] = '«-';
              $trans['&mdash;'] = '-';
              $trans['&copy;'] ='©';
              $trans['&eacute;'] = 'é';
              $trans['€']='Euros';
              }
    • Merci pour vos retours (Je n’avais pas recu de mail automatique quand audwill à posté son message...)

      Je vais ajouter les caractères à échapper. Pour les notes de bas de page, il faut ajouter un style.

      J’ai prévu de fournir un squelette par défaut plus “joli” et faire enfin fonctionner la génération en UTF-8. Mais je manque un peu de temps... La semaine prochaine je pense.

    • freebsnet

      bonjour Yves
      faut aussi mettre dans ton modèle le filtre |abs_ul sur les balises #DESCRIPTIF, #CHAPO, #TEXTE, etc .... sinon le raccourcis typo [->artX] renvoie une url relative et non une absolue, ce qui au niveau du pdf donne des url inexploitables.

    Reply to this message

  • 5

    Bonjour,

    Merci pour ce plugin fort utile.
    J’ai de mon coté un soucis si l’article contient des images :

    ERREUR n°6
    Fichier : ..../www/spip_dev/plugins/auto/spipdf/html2pdf/html2pdf.class.php
    Ligne : 2309
    Impossible de charger l’image /spip/IMG/image/Brest_Au_Quotidien/CLic.jpg

    Cordialement,

    // Config serveur


    chez OVH / mutu 720 -----------------------------------------
    System : Linux web248.720.ha.ovh.net 2.6.32.7-mutu-grs-ipv4-32 #2


    PHP Version 5.2.13


    pdf
    PDF Support enabled
    PDFlib GmbH Version 4.0.2


    • Bonjour,

      D’après l’erreur, je vois que le plugin est dans spip_dev/plugins et que l’image est cherchée dans spip/IMG/image/

      Votre site est dans un sous répertoire spip_dev/ ou spip/ ?

      Autre chose à regarder, je n’ai pas testé mon plugin via l’installation automatique dans le répertoire plugins/auto. Mais je ne pense pas que ça pose pb.

      ++ Yves

    • Bonjour Yves,

      Effectivement j’avais pas noté la chose.
      Je teste sur ../spip_dev et j’ai manifestement de l’url abolu (menant sur ../spip le site en production) qui traine qql part (lié config de fckeditor). Bref...

      je vais revoir/modifier cela .

      merci et désolé d’avoir poste sans regarder...

    • Suite au message que j’ai précédent posté :

      1. j’ai bien remis l’image dans le IMG/ du site en test. Donc le chemin est “standard”
      2. je n’ai gardé que l’attribut src (pas de border, width, etc....). L’image fait 86 ko et 350 x 260 pixels : (ni gros poids de fichier / ni grosse définition)
      3. J’ai déplacé le plugin dans /plugins et non plus plugins/auto (à tout hasard...)
      4. testé sans l’image (pour vérifier... ): le pdf est généré

      J’ai toujours l’erreur No6


      ERREUR n°6
      Fichier : .../www/spip_dev/plugins/spipdf/html2pdf/html2pdf.class.php
      Ligne : 2309
      Impossible de charger l’image /spip_dev/IMG/image/Brest_Au_Quotidien/CLic.jpg


      => Qui se traduit au 2eme chargement de la page par un message d’Acrobat (en pièce jointe)
      => html2pdf.class.php / Ligne 2309 : ne semble pas capter les dimensions de l’image ?

      Ps : pas encore testé ce qui est dit pour config UTF-8, je ferais suivre...

    • Est-ce que vous utilisez le squelette du plugin ou un squelette perso ?

      Votre image est intégrée via SPIP ou via une autre voie : html, fckeditor... ?

      Pour ce qui est de l’UTF-8, merci de tester mais je pense qu’il y a vraiment un problème de ce côté.

      Je vais me pencher sur quelques optimisations d’ici quelques jours.

    • -  J’utilise le squelette (non modifié) du plugin pour générer le pdf
      -  L’image a été intégré initialement via fckeditor.
      Après simplification du code manuellement (suppression des attributs qui pourraient poser pb ds la balise img), il reste :
      img alt=“” src=“IMG/image/Brest_Au_Quotidien/CLic.jpg”

      Dès que j’ai testé l’UTF-8 je fais retour.

      Merci ! :)

    Reply to this message

  • 5

    il existe un moyen simple “d’échapper” le code html qui n’est pas bien géré par le plugin afin qu’il n’apparaisse pas...
    regardez du coté des anciens plugins PDF archivés ou dans les vieux articles parlant de pdf, quelqu’un a écrit des filtres spip d’échappement de bcp de codes html, c’était peut etre J. Pyrat... de mémoire 

    • Bonjour,

      J’ai essayé ce plugin... sans succès.

      • Il semble que la version de mon serveur soit bien du php 5 (PHP Version 5.2.14).
      • Tous mes squelettes sont en utf8 (j’ai testé en changeant la ligne de code concernée).
      • Version de spip : 2.1.0
      • Hébergeur : OVH

      Le fichier .pdf n’est pas généré correctement et rien ne s’ouvre.

      Voir ici.

      Cordialement,

      KMk.

    • Bonjour,

      Vous êtes passé en UTF-8, mais j’ai pu tester quand vous étiez en ISO

      Ce n’est pas lié au serveur ou à la version de PHP mais à du code HTML mal formé et non géré par la bibliothèque. Il y a d’ailleurs une erreur explicite :

      ERREUR n°4
      Fichier : /homez.108/laglaneu/www/plugins/spipdf/html2pdf/parsingHTML.class.php
      Ligne : 99
      
      Code HTML non valide, les balises ne sont pas fermées dans le bon ordre.
      Etat :
      
      Array
      (
          [0] => page
          [1] => meta
          [2] => table
          [3] => tr
          [4] => td
      )
      
      HTML : ...eral Public License</p></div> </page>

      Avez-vous au moins essayé avec un article simple et avec le squelette livré ? Parceque cet article est un peu “tordu” http://laglaneuse.info/spip.php?article29#pdf ;)

      Je ne dis pas que ça ne devrait pas fonctionner mais il faut y aller progressivement.

      Par contre, en UTF-8, ça ne fonctionne pas du tout... Il suffit d’ouvrir le fichier PDF généré pour voir l’erreur PHP. Ca rejoint donc ce que je dis au premier paragraphe... Je vais finir par trouver...

    • Bonjour,

      Hum... en effet, l’article en question me permet de tester les codes de spip pour le .css .

      • Je viens d’écrire un article tout simple, deux paragraphes. Avec un CHARSET utf8.
      • Même contexte que précédemment.

      C’est ici.

      Avec la même impossibilité de générer le .pdf.

      Une idée ??

      Cordialement,

      KMk.

    • Repassez le plugin en ISO dans spipdf.php. Même si votre charset d’origine est UTF-8, le plugin se chargera de convertir en ISO. Le temps de trouver ce qui cloche (j’ai déjà quelques pistes). C’est un bug qui se produit de manière erratique et donc pas facile à résoudre.

      Concernant votre article de test, il doit juste y avoir quelques subtilités non gérées car le plugin gère déjà pas mal de chose. Voici un exemple :

      http://www.grafactory.net/devel/spip/spip.php?article3

      Vous pouvez customiser l’affichage du PDF simplement avec HTML et CSS. (voir spipdf_article.html).

      Cordialement,

    • Bonjour,

      OK, avec l’article tout simple, cela fonctionne. Merci pour cette accompagnement !

      Cordialement,
      KMk.

    Reply to this message

  • 2

    Ce plugin est excellent, bravo.
    Je suis en train de tester les limites (en poids) des documents que l’on peut intégrer au PDF.

    Reply to this message

  • Le plugin échappe déjà la plupart du code HTML non géré par HTML2PDF. Pour ça, j’ai justement consulté l’existant.

    J’ai également ajouté des éléments qui n’étaient pas géré, produits par des raccourcis typographiques, et qu’ils ne suffisaient pas juste d’échapper. Par exemple, la balise pour les légendes de tableau ou les balises

    Ce que je veux donc dire, c’est que je n’ai pas testé TOUTES les balises HTML existantes (http://www.w3.org/html/wiki/Elements)

    Reply to this message

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom