Apps

Module d'Export PDF

Description

Ce module permet de télécharger un contenu sous forme de fichier PDF.

Fonctionnement

Un utilisateur peut demander l'export PDF à partir du gabarit Full Display de la publication.

Le module requiert l'installation de phantomjs sur le serveur d'application.

ExportPdfPlugin - schéma d'architecture

Etape 1 : l'utilisateur demande le PDF d'une Publication

Etape 2 : JPlatform demande à PhantomJS de générer le PDF en lui communiquant :

  • l'identifiant de la publication à exporter
  • le membre qui réalise l'action
  • le portail d'affichage à utiliser
  • les options de personnalisation du rendu
  • l'endroit où doit être sauvé le fichier PDF sur le serveur

Etape 3 : PhantomJS requête la page HTML de la publication affichée au sein du portail spécifié.

Etape 4 : PhantomJS produit une capture de la page HTML au format PDF, et stocke le fichier à l'endroit indiqué par JPlatform (répertoire temporaire de l'OS du serveur)

Etape 5 : Le navigateur télécharge le fichier PDF

Options

  • choix des types de contenus compatibles
  • légère personnalisation possible du PDF

Ce module vise à remplacer cet outil ( Génération de PDF à la volée).

Bug tracker associé : https://issues.jalios.com/browse/EXPORTPDF


Installation

