Page 1 of 1

unable to marshal type "org.docx4j.math.CTOMathPara"

PostPosted: Tue Aug 23, 2011 7:04 pm
by tosswang
hi,all:
i want to insert a formula into doc,but an exception is thrown,

Code: Select all
javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.SAXException2: unable to marshal type "org.docx4j.math.CTOMathPara" as an element because it is missing an @XmlRootElement annotation]
   at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:328)
   at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:254)
   at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75)
   at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:192)
   at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:170)
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:201)
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:189)
   at org.docx4j.openpackaging.io.SaveToZipFile.savePart(SaveToZipFile.java:366)
   at org.docx4j.openpackaging.io.SaveToZipFile.addPartsFromRelationships(SaveToZipFile.java:329)
   at org.docx4j.openpackaging.io.SaveToZipFile.save(SaveToZipFile.java:159)
   at org.docx4j.openpackaging.io.SaveToZipFile.save(SaveToZipFile.java:100)
   at org.docx4j.openpackaging.packages.WordprocessingMLPackage.save(WordprocessingMLPackage.java:205)

at org.TestMathFormulaXml.main(TestMathFormulaXml.java:157)
[/code]

my code is

Code: Select all
package org;

import java.io.File;
import java.util.HashMap;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.annotation.XmlRootElement;

import org.docx4j.math.CTOMath;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;


public class TestMathFormulaXml
{
private static org.docx4j.wml.ObjectFactory factory = new org.docx4j.wml.ObjectFactory();
   
public static JAXBContext context = org.docx4j.jaxb.Context.jc;

public static void insertSubSuper(String key,MainDocumentPart documentPart,WordprocessingMLPackage wordMLPackage)throws Exception
{
      
      String xpath = "//w:r[w:t[contains(text(),'"+key+"')]]";
      List<Object> list = documentPart.getJAXBNodesViaXPath(xpath, false);
      
      for(int i=0;i<list.size();i++)
      {         
         org.docx4j.wml.R r = (org.docx4j.wml.R) list.get(i);         
         org.docx4j.wml.P parent = (org.docx4j.wml.P) r.getParent();
               
         int index =parent.getContent().indexOf(r);
         System.out.println(index);
         parent.getContent().remove(r);
         
         org.docx4j.math.ObjectFactory mathFactory=new org.docx4j.math.ObjectFactory();
         
         org.docx4j.math.CTOMathPara para=mathFactory.createCTOMathPara();
               
         
         CTOMath oMath=mathFactory.createCTOMath();
         
         String mr="<m:r  xmlns:ve=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" " +
               "xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" " +
               "xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" " +
               "xmlns:v=\"urn:schemas-microsoft-com:vml\" " +
               "xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" " +
               "xmlns:w10=\"urn:schemas-microsoft-com:office:word\" " +
               "xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" " +
               "xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\">" +
               "<m:rPr>" +
               "<m:sty m:val=\"p\" /> " +
               "</m:rPr>" +
               "<w:rPr>" +
               "<w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" /> " +
               "<w:sz w:val=\"30\" /> " +
               "<w:szCs w:val=\"30\" /> " +
               "</w:rPr>" +
               "<m:t>${mainDesc}</m:t> " +
               "</m:r>";
         
         String mpr=" <m:mPr xmlns:ve=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" " +
               "xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" " +
               "xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" " +
               "xmlns:v=\"urn:schemas-microsoft-com:vml\" " +
               "xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" " +
               "xmlns:w10=\"urn:schemas-microsoft-com:office:word\" " +
               "xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" " +
               "xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\">" +               
               "<m:mcs>" +
               "<m:mc>" +
               "<m:mcPr>" +
               "<m:count m:val=\"1\" /> " +
               "<m:mcJc m:val=\"center\" /> " +
               "</m:mcPr>" +
               "</m:mc>" +
               "</m:mcs>" +
               "<m:ctrlPr>" +
               "<w:rPr>" +
               "<w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" /> " +
               "<w:sz w:val=\"30\" />" +
               "<w:szCs w:val=\"30\" /> " +
               "</w:rPr>" +
               "</m:ctrlPr>" +               
               "</m:mPr>";
         
         String mmr1=retMmr("2");
         String mmr2=retMmr("3");
         
         HashMap<String, String> mappings = new HashMap<String, String>();
         mappings.put("mainDesc", "C");
         Object mrObj=org.docx4j.XmlUtils.unmarshallFromTemplate(mr, mappings,context,org.docx4j.math.CTR.class);
         oMath.getEGOMathElements().add((org.docx4j.math.CTR)mrObj);
         
         Object mprObj=org.docx4j.XmlUtils.unmarshalString(mpr,context,org.docx4j.math.CTMPr.class);
         Object mmr1Obj=org.docx4j.XmlUtils.unmarshalString(mmr1,context,org.docx4j.math.CTMR.class);
         Object mmr2Obj=org.docx4j.XmlUtils.unmarshalString(mmr2,context,org.docx4j.math.CTMR.class);
         
         org.docx4j.math.CTM ctm=mathFactory.createCTM();
         
         ctm.setMPr((org.docx4j.math.CTMPr)mprObj);
         ctm.getMr().add((org.docx4j.math.CTMR)mmr1Obj);
         ctm.getMr().add((org.docx4j.math.CTMR)mmr2Obj);
         
         oMath.getEGOMathElements().add(ctm);
         
         
         para.getOMath().add(oMath);
         
         parent.getContent().add(para);
      }
      
      
   }
   
