Creazione di una presentazione MS PowerPoint in Java

1. Introduzione

In questo articolo vedremo come creare una presentazione utilizzando Apache POI.

Questa libreria ci dà la possibilità di creare presentazioni PowerPoint, leggere quelle esistenti e modificarne il contenuto.

2. Dipendenze di Maven

Per iniziare, dovremo aggiungere le seguenti dipendenze nel nostro pom.xml :

 org.apache.poi poi 3.17   org.apache.poi poi-ooxml 3.17 

L'ultima versione di entrambe le librerie può essere scaricata da Maven Central.

3. Apache POI

La libreria POI di Apache supporta sia i file .ppt che .pptx e fornisce l'implementazione HSLF per il formato di file Powerpoint '97 (-2007) e XSLF per il formato di file OOXML di PowerPoint 2007.

Poiché non esiste un'interfaccia comune per entrambe le implementazioni, dobbiamo ricordarci di utilizzare le classi XMLSlideShow , XSLFSlide e XSLFTextShape quando lavoriamo con il formato di file .pptx più recente .

E, quando è necessario lavorare con il vecchio formato .ppt , usa le classi HSLFSlideShow , HSLFSlide e HSLFTextParagraph .

Useremo il nuovo formato di file .pptx nei nostri esempi e la prima cosa che dobbiamo fare è creare una nuova presentazione, aggiungervi una diapositiva (magari usando un layout predefinito) e salvarla.

Una volta che queste operazioni sono chiare, possiamo quindi iniziare a lavorare con immagini, testo e tabelle.

3.1. Crea una nuova presentazione

Creiamo prima la nuova presentazione:

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

3.2. Aggiungi una nuova diapositiva

Quando si aggiunge una nuova diapositiva a una presentazione, possiamo anche scegliere di crearla da un layout predefinito. Per ottenere ciò, dobbiamo prima recuperare l' XSLFSlideMaster che contiene i layout (il primo è il master predefinito):

XSLFSlideMaster defaultMaster = ppt.getSlideMasters().get(0);

Ora possiamo recuperare XSLFSlideLayout e usarlo durante la creazione della nuova diapositiva:

XSLFSlideLayout layout = defaultMaster.getLayout(SlideLayout.TITLE_AND_CONTENT); XSLFSlide slide = ppt.createSlide(layout);

Vediamo come riempire i segnaposto all'interno di un template:

XSLFTextShape titleShape = slide.getPlaceholder(0); XSLFTextShape contentShape = slide.getPlaceholder(1);

Ricorda che ogni modello ha i suoi segnaposto, istanze della sottoclasse XSLFAutoShape , che potrebbero differire in numero da un modello all'altro.

Vediamo come possiamo recuperare rapidamente tutti i segnaposto da una diapositiva:

for (XSLFShape shape : slide.getShapes()) { if (shape instanceof XSLFAutoShape) { // this is a template placeholder } }

3.3. Salvataggio di una presentazione

Una volta creata la presentazione, il passaggio successivo è salvarla:

FileOutputStream out = new FileOutputStream("powerpoint.pptx"); ppt.write(out); out.close();

4. Lavorare con gli oggetti

Ora che abbiamo visto come creare una nuova presentazione, aggiungervi una diapositiva (utilizzando o meno un modello predefinito) e salvarla, possiamo iniziare ad aggiungere testo, immagini, collegamenti e tabelle.

Cominciamo con il testo.

4.1. Testo

Quando si lavora con il testo all'interno di una presentazione, come in MS PowerPoint, dobbiamo creare la casella di testo all'interno di una diapositiva, aggiungere un paragrafo e quindi aggiungere il testo al paragrafo:

XSLFTextBox shape = slide.createTextBox(); XSLFTextParagraph p = shape.addNewTextParagraph(); XSLFTextRun r = p.addNewTextRun(); r.setText("Baeldung"); r.setFontColor(Color.green); r.setFontSize(24.);

Quando si configura XSLFTextRun , è possibile personalizzarne lo stile scegliendo la famiglia di caratteri e se il testo deve essere in grassetto, corsivo o sottolineato.

4.2. Collegamenti ipertestuali

Quando si aggiunge del testo a una presentazione, a volte può essere utile aggiungere collegamenti ipertestuali.

Dopo aver creato l' oggetto XSLFTextRun , possiamo ora aggiungere un collegamento:

XSLFHyperlink link = r.createHyperlink(); link.setAddress("//www.baeldung.com");

4.3. immagini

Possiamo anche aggiungere immagini:

byte[] pictureData = IOUtils.toByteArray( new FileInputStream("logo-leaf.png")); XSLFPictureData pd = ppt.addPicture(pictureData, PictureData.PictureType.PNG); XSLFPictureShape picture = slide.createPicture(pd);

Tuttavia, senza una configurazione adeguata, l'immagine verrà posizionata nell'angolo superiore sinistro della diapositiva . Per posizionarlo correttamente, dobbiamo configurare il suo punto di ancoraggio:

picture.setAnchor(new Rectangle(320, 230, 100, 92));

Il XSLFPictureShape accetta un rettangolo come punto di ancoraggio, che ci permette di configurare le coordinate x / y con i primi due parametri, e la larghezza / altezza dell'immagine con gli ultimi due.

4.4. Liste

Il testo, all'interno di una presentazione, è spesso rappresentato sotto forma di un elenco, numerato o meno.

Definiamo ora un elenco di punti elenco:

XSLFTextShape content = slide.getPlaceholder(1); XSLFTextParagraph p1 = content.addNewTextParagraph(); p1.setIndentLevel(0); p1.setBullet(true); r1 = p1.addNewTextRun(); r1.setText("Bullet");

Allo stesso modo, possiamo definire un elenco numerato:

XSLFTextParagraph p2 = content.addNewTextParagraph(); p2.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenRight, 1); p2.setIndentLevel(1); XSLFTextRun r2 = p2.addNewTextRun(); r2.setText("Numbered List Item - 1");

Nel caso in cui lavoriamo con più elenchi, è sempre importante definire indentLevel per ottenere un rientro corretto degli elementi.

4.5. Tabelle

Tables are another key object in a presentation and are helpful when we want to display data.

Let's start by creating a table:

XSLFTable tbl = slide.createTable(); tbl.setAnchor(new Rectangle(50, 50, 450, 300));

Now, we can add a header:

int numColumns = 3; XSLFTableRow headerRow = tbl.addRow(); headerRow.setHeight(50); for (int i = 0; i < numColumns; i++) { XSLFTableCell th = headerRow.addCell(); XSLFTextParagraph p = th.addNewTextParagraph(); p.setTextAlign(TextParagraph.TextAlign.CENTER); XSLFTextRun r = p.addNewTextRun(); r.setText("Header " + (i + 1)); tbl.setColumnWidth(i, 150); }

Once the header is completed, we can add rows and cells to our table to display data:

for (int rownum = 1; rownum < numRows; rownum++) { XSLFTableRow tr = tbl.addRow(); tr.setHeight(50); for (int i = 0; i < numColumns; i++) { XSLFTableCell cell = tr.addCell(); XSLFTextParagraph p = cell.addNewTextParagraph(); XSLFTextRun r = p.addNewTextRun(); r.setText("Cell " + (i*rownum + 1)); } }

When working with tables, it's important to remind that it's possible to customize the border and the background of every single cell.

5. Altering a Presentation

Not always when working on a slideshow, we have to create a new one, but we have to alter an already existing one.

Let's give a look to the one that we created in the previous section and then we can start altering it:

5.1. Reading a Presentation

Reading a presentation is pretty simple and can be done using the XMLSlideShow overloaded constructor that accepts a FileInputStream:

XMLSlideShow ppt = new XMLSlideShow( new FileInputStream("slideshow.pptx"));

5.2. Modifica dell'ordine delle diapositive

Quando si aggiungono diapositive alla nostra presentazione, è una buona idea metterle nell'ordine corretto per avere un flusso corretto di diapositive.

Quando ciò non accade, è possibile riorganizzare l'ordine delle diapositive. Vediamo come possiamo spostare la quarta diapositiva in modo che sia la seconda:

List slides = ppt.getSlides(); XSLFSlide slide = slides.get(3); ppt.setSlideOrder(slide, 1);

5.3. Eliminazione di una diapositiva

È anche possibile eliminare una diapositiva da una presentazione.

Vediamo come possiamo eliminare la 4a diapositiva:

ppt.removeSlide(3);

6. Conclusione

Questo breve tutorial ha illustrato come utilizzare l' API POI di Apache per leggere e scrivere file PowerPoint da una prospettiva Java.

Il codice sorgente completo di questo articolo può essere trovato, come sempre, su GitHub.