Aujourd'hui je vous présente un outil que j'ai développé pour notre CMS favoris Joomla qui vous permet, grâce au navigateur web chrome uniquement, de transformer chacun de vos articles Joomla Content en un fichier PDF ! Je pensais que c'étati impossible, alors je l'ai fait !

Alors je sais, existe des outils gratuits (je reste toujours dans l'univers du gratuit car je n'ai aucun budget à mon boulot pou acheter quoi que ce soit, et ca reviens beaucoup moins cher de passer quelque semaines à rechercher et à coder)  qui vous permettent de faire ce genre de choses comme PhocaPDF. Il existe des composants pour faire ceci mais je ne veux pas que cela reste un composant utilisable manuellement, pour chacun des articles, je veux véritablement sortir tous les articles de mon site Joomla (Content) en un fichier PDF. Il y a intérêt, dans mon cadre professionne, de pouvoir fournir un et un seul fichier qui va contenir l'ensemble de mon Joomla. En effet, tout le monde n'a pas forcément et à chance d'avoir un accès web lorsque les personnes ne sont plus au bureau. Elles ont certes un ordinateur mais pas forcément d'accès au réseau. Et je parle même pas de la sécurisation des données si jamais on passe par Internet !

CHROME

Alors j'entends déjà ici les mauvaises langues dire, à juste titre, "oui ton outil n'est pas compatible avec les normes du web, il se retrouve associé à 1 et 1 seul navigateur Web : Chrom". Oui je sais. Je plussois. Et alors ? Quand on se penche sur ce genre de concept, on accepte aussi de tirer les outils par les cheveux pour pouvoir aboutir à ses fins, lorsque ces dernières sont assez complexes. Mais je suis d'accord avec vous.
Une deuxième remarque, c'est aussi la justification de l'utilisation de l'outil navigateur web de Google Chrome. Pourquoi utiliser ce navigateur en particulier ?  Ce site est-il en partenariat avec le plus gros moteur de recherche du moment ?
 
Hélas non, je ne suis en partenariat avec personne ici. Le choix de Chrome se justifie simplement car il possède un mode CLI assez intéressant que je n'ai pas retrouvé sur les autres navigateurs. Je souligne au passage que tout ce que j'ai fait jusqu'à présent, je l'ai fabriqué sur une plate-forme Windows sans avoir détesté sur les autres systèmes d'exploitation. D'ailleurs retrouvez toutes les commandes chrome sur le site de Perter BEVERLOO.
En effet, parmi les paramètres du mode commande de Google Chrome, il existe des paramètres qui vous permettent de pouvoir afficher une page web dans un fichier PDF, sans afficher le contenu, le tout en ligne de commande, ce qui nous permet de fabriquer des scripts de modification et de génération de fichier PDF, au travers d'un fichier de commande .bat.
 

La commande .bat générique 

La commande de base, commentée par les infobulles, est la suivante  :
  
chrome.exe --headless --disable-gpu --print-to-pdf=c:\Users\seb\temp\fichier.pdf
 
Je pense que pour les plus pertinents d'entre vous, vous aurez désormais compris ce que je comptais faire. Plus précisément dans Joomla content, je liste l'ensemble des articles qui sont présents dans la base de données, et grâce à Chrome, je lui demande de les afficher, mais dans une méthode très particulière car il ne les affiche pas à l'écran, mais il utilise un paramètre qui permet de fabriquer un affichage particulier dans un fichier PDF.
L'intérêt de cet outil est de pouvoir utiliser l'outil navigateur web, avec toutes les propriétés qui lui sont conférées, notamment en terme de marges, d'en-têtes et de pieds de page, et tutti quanti. Notez que lorsque vous utilisez cette méthode, la première des choses à faire et d'aller dans Chrome lui-même pour lui paramétrer vos préférences en termes d'en-tête et de pied de page. Peut-être ne voulez-vous pas qu'ils s'affichent. Je n'ai pas regardé en détail mais peut etre existe-t-il aussi des options pour paramétrer en mmode CLI des entêtes, pieds de pages, marges ...
 

