首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenXML SDK和MathML

OpenXML SDK和MathML
EN

Stack Overflow用户
提问于 2012-06-12 17:13:01
回答 1查看 4.7K关注 0票数 3

我使用MathML创建了一些数据块,我需要通过OpenXML SDK将其插入到docx文件中。我听说这是可能的,但我没有做到。有人能帮我解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-13 04:46:10

据我所知,OpenXml SDK不支持开箱即用的presentation MathML。

相反,Office支持OpenXml MathML。因此,要将演示文稿MathML插入到word文档中,我们首先必须将演示文稿MathML转换为MathML。

幸运的是,微软提供了一个XSL文件(称为MML2OMML.xsl)来将presentation MathML转换为Office MathML。文件MML2OMML.xsl位于%ProgramFiles%\Microsoft Office\Office12下。结合.Net框架类XslCompiledTransform,我们能够将presentation MathML转换为.Net MathML。

下一步是从转换后的MathML创建一个OfficeMath对象。OfficeMath类表示包含WordprocessingML的运行,应将其作为Office Open XML Math进行处理。有关更多信息,请参阅MSDN

演示文稿MathML不包含字体信息。为了得到好的结果,我们必须将字体信息添加到创建的OfficeMath对象中。

在最后一步中,我们必须将OfficeMath对象添加到word文档。在下面的示例中,我只是在名为template.docx的word文档中搜索第一个Paragraph,并将OfficeMath对象添加到找到的段落中。

代码语言:javascript
复制
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);
    }
  }
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10993621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档