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 (MAJ Déc 2015 : osbolète) :
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 😉
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
@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
@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 😉
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.
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
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 😉
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…………….!!!!!!!!!!!!!!!!!!!)
Merci ,j’ai déjà trouver la solution 🙂
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
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.
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)
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à
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
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..
Merci 🙂
Hola he seguido todos los pasos con respecto a la exportación a pdf. y si me muestra los marcos de pdf pero no me muestra el contenido de mi dashboard dice « Acceso Denegado o archivo no funciona »
Hi Judit, please try again, it should work 😉
Bonjour, je suis un débutant sur pentaho CDE 5.0 version stable.
J’ai fait mon tableau de bord et il y a ds paramètres et des graphiques.
Lorsque je clique sur un détail et que je reviens à la page principale,je reviens aux paramètres par défaut.
je devrais conserver mes paramètres.
J’aimerais donc conserver mes paramètres sélectionnés juste avant le clic sur les détails.
veillez m’aidez SVP
Bonjour
Comme ça difficile de répondre…
Bonjour,
Actuellement en stage de fin d’étude dans le domaine décisionnel, j’ai élaboré mon Datawarehouse avec Talend, conçu mes cubes OLAP avec le schema workbench, et analyser ces cubes grâce a Mondrian/Jpivot.
Mon problème maintenant, c’est que je veux intégrer cet interface d’analyse OLAP dans une application PHP.
Comme dois-je faire si c’est possible s’il vous plait?sinon que dois-je faire comme plan b?
Merci beaucoup de me répondre.
Bonne journée.
Bonjour
Le plus simple c’est d’intégrer une iframe dans votre appli PHP (bon c’est pas très propre, mais cela au moins l’avantage de fonctionner !)
bon courage
Bonjour,
D’accord je vais l’essayer 😉
Merci beaucoup pour votre aide.
Bonne journée.
Merci pour le guide. Je continue, mais au moment de la génération du fichier PDF avec le bouton, le fichier PDF est téléchargé sur blanc. Je l’utilise Pentaho 5.3. Il manque quelque chose?
En effet, je crois que cela ne fonctionne plus sous Pentaho 5.
Regardez plutôt ce lien : http://joshid.github.io/blog/2014/10/08/pentaho-pdf-export
La version 2.1 de PhantomJS est disponible en binaire pour Linux. Je ne sais pas si ça marche avec toutes les distributions, mais ne plus avoir à reconstruire le produit à partir des sources est un vrai progrès!
En effet, voilà une bonne info 😉
Ou je pourrai trouver le package phantomJS svp?
Sur phantomjs.org ?
Bonjour,
J’ai créé un job que je peux déclencher depuis mon serveur pentaho pour exporter n’importe quelle page web au format pdf. Ce job fonctionne bien pour la plupart des sites que j’ai pu tester mais le fichier pdf téléchargé est vide lorsque j’indique une adresse web correspondant à un document présent dans le serveur pentaho (ex : http://localhost:8082/pentaho/api/repos/%3Apublic%3Atry_parameters.prpt/viewer?ts=1548241412690), même en précisant les informations d’authentification (&userid=joe&password=password)le problème est toujours présent.
Auriez-vous une idée de ce qui pourrait déclencher ce comportement ?
Merci beaucoup pour votre tutoriel,
Bonne journée.
Bonjour. L’url que vous indiquez (avec userid et password) est-elle accessible quand vous êtes déconnecté de la console utilisateur pentaho ?