JOOMLA 

 
Au niveau de Joomla, j'ai donc fabriqué un petit module qui permet de lister l'ensemble des articles de votre site Joomla, articles générés dans Joomla content uniquement.. A adaprer si vous utilisez K2. Mon outil ne prend pas en compte les autres systèmes de gestion de contenu comme k2 ou d'autres que j'ignore, je reste fidèle pour des raisons de simplicité à mon Joomla "de base" et son Joomla content. Une fois le module installé, voici comment il fonctionne.
 

Fonctionnement

 Le principe est on ne peut plus simple. J'ai lancé, après avoir défini un set_time_limit à 0 afin de ne pas être embêté par le timeout du serveur (local, je précise), une simple requête Joomla me liste l'ensemble des articles dont l'état est égal à 1, en d'autres termes l'ensemble des articles qui sont publiés. Une fois ma requête écrite et lancée, je récupère tous ces articles dans un objet que je parcours. Lorsque je parcours à cet objets, je définis une URL dans laquelle je passe le numéro de l'article en paramètre, via une concaténation, et cet URL je vais la passer dans une chaîne de caractère représentant la ligne de commande de chrome à lancer. Cette ligne, pour des raisons pratiques, je l'affiche à l'utilisateur. Il peut alors ainsi faire un copier-coller uniquement de l'article qui intéresse à transformer dans un fichier PDF. Toutefois, car l'objet est bien un outil de scriptage, je génère un fichier texte, plus particulièrement un fichier texte avec une extension bat, afin de pouvoir créer un fichier bat à lancer sur ma ligne de commande Windows. Ce fichier, comme par hasard, je le nomme script.bat.
Une fois l'ensemble du fichier BAT écrit sur ma machine, ce fichier est remplacé dans le répertoire du module du module, il ne me reste plus qu'à récupérer ce fichier afin de lancer sur la ligne de commande.
 

CONFIGURATION DU MODULE 

 Lorsque vous aurez installé ce module sur votre machine, vous devrez absolument faire une configuration essentielle afin d'adapter mon outil à votre machine locale.
Nous sommes bien d'accord que cet outil travaille sur un serveur pour générer votre script, mais ce dernier doit absolument être lancé sur votre machine en local qui contient le logiciel de Google Chrome. (j'avais prévenu que c'étatit mamaille and co)  Et la configuration de cet outil consiste, dans la configuration Joomla du module, de spécifier dans les paramètres deux informations :
  • dans un premier temps vous allez spécifier le chemin dans lequel votre Fichier de script généré doit être enregistré,
  • dans un deuxième temps vous spécifierez, et cela est essentiel, le chemin d'accès à votre logiciel chrome.

Je n'ai fait des tests que sous Windows, peut-être faudrait-il faire des recherches pour les autres systèmes d'exploitation en terme de chemin d'accès à Chrome. Une fois ces informations configurées, vous n'aurez plus qu'à créer un module dans un article accessible uniquement aux administrateurs par exemple, et une fois ce module positionné sur votre article, vous devrez simplement lancer l'article sur lequel votre mois de déposé. Vous obtiendrez ainsi un script généré sur votre machine, avec le chemin d'accès Chrome que vous avez spécifié dans la console d' administration de l'outil, mais aussi vous aurez sous vos yeux le script qui a été généré.

Faites toutefois attention si vous avez des dizaines de millions d'articles sur votre Joomla, au time out. Dans le cas où le Time Out est trop court, j'ai préconfiguré 4 du fichier helper.php un time out à 0. Ce n'est pas très propre, mais dans la mesure où mon outil ne travaille que sur un serveur local, je n'ai que faire des considérations purement web.

En conclusion, même si cet outil est particulièrement bancal dans la mesure où il ne fonctionne qu'avec un type de navigateur, que le Time Out c'est pas top, que (il faut bien le dire) rien n'est très très propre, et surtout que je suis très conscient des limites de l'outil, je ne m'attends à aucune remarque de la part de mes chers lecteurs que j'adore. Juste partager une trouvaille.
Comme vous le savez ici j'ai ma mamailler et bidouiller un peu tous les codes afin de tirer les extrêmes de chacun des outils que je regarde, et je reste toutefois à l'écoute de vous aider et vos besoins, même si mon cahier commence à se remplir de prochains projets...

Mon Github

slhuilli1's GitHub repositories