Apache POI PPT - PowerPoint en Java

Ça arrive souvent qu'une application a besoin de générer des rapports avec le format Microsoft Office ppt ou pptx, comme elle a besoin de modifier et lire des fichiers Power Point. Un programmeur Java qui veut produire des fichiers MS Office doit utiliser une libraire Java et parmi eux on trouve celle de Apache connue pour son efficacité.

Apache POI est une API qui permet de créer, modifier et d'afficher des fichiers MS Office. Cette libraire open source est développée et distribuée par Apache Software Foundation.

Ce tutoriel est destine à ceux qui ont besoin de lire, créer et modifier les fichier Power Point en utilisant Java. Il explique les fonctionnalités essentielles de la librairie Apache POI et ses caractéristiques de base pour pouvoir effectuer des opérations sur les fichiers Power Point.

Téléchargement et Installation de Apache POI PPT

Téléchargez la dernière version de Apache POI à partir de du site officiel (Télécharger Apache POI PPT) et décompressez le contenu vers le dossier de votre projet pour pouvoir ensuite lier les librairies requises à l'application. Nous allons avoir besoin des fichiers .jar suivants:
  • poi.jar
  • poi-oxml.jar
  • poi-oxml-schema.jar
  • log4j.jar
  • xmlbeans.jar

Classes et méthodes

Apache POI contient des classes et des méthodes pour travailler avec les fichiers excel, word et power point. Nous avons déjà expliqué ces classes pour excel et word dans des articles précédents. On va vous montrer les classes relatifs à Power Point:
  • XMLSlideShow: pour créer et gérer une présentation, vous avez cette classe XMLSlideShow dans le package org.apache.poi.xslf.usermoder.
  • XSLFSlide: crée et gère un slide dans une présentation.
  • XSLFSlideMaster: pour une présentation qui contient différents layouts de slide. La classe XSLFSlideMaster donne accès à ces layouts.
  • XSLFSlideLayout: permet de gérer les layouts d'un slide.
  • XSLFTextParagraph: vous pouvez écrire du texte dans le slide en utilisant la classe XSLFTextParagraph.
  • XSLFTextRun: cette classe gère le formatage du texte (hyperliens, couleurs, polices, etc).
  • XSLFTextShape: cette classe gère les formes qui contient du texte.
  • XSLFHyperlink: permet de créer des hyperliens dans une présentation.

Créer une présentation Power Point vide

Maintenant, voyons comment créer une présentation en utilisant Java. Pour créer une présentation vide vous devez instancier la classe XMLSlideShow:

XMLSlideShow ppt = new XMLSlideShow();
Enregistrez les modification dans un document PPT en utilisant la classe FileOutputStream:

File file=new File("C://POIPPT//Examples//example1.pptx");
FileOutputStream out = new FileOutputStream(file);
ppt.write(out);
Le code ci-dessous est le programme complet pour créer un document PowerPoint vide:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;

public class PowerPoint {

public static void main(String args[]) throws IOException{

//créer un nouveau Slide Show vide
XMLSlideShow ppt = new XMLSlideShow();

//créer un objet FileOutputStream pour enregistrer le document PPT
File file =new File("exemple.pptx");
FileOutputStream fis = new FileOutputStream(file);

//sauvegarder le fichier
ppt.write(fis);
System.out.println("fichier créé avec succès");
fis.close();
}
}
La compilation et l'exécution de ce code crée un fichier exemple.pptx vide dans le répertoire de notre projet qui apparaît comme ça:

Modifier ou éditer un fichier PowerPoint existant

Pour ouvrir une présentation existante, instanciez la classe XMLSlideShow et passez l'objet FileInputStream du fichier que vous vouliez modifier comme un argument dans le constructeur de XMLSlideShow.

