在一次调试考试系统bug时遇到的问题,功能是word录入一些题目,解析其中的数学公式转为浏览器可显示的图片。
正常的最新版的word插入的公式是DocumentFormat.OpenXml.Math.OfficeMath类,
这时主要是通过MathML渲染器Jeuclid
来将文档中的数学公式xml转换为png。
但是当使用旧版本的word时,插入的公式为objectElement形式,这时上面提到的方法就不能用了,
仔细查看word中包含数学公式的xml片段,发现其中包含一个
通过查看XWPFDocument(POI提供的word文档解析)的API可以获取文档的所有图片内容,另外还有一个根据ID来获取图片信息的方法,
通过尝试,可以直接通过rid直接获取到对应的图片数据,
其中大部分是wmf格式,少部分是emf格式,考虑到浏览器不支持显示这两种格式图片,就打算转为png格式。
其中主要用到了Apache提供的jar包batick-codec相关maven依赖如下
|
|
主要用到了其中的WMFTranscoder类和JPEGTranscoder类,
WMFTranscoder负责将wmf转为svg,PNGTranscoder将svg转为jpeg,或者用JPEGTranscoder,示例代码如下
其中操作文件流的代码可能不规范,毕竟我只是个前端开发0.0,细节就请忽略吧。
需要注意的是,在linux服务器上使用该包时会出现一些问题,因为大多linux服务器是不带图形用户界面的,这时候会报一系列和X11 Server相关的错误,
最后我也没解决,主要还是Xserver安装总出错,启动不起来,有时间再研究一下
最后没办法我就只能用另一种方法将wmf转为svg之后,将svg的字节流直接转为base64的字符串在浏览器段显示了,考虑到公式文件不大,也就凑活用了
maven依赖为
|
|
最后通过下面代码转为图片的base64
另外就是将emf图片转为png的问题了,
maven依赖:
代码如下:
其中IOUtils是POI的一个工具类,简化文件的一些操作,看方法名就知道了,具体细节有问题的可以留言或通过其他方式来告知。
需要注意的问题是该类也默认需要GUI,这点可以通过设置java的启动参数来修改,让java不去调用系统硬件,自己来实现其功能:-Djava.awt.headless=true
本来以为可以一并解决上边transcoder对X11的调用,结果并未如愿,有大神解决过相关问题的希望可以留言指导下,
✧(≖ ◡ ≖✿)嘿嘿