Open In App

How to Create a MS PowerPoint Presentation in Java with a Maven Project?

Last Updated : 11 Apr, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

In the software industry, presentations play a major role as information can be conveyed easily in a presentable way via presentations. Using Java, with the help of Apache POI, we can create elegant presentations. Let us see in this article how to do that.

Necessary dependencies for using Apache POI:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>

Apache POI

It has support for both .ppt and .pptx files. i.e. via 

  • HSLF implementation is used for the Powerpoint 97(-2007) file format 
  • XSLF implementation for the PowerPoint 2007 OOXML file format.

There is no common interface available for both implementations. Hence for 

  • .pptx formats, XMLSlideShow, XSLFSlide, and XSLFTextShape classes need to be used.
  • .ppt formats, HSLFSlideShow, HSLFSlide, and HSLFTextParagraph classes need to be used.

Let us see the example of creating with .pptx format

Creation of a new presentation:

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

Next is adding a slide

XSLFSlideMaster defaultSlideMaster = samplePPT .getSlideMasters().get(0);

Now, we can retrieve the XSLFSlideLayout and it has to be used while creating the new slide

XSLFSlideLayout xslFSlideLayout 
  = defaultMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);
XSLFSlide slide = samplePPT.createSlide(xslFSlideLayout 
);

Let us cover the whole concept by going through a sample maven project.

Example Maven Project

Project Structure:

Project Structure

 

As this is the maven project, let us see the necessary dependencies via pom.xml

pom.xml

XML




<?xml version="1.0" encoding="UTF-8"?>
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                        http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>powerpointpresentation-apache-poi</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>powerpointpresentation-apache-poi</name>
 
    <parent>
        <groupId>com.gfg</groupId>
        <artifactId>parent-modules</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
 
    <dependencies>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>${poi.version}</version>
        </dependency>
    </dependencies>
 
    <properties>
        <poi.version>5.2.0</poi.version>
    </properties>
 
</project>


PowerPointHelper.java

In this file below operations are seen

  • A new presentation is created
  • New slides are added
  • save the presentation as
FileOutputStream outputStream = new FileOutputStream(fileLocation);
samplePPT.write(outputStream);
outputStream.close();

We can write Text, create hyperlinks, and add images. And also the creation of a list, and table are all possible. In general, we can create a full-fledged presentation easily as well can alter the presentation by adjusting the slides, deleting the slides, etc. Below code is self-explanatory and also added comments to get an understanding of it also.

Java




import org.apache.poi.sl.usermodel.AutoNumberingScheme;
import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.sl.usermodel.TableCell;
import org.apache.poi.sl.usermodel.TextParagraph;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xslf.usermodel.SlideLayout;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFAutoShape;
import org.apache.poi.xslf.usermodel.XSLFHyperlink;
import org.apache.poi.xslf.usermodel.XSLFPictureData;
import org.apache.poi.xslf.usermodel.XSLFPictureShape;
import org.apache.poi.xslf.usermodel.XSLFShape;
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.XSLFTable;
import org.apache.poi.xslf.usermodel.XSLFTableCell;
import org.apache.poi.xslf.usermodel.XSLFTableRow;
import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
import org.apache.poi.xslf.usermodel.XSLFTextRun;
import org.apache.poi.xslf.usermodel.XSLFTextShape;
 
import java.awt.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
// Helper class for the
// PowerPoint presentation creation
public class PowerPointHelper {
 
    /**
     * Read an existing presentation
     *
     * @param fileLocation
     *            File location of the presentation
     * @return instance of {@link XMLSlideShow}
     * @throws IOException
     */
    public XMLSlideShow readWithExistingSlideShow(String fileLocation) throws IOException {
        return new XMLSlideShow(new FileInputStream(fileLocation));
    }
 
