mathml和openxml互转

需求:在线编辑试卷,支持word导入,导出,支持数学公式。

这个需求在教育行业还是比较普遍的,就功能上来讲并没有什么难度的,只是这个公式弄起来有点麻烦,但至少是可以弄的。主要分为下面两个大流程

从html到word

前端公式编辑器当时我用的是mathmlEditor,当然现在可能有更好的编辑器了,毕竟已经过了3,4年了。不管用什么编辑器,至少满足两个要求,一是支持公式编辑, 二是公式有对应的mathml,并且可以传到后台。

数据到后台后我们有两个主要问题:一是如何生成word,二是如何将mathml转成word可以识别的openxml。

生成word的方法有很多种,这里介绍两种。一种是基于模板的方式,这种方式比较简单;另一种是第三方api如docx4j。前者一般适用于一些比较固定的格式,后者比较灵活,想要什么 样的格式完全自定义,当然也要花一定的时间熟悉第三方的api。

模板来源于自己定义好的word,另存为xml格式,把要替换的地方用特殊的标签替代,然后用比如freemartker这样的工具将真正的内容写入的模板中即可,这种方式网上的代码很多,大家有需要可以自己找找。 笔者当时的业务比较多,是要html转word的,html中是带样式的,这个是不可控的,因此当时选用的是docx4j的,这个还是比较强大的,常见的html中的功能都能实现,也是比较推荐的一种。效果图见:https://bbs.csdn.net/topics/390493859。当时弄好这个就离职 去上海了,后面就没有从事这个行业,也没有再关心过这个问题,所以没有在上面进行详细说明解决方案,还有可能是当时太年轻,并没有开源的思想,后来偶尔上csdn上发现好多同学发来私信问了这个问题,因为太多,平常也没那么多时间一个一个去说,毕竟东西很多,后来选择几个帮助 他们完成相应的需求,记得完成后我还请他们把方案放在这个贴子上,可是最终并没有,后面还是有不少人问这个问题,于是就有了这遍博客。当然这都是题外话。docx4j的官网是:https://www.docx4java.org/trac/docx4j,github:https://github.com/plutext/docx4j 当时用的时候是2.8的版本, 还是有一些bug,不过影响不大,自己跟着源码也能改掉。几年时间,现在再看看已是3.3.7的,当时的bug应该不存在了。

好了,生成word方式结束了,还有一个重要的问题:怎么样从mathml转openxml,解决这个问题后那么一切也都不是问题。说真的这个当时真是花的太多的精力,记得当时mathml是可以导入一个有公式的word的, 这说明至少这个前端工具做到这点了,后来跟着这个思路找到了acitonscript3的代码,只可惜是被混淆的,而且代码是真的多,一开始想一行行来翻译成java,试了几天就放弃了,感觉这工作量应该是一个团队做的事。 不是我一个人能搞的了的,所以果断放弃。可能也是上天的卷顾,当时在一家国外网站找到了这个jar,网站名子我忘记了,只记得是要翻墙的。因为之前帮过个别人实现过这个功能,所以当时就向第一个人那要了这个jar,以防后面需要,事实证明确实是明智之举啊。 文末我会给出这样的工程,有需要的下载即可。有什么问题欢迎留言,因为精力有限,网站体验没有做的很好,大家也就将就用哈,有精力必回复!

从word到html

有了这个jar,实际上这个问题也没那么难了。当时的需求是word转成html,用openoffice服务可以将docx转成html,只是处理不了公式,不知道现在行不行,没有试过。所以我们只需要在转之前将里面的公式标签转 成mathml就可以了。docx文件改成zip解压后点点你们的文件,有具document.xml,里面是主要的内容,也可以看到里面的公式的实现方式。处理逻辑是直接修改文件 将里面的公司标签提取出来转成mathml再写进去就可以了。当时firefox,chrome是直接支持mathml的,所以转出来后可以直接显示了,ie好像要装个什么插件,现在不知道支不支持。

项目地址见:http://www.storm-spirit.cn/

猜你喜欢

转载自blog.csdn.net/tlfu_12344/article/details/82183519