   public static String retMmr(String val)
   {
      
      String mmr="<m:mr xmlns:ve=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" " +
               "xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" " +
               "xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" " +
               "xmlns:v=\"urn:schemas-microsoft-com:vml\" " +
               "xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" " +
               "xmlns:w10=\"urn:schemas-microsoft-com:office:word\" " +
               "xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" " +
               "xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\">" +            
            "<m:e>" +
            "<m:r>" +
            "<m:rPr>" +
            "<m:sty m:val=\"p\" />" +
            "</m:rPr>" +
            "<w:rPr>" +
            "<w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" />" +
            "<w:sz w:val=\"30\" />" +
            "<w:szCs w:val=\"30\" />" +
            "</w:rPr>" +
            "<m:t>"+val+"</m:t>" +
            "</m:r>" +
            "</m:e>" +
            "</m:mr>";
      return mmr;
   }
   
   public static void main(String[] args)
   {
      try
      {
         
         String inputfilepath = "c:/workspace/aa.docx";
         
         WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage
               .load(new java.io.File(inputfilepath));
         MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
         
         insertSubSuper("label2",documentPart,wordMLPackage);
         
         wordMLPackage.save(new File("c:/workspace/aa_out.docx"));
      }
      catch(Exception e)
      {
         e.printStackTrace();
      }
      
   }
}


thanks in advance!

tosswang

Re: unable to marshal type "org.docx4j.math.CTOMathPara"

PostPosted: Tue Aug 23, 2011 10:50 pm
by jason
The ObjectFactory contains:

Code: Select all
    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CTOMathPara }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/officeDocument/2006/math", name = "oMathPara")
    public JAXBElement<CTOMathPara> createOMathPara(CTOMathPara value) {
        return new JAXBElement<CTOMathPara>(_OMathPara_QNAME, CTOMathPara.class, null, value);
    }


You can use that to wrap the paragraph in a JAXBElement which tells JAXB how to marshal it.

Alternatively, it would be safe to add an @XmlRootElement annotation to the CTOMathPara source code.

cheers .. Jason

Re: unable to marshal type "org.docx4j.math.CTOMathPara"

PostPosted: Wed Aug 24, 2011 3:14 pm
by tosswang
hi,jason:

please pardon my poor english level,i don't know how to modify my code after I read your tips....

Why am I not encountered such a problem when i insert text into doc?

What is the difference between the insert formulas and insert text into doc?

thanks jason

tosswang

Re: unable to marshal type "org.docx4j.math.CTOMathPara"

PostPosted: Wed Aug 24, 2011 8:38 pm
by tosswang
please help me!Any tips are very grateful!

Re: unable to marshal type "org.docx4j.math.CTOMathPara"

PostPosted: Thu Aug 25, 2011 10:52 pm
by jason
Try something like:

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
org.docx4j.math.CTOMathPara para=mathFactory.createCTOMathPara();
:
//parent.getContent().add(para);
JAXBElement<CTOMathPara> wrapper = mathFactory.createOMathPara(para);
parent.getContent().add(wrapper );
 
Parsed in 0.018 seconds, using GeSHi 1.0.8.4

Re: unable to marshal type "org.docx4j.math.CTOMathPara"