    /**
     * Create a sample presentation
     *
     * @param fileLocation
     *            File location of the presentation
     * @throws IOException
     */
    public void creatingAPresentation(String fileLocation) throws IOException {
        // Create presentation
        XMLSlideShow samplePPT = new XMLSlideShow();
 
        XSLFSlideMaster defaultSlideMaster = samplePPT.getSlideMasters().get(0);
 
        // Retrieving the slide layout
        XSLFSlideLayout defaultLayout = defaultSlideMaster.getLayout(SlideLayout.TITLE_ONLY);
 
        // Creating the 1st slide
        XSLFSlide sampleSlide1 = samplePPT.createSlide(defaultLayout);
        XSLFTextShape sampleTitle = sampleSlide1.getPlaceholder(0);
         
          // Clearing text to remove the
          // predefined one in the template
        sampleTitle.clearText();
        XSLFTextParagraph paragraph = sampleTitle.addNewTextParagraph();
 
        XSLFTextRun r1 = paragraph.addNewTextRun();
        r1.setText("GeeksforGeeks");
        r1.setFontColor(new Color(78, 147, 89));
        r1.setFontSize(48.);
 
        // Add Image
        ClassLoader classLoader = getClass().getClassLoader();
        byte[] imageData = IOUtils.toByteArray(new FileInputStream(classLoader.getResource("gfglogo.png").getFile()));
 
        XSLFPictureData pictureData = samplePPT.addPicture(imageData, PictureData.PictureType.PNG);
        XSLFPictureShape picture = sampleSlide1.createPicture(pictureData);
        picture.setAnchor(new Rectangle(320, 230, 100, 92));
 
        // Creating 2nd slide
        defaultLayout = defaultSlideMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);
        XSLFSlide sampleSlide2 = samplePPT.createSlide(defaultLayout);
 
        // setting the tile
        sampleTitle = sampleSlide2.getPlaceholder(0);
        sampleTitle.clearText();
        XSLFTextRun r = sampleTitle.addNewTextParagraph().addNewTextRun();
        r.setText("GeeksforGeeks");
 
        // Adding the link
        XSLFHyperlink hyperLink = r.createHyperlink();
        hyperLink.setAddress("https://www.geeksforgeeks.org/");
 
        // setting the content
        XSLFTextShape content = sampleSlide2.getPlaceholder(1);
        content.clearText(); // unset any existing text
        content.addNewTextParagraph().addNewTextRun().setText("First paragraph");
        content.addNewTextParagraph().addNewTextRun().setText("Second paragraph");
        content.addNewTextParagraph().addNewTextRun().setText("Third paragraph");
 
        // Creating 3rd slide - List
        defaultLayout = defaultSlideMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);
        XSLFSlide sampleSlide3 = samplePPT.createSlide(defaultLayout);
        sampleTitle = sampleSlide3.getPlaceholder(0);
        sampleTitle.clearText();
        r = sampleTitle.addNewTextParagraph().addNewTextRun();
        r.setText("List creations");
 
        content = sampleSlide3.getPlaceholder(1);
        content.clearText();
        XSLFTextParagraph paragraph1 = content.addNewTextParagraph();
        paragraph1.setIndentLevel(0);
        paragraph1.setBullet(true);
        r1 = paragraph1.addNewTextRun();
        r1.setText("Bullet creations");
 
        // the next three paragraphs form an auto-numbered list
        XSLFTextParagraph paragraph2 = content.addNewTextParagraph();
        paragraph2.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenRight, 1);
        paragraph2.setIndentLevel(1);
        XSLFTextRun r2 = paragraph2.addNewTextRun();
        r2.setText("Numbered List Item - 1");
 
        // Creating 4th slide
        XSLFSlide sampleSlide4 = samplePPT.createSlide();
        creationOfTable(sampleSlide4);
 
        // Save presentation
        FileOutputStream outputStream = new FileOutputStream(fileLocation);
        samplePPT.write(outputStream);
        outputStream.close();
 
        // Closing presentation
        samplePPT.close();
    }
 
    /**
     * Delete a slide from the presentation
     *
     * @param pptFile
     *            The presentation
     * @param slideNumber
     *            The number of the slide to be deleted (0-based)
     */
    public void deleteSlide(XMLSlideShow pptFile, int slideNumber) {
        pptFile.removeSlide(slideNumber);
    }
 
    /**
     * Re-order the slides inside a presentation
     *
     * @param pptFile
     *            The presentation
     * @param slideNumber
     *            The number of the slide to move
     * @param newSlideNumber
     *            The new position of the slide (0-base)
     */
    public void reorderSlide(XMLSlideShow pptFile, int slideNumber, int newSlideNumber) {
        List<XSLFSlide> slideList = pptFile.getSlides();
 
        XSLFSlide secondSlide = slideList.get(slideNumber);
        pptFile.setSlideOrder(secondSlide, newSlideNumber);
    }
 
    /**
     * Retrieve the placeholder inside a slide
     *
     * @param slide
     *          The slide
     * @return List of placeholder inside a slide
     */
    public List<XSLFShape> retrieveTemplatePlaceholders(XSLFSlide slide) {
        List<XSLFShape> placeholders = new ArrayList<>();
 
        for (XSLFShape shape : slide.getShapes()) {
            if (shape instanceof XSLFAutoShape) {
                placeholders.add(shape);
            }
        }
        return placeholders;
    }
 
    /**
     * Create a table
     *
     * @param slide
     *            Slide
     */
    private void creationOfTable(XSLFSlide slide) {
 
        XSLFTable table = slide.createTable();
        table.setAnchor(new Rectangle(50, 50, 450, 300));
 
        int numColumns = 3;
        int numRows = 5;
 
        // header
        XSLFTableRow headerRow = table.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("HeaderPart " + (i + 1));
            r.setBold(true);
            r.setFontColor(Color.white);
            th.setFillColor(new Color(79, 129, 189));
            th.setBorderWidth(TableCell.BorderEdge.bottom, 2.0);
            th.setBorderColor(TableCell.BorderEdge.bottom, Color.white);
            // all columns are equally sized
            table.setColumnWidth(i, 150);
        }
 
        // data
        for (int rownum = 0; rownum < numRows; rownum++) {
            XSLFTableRow tr = table.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("Data " + (i * rownum + 1));
                if (rownum % 2 == 0) {
                    cell.setFillColor(new Color(208, 216, 232));
                } else {
                    cell.setFillColor(new Color(233, 247, 244));
                }
            }
        }
    }
}


