Java: Mostrar Presentación PowerPoint en Ventana

La librería apache poi ha cambiado mucho pues su enfoque ha cambiado de generar reportes a leer reportes y/o usarlos como plantilla, por lo que si quieres mostrar una presentación será una tarea difícil ya que ahora no te permite acceder a las coordenadas de los elementos, pero de todas formas te muestro aquí una manera de poder pintar esa presentación sin preocuparte de más por batallar con la lectura de todos los elementos internos y en unas pocas líneas de código.

Cargar presentación PowerPoint en un JFrame

  1. Agrega las librerías requeridas a tu archivo de configuración

    En mi caso agrego en el pom.xml lo siguiente:
    <dependencies>
    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>5.2.3</version>
    <scope>compile</scope>
    </dependency>
    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.2</version>
    <scope>compile</scope>
    </dependency>
    <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.19.0</version>
    </dependency>
    </dependencies>

  2. Crea tu componente para mostrar la diapositiva

    En este caso debe de tener un constructor que nos asegure que siempre vamos a tener una diapositiva. Este componente esta hecho solamente para para mostrar presentación powerpoint una diapositiva a la vez

    public class SlideComponent extends JPanel {
    private final Slide<?,?> slide;

    public SlideComponent(Slide<?,?> slide) {
    this.slide = slide;
    }

  3. Delega el pintado en el componente de diapositiva a la diapositiva

    Sobreescribiremos el metodo paintComponent para personalizar el pintado

    protected void paintComponent(Graphics g){
    Graphics2D g2d = (Graphics2D) g;
    slide.draw(g2d);
    }

  4. Leer un archivo mediante un dialogo de selección de archivo

    Aquí usaremos un JFileChooser y le pondremos por defecto un filtro para que solo abra archivos con las extensiones deseadas

    JFileChooser fileChooser = new JFileChooser();
    fileChooser.setFileFilter(new FileNameExtensionFilter("Power point presentation", "ppt", "pptx"));
    if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
    File presentationppt = fileChooser.getSelectedFile();

  5. Cargar dependiendo de la extensión de la presentación

    La clase Slideshow tiene los métodos comunes, pero deberemos de usar el tipo concreto para leer el archivo con la presentación, los archivos .ppt son de tipo HSLFSlideShow y los .pptx son de tipo XMLSlideShow.

    try (FileInputStream inputStream = new FileInputStream(presentationppt)) {
    SlideShow slideShow = presentationppt.getName().endsWith(".ppt") ? new HSLFSlideShow(inputStream) : new XMLSlideShow(inputStream);

  6. Cargamos la lista de diapositivas

    En este caso crearemos un componente por cada diapositiva y le agregaremos escuchas de eventos, aunque se puede resolver de maneras más optimas. Incluso si lo deseas puedes agregar todas a la vista y el scroll se encargará de mostrarlas una junto a la otra

    List slides = slideShow.getSlides();
    for (Slide slide : slides) {
    SlideComponent slideComponent = new SlideComponent(slide);
    addListenersToSlideComponent(slideComponent);
    sliderComponents.add(slideComponent);
    }

  7. cargamos la diapositiva actual para mostrar una a la vez

    En mi caso para simplificar el proceso de repintado tengo un JScrollPane y al llamar al método setViewportView podemos controlar que cosa se muestra dentro.

    SlideComponent firstSlide = sliderComponents.get(currentSlide);
    jspanel.setViewportView(firstSlide);

Herramientas
  • Maven
    IDE (Netbeans, IntelliJ, Eclipse)
Materiales
  • Apache poi-scratchpad
    Apache poi-ooxml

Código completo

Como siempre el código de ejemplo para mostrar presentación de powerpoint en un JFrame de manera interactiva puedes hallarlo en mi cuenta de github.

Si te ha gustado la librería poi para trabajar con presentaciones usando Java, puede que también te interese usarla para convertir de powerpoint a PDF.


  • Cursos de Código Facilito

    Te comparto aquí mis recomendaciones de cursos de Código Facilito. Codigofacilito.com es una plataforma virtual de cursos en idioma exclusivamente español que inició como un canal de YouTube. Opinión de la plataforma En mi opinión la plataforma aún es incipiente y los cursos necesitan más trabajo, ya que es muy común hallarse con clases de…


  • Cursos de LinkedIn Learning

    Te comparto aquí mis recomendaciones de cursos de Linkedin Learning. LinkedIn Learning es una plataforma virtual de cursos propiedad de Microsoft. Hallarás mucho material en inglés, pues prácticamente todos los cursos vienen con subtítulos en castellano y en la parte técnica son muy buenos debido a la adquisición de Lynda.com. En mi opinión la plataforma…


  • Mockito: Snippets de código

    Estos snippets de código para entrevista acerca de mockito espero te sean de mucha utilidad. Claro que también los puedes usar para tu desarrollo en el día a día. Mock básico Si te llegan a mostrar algo como esto es mejor que sospeches, mockito se usa principalmente para pruebas de integración. Si llegas a ver…


javapro.org