2012-06-12 4 views
3

Я использую MathML для создания некоторых блоков данных, и мне нужно вставить его через OpenXML SDK в файл docx. Я слышал, что это возможно, но я не справился с этим. Может ли кто-нибудь помочь мне с этой проблемой?OpenXML SDK и MathML

ответ

7

Насколько я знаю, OpenXML SDK не поддерживает презентацию MathML из коробки.

Вместо этого OpenXML SDK поддерживает Office MathML. Итак, чтобы вставить презентацию MathML в документ Word, у нас сначала есть , чтобы преобразовать презентацию MathML в Office MathML.

К счастью, Microsoft предоставляет XSL-файл (называемый MML2OMML.xsl) для преобразования представления MathML в офис MathML. Файл MML2OMML.xsl находится под %ProgramFiles%\Microsoft Office\Office12. В сочетании с классом .Net Framework XslCompiledTransform мы можем преобразовать презентацию MathML в Office MathML.

Следующим шагом является создание объекта OfficeMath из преобразованного MathML. Класс OfficeMath представляет собой пробел, содержащий WordprocessingML, который обрабатывается так, как если бы это был Office Open XML Math. Для получения дополнительной информации см. MSDN.

Презентация MathML не содержит информации о шрифте. Чтобы получить хороший результат , мы должны добавить информацию о шрифте в созданный объект OfficeMath.

На последнем этапе мы должны добавить объект OfficeMath к нашему слову. В приведенном ниже примере я просто ищу первый Paragraph в текстовом документе под названием template.docx и добавьте объект OfficeMath к найденному абзацу.

XslCompiledTransform xslTransform = new XslCompiledTransform(); 

// The MML2OMML.xsl file is located under 
// %ProgramFiles%\Microsoft Office\Office12\ 
xslTransform.Load("MML2OMML.xsl"); 

// Load the file containing your MathML presentation markup. 
using (XmlReader reader = XmlReader.Create(File.Open("mathML.xml", FileMode.Open))) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
    XmlWriterSettings settings = xslTransform.OutputSettings.Clone(); 

    // Configure xml writer to omit xml declaration. 
    settings.ConformanceLevel = ConformanceLevel.Fragment; 
    settings.OmitXmlDeclaration = true; 

    XmlWriter xw = XmlWriter.Create(ms, settings); 

    // Transform our MathML to OfficeMathML 
    xslTransform.Transform(reader, xw); 
    ms.Seek(0, SeekOrigin.Begin); 

    StreamReader sr = new StreamReader(ms, Encoding.UTF8); 

    string officeML = sr.ReadToEnd(); 

    Console.Out.WriteLine(officeML); 

    // Create a OfficeMath instance from the 
    // OfficeMathML xml. 
    DocumentFormat.OpenXml.Math.OfficeMath om = 
     new DocumentFormat.OpenXml.Math.OfficeMath(officeML); 

    // Add the OfficeMath instance to our 
    // word template. 
    using (WordprocessingDocument wordDoc = 
     WordprocessingDocument.Open("template.docx", true)) 
    { 
     DocumentFormat.OpenXml.Wordprocessing.Paragraph par = 
     wordDoc.MainDocumentPart.Document.Body.Descendants<DocumentFormat.OpenXml.Wordprocessing.Paragraph>().FirstOrDefault();   

     foreach (var currentRun in om.Descendants<DocumentFormat.OpenXml.Math.Run>()) 
     { 
     // Add font information to every run. 
     DocumentFormat.OpenXml.Wordprocessing.RunProperties runProperties2 = 
      new DocumentFormat.OpenXml.Wordprocessing.RunProperties(); 

     RunFonts runFonts2 = new RunFonts() { Ascii = "Cambria Math", HighAnsi = "Cambria Math" };   
     runProperties2.Append(runFonts2); 

     currentRun.InsertAt(runProperties2, 0); 
     } 

     par.Append(om); 
    } 
    } 
} 
+0

Большое спасибо за ваш ответ! Я очень ценю это! Я уже пробовал свой код, и у меня был успех! Вы спасли меня! Еще раз спасибо! – user1450792

+0

@ user1450792: Добро пожаловать! Пожалуйста, примите мой ответ, нажав на галочку рядом с ответом, чтобы переключить его с полого на зеленый. – Hans

+0

Очень хорошее решение @ Ханс. Но как я могу сделать обратное. Я хочу преобразовать xml-содержимое текстового файла с OMML в обычный текст, содержащий MML ..!? – serene

Смежные вопросы