Export PDF de Dashboards Pentaho CDE avec PhantomJS

Introduction

Quand vous publiez des tableaux de bord dans Pentaho avec les Ctools (Pentaho CDF/CDE), il arrive immanquablement une question embarrassante (mais justifiée) de la part de vos utilisateurs :

« Est-ce que je peux sauvegarder mon tableau de bord au format PDF ? »

J’avais tenté d’apporter une réponse à cette question il y a quelques temps dans l’article « Exporter en PDF vos tableaux de bords Pentaho CDE/CDF » .

Mais la méthode de mise en œuvre proposée basée sur le plugin CGG (Community Graphic Generator) et Pentaho Report Designer, quoique intéressante, ne m’avait jamais vraiment donné entièrement satisfaction (complexe et longue).

C’est finalement grâce à l’expertise d’un collègue d’Atol C&D (merci Charly) et son étude d’une solution générique d’impression de page web que j’ai obtenu une solution convenable, à savoir l’utilisation de PhantomJS pour l’export PDF au travers d’un navigateur Webkit piloté en Javascript.

Je vous propose dans cet article de détailler la méthodologie de mise en place de PhantomJS dans Pentaho, afin que vous puissiez proposer dans vos propres tableaux de bord une solution générique d’impression PDF fiable côté serveur.

Téléchargez tout d’abord le package de démonstration ici :

Package de démonstration PhantomJS CDE (339 downloads)

Installation

1. Dézipper le package d’installation.

Celui-ci contient 3 répertoires qui doivent être copiés comme suit dans votre installation Pentaho :

  • /phantomjs-demo dans /biserver-ce/pentaho-solutions (contient le dashboard de démonstration avec un bouton pour l’export PDF)
  • /phantomjs-lib dans /biserver-ce/tomcat/webapps/pentaho (contient les librairies de PhantomJS 1.9, Windows & Linux)
  • /phantomjs dans /biserver-ce/pentaho-solutions/system (contient un job kettle et une Xaction)

2. Editer le fichier phantomjs.xaction (dans system/phantomjs/) afin de configurer les variables pentaho_folder et baseURL en fonction de votre installation Pentaho :

3. Effectuer un refresh du référentiel et des paramètres système (depuis la console utilisateur web)

4. Ouvrir le dashboard et lancer un export PDF.

Petite vidéo de démonstration :

Note importante : si vous êtes sous Windows 7 et que vous avez une carte NVIDIA, il vous faudra suivre la procédure suivante, à savoir « Activer le processeur NVIDIA hautes performances » ! (sic)

Comment ça marche ?

Pour faire simple, PhantomJS est une librairie Javascript qui permet de piloter l’impression PDF d’une page web à partir de son URL (bien sûr PhantomJS va beaucoup plus loin que cela, mais ce n’est pas l’objet de cet article).

Par exemple vous pouvez tester l’instruction ci-dessous dans un éditeur en ligne de commande. Pour cela placez vous dans le répertoire /biserver-ce/tomcat/webapps/pentaho/phantomjs-lib et tapez :

phantomjs rasterize.js http://www.pentaho.fr snapshot.pdf A4

Si tout se passe bien, le fichier snapshot.pdf est généré (une belle photo de la page d’accueil du site pentaho.fr).

Implémentation dans Pentaho

1. Principe

Le principe de fonctionnement est finalement simple, il faut depuis le dashboard être capable d’invoquer l’exécution de PhantomJS côté serveur (en précisant l’URL du dashboard), puis rediriger le fichier PDF obtenu dans la page Web (pour le download).

Pour cela il nous faut utiliser un job Kettle pour l’appel de PhantomJS ainsi qu’une Xaction pour l’invocation du job à partir du tableau de bord.

2. Job Kettle

Il permet d’invoquer le programme PhantomJS (différencié en fonction de l’environnement Windows ou Linux), avec le passage de 3 paramètres :

  • l’URL de génération (URL_GENERATION), c’est à dire l’url complète du tableau de bord (paramètres inclus).
  • le répertoire d’installation de Pentaho (PENTAHO_FOLDER)
  • le nom du fichier PDF (NOM_FICHIER)

3. Xaction

Cette séquence d’action joue un rôle fondamental : elle permet l’appel du job kettle en mode web (depuis la console utilisateur Pentaho), le passage des paramètres nécessaires et la redirection du fichier PDF pour le download.

Voici un aperçu de l’Xaction dans Pentaho Design Studio :

4. Configuration du dashboard

Le bouton « Exporter » s’appuie sur le composant « Execute Xaction Component » et permet l’appel de l’Xaction, avec passage du paramètre url_params

Tous les paramètres qui servent à piloter le dashboard doivent obligatoirement être de type « Custom ».

Pour chaque paramètre, une instruction javascript doit être définie pour pouvoir utiliser le paramètre dans l’URL du dashboard (au format &PARAM_PRODUCTLINE=Planes) :

Dashboards.getQueryParameter(« PARAM_PRODUCTLINE ») :

 