PostPosted: Fri Aug 26, 2011 1:00 am
by tosswang
hi,jason

thank your reply very much.I encounter a new problem,
Code: Select all
javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.SAXException2: unable to marshal type "org.docx4j.math.CTR" as an element because it is missing an @XmlRootElement annotation]
   at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:328)
   at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:254)
   at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75)
   at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:192)
   at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:170)
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:201)
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:189)
   at org.docx4j.openpackaging.io.SaveToZipFile.savePart(SaveToZipFile.java:366)
   at org.docx4j.openpackaging.io.SaveToZipFile.addPartsFromRelationships(SaveToZipFile.java:329)
   at org.docx4j.openpackaging.io.SaveToZipFile.save(SaveToZipFile.java:159)
   at org.docx4j.openpackaging.io.SaveToZipFile.save(SaveToZipFile.java:100)
   at org.docx4j.openpackaging.packages.WordprocessingMLPackage.save(WordprocessingMLPackage.java:205)
   at org.TestMathFormulaXml.main(TestMathFormulaXml.java:163)
Caused by: com.sun.istack.SAXException2: unable to marshal type "org.docx4j.math.CTR" as an element because it is missing an @XmlRootElement annotation
   at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:244)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:303)
   at com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:114)
   at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:152)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681)
   at com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:65)
   at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:168)
   at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:152)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681)
   at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:150)
   at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:156)
   at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:185)
   at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:305)
   at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:312)
   at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:71)
   at com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:114)
   at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:152)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:589)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:312)
   at com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:114)
   at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:152)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681)
   at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:150)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:589)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:312)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:490)
   at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:325)
   ... 12 more
org.docx4j.openpackaging.exceptions.Docx4JException: Failed to add parts from relationships
   at org.docx4j.openpackaging.io.SaveToZipFile.addPartsFromRelationships(SaveToZipFile.java:334)
   at org.docx4j.openpackaging.io.SaveToZipFile.save(SaveToZipFile.java:159)
   at org.docx4j.openpackaging.io.SaveToZipFile.save(SaveToZipFile.java:100)
   at org.docx4j.openpackaging.packages.WordprocessingMLPackage.save(WordprocessingMLPackage.java:205)
   at org.TestMathFormulaXml.main(TestMathFormulaXml.java:163)
Caused by: org.docx4j.openpackaging.exceptions.Docx4JException: Problem saving part word/document.xml
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:259)
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:189)
   at org.docx4j.openpackaging.io.SaveToZipFile.savePart(SaveToZipFile.java:366)
   at org.docx4j.openpackaging.io.SaveToZipFile.addPartsFromRelationships(SaveToZipFile.java:329)
   ... 4 more
Caused by: javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.SAXException2: unable to marshal type "org.docx4j.math.CTR" as an element because it is missing an @XmlRootElement annotation]
   at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:328)
   at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:254)
   at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75)
   at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:192)
   at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:170)
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:201)
   ... 7 more
Caused by: com.sun.istack.SAXException2: unable to marshal type "org.docx4j.math.CTR" as an element because it is missing an @XmlRootElement annotation
   at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:244)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:303)
   at com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:114)
   at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:152)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681)
   at com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:65)
   at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:168)
   at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:152)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681)
   at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:150)
   at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:156)
   at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:185)
   at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:305)
   at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:312)
   at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:71)
   at com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:114)
   at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:152)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:589)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:312)
   at com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:114)
   at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:152)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681)
   at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:150)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:589)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:312)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:490)
   at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:325)
   ... 12 more
org.docx4j.openpackaging.exceptions.Docx4JException: Failed to add parts from relationships
   at org.docx4j.openpackaging.io.SaveToZipFile.addPartsFromRelationships(SaveToZipFile.java:334)
   at org.docx4j.openpackaging.io.SaveToZipFile.save(SaveToZipFile.java:159)
   at org.docx4j.openpackaging.io.SaveToZipFile.save(SaveToZipFile.java:100)
   at org.docx4j.openpackaging.packages.WordprocessingMLPackage.save(WordprocessingMLPackage.java:205)
   at org.TestMathFormulaXml.main(TestMathFormulaXml.java:163)
