Добавить уравнение в документ WordX для обработки OpenXML и отобразить в профессиональном формате - PullRequest
0 голосов
/ 14 января 2019

Я использую OpenXML, чтобы создать документ обработки текста и добавить уравнения. Я могу добавить уравнения, и они правильно отображаются в документе при открытии в MS Word, но они отображаются в линейном формате, а не в профессиональном формате. Достаточно просто изменить отображение на «профессиональный» из Word, но я бы предпочел, чтобы уравнения отображались правильно с самого начала. Можно ли программно управлять этим через Open XML? Мой тестовый код ниже.

using System;
using System.IO;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string sourceFile = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\test\equationTemplate.dotx";
            string destinationFile = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\test3.docx";
            // Create a copy of the template file and open the copy
            File.Copy(sourceFile, destinationFile, true);
            using (WordprocessingDocument document = WordprocessingDocument.Open(destinationFile, true))
            {
                document.ChangeDocumentType(DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
                MainDocumentPart mainPart = document.MainDocumentPart;
                DocumentSettingsPart documentSettingPart1 = mainPart.DocumentSettingsPart;
                AttachedTemplate attachedTemplate1 = new AttachedTemplate() { Id = "relationId1" };
                documentSettingPart1.Settings.Append(attachedTemplate1);
                documentSettingPart1.AddExternalRelationship("http://schemas.openxmlformats.org/officeDocument/2006/relationships/attachedTemplate", new Uri(sourceFile, UriKind.Absolute), "relationId1");
                mainPart.Document = new Document();
                Body body = mainPart.Document.AppendChild(new Body());
                Paragraph para = body.AppendChild(new Paragraph());
                var para2 = para.AppendChild(new DocumentFormat.OpenXml.Math.Paragraph());
                DocumentFormat.OpenXml.Math.OfficeMath myMath = new DocumentFormat.OpenXml.Math.OfficeMath(new Run(new Text(@"M=\frac{wl^2}{8}")));
                para2.AppendChild(myMath);
                mainPart.Document.Save();
            }
        }
    }
}

Я использовал инструмент повышения производительности OpenXML для сравнения документов Word с линейным и профессиональным форматированием, и разница показана ниже. Я думаю, что мне нужен эквивалент метода OMath.BuildUp () в Interop.Word для генерации более сложного XML, но я не могу найти его нигде в OpenXML.

 <m:oMathPara>
        <m:oMath>
         <m:r>
          <w:rPr>
           <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
          </w:rPr>
          <m:t>
           M=\frac{wl^2}{8}
          </m:t>
         </m:r>
        </m:oMath>
       </m:oMathPara>


   <m:oMathPara>
    <m:oMath>
     <m:r>
      <w:rPr>
       <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
      </w:rPr>
      <m:t>
       M=
      </m:t>
     </m:r>
     <m:f>
      <m:fPr>
       <m:ctrlPr>
        <w:rPr>
         <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
        </w:rPr>
       </m:ctrlPr>
      </m:fPr>
      <m:num>
       <m:r>
        <w:rPr>
         <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
        </w:rPr>
        <m:t>
         w
        </m:t>
       </m:r>
       <m:sSup>
        <m:sSupPr>
         <m:ctrlPr>
          <w:rPr>
           <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
           <w:i/>
          </w:rPr>
         </m:ctrlPr>
        </m:sSupPr>
        <m:e>
         <m:r>
          <w:rPr>
           <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
          </w:rPr>
          <m:t>
           l
          </m:t>
         </m:r>
        </m:e>
        <m:sup>
         <m:r>
          <w:rPr>
           <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
          </w:rPr>
          <m:t>
           2
          </m:t>
         </m:r>
        </m:sup>
       </m:sSup>
       <m:ctrlPr>
        <w:rPr>
         <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
         <w:i/>
        </w:rPr>
       </m:ctrlPr>
      </m:num>
      <m:den>
       <m:r>
        <w:rPr>
         <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
        </w:rPr>
        <m:t>
         8
        </m:t>
       </m:r>
       <m:ctrlPr>
        <w:rPr>
         <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
         <w:i/>
        </w:rPr>
       </m:ctrlPr>
      </m:den>
     </m:f>
    </m:oMath>
   </m:oMathPara>
...