我正在写一个从XML&MathML到MS Word文档的转换器。
我使用的是MFC和Word自动化,所以像这样编写文本没有问题:
_Application app;
COleVariant vtOpt(DISP_E_PARAMNOTFOUND, VT_ERROR),
vtTrue((short)TRUE),
vtFalse((short)FALSE);
app.CreateDispatch("Word.Application",NULL);
Documents docs = app.GetDocuments();
_Document doc = docs.Add (vtOpt, vtOpt, vtOpt, vtOpt);
Range range = doc.Range (vtOpt, vtOpt);
range.InsertAfter (_T("Hello Word!"));现在的问题是如何将MathML方程式转换为嵌入式MathType对象。我发现的一种可能的方法是用TeX编写公式,然后以编程方式调用MTCommand_TeXToggle (在Word的MathType 6.5库中找到)宏,它将TeX替换为MathType OLE对象。但是,我必须以某种方式将MathML转换为TeX,这并不容易。
我知道,MathType OLE对象应该接受原始MathML数据,但是当我试图以编程方式创建和访问OLE对象时:
InlineShapes shapes = doc.GetInlineShapes ();
InlineShape control = shapes.AddOLEObject (COleVariant("Equation.DSMT4"), vtOpt, vtFalse, vtFalse, vtOpt, vtOpt, vtOpt, vtOpt);
OLEFormat fm = control.GetOLEFormat ();
COleDispatchDriver drv = fm.GetObject();最终,我没有合理的接口来向它提供MathML数据。因此,问题是: 1)有没有一种方法可以控制OLE对象并向其发送一些MathML数据?或者2)有没有办法获得一个MS Word VB宏,将所选内容从MathML转换为MathType OLE对象?
先谢谢你,尼克·斯坦奇
发布于 2009-06-12 19:13:01
破解了!
用户可以在其代码中使用COleClientItem对象来获取MathType OLE控件的实例。如MathType SDK MFC示例中所示。然后,操作COleDataSource,向控件提供MathML数据,并调用COleClientItem::CopyToClipboard();。现在,在从Word自动化类进行Range::Paste(opt1, opt2);调用时,可以使用表示控件本身的数据作为OLE对象。看起来有点奇怪,但对我来说很有效:),您所要做的就是向示例中再添加一行,即调用CopyToClipboard方法的那一行。
发布于 2009-06-10 14:16:20
尼克,你应该试试我们的MathType软件开发工具包。它是“按原样”提供的,但它是免费的:http://www.dessci.com/en/reference/sdk/
罗尔,谢谢你的好话。我会把这个传给我们的支持团队。
鲍勃·马修斯设计科学
下面是关于我推荐试用MathType 的一些说明和其他信息。从MathType 6.5开始,可以在MathType对象上使用IDataObject接口传入MathML。MathML编码的表达式将插入到当前光标位置。因此,一般来说,策略是插入一个空的MathType公式,激活它,进入IDataObject界面,通过MathML设置公式,然后再次关闭公式。
MathType软件开发工具包包括更详细的文档,以及演示该技术的示例"OLECont“应用程序。根据您在这里发布的内容,您应该可以让您的代码正常工作。
发布于 2009-06-10 10:21:59
我能提供的唯一建议是,我总是发现设计科学的支持是相当好的。您可能希望询问他们的OLE接口是否提供MathML支持。
我还没有研究过Word 2007公式编辑器。如果它有一个不同的自动化接口,也许它可以更容易地导入其他格式。
https://stackoverflow.com/questions/969406
复制相似问题