We can able to get the presentation got created according to the code written and its contents are shown in the image below

 

We can test the same by means of the below test file as well

PowerPointIntegrationTest.java

Java




import org.apache.poi.sl.usermodel.AutoNumberingScheme;
import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.sl.usermodel.TableCell;
import org.apache.poi.sl.usermodel.TextParagraph;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xslf.usermodel.SlideLayout;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFAutoShape;
import org.apache.poi.xslf.usermodel.XSLFHyperlink;
import org.apache.poi.xslf.usermodel.XSLFPictureData;
import org.apache.poi.xslf.usermodel.XSLFPictureShape;
import org.apache.poi.xslf.usermodel.XSLFShape;
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.XSLFTable;
import org.apache.poi.xslf.usermodel.XSLFTableCell;
import org.apache.poi.xslf.usermodel.XSLFTableRow;
import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
import org.apache.poi.xslf.usermodel.XSLFTextRun;
import org.apache.poi.xslf.usermodel.XSLFTextShape;
 
import java.awt.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
// Helper class for the
// PowerPoint presentation creation
public class PowerPointHelper {
 
    /**
     * Read an existing presentation
     *
     * @param fileLocation
     *            File location of the presentation
     * @return instance of {@link XMLSlideShow}
     * @throws IOException
     */
    public XMLSlideShow readWithExistingSlideShow(String fileLocation) throws IOException {
        return new XMLSlideShow(new FileInputStream(fileLocation));
    }
 
    /**
     * Create a sample presentation
     *
     * @param fileLocation
     *            File location of the presentation
     * @throws IOException
     */
    public void creatingAPresentation(String fileLocation) throws IOException {
        // Create presentation
        XMLSlideShow samplePPT = new XMLSlideShow();
 
        XSLFSlideMaster defaultSlideMaster = samplePPT.getSlideMasters().get(0);
 
        // Retrieving the slide layout
        XSLFSlideLayout defaultLayout = defaultSlideMaster.getLayout(SlideLayout.TITLE_ONLY);
 
        // Creating the 1st slide
        XSLFSlide sampleSlide1 = samplePPT.createSlide(defaultLayout);
        XSLFTextShape sampleTitle = sampleSlide1.getPlaceholder(0);
         
          // Clearing text to remove the
          // predefined one in the template
        sampleTitle.clearText();
        XSLFTextParagraph paragraph = sampleTitle.addNewTextParagraph();
 
        XSLFTextRun r1 = paragraph.addNewTextRun();
        r1.setText("GeeksforGeeks");
        r1.setFontColor(new Color(78, 147, 89));
        r1.setFontSize(48.);
 
        // Add Image
        ClassLoader classLoader = getClass().getClassLoader();
        byte[] imageData = IOUtils.toByteArray(new FileInputStream(classLoader.getResource("gfglogo.png").getFile()));
 
        XSLFPictureData pictureData = samplePPT.addPicture(imageData, PictureData.PictureType.PNG);
        XSLFPictureShape picture = sampleSlide1.createPicture(pictureData);
        picture.setAnchor(new Rectangle(320, 230, 100, 92));
 
        // Creating 2nd slide
        defaultLayout = defaultSlideMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);
        XSLFSlide sampleSlide2 = samplePPT.createSlide(defaultLayout);
 
        // setting the tile
        sampleTitle = sampleSlide2.getPlaceholder(0);
        sampleTitle.clearText();
        XSLFTextRun r = sampleTitle.addNewTextParagraph().addNewTextRun();
        r.setText("GeeksforGeeks");
 
        // Adding the link
        XSLFHyperlink hyperLink = r.createHyperlink();
        hyperLink.setAddress("https://www.geeksforgeeks.org/");
 
