Manipuler un fichier OpenDocument avec PHP  


Avec près de 200 000 téléchargements quotidiens de la suite OpenOffice, le challenge technique se déplace vers les API liées à l'outil. Si pour l'instant Microsoft Office reste largement plus outillé, la résistance s'organise. Dans cet article, nous allons présenter les outils qui permettent de coupler OpenOffice et PHP, c'est-à-dire comment générer facilement des fichiers au format OpenDocument avec PHP.


Introduction

La suite bureautique OpenOffice gagne de plus en plus de terrain sur son célèbre concurrent propriétaire si bien que de nombreuses administrations et entreprises l'adoptent en masse (on compte près de 200 000 téléchargements par jour).

De fait, les besoins en terme d'API liées à OpenOffice augmentent. A ce titre, générer des documents OpenOffice à la volée est un besoin qui se fait de plus en plus sentir.

L'effort des communautés Open Source est arrivé à point : de nombreuses bibliothèques permettant de générer des fichiers au format Open Document se fiabilisent.



Deux approches différentes existent. La première consiste à créer des documents OpenOffice à partir de zéro, la seconde consiste à en générer à partir de modèles.

Dans cet article, nous allons nous intéresser aux solutions PHP basées sur l'utilisation de modèles. Actuellement, ces projets de templating ne sont pas légion : seules quelques bibliothèques sont réellement intéressantes et maintenues à jour.

Le templating avec les documents OpenOffice

Commençons par regarder de plus près ce que sont réellement les documents OpenOffice. Ceux-ci respectent le format ouvert OpenDocument. Ce format est basé sur deux technologies qui ont fait leurs preuves : la compression Zip et le langage XML.

En pratique, un document OpenOffice est donc en réalité une simple archive compressée au format Zip ! Celle-ci contient différents dossiers et fichiers écrits en langage XML (Fig. 1). On y retrouve entre autre les images, les styles, les paramètres du document et bien sûr notre contenu texte. C'est précisément le fichier content.xml qui stocke ce contenu texte.

Les bibliothèques PHP qui manipulent des documents OpenOffice doivent donc extraire ce fichier content.xml de l'archive existante, réaliser les modifications nécessaires puis re-compresser le tout.

 

Le templating est une technique utilisée pour générer des documents formatés selon un modèle prédéfini. Cette technique ne s'applique pas qu'à la génération de documents OpenOffice : elle est également très utilisée pour les sites web dans le but de dissocier la partie visuelle de la partie métier.



Les solutions de templating OpenDocument avec PHP

Le templating appliqué aux documents OpenOffice n'est pas très répandu : seule une poignée de bibliothèques mérite le détour.

 

odtPHP

OdtPHP est un projet en pleine évolution qui a été initié fin 2008 par les français d'Anaska (la filiale formation du groupe AlterWay). Cette bibliothèque ne dépend d'aucun moteur de template externe : les développeurs ont fait le choix d'intégrer tout le nécessaire pour réaliser les fonctions de templating au sein de la bibliothèque. Cela confère à cette bibliothèque une grande légèreté face à TinyDoc. Nous nous intéresserons dans la suite de cet article au fonctionnement d'odtPHP.

Site web : www.odtphp.com



TinyButStrongOOo

TinyButStrongOOo est une bibliothèque basée sur le moteur de template TinyButStrong qui à fait ses preuves depuis plusieurs années. Malheureusement, celle-ci n'a pas évolué depuis plus de 3 ans maintenant : TinyButStrongOOo est aujourd'hui clairement périmée car il est basé sur une vieille version de TBS et donc de PHP. Une nouvelle version nommée tinyDoc a été initiée par l'auteur de TinyButStrongOOo, Olivier Loynet.

Site web : www.tinybutstrong.com/fr/tbsooo.php



PHPOpenDocumentReports

Si vous êtes allergique au moteur de template TinyButStrong il existe un projet alternatif bien moins répandu créé par Eric Letard, mais tout de même très intéressant : PHPOpenDocumentReports. En effet, cette bibliothèque est basée sur le moteur Savant3.

Site web : sourceforge.net/projects/podr/

 

OdtPHP

Nous allons nous intéresser de plus près au projet odtPHP qui est le plus actif et qui offre le plus de fonctionnalités. OdtPHP a été initié par des formateurs d'Anaska (la filiale formation du groupe AlterWay). Depuis, plusieurs contributeurs externes ont apporté leur pierre à l'édifice.