Le paramètre url_params permet de stocker les valeurs en cours de chaque paramètre afin d’exporter le PDF correspondant au dashboard consulté.

url_params est mis à jour au travers d’une fonction appelée à chaque modification des paramètres de contrôle du dashboard, via les évènements de type PostChange (sur le Select component) ou ClickAction (sur les graphiques)

function update_url_params(){
 
var solution= Dashboards.context.solution;
var path= Dashboards.context.path;
var file= Dashboards.context.file;
 
var params=
"solution=" + solution
+ "&path=" + path
+ "&file="+ file
+ "&PARAM_PRODUCTLINE=" + PARAM_PRODUCTLINE
+ "&PARAM_MARKET=" + PARAM_MARKET
+ "&PARAM_YEAR=" + PARAM_YEAR ;
 
console.log("url_params=" + params);
 
Dashboards.fireChange("url_params", params);
 
}

Quelques précisions

Le fichier rasterize.js permet de contrôler de façon avancée la génération du PDF, comme par exemple le temps de « pause » avant que PhantomJS fasse la « photo » de la page web (juste histoire qu’elle soit chargée entièrement).Pour cela vous pouvez ajuster la fonction setTimeout (par défaut 2000 ms)

La version Linux de PhantomJS de mon package est celle fournie pour une distribution CentOS 64 bits. Si vous avez une autre distrib’, prenez connaissance des instructions d’installation.

J’espère que cet article tant attendu fera beaucoup d’heureux…

A bientôt ;-)