Caused by: org.docx4j.openpackaging.exceptions.Docx4JException: Problem saving part word/document.xml
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:259)
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:189)
   at org.docx4j.openpackaging.io.SaveToZipFile.savePart(SaveToZipFile.java:366)
   at org.docx4j.openpackaging.io.SaveToZipFile.addPartsFromRelationships(SaveToZipFile.java:329)
   ... 4 more
Caused by: javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.SAXException2: unable to marshal type "org.docx4j.math.CTR" as an element because it is missing an @XmlRootElement annotation]
   at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:328)
   at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:254)
   at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75)
   at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:192)
   at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:170)
   at org.docx4j.openpackaging.io.SaveToZipFile.saveRawXmlPart(SaveToZipFile.java:201)
   ... 7 more
Caused by: com.sun.istack.SAXException2: unable to marshal type "org.docx4j.math.CTR" as an element because it is missing an @XmlRootElement annotation
   at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:244)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:303)
   at com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:114)
   at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:152)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681)
   at com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:65)
   at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:168)
   at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:152)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681)
   at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:150)
   at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:156)
   at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:185)
   at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:305)
   at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:312)
   at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:71)
   at com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:114)
   at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:152)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:589)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:312)
   at com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:114)
   at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:152)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681)
   at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:150)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:589)
   at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:312)
   at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:490)
   at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:325)
   ... 12 more

my code is
Code: Select all
package org;

import java.io.File;
import java.util.HashMap;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.docx4j.math.CTOMath;
import org.docx4j.math.CTOMathPara;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;

@XmlRootElement
public class TestMathFormulaXml
{
private static org.docx4j.wml.ObjectFactory factory = new org.docx4j.wml.ObjectFactory();
   
public static JAXBContext context = org.docx4j.jaxb.Context.jc;

public static void insertSubSuper(String key,MainDocumentPart documentPart,WordprocessingMLPackage wordMLPackage)throws Exception
{
      
      String xpath = "//w:r[w:t[contains(text(),'"+key+"')]]";
      List<Object> list = documentPart.getJAXBNodesViaXPath(xpath, false);
      
      for(int i=0;i<list.size();i++)
      {         
         org.docx4j.wml.R r = (org.docx4j.wml.R) list.get(i);         
         org.docx4j.wml.P parent = (org.docx4j.wml.P) r.getParent();
               
         int index =parent.getContent().indexOf(r);

         parent.getContent().remove(r);
         
         org.docx4j.math.ObjectFactory mathFactory=new org.docx4j.math.ObjectFactory();
         
         org.docx4j.math.CTOMathPara para=mathFactory.createCTOMathPara();
         
         
         JAXBElement<CTOMathPara> wrapper = mathFactory.createOMathPara(para);
         
         parent.getContent().add(wrapper );
         
         CTOMath oMath=mathFactory.createCTOMath();
         
         String mr="<m:r  xmlns:ve=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" " +
               "xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" " +
               "xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" " +
               "xmlns:v=\"urn:schemas-microsoft-com:vml\" " +
               "xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" " +
               "xmlns:w10=\"urn:schemas-microsoft-com:office:word\" " +
               "xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" " +
               "xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\">" +
               "<m:rPr>" +
               "<m:sty m:val=\"p\" /> " +
               "</m:rPr>" +
               "<w:rPr>" +
               "<w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" /> " +
               "<w:sz w:val=\"30\" /> " +
               "<w:szCs w:val=\"30\" /> " +
               "</w:rPr>" +
               "<m:t>${mainDesc}</m:t> " +
               "</m:r>";
         
         String mpr=" <m:mPr xmlns:ve=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" " +
               "xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" " +
               "xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" " +
               "xmlns:v=\"urn:schemas-microsoft-com:vml\" " +
               "xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" " +
               "xmlns:w10=\"urn:schemas-microsoft-com:office:word\" " +
               "xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" " +
               "xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\">" +               
               "<m:mcs>" +
               "<m:mc>" +
               "<m:mcPr>" +
               "<m:count m:val=\"1\" /> " +
               "<m:mcJc m:val=\"center\" /> " +
               "</m:mcPr>" +
               "</m:mc>" +
               "</m:mcs>" +
               "<m:ctrlPr>" +
               "<w:rPr>" +
               "<w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" /> " +
               "<w:sz w:val=\"30\" />" +
               "<w:szCs w:val=\"30\" /> " +
               "</w:rPr>" +
               "</m:ctrlPr>" +               
               "</m:mPr>";
         
         String mmr1=retMmr("2");
         String mmr2=retMmr("3");
         
         HashMap<String, String> mappings = new HashMap<String, String>();
         mappings.put("mainDesc", "C");
         Object mrObj=org.docx4j.XmlUtils.unmarshallFromTemplate(mr, mappings,context,org.docx4j.math.CTR.class);
         oMath.getEGOMathElements().add((org.docx4j.math.CTR)mrObj);
         
         Object mprObj=org.docx4j.XmlUtils.unmarshalString(mpr,context,org.docx4j.math.CTMPr.class);
         Object mmr1Obj=org.docx4j.XmlUtils.unmarshalString(mmr1,context,org.docx4j.math.CTMR.class);
         Object mmr2Obj=org.docx4j.XmlUtils.unmarshalString(mmr2,context,org.docx4j.math.CTMR.class);
         
         org.docx4j.math.CTM ctm=mathFactory.createCTM();
         
         ctm.setMPr((org.docx4j.math.CTMPr)mprObj);
         ctm.getMr().add((org.docx4j.math.CTMR)mmr1Obj);
         ctm.getMr().add((org.docx4j.math.CTMR)mmr2Obj);
         
         oMath.getEGOMathElements().add(ctm);
         
         
         para.getOMath().add(oMath);
         
         parent.getContent().add(para);
      }
      
      
   }
   