        // setting the content
        XSLFTextShape content = sampleSlide2.getPlaceholder(1);
        content.clearText(); // unset any existing text
        content.addNewTextParagraph().addNewTextRun().setText("First paragraph");
        content.addNewTextParagraph().addNewTextRun().setText("Second paragraph");
        content.addNewTextParagraph().addNewTextRun().setText("Third paragraph");
 
        // Creating 3rd slide - List
        defaultLayout = defaultSlideMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);
        XSLFSlide sampleSlide3 = samplePPT.createSlide(defaultLayout);
        sampleTitle = sampleSlide3.getPlaceholder(0);
        sampleTitle.clearText();
        r = sampleTitle.addNewTextParagraph().addNewTextRun();
        r.setText("List creations");
 
        content = sampleSlide3.getPlaceholder(1);
        content.clearText();
        XSLFTextParagraph paragraph1 = content.addNewTextParagraph();
        paragraph1.setIndentLevel(0);
        paragraph1.setBullet(true);
        r1 = paragraph1.addNewTextRun();
        r1.setText("Bullet creations");
 
        // the next three paragraphs form an auto-numbered list
        XSLFTextParagraph paragraph2 = content.addNewTextParagraph();
        paragraph2.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenRight, 1);
        paragraph2.setIndentLevel(1);
        XSLFTextRun r2 = paragraph2.addNewTextRun();
        r2.setText("Numbered List Item - 1");
 
        // Creating 4th slide
        XSLFSlide sampleSlide4 = samplePPT.createSlide();
        creationOfTable(sampleSlide4);
 
        // Save presentation
        FileOutputStream outputStream = new FileOutputStream(fileLocation);
        samplePPT.write(outputStream);
        outputStream.close();
 
        // Closing presentation
        samplePPT.close();
    }
 
    /**
     * Delete a slide from the presentation
     *
     * @param pptFile
     *            The presentation
     * @param slideNumber
     *            The number of the slide to be deleted (0-based)
     */
    public void deleteSlide(XMLSlideShow pptFile, int slideNumber) {
        pptFile.removeSlide(slideNumber);
    }
 
    /**
     * Re-order the slides inside a presentation
     *
     * @param pptFile
     *            The presentation
     * @param slideNumber
     *            The number of the slide to move
     * @param newSlideNumber
     *            The new position of the slide (0-base)
     */
    public void reorderSlide(XMLSlideShow pptFile, int slideNumber, int newSlideNumber) {
        List<XSLFSlide> slideList = pptFile.getSlides();
 
        XSLFSlide secondSlide = slideList.get(slideNumber);
        pptFile.setSlideOrder(secondSlide, newSlideNumber);
    }
 
    /**
     * Retrieve the placeholder inside a slide
     *
     * @param slide
     *          The slide
     * @return List of placeholder inside a slide
     */
    public List<XSLFShape> retrieveTemplatePlaceholders(XSLFSlide slide) {
        List<XSLFShape> placeholders = new ArrayList<>();
 
        for (XSLFShape shape : slide.getShapes()) {
            if (shape instanceof XSLFAutoShape) {
                placeholders.add(shape);
            }
        }
        return placeholders;
    }
 
    /**
     * Create a table
     *
     * @param slide
     *            Slide
     */
    private void creationOfTable(XSLFSlide slide) {
 
        XSLFTable table = slide.createTable();
        table.setAnchor(new Rectangle(50, 50, 450, 300));
 
        int numColumns = 3;
        int numRows = 5;
 
        // header
        XSLFTableRow headerRow = table.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("HeaderPart " + (i + 1));
            r.setBold(true);
            r.setFontColor(Color.white);
            th.setFillColor(new Color(79, 129, 189));
            th.setBorderWidth(TableCell.BorderEdge.bottom, 2.0);
            th.setBorderColor(TableCell.BorderEdge.bottom, Color.white);
            // all columns are equally sized
            table.setColumnWidth(i, 150);
        }
 
        // data
        for (int rownum = 0; rownum < numRows; rownum++) {
            XSLFTableRow tr = table.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("Data " + (i * rownum + 1));
                if (rownum % 2 == 0) {
                    cell.setFillColor(new Color(208, 216, 232));
                } else {
                    cell.setFillColor(new Color(233, 247, 244));
                }
            }
        }
    }
}


Output of JUnit:

Output of JUnit

 

Conclusion

We have seen the ways of creating of presentation, adding text, images, lists, etc to the presentation as well as altering the presentation as well. Apache POI API is a very useful and essential API that has to be used in software industries for working with the presentation.



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads