OpenXML SDK 和 MathML

标签 openxml docx equation mathml

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

最佳答案

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

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

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

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

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

在最后一步中,我们必须将 OfficeMath 对象添加到我们的 word 文档中。 在下面的示例中,我只是搜索第一个 Paragraph 名为 template.docx 的 word 文档,并将 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);
    }
  }
}

关于OpenXML SDK 和 MathML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10993621/

相关文章:

java - 离散余弦变换实现

python - 求解指数方程给出多个解

excel - 更改宏的默认图标

c# - 如何使用 Novacode DocX 在表上设置 "keep with next"属性?

replace - 如何使用 Novacode Docx 替换 word 文档中的图像

image - 从 markdown 到 docx 的 pandoc 转换的图形大小

java - 嵌套 if 语句没有字符串

c# - 往返 XML -> Excel -> XML

c# - 在 C# 的 excel 文档中执行查找和替换

javascript - 如何使用 Word JS API 删除插入的 OOXML 注释?