Créer des fichiers OpenOffice (.odt) avec PHP
Posté le Wednesday 17 July 2013 | Catégories : PHP
Si vous souhaitez créer des documents OpenOffice.org (.odt) à partir de votre application PHP, il existe une librairie pour cela.
Vous pouvez télécharger odtphp sur Github. Il faut ensuite créer un document texte OpenOffice et définir les emplacements à l'aide d’accolades {mot_cle} (comme dans l'exemple ci-dessus). Il ne reste plus qu'à créer le document final en PHP:
require "./chemin/vers/odtphp/odf.php";
$odf = new odf("odtphp-exemple1.odt", array('ZIP_PROXY' => 'PhpZipProxy'));
$odf->setVars('titre', 'Mon titre dynamique');
$odf->setVars('texte', "Mon texte,\n\n\nAvec plusieurs lignes...");
// Ajouter une image:
$odf->setImage('image', 'web-d.jpg');
$odf->exportAsAttachedFile("Exemple ODTPHP");
Listes
Il est possible de créer des listes. Il faut pour cela utiliser des "segments". Un segment commence par [!-- BEGIN nom_du_segment --] et se termine par [!-- END segment1 --] (attention, OpenOffice essaiera peut-être de remplacer les deux tirets (--) par une seule ligne, ce qui ne fonctionne pas!). A l'intérieur du segment, on utilise toujours les mêmes accolades.
Dans le code PHP,
- on crée la liste avec la méthode setSegment("nom_du_segment"),
- puis pour chaque élément de la liste on doit effectuer un merge(),
- et finalement on fait un merge du segment.
$odf = new odf("odtphp-exemple2.odt", array('ZIP_PROXY' => 'PhpZipProxy'));
$odf->setVars('titre', 'Titre dynamique');
$segment = $odf->setSegment('segment1');
$segment->setVars("element_titre", "Chapitre 1");
$segment->setVars("element_texte", "Lorem ipsum...");
$segment->merge();
$segment->setVars("element_titre", "Chapitre 2");
$segment->setVars("element_texte", "Lorem ipsum...");
$segment->merge();
$odf->mergeSegment($segment);
$odf->exportAsAttachedFile("Exemple avec liste");
Tableaux
Odtphp peut également créer un tableau de plusieurs lignes. Il y a cependant un truc supplémentaire: pour indiquer à odtphp qu'il s'agit bien d'une ligne de tableau, et pas d'une simple ligne, le segment doit commencer par row.
Le code PHP par contre reste identique:
$odf = new odf("odtphp-exemple3.odt", array('ZIP_PROXY' => 'PhpZipProxy'));
$odf->setVars('titre', 'Titre dynamique');
$segment = $odf->setSegment('segment1');
$segment->element_texte("Lorem ipsum...");
$segment->setVars("element_titre", "Chapitre 1");
$segment->merge();
$segment->setVars("element_titre", "Chapitre 2");
$segment->element_texte("Lorem ipsum...");
$segment->merge();
$odf->mergeSegment($segment);
$odf->exportAsAttachedFile("Exemple avec tableau");