26 comments to Export PDF de Dashboards Pentaho CDE avec PhantomJS

  • Patrick

    Bonjour
    Merci pour ce tuto la demo fonctionne correctement sur mon serveur cependant lorsque je l’adapte pour un de mes tableaux de bord j’ai le message suivant lors de l’export en pdf « Access Denied or File Not Found »
    Merci de votre aide

  • Bonjour
    Si vous avez un « access denied », cela signifie probablement que vous n’avez pas accès au serveur Pentaho via une URL directe.
    Dans l’url de génération passée à kettle, je rajoute à la fin « &userid=joe&password=password », c’est peut-être cela qu’il vous faut adapter en fonction de votre installation

  • Patrick

    @osbi.fr – L’installation de pentaho serveur est classique avec l’utilisateur joe et le password password.
    Comment puis je verifier que l’url est correcte
    Merci

  • L’url est affichée dans le fichier pentaho.log (/tomcat/logs)
    Il suffit de la copier/coller dans votre navigateur et voir ce qu’il se passe

  • Patrick

    @osbi.fr

    Merci grâce au log j’ai identifié mon erreur dans le postchange du select coponent, cela fonctionne désormais.
    A bientôt au 5 décembre

  • Parfait !
    Content de vous rencontrer le 5 Décembre ;-)

  • Patrick

    Rebonjour,
    Avec une solution cassifiée de pentaho je rencontre un pb d’authentification lors de l’utilisation de l’export en pdf ainsi que le button ExportComponent.
    Bien que je sois authentifié et ayant les droits pour exécuter les tableaux de bord lorsque que j’essaie d’exporter au format pdf ( j’ai modifié &userid=joe&password=password »)

    Merci

  • Bonjour
    Comme ça je ne sais pas répondre, il y a peut-être un paramètre dans la configuration de C.A.S. qui permet d’autoriser le passage des infos user/password dans l’url via la méthode GET.
    Il faudrait creuser cela.

  • Utkarsh

    Hi,

    I am using Pentaho 5.0.1 and url below being used in the .xaction is no longed supported in the CDE 5.0

    Urls below are supported in the CDE 5.0 as separate call for header & the dashboard content
    http://localhost:8080/pentaho/plugin/pentaho-cdf-dd/api/renderer/getHeaders?params
    http://localhost:8080/pentaho/plugin/pentaho-cdf-dd/api/renderer/getContent?params

  • jabrisiham

    je travaille avec pentaho 5 et l’url utilisé du daschboard dans xaction n’est pas le mm..comment ferai je pour le recuperer en version 5

  • Désolé, personnellement je ne travaille pas encore avec Pentaho 5.0 (pas suffisamment stable et documenté)
    il faudra attendre un petit peu sur ce point ;-)

  • Ingénieur BI

    Bonsoir tout le monde,
    j’essaye de faire un multi value list ou multi selection button avec Pentaho report designer,mé ca me donnée qu’un single select!!!!!! j’arrive pas à selectionner plusieurs items,je ne selectionne que 1 la fois!!!!!!!
    N.B : j’ai créer le paramètre ,je lui ai associé la requete sql content « IN »
    merciii d’avance de voos aides

  • Bonjour

    essayez de regarder dans les samples de Pentaho (Steel-Wheels/reporting) !!!!!!!!! Je suis sûr que vous allez trouver un exemple similaire au vôtre !!!!!!!!!!!!!!!!!
    (ça fonctionne très bien le multi-select…………….!!!!!!!!!!!!!!!!!!!)

  • Ingénieur BI

    Merci ,j’ai déjà trouver la solution :)

  • Fripou

    Bonjour.
    J’ai suivi votre tuto mais lorsque je lance l’export PDF sur la page de test proposer par PhantomJS j’ai une erreur du type : RuntimeContext.ERROR_0017 – [fr_18] Activity failed to execute …
    Une idée de résolution ?

    Cdlt

  • Bonjour

    Quelle version de Pentaho utilisez vous ? (4.8 , 5 ?)
    Normalement l’url de génération du pdf avec PhantomJS générée par Kettle est passée dans la log tomcat, il faut voir déjà si vous la voyez et ce qui se passe si vous la jouez dans le navigateur

  • Fripou

    Je suis sur Pentaho 4.8. Dans mes logs de Tomcat (/biserver-ce/tomcat/logs/*) je n’ai aucun lien et aucune info sur cette erreur. J’ai juste un message d’erreur lorsque je clic sur le bouton export pdf dans le dashboard.

  • Fripou

    Désolé je débute juste avec Pentaho, Tomcat, saiku etc … Dans le log catalina….log j’ai une ligne qui me dit « /root/Pentaho/biserver-ce/tomcat/webapps/pentaho/phantomjs-lib/kettle_3174b895-ed7b-11e3-8912-b7f98e1ae4dashell: line 1: ./phantomjs: Permission denied » et ensuite j’ai « 15:05:11,918 ERROR [KettleComponent] Error Start: Pentaho Pentaho Platform Engine Core 4.8.0-stable.51169
    15:05:11,919 ERROR [KettleComponent] 31088943-ed7b-11e3-8912-b7f98e1ae4da:COMPONENT:context-32422578-1402059911065:phantomjs.xactionKettle.ERROR_0008 …. » Est ce que ça pourrait venir d’un manque de droit sur un fichier ?

  • Essayez juste de mettre le fichier phantomjs en droit d’exécution (chmod 777 par ex)

  • Fripou

    Alors j’ai mis les droits 777 sur tout mon Pentaho (c’est pas très propre mais c’est sur une machine virtuelle perso ^^) cela ne change rien . J’ai toujours le même message sur Pentaho : http://hpics.li/ec2996b .
    Dans le fichier pentaho.log j’ai réussi a trouver ce lien http://192.168.230.85:8080/pentaho/content/pentaho-cdf-dd/Render?solution=phantomjs-demo&path=&file=phantomjs-dash.wcdf&PARAM_PRODUCTLINE=Planes&PARAM_MARKET=APAC&PARAM_YEAR=2003&userid=joe&password=password qui me permet d’acceder a la version web de la page que je veux exporter en pdf. Mais même soucis à partir du navigateur j’ai le message d’erreur qui apparait.
    Un peu plus loin dans le log j’ai : line 1: ./phantomjs: cannot execute binary file
    Et derrière la suite des messages d’erreur (une partie des erreurs) :
    Error Start: Pentaho Pentaho Platform Engine Core 4.8.0-stable.51169
    e6340373-ed7d-11e3-8912-b7f98e1ae4da:COMPONENT:context-33484631-1402061074011:phantomjs.xactionKettle.ERROR_0008
    Avec les info JAVA derrière bien sur …

    Je suis un peu coincé du coup.

  • Au vu du message d’erreur, ça vient de la version linux de phantomjs
    Cf https://github.com/gruntjs/grunt-contrib-qunit/issues/46
    Il faut creuser de ce côté là

  • GIBI

    Bonjour,
    je viens d’installer pentaho biserver version 5 et j’ai creer une base de données pour l’authentification et la gestion des users et droits…
    aprés la config j’arrive à me connecter avec les login et password stocké dans la base de données selon les droits qu’ils ont…mon problem c’est que lorsque j’ajoute un utilisateur à travers la console d’administration du biserver le login et password s’affiche au niveau de la console méé rien n’est inseréé dans ma base de donnée que j’ai crée…donc jusqu’a maintenant je sais pas comment faire pour que ce que j’ajoute au niveau de la console d’admin apparait au niveau de ma BD mysql….
    Normalement je doit avoir une requete INsert et update pour que ca marche,pour le moment j’ai vu que les select….!!!!
    si vous pouvez m’aider svp et mercii bcp

  • Je crois bien que c’est un bug lié à Pentaho 5. Ton utilisateur est créé directement dans le nouveau moteur jackrabbit et pas dans ta base de données
    Je te conseille de tester la nouvelle version 5.1-RC qui vient de sortir et qui corrige pas mal de pb liés à cette version: https://pentaho.app.box.com/51-CE-RC/2/2078936284

  • GIBI

    wi je vais voiir la nouvelle version,mais avant j’aimerai bien savoir ou puis je modifier mon UPDATE et Insert pour que ca part dans ma base de données au lieu du jackrabbit!!??

  • Si je le savais, tu penses bien que je t’aurais indiqué la méthode..

Leave a Reply

  

  

  

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>