3

MathMLを使用していくつかのデータブロックを作成し、OpenXMLSDKを介してdocxファイルに挿入する必要があります。それは可能だと聞きましたが、私はそれを管理しませんでした。誰かがこの問題で私を助けることができますか?

4

1 に答える 1

10

私の知る限り、OpenXml SDK はそのままではプレゼンテーション MathML をサポートしていません。

代わりに、OpenXml SDK は Office MathML をサポートしています。したがって、プレゼンテーション MathML を Word 文書に挿入するには、まずプレゼンテーション MathML を Office MathML に変換する必要があります。

さいわい、Microsoft はプレゼンテーション MathML を Office MathML に変換する XSL ファイル ( MML2OMML.xslと呼ばれる) を提供しています。MML2OMML.xsl ファイルは の下にあり%ProgramFiles%\Microsoft Office\Office12ます。.Net Framework クラスと組み合わせて、 XslCompiledTransformプレゼンテーション MathML を Office MathML に変換できます。

次のステップはOfficeMath、変換された MathML からオブジェクトを作成することです。このOfficeMathクラスは、Office Open XML Math であるかのように処理される WordprocessingML を含む実行を表します。詳細については、MSDNを参照してください。

プレゼンテーション MathML にはフォント情報が含まれていません。良い結果を得るには、作成したOfficeMathオブジェクトにフォント情報を追加する必要があります。

最後のステップで、OfficeMathオブジェクトを Word 文書に追加する必要があります。以下の例では、 template.docxParagraphという単語文書の最初のものを検索し、見つかった段落にオブジェクトを追加します。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);
    }
  }
}
于 2012-06-12T20:46:09.730 に答える