package org.pptx4j.samples;
import java.io.File;
import java.util.List;
import javax.xml.bind.JAXBException;
import org.docx4j.dml.CTCustomGeometry2D;
import org.docx4j.dml.CTShapeProperties;
import org.docx4j.dml.STShapeType;
import org.docx4j.jaxb.XPathBinderAssociationIsPartialException;
import org.docx4j.model.shapes.PresetGeometries;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.OpcPackage;
import org.docx4j.openpackaging.packages.PresentationMLPackage;
import org.docx4j.openpackaging.parts.PresentationML.SlidePart;
import org.pptx4j.Pptx4jException;
/**
* Converts predefined shapes (eg <a:prstGeom prst="moon">) to equivalent a:custGeom.
*
* See further http://blogs.msdn.com/b/openspecification/archive/2011/11/14/how-to-use-the-presetshapedefinitions-xml-file-and-fun-with-drawingml.aspx
*
* Note: leftArrow corrupts the pptx, so it is not converted here. Someone motivated might explore why?
*
* @author jharrop
*/
public class ShapesPresetToCustom {
public static void main(String[] args) throws Docx4JException, Pptx4jException, JAXBException {
// A pptx containing all shapes, created using the AutoShapes sample
String inputfilepath = System.getProperty("user.dir") + "/sample-docs/pptx/AutoShapes.pptx";
PresentationMLPackage presentationMLPackage =
(PresentationMLPackage)OpcPackage.load(new java.io.File(inputfilepath));
int slideCount = presentationMLPackage.getMainPresentationPart().getSlideCount();
for (int i=0; i<slideCount; i++) {
System.out.println("\n Slide " + i);
convert( presentationMLPackage.getMainPresentationPart().getSlide(i) );
}
presentationMLPackage.save(
new File(System.getProperty("user.dir") + "/OUT_ShapesPresetToCustom.pptx"));
}
private static void convert(SlidePart slide) throws XPathBinderAssociationIsPartialException, JAXBException {
// We don't have traversal infrastructure for slides right now,
// so use XPath
List<Object> results = slide.getJAXBNodesViaXPath("//p:spPr", false);
for(Object o: results) {
//System.out.println(o.getClass().getName());
CTShapeProperties spPr = (CTShapeProperties)o;
if (spPr.getPrstGeom()==null) {
System.out.println("- this shape not preset");
} else {
STShapeType shapeType = spPr.getPrstGeom().getPrst();
CTCustomGeometry2D customGeo = PresetGeometries.getInstance().get(shapeType.value());
if (customGeo==null) {
System.out.println("- definition MISSING for " + shapeType.value() );
} else if (shapeType.value().equals("leftArrow") ) {
System.out.println("- skipping " + shapeType.value() + " (corrupts pptx)"); // tested 2010 x64; I wonder why
} else {
// really should clone here
spPr.setCustGeom(customGeo);
spPr.setPrstGeom(null);
System.out.println("- " + shapeType.value() + " processed");
}
}
}
}
}