package org.docx4j.samples; import javax.xml.bind.JAXBElement; import org.docx4j.Docx4J; import org.docx4j.TraversalUtil; import org.docx4j.XmlUtils; import org.docx4j.finders.ClassFinder; import org.docx4j.jaxb.Context; import org.docx4j.math.CTOMathPara; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; import org.docx4j.wml.P; /** * Basic demo handling Office Math. * */ public class MathsEquationsFormulae { public static void main(String[] args) throws Exception { // First, create/save a docx containing a formula. WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage(); MainDocumentPart mdp = wordMLPackage.getMainDocumentPart(); P p = new P(); mdp.getContent().add(p); javax.xml.bind.JAXBElement omathpara = (JAXBElement) XmlUtils.unmarshalString(openXML); // or could have used generated code which uses JAXB factory approach p.getContent().add(omathpara); String filename = System.getProperty("user.dir") + "/OUT_maths.docx"; Docx4J.save(wordMLPackage, new java.io.File(filename), Docx4J.FLAG_SAVE_ZIP_FILE); System.out.println("Saved " + filename); // The above shows how to unmarshall it // Now, show how to marshall existing maths content // first, find it ClassFinder finder = new ClassFinder(CTOMathPara.class); new TraversalUtil(mdp.getContent(), finder); // Get the first result Object o = finder.results.get(0); System.out.println(o.getClass().getName()); // Can't use XmlUtils.marshaltoString(o) because // CTOMathPara is missing an @XmlRootElement annotation, // so be explicit String result = XmlUtils.marshaltoString( o, true, true, Context.jc, "http://schemas.openxmlformats.org/officeDocument/2006/math", "oMathPara", org.docx4j.math.CTOMathPara.class); System.out.println(result); } // generated using docx4j code gen at http://webapp.docx4java.org/OnlineDemo/PartsList.html or the Word AddIn private static String openXML = "<m:oMathPara xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\">" + "<m:oMath>" + "<m:sSup>" + "<m:sSupPr>" + "<m:ctrlPr>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" +"</m:ctrlPr>" +"</m:sSupPr>" + "<m:e>" + "<m:d>" + "<m:dPr>" + "<m:ctrlPr>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" +"</m:ctrlPr>" +"</m:dPr>" + "<m:e>" + "<m:r>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" + "<m:t>x+a</m:t>" +"</m:r>" +"</m:e>" +"</m:d>" +"</m:e>" + "<m:sup>" + "<m:r>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" + "<m:t>n</m:t>" +"</m:r>" +"</m:sup>" +"</m:sSup>" + "<m:r>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:cs=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" + "<m:t>=</m:t>" +"</m:r>" + "<m:nary>" + "<m:naryPr>" + "<m:chr m:val=\"∑\"/>" + "<m:grow m:val=\"1\"/>" + "<m:ctrlPr>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" +"</m:ctrlPr>" +"</m:naryPr>" + "<m:sub>" + "<m:r>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:cs=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" + "<m:t>k=0</m:t>" +"</m:r>" +"</m:sub>" + "<m:sup>" + "<m:r>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:cs=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" + "<m:t>n</m:t>" +"</m:r>" +"</m:sup>" + "<m:e>" + "<m:d>" + "<m:dPr>" + "<m:ctrlPr>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" +"</m:ctrlPr>" +"</m:dPr>" + "<m:e>" + "<m:f>" + "<m:fPr>" + "<m:type m:val=\"noBar\"/>" + "<m:ctrlPr>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" +"</m:ctrlPr>" +"</m:fPr>" + "<m:num>" + "<m:r>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:cs=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" + "<m:t>n</m:t>" +"</m:r>" +"</m:num>" + "<m:den>" + "<m:r>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:cs=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" + "<m:t>k</m:t>" +"</m:r>" +"</m:den>" +"</m:f>" +"</m:e>" +"</m:d>" + "<m:sSup>" + "<m:sSupPr>" + "<m:ctrlPr>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" +"</m:ctrlPr>" +"</m:sSupPr>" + "<m:e>" + "<m:r>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:cs=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" + "<m:t>x</m:t>" +"</m:r>" +"</m:e>" + "<m:sup>" + "<m:r>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:cs=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" + "<m:t>k</m:t>" +"</m:r>" +"</m:sup>" +"</m:sSup>" + "<m:sSup>" + "<m:sSupPr>" + "<m:ctrlPr>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" +"</m:ctrlPr>" +"</m:sSupPr>" + "<m:e>" + "<m:r>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:cs=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" + "<m:t>a</m:t>" +"</m:r>" +"</m:e>" + "<m:sup>" + "<m:r>" + "<w:rPr>" + "<w:rFonts w:ascii=\"Cambria Math\" w:cs=\"Cambria Math\" w:eastAsia=\"Cambria Math\" w:hAnsi=\"Cambria Math\"/>" +"</w:rPr>" + "<m:t>n-k</m:t>" +"</m:r>" +"</m:sup>" +"</m:sSup>" +"</m:e>" +"</m:nary>" +"</m:oMath>" +"</m:oMathPara>"; }