
// SlidesToImages.java
// Andrew Davison, ad@coe.psu.ac.th, Nov. 2022

/* Convert each slide of a Powerpoint document into a PNG
   file, which has the same name as the Powerpoint file, with
   the addition of a number.

   The slide-to-image conversion may be incomplete if a slide
   contains a linked picture rather than an embedded one.
   (see https://stackoverflow.com/questions/41877957/error-caused-by-java-lang-illegalargumentexception-relationship-null-doesnt/41888174#41888174)

  Usage:
    > compile SlidesToImages.java
    > run SlidesToImages <pptx fnm>

    e.g.
    > run SlidesToImages prelims.pptx
       - generates prelims1-15.png files

    but...
    > run SlidesToImages file_example_PPT_250kB.ppt
    will trigger an exception since the file is PPT type

*/

import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.io.*;
import java.util.*;
import java.awt.image.*;

import org.apache.poi.xslf.usermodel.*;


public class SlidesToImages
{

  public static void main(String args[])
  {
    if (args.length != 1) {
      System.out.println("Usage: run SlidesToImages <pptx fnm>");
      System.exit(0);
    }
    String fnm = args[0];

    if (!POIUtils.isPowerPoint(fnm)) {
      System.out.println(fnm + " is not a PowerPoint file");
      System.exit(1);
    }
    if (POIUtils.isOldPowerPoint(fnm))
      System.out.println(fnm + " is an old-style PowerPoint file");


    try (FileInputStream fis = new FileInputStream(fnm)) {
      System.out.println("Reading from " + fnm);
      XMLSlideShow ppt = new XMLSlideShow(fis);

      Dimension pgsize = ppt.getPageSize();
   
      java.util.List<XSLFSlide> slides = ppt.getSlides();
      BufferedImage im = null;
      String nm = POIUtils.stripExt(fnm);
      for (int i = 0; i < slides.size(); i++) {
        System.out.println("Slide " + (i+1));
        im = renderSlide(slides.get(i), pgsize);
        POIUtils.saveImage(im, nm + (i+1) + ".png");
      }
    }
    catch (Exception e) 
    {  System.out.println(e);  }

  } /* main */


  private static BufferedImage renderSlide(XSLFSlide slide, Dimension d)
  // convert this slide into a BufferedImage of the same size
  {
    BufferedImage im = new BufferedImage(d.width, d.height,
                                 BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = im.createGraphics();

    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                         RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
                         RenderingHints.VALUE_RENDER_QUALITY);

    // clear the drawing area and render
    g2d.setPaint(Color.white);
    g2d.fill(new Rectangle2D.Float(0, 0, d.width, d.height));
    slide.draw(g2d);

    return im;
  }  // end of renderSlide()


}  // end of SlidesToImages class