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
Agrega las librerías requeridas a tu archivo de configuración
En mi caso agrego en el
pom.xmllo 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>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;
}Delega el pintado en el componente de diapositiva a la diapositiva
Sobreescribiremos el metodo
paintComponentpara personalizar el pintadoprotected void paintComponent(Graphics g){
Graphics2D g2d = (Graphics2D) g;
slide.draw(g2d);
}Leer un archivo mediante un dialogo de selección de archivo
Aquí usaremos un
JFileChoosery le pondremos por defecto un filtro para que solo abra archivos con las extensiones deseadasJFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("Power point presentation", "ppt", "pptx"));
if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
File presentationppt = fileChooser.getSelectedFile();Cargar dependiendo de la extensión de la presentación
La clase
Slideshowtiene los métodos comunes, pero deberemos de usar el tipo concreto para leer el archivo con la presentación, los archivos .ppt son de tipoHSLFSlideShowy los .pptx son de tipoXMLSlideShow.try (FileInputStream inputStream = new FileInputStream(presentationppt)) {
SlideShow slideShow = presentationppt.getName().endsWith(".ppt") ? new HSLFSlideShow(inputStream) : new XMLSlideShow(inputStream);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);
}cargamos la diapositiva actual para mostrar una a la vez
En mi caso para simplificar el proceso de repintado tengo un
JScrollPaney 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.