package org.sikuli.recorder.pptx; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.util.List; import javax.imageio.ImageIO; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.JSONValue; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import org.sikuli.recorder.Utils; import org.sikuli.recorder.Zip; import org.sikuli.recorder.event.ClickEvent; import org.sikuli.recorder.event.ClickEventGroup; import org.sikuli.recorder.event.Event; import org.sikuli.recorder.event.Events; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.stringtemplate.v4.ST; import org.stringtemplate.v4.STGroup; import org.stringtemplate.v4.STGroupDir; import com.google.common.base.Charsets; import com.google.common.base.Objects; import com.google.common.collect.Lists; import com.google.common.io.Files; public class PPTXWriter { static STGroup group = new STGroupDir("org/sikuli/recorder/pptx","utf-8", '$', '$'); static Logger logger = LoggerFactory.getLogger(PPTXWriter.class); static class BoxSTModel { private int x; private int y; private int cx; private int cy; public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public int getCx() { return cx; } public void setCx(int cx) { this.cx = cx; } public int getCy() { return cy; } public void setCy(int cy) { this.cy = cy; } } static class SlideSTModel { private int id; private int rid; private String name; private String imageName; private String command; private File imageSrc; private int imageCx; private int imageCy; private BoxSTModel box; private String content; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getRid() { return rid; } public void setRid(int rid) { this.rid = rid; } public String getImageName() { return imageName; } public void setImageName(String imageName) { this.imageName = imageName; } public File getImageSrc() { return imageSrc; } public void setImageSrc(File imageSrc) { this.imageSrc = imageSrc; } public BoxSTModel getBox() { return box; } public void setBox(BoxSTModel box) { this.box = box; } public int getImageCx() { return imageCx; } public void setImageCx(int imageCx) { this.imageCx = imageCx; } public int getImageCy() { return imageCy; } public void setImageCy(int imageCy) { this.imageCy = imageCy; } public String getCommand() { return command; } public void setCommand(String command) { this.command = command; } public String toString(){ return Objects.toStringHelper(this) .add("name", name) .add("command", command) .add("imageName", imageName) .add("imageSrc", imageSrc.getAbsolutePath()) .toString(); } public String getContent() { return content; } public void setContent(String content) { this.content = content; } } public static void main(String[] args) throws IOException, ParseException{ JSONParser parser=new JSONParser(); System.out.println("=======decode======="); FileReader s = new FileReader(new File("import.json")); // String s="[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]"; JSONObject obj = (JSONObject) parser.parse(s); // JSONArray feed; // JSONArray rows = (JSONArray) // JSONObject JSONObject feed = (JSONObject) obj.get("feed"); JSONArray entry = (JSONArray) feed.get("entry"); // JSONArray array=(JSONArray)obj; // System.out.println("======the 2nd element of array======"); // System.out.println(array.get(1)); // System.out.println(); for (int i = 0; i < entry.size(); ++i){//entry.size(); ++i){ List<Item> items = Lists.newArrayList(); JSONObject row = (JSONObject) entry.get(i); JSONObject field; String value; field = (JSONObject) row.get("gsx$yourname"); value = (String) field.get("$t"); String name = value; items.add(new Item("Name", value)); field = (JSONObject) row.get("gsx$e-mail"); value = (String) field.get("$t"); items.add(new Item("Email", value)); field = (JSONObject) row.get("gsx$www"); value = (String) field.get("$t"); items.add(new Item("URL to homepage", value)); items.add(new Item("Photo", "{Please insert a photo of yourself here to help us connect you to a face}")); field = (JSONObject) row.get("gsx$start"); value = (String) field.get("$t"); items.add(new Item("Starting Semester/Year", value)); field = (JSONObject) row.get("gsx$advisor"); value = (String) field.get("$t"); value = value.replaceAll("&"," and "); items.add(new Item("Advisor", value)); items.add(new Item("Committee Members", "{Please enter the names of your committee members, if applicable}")); field = (JSONObject) row.get("gsx$currentfunding"); value = (String) field.get("$t"); items.add(new Item("Current Funding", value)); field = (JSONObject) row.get("gsx$milestone"); value = (String) field.get("$t"); items.add(new Item("Next Milestone", value)); field = (JSONObject) row.get("gsx$timeline"); value = (String) field.get("$t"); items.add(new Item("Next Milestone Target Time", value)); field = (JSONObject) row.get("gsx$award"); value = (String) field.get("$t"); if (value.length() > 2){ items.add(new Item("Award", value)); } items.add(new Item("Award","{Please add one slide for each new award}")); field = (JSONObject) row.get("gsx$publications"); value = (String) field.get("$t"); // /System.out.println(value); String[] toks = value.split("\n"); for (String tok : toks){ int n = tok.split(" ").length; tok = tok.replaceAll("&"," and "); tok = tok.trim(); if (n > 3){ System.out.println(name + " >" + tok); items.add(new Item("Publication", tok)); } } items.add(new Item("Publication","{Please add one slide for each new publication}")); //System.out.println(toks.length); items.add(new Item("Highlight","{Please insert an image to highlight your research/teaching/service, one image per slide}")); items.add(new Item("Highlight","{Please insert an image to highlight your research/teaching/service, one image per slide}")); String dest = "reviews/" + name + ".pptx"; File outputFile = new File(dest); generate(outputFile, items); // System.out.println(text); } // // Object obj=JSONValue.parse(new FileReader(new File("import.json"))); //JSONArray array=(JSONArray)obj; // System.out.println(entry.size()); // File outputFile = new File("e.pptx"); // generate(outputFile); } public static void generate(File outputFile, List<Item> items){ File pptxSkeletonDir; try { pptxSkeletonDir = createSkeletonDir(); generateFiles(pptxSkeletonDir, items); Zip.zipDir(pptxSkeletonDir, outputFile); } catch (IOException e) { e.printStackTrace(); } } private static File createSkeletonDir() throws IOException{ InputStream inputStream = PPTXWriter.class.getResourceAsStream("skeleton.pptx"); File temp = File.createTempFile("temp","pptx"); Utils.stream2file(inputStream, temp); File pptxSkeletonDir = Utils.createTempDirectory(); Zip.unzip(temp, pptxSkeletonDir); return pptxSkeletonDir; } static class SlideDeck { private List<SlideSTModel> slides = Lists.newArrayList(); int rid = 8; int id = 256; int no = 1; public void addSlide(String title, String value){ SlideSTModel slide = new SlideSTModel(); slide.setName("slide" + (no) + ".xml"); slide.setCommand(title); slide.setContent(value); slide.setId(id); slide.setRid(rid); getSlides().add(slide); id++; rid++; no++; } public List<SlideSTModel> getSlides() { return slides; } } static class Item { public Item(String title, String value) { this.title = title; this.value = value; this.value = value.replaceAll("&"," and "); } String title; String value; }; public static void generateFiles(File pptxSkeletonDir, List<Item> items) throws IOException { File outputDir = pptxSkeletonDir; String L = File.separator; ST presentation_xml_ST = group.getInstanceOf("presentation_xml"); ST presentation_xml_rels_ST = group.getInstanceOf("presentation_xml_rels"); ST content_types_xml_ST = group.getInstanceOf("content_types_xml"); ST app_xml_ST = group.getInstanceOf("app_xml"); //List<SlideSTModel> slides = createSlideSTModels(clickEventGroups); SlideDeck deck = new SlideDeck(); for (Item item : items){ deck.addSlide(item.title, item.value); } // deck.addSlide("Name","Tom Yeh"); // deck.addSlide("Email","tom.yeh@colorado.edu"); // deck. List<SlideSTModel> slides = deck.getSlides(); //copyImagesToPPTX(slides); for (int i = 0; i < slides.size(); ++i){ logger.debug("Writing slide " + (i+1) + " of " + slides.size()); SlideSTModel slide = slides.get(i); ST slide_xml_ST = group.getInstanceOf("simple_slide_xml"); ST slide_xml_rels_ST = group.getInstanceOf("simple_slide_xml_rels"); // // copy image // File dest = new File(outputDir, "ppt" + L + "media" + L + slide.getImageName()); // Files.copy(slide.getImageSrc(), dest); // slide_xml_ST.add("slide", slide); slide_xml_rels_ST.add("slide", slide); File slideFile = new File(outputDir, "ppt" + L + "slides" + L + slide.getName()); File slide_relsFile = new File(outputDir, "ppt" + L + "slides" + L + "_rels" + L + slide.getName() + ".rels"); Files.write(slide_xml_ST.render(), slideFile, Charsets.UTF_8); Files.write(slide_xml_rels_ST.render(), slide_relsFile, Charsets.UTF_8); presentation_xml_ST.add("slide",slide); presentation_xml_rels_ST.add("slide",slide); content_types_xml_ST.add("slide", slide); } app_xml_ST.add("count", slides.size()); File presentationFile = new File(outputDir, "ppt" + L + "presentation.xml"); File presentation_relsFile = new File(outputDir, "ppt" + L + "_rels" + L + "presentation.xml.rels"); File content_types_file = new File(outputDir, "[Content_Types].xml"); File app_file = new File(outputDir, "docProps" + L + "app.xml"); Files.write(presentation_xml_ST.render(), presentationFile, Charsets.UTF_8); Files.write(presentation_xml_rels_ST.render(), presentation_relsFile, Charsets.UTF_8); Files.write(content_types_xml_ST.render(), content_types_file, Charsets.UTF_8); Files.write(app_xml_ST.render(), app_file, Charsets.UTF_8); } // private static List<SlideSTModel> createSlideSTModels(List<ClickEventGroup> clickEventGroups) { // int rid = 8; // int id = 256; // int no = 1; // slide1.xml, slide2.xml ... // List<SlideSTModel> slides = Lists.newArrayList(); // // int imageHeight = 0; // int imageWidth = 0; // // for (ClickEventGroup g : clickEventGroups ){ // // File imageSrc = g.getScreenShotEventBefore().getFile(); // ClickEvent clickEvent = g.getClickEvent(); // int x = clickEvent.getX(); // int y = clickEvent.getY(); // // // assume all images are of the same size // // so we read the image dimensions only once // if (imageWidth == 0 && imageHeight == 0){ // BufferedImage image = null; // try { // image = ImageIO.read(imageSrc); // imageHeight = image.getHeight(); // imageWidth = image.getWidth(); // } catch (IOException e) { // e.printStackTrace(); // } // } // // int maxCx = 9144000; // int maxCy = 6858000; // // int imageCx = maxCx; // int imageCy = maxCy; // // int maxWidth = 1440; // int maxHeight = 1080; // // int boxX = 0; // int boxY = 0; // // int r = 6350; // // // double scaleX = 1.0 * imageWidth / maxWidth; // double scaleY = 1.0 * imageHeight / maxHeight; // double scale; // if (scaleX > scaleY) { // // x is relatively larger // imageCx = maxCx; // imageCy = (int) (imageHeight / scaleX * r); // scale = scaleX; // // } else { // imageCx = (int) (imageWidth / scaleY * r); // imageCy = maxCy; // scale = scaleY; // } // // boxX = (int) (x * r / scale); // boxY = (int) (y * r / scale); // // // fixed dimensions // int boxCx = 50 * r; // int boxCy = 50 * r; // // // center the box // boxX -= (boxCx/2); // boxY -= (boxCy/2); // // String name = "slide" + no + ".xml"; // slide1.xml, slide2.xml ... etc // String imageName = "image" + no + ".png"; // // // SlideSTModel slide = new SlideSTModel(); // slide.setName(name); // slide.setId(id); // slide.setRid(rid); // slide.setImageName(imageName); // slide.setImageSrc(imageSrc); // slide.setImageCx(imageCx); // slide.setImageCy(imageCy); // // BoxSTModel box = new BoxSTModel(); // box.setX(boxX); // box.setY(boxY); // box.setCx(boxCx); // box.setCy(boxCy); // slide.setBox(box); // // String command = ""; // if (clickEvent.getButton() == MouseEvent.BUTTON1){ // if (clickEvent.getCount() == 1){ // command = "Click"; // }else if (clickEvent.getCount() == 2){ // command = "Double Click"; // } // } else if (clickEvent.getButton() == MouseEvent.BUTTON2 || clickEvent.getButton() == MouseEvent.BUTTON3){ // command = "Right Click"; // } // slide.setCommand(command); // logger.trace("createSlideSTModels() --> " + slide); // // rid++; // id++; // no++; // // slides.add(slide); // } // return slides; // } }