   public static String retMmr(String val)
   {
      
      String mmr="<m:mr xmlns:ve=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" " +
               "xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" " +
               "xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" " +
               "xmlns:v=\"urn:schemas-microsoft-com:vml\" " +
               "xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" " +
               "xmlns:w10=\"urn:schemas-microsoft-com:office:word\" " +
               "xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" " +
               "xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\">" +            
            "<m:e>" +
            "<m:r>" +
            "<m:rPr>" +
            "<m:sty m:val=\"p\" />" +
            "</m:rPr>" +
            "<w:rPr>" +
            "<w:rFonts w:ascii=\"Cambria Math\" w:hAnsi=\"Cambria Math\" />" +
            "<w:sz w:val=\"30\" />" +
            "<w:szCs w:val=\"30\" />" +
            "</w:rPr>" +
            "<m:t>"+val+"</m:t>" +
            "</m:r>" +
            "</m:e>" +
            "</m:mr>";
      return mmr;
   }
   
   public static void main(String[] args)
   {
      try
      {
         
         String inputfilepath = "c:/workspace/aa.docx";
         
         WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage
               .load(new java.io.File(inputfilepath));
         MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
         
         insertSubSuper("label2",documentPart,wordMLPackage);
         
         wordMLPackage.save(new File("c:/workspace/aa_out.docx"));
      }
      catch(Exception e)
      {
         e.printStackTrace();
      }
      
   }
}



can you provide an example of inserting formula into a document? :oops:

Re: unable to marshal type "org.docx4j.math.CTOMathPara"

PostPosted: Fri Aug 26, 2011 11:35 am
by jason
Similar problem; similar solution.

From ObjectFactory:

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CTR }{@code >}}
     *
     */

    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/officeDocument/2006/math", name = "r", scope = CTOMathArg.class)
    public JAXBElement<CTR> createCTOMathArgR(CTR value) {
        return new JAXBElement<CTR>(_CTOMathArgR_QNAME, CTR.class, CTOMathArg.class, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CTR }{@code >}}
     *
     */

    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/officeDocument/2006/math", name = "r", scope = CTOMath.class)
    public JAXBElement<CTR> createCTOMathR(CTR value) {
        return new JAXBElement<CTR>(_CTOMathArgR_QNAME, CTR.class, CTOMath.class, value);
    }
 
Parsed in 0.014 seconds, using GeSHi 1.0.8.4


To work out which one you want, you should look at the schema for math, available at http://www.docx4java.org/svn/docx4j/tru ... d-math.xsd

Or you can just try both...

Re: unable to marshal type "org.docx4j.math.CTOMathPara"

PostPosted: Wed Sep 07, 2011 7:20 pm
by tosswang
hi,jason:
thank you very much your tip.i resovle the issue!

tosswang

Re: unable to marshal type "org.docx4j.math.CTOMathPara"

PostPosted: Wed Sep 07, 2011 7:42 pm
by tosswang
Your tip "Alternatively, it would be safe to add an @XmlRootElement annotation to the CTOMathPara source code." is very effective!