Вопрос по openxml-sdk, c#, openxml, ms-word, equations – Как разобрать mathML в выводе WordOpenXML?

4

Я хочу прочитать только XML, используемый для генерации уравнения, которое я получил с помощьюParagraph.Range.WordOpenXML, Но раздел, используемый для уравнения не в соответствии сMathML который, как я обнаружил, чтоEquation Microsoft находится в.MathML

Нужно ли использовать какой-то специальный конвертер для получения желаемого xmls или есть другие способы?

Ваш Ответ

1   ответ
6

OMML2MML.XSL файл (находится под%ProgramFiles%\Microsoft Office\Office15) преобразовыватьMicrosoft Office MathML (уравнения), включенные в документ Word вMathML.

Приведенный ниже код показывает, как преобразовать уравнения в текстовом документе в MathML, используя следующие шаги:

Откройте документ Word с помощью OpenXML SDK (версия 2.5).Создайте XslCompiledTransform и загрузите файл OMML2MML.XSL.Преобразуйте документ word, вызвав метод Transform () в созданном экземпляре XslCompiledTransform.Вывести результат преобразования (например, распечатать на консоли или записать в файл). I '

Мы проверили приведенный ниже код с помощью простого текстового документа, содержащего два уравнения, текст и рисунки.

using System.IO;
using System.Xml;
using System.Xml.Xsl;
using DocumentFormat.OpenXml.Packaging;

public string GetWordDocumentAsMathML(string docFilePath, string officeVersion = "14")
{
    string officeML = string.Empty;
    using (WordprocessingDocument doc = WordprocessingDocument.Open(docFilePath, false))
    {
        string wordDocXml = doc.MainDocumentPart.Document.OuterXml;

        XslCompiledTransform xslTransform = new XslCompiledTransform();

        // The OMML2MML.xsl file is located under 
        // %ProgramFiles%\Microsoft Office\Office15\
        xslTransform.Load(@"c:\Program Files\Microsoft Office\Office" + officeVersion + @"\OMML2MML.XSL");

        using (TextReader tr = new StringReader(wordDocXml))
        {
            // Load the xml of your main document part.
            using (XmlReader reader = XmlReader.Create(tr))
            {
                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 OfficeMathML to MathML.
                    xslTransform.Transform(reader, xw);
                    ms.Seek(0, SeekOrigin.Begin);

                    using (StreamReader sr = new StreamReader(ms, Encoding.UTF8))
                    {
                        officeML = sr.ReadToEnd();
                        // Console.Out.WriteLine(officeML);
                    }
                }
            }
        }
    }
    return officeML;
}

Чтобы преобразовать только одно уравнение (а не весь текст документа), просто запросите нужноеОфисный математический абзац (m: oMathPara) и использоватьOuterXML свойство этого узла. Код ниже показывает, как запросить первый абзац по математике:

string mathParagraphXml = 
      doc.MainDocumentPart.Document.Descendants<documentformat.openxml.math.paragraph>().First().OuterXml;
</documentformat.openxml.math.paragraph>

Используйте возвращенный XML для подачи.TextReader

Опять же @Hans это работает отлично для случая всего документа, но использование только определенного узла oMath не работает ..? Как это должно быть сделано ..? serene
Обратите внимание, что если вы работаете в самом Word, вы можетеЗаменить Document.Content.XML. Вы должны сохранить документ, закрыть его или сделать копию (вы можетепока читаюs откройте в Word), а затем откройте его с помощью OpenXML SDK. Уравнения в Document.Content.XML экранируются и встраиваются в объект формы. Chris
@JeremyThompson: TheWordprocessingDocument это класс, который представляет собой документ Word. Класс включен в OpenXML SDK от Microsoft. Hans
@ Ганс, не могли бы вы сказать мне, чтоWordprocessingDocument ссылка есть? Спасибо Jeremy Thompson

Похожие вопросы