gpt4 book ai didi

OpenXML SDK 和 MathML

转载 作者:行者123 更新时间:2023-12-01 08:35:39 32 4
gpt4 key购买 nike

我使用 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com