项目中的一个模块,需要根据模板生成word文件,提供word文件下载打印功能,采用的方案是用freemarker模板来生成word,并提供下载,现在客户需要增加一个预览功能,并希望格式跟word模板差不多,解决思路是把freemarker生成的word转html,然后就一路踩坑...
第一步先在命令行用Poi实现word转html,在github上下载来一个开源项目,github.com/whiteS18/Wo…: java.lang.NullPointerException,废了好大的劲,需要将poi包中的代码拷贝到项目中来进行修改,才解决该问题,具体可以参考blog.csdn.net/qq\_3014683….
满心欢喜进行第二步,在tomcat下拿真实的数据进行联调测试,然后在tomcat下用freemarker生成的word转html报错,这一下感觉人有点懵,怎么换个环境就不行了呢,半天没找到原因,为了证明不是环境问题,在命令行中换成freemarker生成的word文件(未用wps编辑)发现报一样的错,那就是文件格式问题了,网上一搜资料,freemark模块转换的word文件,虽然word可以下载打印,但其格式是xml文件,poi不能识别,也就是poi不认识它,转不了,又不可能一个个文件手动用wps编辑一下再生成,这下又要转换思路了。
思路一,再做一个单独的html模板,生成word的同时,用另外一个模板生成html,就不用做word转html了,由于表单较多,这个工作量有点大,放弃。
思路二,xml格式不能doc识别,能不能转一下格式?采用思路2,尝试用jacob转xml doc为标准doc.参考www.zhihu.com/question/41… doc转成标准doc,然后再在命令行中用freemark模块转换的word文件转html成功。
本以为看到大功告成希望的曙光了,继续在tomcat中联调,也不报错了,又出现一个奇怪的问题,在命令行里面转换成的html中文显示一切正常,到tomcat里面后转标准doc中文显示正常,转html,全部乱码,又被这个坑卡住了。网上找资料看是否解决办法,只找到个没太多养分的帖子blog.csdn.net/daocaoren92…
卡的没办法了,只能在tomcat中反复调试看是否有解决问题的办法,因为在命令行里面一切正常,在tomcat里面运行就报错,尝试将tomcat中的配置改成URIEncoding="UTF-8",失败。然后就拿着源码一步步调试,调试时发现到了 wordToHtmlConverter.processDocument(wordDocument);
org.w3c.dom.Document htmlDocument = wordToHtmlConverter.getDocument(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); DOMSource domSource = new DOMSource(htmlDocument);
StreamResult streamResult = new StreamResult(baos);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer serializer = tf.newTransformer(); serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); serializer.setOutputProperty(OutputKeys.INDENT, "yes"); serializer.setOutputProperty(OutputKeys.METHOD, "html"); serializer.transform(domSource, streamResult);
baos.close();
content = baos.toString();
content=baos.toString()这行时,content中就是乱码了,也就是说问题很可能出现在这里,我考虑对baos这个ByteArrayOutputStream数据进行编码处理,将代码改成, wordToHtmlConverter.processDocument(wordDocument);
org.w3c.dom.Document htmlDocument = wordToHtmlConverter.getDocument(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
DOMSource domSource = new DOMSource(htmlDocument);
StreamResult streamResult = new StreamResult(baos);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer serializer = tf.newTransformer(); serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); serializer.setOutputProperty(OutputKeys.INDENT, "yes"); serializer.setOutputProperty(OutputKeys.METHOD, "html"); serializer.transform(domSource, streamResult);
baos.close();
byte[] lens = baos.toByteArray();
content= new String(lens,"utf-8");
再拿到tomcat里面运行,终于拨开云雾见天日,终于没有乱码了。 此次踩坑较多,且是连环坑,坑的差点看不到出路了,最终虽然侥幸填好了坑,把这次经历分享出来,希望大家碰到类似的情况下能顺利解决问题。