Nous pouvons télécharger ce projet directement sur Sourceforge à l'adresse suivante : http://sourceforge.net/projects/odtphp/.

L'archive contient différents éléments : nous retrouvons bien sûr la bibliothèque qui se compose de 3 classes. Nous avons également une documentation de ces classes générée au format PHPDoc pour celles et ceux qui voudraient mettre la main à la pâte. Enfin, il est possible de tester la bibliothèque a travers quelques exemples d'utilisation concrets.

Fonctionnalités

Du côté des fonctionnalités, odtPHP intègre tout ce qu'il faut pour faire du templating OpenOffice : la bibliothèque gère bien sûr le remplacement de variables simples. Dans notre modèle, les balises sont tout simplement identifiées par des accolades :

{balise}


De la même manière, Il est également possible d'ajouter des images. Dans ce cas, les images sont compressées dans l'archive de manière transparente pour l'utilisateur.

La bibliothèque gère également la fusion de segments. Ils permettent de répéter autant de fois que souhaité une portion du modèle pour générer notre document final. Un segment est en fait délimité grâce à deux balises spécifiques de début et de fin :

[!-- BEGIN nomSegment --][!-- END nomSegment –]


Un tel segment peut contenir du texte, des images, des balises mais également d'autres segments ce qui rend les combinaisons possibles infinies !

Une ligne de tableau peut également tout à fait faire office de segment : cela permet de répéter une ligne de tableau avec le contenu souhaité. Pour ce faire, il suffit simplement de préfixer le nom des balises par « row. » :

[!-- BEGIN row.nomSegment --][!-- END row.nomSegment –]


Concernant l'exportation du fichier, l'utilisateur a le choix des armes : il peut soit l'envoyer directement sur le navigateur, soit le copier dans un dossier du serveur.

Utilisation

Avant d'utiliser odtPHP, la première étape consiste tout simplement à créer un modèle (Fig. 2). Celui-ci sera exploité par la bibliothèque à chaque fois que vous voudrez générer un nouveau document OpenOffice. Vous pouvez créer celui-ci en éditant directement un nouveau document avec la suite OpenOffice. Ensuite, libre à vous d'ajouter du texte, des images et bien sûr des balises et segments sans quoi le modèle n'aurait que peu d'intérêt !


Une fois notre modèle créé, nous allons nous attaquer au code PHP. Nous devons tout d'abord importer la bibliothèque odtPHP. Ensuite, nous devons instancier un nouvel objet ODF avec pour seul paramètre le chemin vers le modèle ODT que nous venons de créer.

Après ces deux étapes, nous pouvons fusionner nos variables, segments et images en appelant les méthodes proposées par la bibliothèque. Ceci fait, il ne nous reste plus qu'à exporter notre fichier final, soit directement vers le navigateur du client, soit vers un fichier sur le serveur.

Voici le code permettant d'alimenter en contenu le modèle que nous avons créé précédemment :

<?php
require_once('../library/odf.php');

$odf = new odf("modele.odt");

$odf->setVars('titre', 'PHP');

$message = "PHP est un langage de scripts libre principalement utilisé pour produire des pages Web dynamiques.";

$odf->setVars('message', $message);

$odf->exportAsAttachedFile();
?>


C'est terminé … enfin presque ! Il nous reste bien sûr à exécuter notre page PHP afin de télécharger le document final. OdtPHP va se charger de remplacer toutes les balises de notre modèle par le contenu des variables que nous avons déclaré en PHP.



Bien sûr, il s'agit là du cas le plus simple d'utilisation de cette bibliothèque. Avec un segment par exemple, nous aurions pu répéter notre titre et notre texte plusieurs fois avec du contenu variable.


Conclusion

Comme nous l'avons vu dans l'exemple, odtPHP se révèle simple et efficace. Contrairement aux autres bibliothèques évoquées, odtPHP n'exploite pas un moteur de template externe mais intègre directement ses propres fonctions pour gérer les opérations de templating. Cela confère à cette bibliothèque une légèreté inégalable par rapport aux autres tout en restant totalement indépendante.

En contrepartie, vous ne retrouverez pas dans cette bibliothèque quelques fonctionnalités non essentielles que propose TinyButStrongOOo par exemple.



Liens utiles

http://sourceforge.net/projects/odtphp/
http://fr.openoffice.org/

Auteur

Vincent BROUTÉ
Étudiant à l'IUT Informatique de Vannes. Passionné des technologies Web et de l'OpenSource. Responsable du site www.depannetonpc.net


Retour à l'accueil des articles