Installation de PhantomJS

  • Télécharger et installer phantomJS (http://phantomjs.org/)
    • Note : suite au bug de zoom #12685, nous vous conseillons l'installation de la dernière version 1.9.x.
  • Noter l'emplacement complet de l'exécutable
    • Exemple sous Windows: C:\bin\phantomjs-x.y.z-windows\bin\phantomjs.exe
    • Exemple sous UNIX: /bin/phantomj
  • L'utilisateur système de JPlatform doit avoir les droits d'appeler cet exécutable

Installation du module

  • Dézipper le module et redémarrez JPlatform

Paramétrage du module

  • dans les propriétés du module, saisir l'emplacement de phantomjs
  • sauver
    • vérifier les logs JPlatform en cas de mauvais paramétrage

 

Validation de l'installation

Nous allons essayer de générer un PDF à partir d'une Publication JPlatform :

  • créer un nouvel article et le consulter en Full Display
  • dans le menu d'actions de la publication, vérifier qu'une nouvelle action "Exporter en PDF" est disponible. Si ce n'est pas le cas :
    • chercher la présence d'éventuelles erreurs dans les logs JPlatform
    • vérifier l'installation et l'emplacement de phantomjs
    • Rafraîchir les propriétés JPlatform ou redémarrer
    • afficher l'article à nouveau
    • vérifier la présence de la nouvelle action
  • cliquer sur l'action "Exporter en PDF"
  • vérifier que le fichier PDF est téléchargé par le navigateur et stocké sur le poste client
  • ouvrir le PDF pour vérifier son contenu

FAQ

1. A quoi sert PhantomJS ?

PhantomJS (wikipedia) est un navigateur web headless (sans interface graphique), permettant d'automatiser des interactions avec des pages Web.

PhantomJS est utilisé comme moteur de rendu car il supporte le CSS, JS, les canvas et le SVG.

Ainsi, une page WEB produite par PhantomJS aura quasiment le même rendu qu'en appelant la page depuis un vrai navigateur Web.

2. Que peut-on exporter en PDF ?

Techniquement, n'importe quelle page HTML pourrait être exportée en fichier PDF.
Fonctionnellement, le lien d'export est proposé sur le Full Display d'un Contenu.
Il faut cependant que :

  1. le type de contenu soit compatible (voir les propriétés du module)
  2. le Full Display du contenu propose le menu des actions sur la publication (menu de droite) afin de proposer le lien d'export. Le cas échéant, il faut injecter le lien d'export via une target.
3. Comment définir les types compatibles ?

Le module permet de définir pour quels types de contenu l'export PDF sera disponible (par défaut : Article, Brève et Page Wiki).
Cela se définit dans les propriétés du module.

4. Les générations PDF sont-elles fiables à 100% ?

Non. En effet, la qualité et "l'exactitude" du PDF généré dépend entièrement de l'outil PhantomJS, mais également des outils ou composants sur lesquels il se base.

Vous pouvez par exemple constater des différences entre un PDF généré :

  1. par l'export PDF JPlatform
  2. par l'export PDF réalisé par la fonction d'impression de votre navigateur

Le bugtracker de PhantomJs se trouve ici : https://github.com/ariya/phantomjs/issues

Jalios n'est pas responsable des problèmes de rendu lié à l'outil PhantomJS.

5. Y a-t-il des contraintes ?
  • l'outil phantomjs doit être installé sur le même serveur que JPlatform
  • l'export PDF n'est proposé que si l'utilisateur est authentifié
  • le serveur d'application doit autoriser l'utilisation de cookie (surtout si le site est privé)
  • le nom du cookie de session J2EE doit être standard, c'est-à-dire "JSESSIONID"
  • un problème d'authentification peut avoir lieu si le site est accédé avec le domaine "localhost". Dans ce cas, préférer l'utilisation de "127.0.0.1"
  • il existe un bug connu (https://github.com/ariya/phantomjs/issues/10196, lié au bug suivant du composant QT) faisant que certains hyperliens ne sont pas cliquables dans le PDF
6. Comment personnaliser le rendu PDF ?

Le rendu PDF peut être personnalisé de plusieurs manières :

  1. surcharge du portail d'impression
  2. options d'impression par type de contenu
  3. remplacement du PDF Driver

Surcharge du portail d'impression

Par défaut, la publication est affichée au sein du portail d'impression par défaut de JPlatform (propriété channel.default-printportal).
Il est toutefois possible de définir un portail d'impression PDF dédié (propriétés éditables du module).

Options d'impression

Liste des options de personnalisation du rendu PDF :

  • la taille de la page (format). Exemple : A3, A4, ...
  • l'orientation de la page. Exemple : portrait, landscape
  • en-tête de chaque page :
    • affichage du nom du site : oui / non
    • affichage du numéro de page : oui / non
  • pied de page de chaque page :
    • affichage du nom du site : oui / non
    • affichage du numéro de page : oui / non

Ces options peuvent être surchargées par type de contenu.

Valeurs par défaut :

jcmsplugin.exportpdf.generate-pdf.render.default.format: A4
jcmsplugin.exportpdf.generate-pdf.render.default.orientation: portrait
jcmsplugin.exportpdf.generate-pdf.render.default.display-header-sitename: true
jcmsplugin.exportpdf.generate-pdf.render.default.display-header-numerotation: false
jcmsplugin.exportpdf.generate-pdf.render.default.display-footer-sitename: false
jcmsplugin.exportpdf.generate-pdf.render.default.display-footer-numerotation: true

Ces valeurs s'appliqueront en l'absence de personnalisation pour le type de contenu concerné.

Pour personnaliser le rendu d'un type de contenu, il faut suivre la syntaxe suivante, décrite dans le plugin.prop du module :

jcmsplugin.exportpdf.generate-pdf.render.{MyType}.{option-name}: overrided value

En prenant le type JGuide, un exemple de personnalisation serait :

# Customization for JGuide content type:
jcmsplugin.exportpdf.generate-pdf.render.JGuide.format: A3
jcmsplugin.exportpdf.generate-pdf.render.JGuide.orientation: landscape
jcmsplugin.exportpdf.generate-pdf.render.JGuide.display-header-sitename: false
jcmsplugin.exportpdf.generate-pdf.render.JGuide.display-header-numerotation: true
jcmsplugin.exportpdf.generate-pdf.render.JGuide.display-footer-sitename: true
jcmsplugin.exportpdf.generate-pdf.render.JGuide.display-footer-numerotation: false

Remplacement du PDF Driver

Enfin, en dernier recours, il est possible de remplacer totalement le composant en charge de la génération du PDF (par défaut, PhantomJS).
Pour ce faire, il faut :

  • créer une classe qui implémente l'interface com.jalios.jcmsplugin.exportpdf.PDFDriver, ex com.acme.exportpdf.MyCustomPDFDriver
  • la déclarer dans les propriétés du site :
    1. nom du driver à utiliser
    2. emplacement de la classe Java de ce driver

Comportement par défaut :

# Driver name to use:
jcmsplugin.exportpdf.generate-pdf.driver: phantomjs
# Class of the driver:
jcmsplugin.exportpdf.generate-pdf.phantomjs.clazz: com.jalios.jcmsplugin.exportpdf.impl.PhantomJSDriver

Exemple de surcharge :

# Driver name to use:
jcmsplugin.exportpdf.generate-pdf.driver: customdriver
# Class of the driver:
jcmsplugin.exportpdf.generate-pdf.customdriver.clazz: com.acme.exportpdf.MyCustomPDFDriver
7. Les PDFs sont-ils conservés ?

Pour des raisons de droits, le fichier PDF généré n'est pas conservé, mais supprimé après le téléchargement.

8. Comment débugguer ?

Activer les logs JPlatform

  • activer le niveau de trace ALL dans le package com.jalios.jcmsplugin.exportpdf
  • demander l'export PDf d'une publication
  • consultez les logs (indiquent notamment la ligne de commande d'appel à PhantomJS qui est exécutée)

 

Identifier la version de PhantomJS

~$ phantomjs -v
2.1.1

 

Identifier la version de Webkit embarquée par PhantomJS

Issue de la documentation : http://phantomjs.org/faq.html

Q: Which WebKit version is used by PhantomJS?

A: If you want to know HTML5/CSS3/other features supported by PhantomJS, using WebKit version is not a good idea. See Supported Web Standards documentation page for details.

If you really like to get the WebKit version, find it via the user agent, run the examples/useragent.js. The actual version depends on the libraries with which PhantomJS was compiled.

/bin/phantomjs-2.1.1-linux-x86_64/ $ phantomjs examples/useragent.js 
The default user agent is Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1

Où le script examples/useragent.js se trouve dans le répertoire de PhantomJS.
Dans l'exemple ci dessus, la version de Webkit est 538.1.

9. Erreur : Unsafe JavaScript attempt to access frame in 1.9.8

La version 1.9.8 peut générer ce genre d'erreur :

 
 
com.jalios.jcmsplugin.exportpdf.PDFRenderingException: [WARN] Unable to load the address '  https://[...]?&portal=j_55&printView=true' Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL {webapp}/WEB-INF/plugins/ExportPdfPlugin/contentpdf.js Domains, protocols and ports must match.
at com.jalios.jcmsplugin.exportpdf.impl.PhantomJSDriver.generatePdf(PhantomJSDriver.java:153)
at com.jalios.jcmsplugin.exportpdf.PDFManager.generatePdf(PDFManager.java:196)
at com.jalios.jcmsplugin.exportpdf.PDFManager.getPdf(PDFManager.java:153)
at org.apache.jsp.plugins.ExportPdfPlugin.jsp.pdf_jsp._jspService(pdf_jsp.java:1086)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
[...]
 

Une issue existe à ce sujet : https://github.com/ariya/phantomjs/issues/12697

Solution : utiliser la version 2.1.1 sembe résoudre ce problème.

Informations

Version
  • 1.0
Stabilité
  • Stable
Compatibilité
  • JPlatform 10 SP2
    JCMS 9
Certifié Jalios
  • Oui
Prix
  • Module payant
Support
  • Jalios Support
Auteur
  • Jalios SA
Licence
  • Jalios
Taille
  • 119,64 Ko
Mis-à-jour
  • 25/07/16
Téléchargements
  • 38