File file=new File(“C://POIPPT//Examples//example1.pptx”);
FileInputstream inputstream =new FileInputStream(file);
XMLSlideShow ppt = new XMLSlideShow(inputstream);
Vous pouvez ajouter les slides à une présentation en utilisant la méthode createSlide() de la classe XMLSlideShow.

XSLFSlide slide1= ppt.createSlide();
Le programme suivant ouvre et ajoute des slides au fichier déjà créé exemple.pptx:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;

public class EditPresentation {

public static void main(String ar[]) throws IOException{

//ouvrir un fichier powerpoint existant
File fichier = new File("exemple.pptx");
FileInputStream inputstream=new FileInputStream(fichier);
XMLSlideShow ppt = new XMLSlideShow(inputstream);

//ajouter des slides à la présentation
XSLFSlide slide1 = ppt.createSlide();
XSLFSlide slide2 = ppt.createSlide();
XSLFSlide slide3 = ppt.createSlide();

//enregistrer les modifications
FileOutputStream fis = new FileOutputStream(fichier);
ppt.write(fis);

System.out.println("Modifications faites avec succès");
fis.close();
}
}
Le programme génère le résultat suivant:

Modifications faites avec succès
Le document modifié avec trois nouveaux slides:


Après l'ajout de nouvelles diapositives vous pouvez lire, écrire et effectuer des opérations sur ces diapositives.

Les layouts disponibles

Les présentations PowerPoint ont des layouts pour chaque diapositive que vous pouvez choisir. Premièrement, trouvons la liste de tous les layouts disponibles. 
Il y a différents slides dites master et dans chaque slide master, il existe plusieurs slides layouts.
- Vous pouvez obtenir la liste des diapositives en utilisant la méthode getSlideMasters() de la classe XMLSlideShow.
- Vous pouvez obtenir la liste des diapositives layouts à partir de chaque slide master en appelant la méthode getSlideLayouts() de la classe XSLFSlideMaster.
- Vous pouvez obtenir le nom d'un layout à partir de l'objet layout en utilisant la méthode getType() de la classe XSLFSlideLayout.

Le programme ci-dessous affiche tous les layout disponibles dans un PPT:

import java.io.IOException;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlideLayout;
import org.apache.poi.xslf.usermodel.XSLFSlideMaster;

public class SlideLayouts {

public static void main(String args[]) throws IOException{

XMLSlideShow ppt = new XMLSlideShow();
System.out.println("Les layouts disponibles");

//obtenir la liste de tous les slides masters
for(XSLFSlideMaster master : ppt.getSlideMasters()){

//obtenir la liste de tous les slides layout dans chaque slide master
for(XSLFSlideLayout layout : master.getSlideLayouts()){

//obteni le nom de layout
System.out.println(layout.getType());
}
}
}
}
Sortie:

Les layouts disponibles
BLANK
TITLE_ONLY
SECTION_HEADER
PIC_TX
TITLE_AND_CONTENT
TITLE
VERT_TX
VERT_TITLE_AND_TX
TWO_TX_TWO_OBJ
TWO_OBJ
OBJ_TX
La figure ci-dessous montre quelques layouts disponibles dans MS Office 2007:


Créer un diapositive qui utilise Title layout

Créons un diapositive (slide) qui utilise le layout Title:

1- Créer une présentation vide en instanciant la classe XMLSlideShow:

XMLSlideShow ppt = new XMLSlideShow();
2- Obtenir la liste des slides masters en utilisant la méthode getSlideMasters(). puis sélectionner le slide master désiré avec son index:

XSLFSlideMaster slideMaster = ppt.getSlideMasters().get(0);
Ici on obtient le slide master par défaut qui est dans la position 0 du tableau.

3- Choisir le layout en utilisant la méthode getLayout() de la classe XSLFSlideMaster. Cette méthode accepte un paramètre qui est une variable statique qui représente le layout désiré. Il existe plusieurs variables dans cette classe et chacune représente un slide layout.

Le code suivant montre comment créer un title layout:

XSLFSlideLayout titleLayout = slideMaster.getLayout(SlideLayout.TITLE);
4- Créer un nouveau diapositive en passant l'objet layout de diapositive comme paramètre.

XSLFSlide slide = ppt.createSlide(titleLayout);

5- Séléctionner un placeholder en utilisant la méthode getPlaceholder() de la classe XSLFSlide. Cette méthode accepte un paramètre integer. En passant la valeur 0, on obtient l'objet XSLFTextSlide utilisé pour pouvoir accéder à la zone du texte du titre dans le diapositive. Modifier le titre avec la méthode setText():

XSLFTextShape titre = slide.getPlaceholder(0);
titre.setText("CodeurJava");

Voici le programme complet:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.xslf.usermodel.SlideLayout;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFSlideLayout;
import org.apache.poi.xslf.usermodel.XSLFSlideMaster;
import org.apache.poi.xslf.usermodel.XSLFTextShape;

public class TitleLayout {

public static void main(String args[]) throws IOException{

XMLSlideShow ppt = new XMLSlideShow();

//récupérer l'objet slidemaster
XSLFSlideMaster slideMaster = ppt.getSlideMasters().get(0);

//obtenir le slidelayout voulu
XSLFSlideLayout titleLayout = slideMaster.getLayout(SlideLayout.TITLE);

//créer un slide avec le slidelayout séléctionné
XSLFSlide slide = ppt.createSlide(titleLayout);

//modifier le placeholder 0 qui est le titre
XSLFTextShape titre = slide.getPlaceholder(0);

//éditer le titre
titre.setText("CodeurJava");

//créer le nouveau fichier pptx
File file=new File("Exemple.pptx");
FileOutputStream fos = new FileOutputStream(file);

//sauvegarder les modifications
ppt.write(fos);
System.out.println("diapositive créé avec succès");
fos.close();
}
}
Sortie:

diapositive créé avec succès

Modifier le titre et le contenu de layout

Créons un diapositive en utilisant le titre et layout en suivant les étapes suivante:

1- Créer une présentation vide en instanciant la classe XMLSlideShow.
2- Obtenir la liste de tous les slidemasters avec la méthode getSlideMasters()
3- Obtenir le layout désiré en utilisant la méthode getLayout() de la classe XSLFSlideMaster:
4- Créer un nouveau diapositive en pasant l'objet layout comme paramètre:

XSLFSlide slide = ppt.createSlide(SlideLayout.TITLE_AND_CONTENT);
5- Séléctionner un placeholder avec la méthode getPlaceholder():

XSLFTextShape titre = slide.getPlaceholder(1);
title1.setText("Introduction");
6 - Effacer le texte du slide en appelant la méthode clearText() de la classe XSLFTextShape.

body.clearText();
7- Ajouter un nouveau paragraphe en utilisant la méthode addNewTextParagraph().Maintenant vous pouvez ajouter du texte avec la méthode addNewTextRun() puis la méthode setText().

body.addNewTextParagraph().addNewTextRun().setText("this is my first slide body");
Voici le code complet:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xslf.usermodel.SlideLayout;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFSlideLayout;
import org.apache.poi.xslf.usermodel.XSLFSlideMaster;
import org.apache.poi.xslf.usermodel.XSLFTextShape;

public class TitleAndBodyLayout {

public static void main(String args[]) throws IOException{

XMLSlideShow ppt = new XMLSlideShow();

//récupérer l'objet slidemaster
XSLFSlideMaster slideMaster = ppt.getSlideMasters().get(0);

//obtenir le slidelayout voulu
XSLFSlideLayout titleLayout = slideMaster.getLayout(SlideLayout.TITLE);

//créer un slide avec le slidelayout séléctionné
XSLFSlide slide = ppt.createSlide(titleLayout);

//modifier le placeholder 0 qui est le titre
XSLFTextShape titre = slide.getPlaceholder(0);

//éditer le titre
titre.setText("Introduction");

//séléctionner le placeholder 1 qui est le texte
XSLFTextShape body = slide.getPlaceholder(1);

//effacer le l'ancien contenu
body.clearText();

//ajouter un paragraphe
body.addNewTextParagraph().addNewTextRun().setText("Mon premier diapositive");

//créer le nouveau fichier pptx
File file=new File("Exemple.pptx");
FileOutputStream fos = new FileOutputStream(file);

//sauvegarder les modifications
ppt.write(fos);
System.out.println("diapositive créé avec succès");
fos.close();
}
}
Sortie:

diapositive créé avec succès

Obtenir et modifier la taille d'un slide

La taille d'un diapositive est obtenue avec la méthode getPageSize() de la classe XMLSlideShow.

java.awt.Dimension pgsize = ppt.getPageSize();
Pour changer la taille du slide en java, utilisez la méthode setPageSize() de la classe XMLSlideShow.

ppt.setPageSize(new java.awt.Dimension(1024, 768));
Voici le programme complet:

import java.awt.Dimension;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xslf.usermodel.XMLSlideShow;

public class ChangingSlide {

public static void main(String args[]) throws IOException{

File file = new File("Exemple.pptx");
XMLSlideShow ppt = new XMLSlideShow();

//obtenir la dimension courante
Dimension pptsize = ppt.getPageSize();

System.out.println("La dimension du diapositive courante:");
System.out.println("largeur :" + pptsize.width);
System.out.println("hauteur :" + pptsize.height);

//modifier la dimension
ppt.setPageSize(new java.awt.Dimension(1024,400));

FileOutputStream out = new FileOutputStream(file);
ppt.write(out);
System.out.println("la dimension du diapositive a été changée");
out.close();
}
}
Sortie:

La dimension du diapositive courante:
largeur :720
hauteur :540
la dimension du diapositive a été changée
Le diapo apparaît comme ça après le changement de la taille:

Changer l'ordre des diapositives

Vous pouvez changer l'ordre avec la méthode setSlideOrder(). Récupérez l'ensemble des slides avec la méthode getSlides() puis sélectionnez à partir du tableau des slides, et changez l'ordre en utilisant la méthode setSlideOrder():

//sélectionner le troisième diapo
XSLFSlide slide = slides.get(2);

//mettez le en premier
ppt.setSlideOrder(slide, 1);
Le code suivant illustre un exemple:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;

public class ReorderSlide {

public static void main(String args[]) throws IOException{

File fichier=new File("exemple.pptx");
XMLSlideShow ppt = new XMLSlideShow(new FileInputStream(fichier));

//récupérer la liste des slides
java.util.List slides = ppt.getSlides();

//séléctionner le 3ème slide
XSLFSlide selectesdslide = slides.get(2);

//metter le en première position
ppt.setSlideOrder(selectesdslide, 0);

FileOutputStream fos = new FileOutputStream(fichier);
ppt.write(fos);
fos.close();
}
}
L'affichage avant et après la permutation entre le diapo 1 et 3:

Avant
Après

Supprimer des slides

Vous pouvez supprimer des diapos en appelant la méthode removeSlide(). Cette méthode accepte un integer qui représente la position du diapo à supprimer.

 
File file=new File("fichier1.pptx");
XMLSlideShow ppt = new XMLSlideShow(new FileInputStream(file));

//supprimer le diapo à la position 0
ppt.removeSlide(0);
.
.
.
Si on applique cette opération de suppression sur l'exemple ci-dessus qui contient trois diapos (1, 2 et 3), on obtient ceci en sortie:

Ajouter une image

Vous pouvez ajouter des images à une présentation en utilisant la méthode createPicture() de la classe XSLFSlide. La méthode createPicture() accepte une image de format tableau d'octets ou bytes.

Il faut lire le fichier de l'image qui va être ajoutée et le convertie en un tableau d'octets en utilisant la méthode IOUtils.toByteArray().

//lire l'image
File image=new File("C://logo.jpg");

//convertir l'image en un tableau d'octets
byte[] bimage = IOUtils.toByteArray(new FileInputStream(image));
Maintenant on doit ajouter l'image créé dans la présentation en utilisant la méthode addPicture(). cette méthode accepte la variable byte qu'on a obtenu à partir de la conversion de l'image.

PictureData picdata = ppt.addPicture(picture, PictureData.PictureType.PNG);
Finalement, intégrez l'image dans le diapo avec la méthode createPicture():

XSLFPictureShape pic = slide.createPicture(picdata);
Le programme suivant implémente ces étapes citées d'ajout d'une image:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFPictureData;
import org.apache.poi.xslf.usermodel.XSLFPictureShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;

public class AddImage {

public static void main(String args[]) throws IOException{

XMLSlideShow ppt = new XMLSlideShow();
XSLFSlide slide = ppt.createSlide();

//lire une image
File image=new File("logo.png");

//convertir l'image en bytes
byte[] picture = IOUtils.toByteArray(new FileInputStream(image));

//ajouter l'image à la présentation
PictureData picdata = ppt.addPicture(picture, PictureData.PictureType.PNG);

//créer un slide pour cette image ajoutée
XSLFPictureShape pic = slide.createPicture(picdata);

File file=new File("diapoimage.pptx");
FileOutputStream fos = new FileOutputStream(file);

ppt.write(fos);
System.out.println("image ajoutée!");
fos.close();
}
}
Le fichier apparait de cette façon après sa création:

Formatage du texte

Le texte dans une présentation peut etre formaté en utilisant les méthodes de la classe XSLFTextRun. Pour le faire, il faut créer un objet XSLFTextRun comme montré ci-dessous:

//création d'un slide avec un titre et un contenu
XSLFSlide slide = ppt.createSlide(slidelayout);

//sélectionner le placeholder 1
XSLFTextShape body = slide.getPlaceholder(1);

//ajout d'un paragraphe
XSLFTextParagraph paragraph=body.addNewTextParagraph();

//création d'un objet TextRun
XSLFTextRun run = paragraph.addNewTextRun();
Vous pouvez changer la taille de police de texte dans la présentation en utilisant setFontSize():

run.setFontColor(java.awt.Color.blue);
run.setFontSize(26);
Le morceau de code suivant montre comment appliquer les différents styles: bold, italic, underline à un texte dans un power point.

//changer le texte en Bold
run.setBold(true);

//changer le texte en Italic
run.setItalic(true)

//Trace une ligne au milieu du texte
run.setStrikethrough(true);

//souligner le texte
run.setUnderline(true);
Pour avoir de l'espace entre les paragraphes, ajoutez addLineBreak() de la classe XSLFTextParagraph:

paragraph.addLineBreak();
Le programme suivant rassemble toutes les méthodes citées:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.xslf.usermodel.SlideLayout;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFSlideLayout;
import org.apache.poi.xslf.usermodel.XSLFSlideMaster;
import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
import org.apache.poi.xslf.usermodel.XSLFTextRun;
import org.apache.poi.xslf.usermodel.XSLFTextShape;

public class FormatageTexte {

public static void main(String args[]) throws IOException{

//créer une présentation vide
XMLSlideShow ppt = new XMLSlideShow();

//récuperer l'objet slidemaster
XSLFSlideMaster slideMaster = ppt.getSlideMasters()[0];

//séléctionner le layout à partir de la liste fournie
XSLFSlideLayout slidelayout = slideMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);

//créer un diapo avec un titre et un contenu
XSLFSlide slide = ppt.createSlide(slidelayout);

//séléctionner le titre
XSLFTextShape body = slide.getPlaceholder(1);

//supprimer le texte éxistant dans le diapo
body.clearText();

//ajouter un nouveau paragraphe
XSLFTextParagraph paragraph=body.addNewTextParagraph();

//ligne 1

XSLFTextRun run1 = paragraph.addNewTextRun();
run1.setText("Ligne colorrée");

//modifier la couleur du texte
run1.setFontColor(java.awt.Color.red);

//modifier la taille de police
run1.setFontSize(24);

//passer à la ligne suivante
paragraph.addLineBreak();

//ligne 2

XSLFTextRun run2 = paragraph.addNewTextRun();
run2.setText("Ligne en GRAS");
run2.setFontColor(java.awt.Color.CYAN);

//rendre le texte en bold
run2.setBold(true);
paragraph.addLineBreak();

//ligne 3

XSLFTextRun run3 = paragraph.addNewTextRun();
run3.setText(" Ligne barrée");
run3.setFontSize(12);

//rendre le texte Italic
run3.setItalic(true);

//texte barré
run3.setStrikethrough(true);
paragraph.addLineBreak();

//ligne 4

XSLFTextRun run4 = paragraph.addNewTextRun();
run4.setText(" Ligne soulignée");
run4.setUnderline(true);

//souligner le texte
paragraph.addLineBreak();

//créer un objet file
File file=new File("TextFormat.pptx");
FileOutputStream out = new FileOutputStream(file);

//enregistrer les modifications
ppt.write(out);
out.close();
}
}
Exécution: