java通过freemarker导出包含富文本图片的word文档
廢話不多說(shuō),進(jìn)入正題!
本文重點(diǎn)在于:對(duì)富文本圖片的導(dǎo)出(基礎(chǔ)的freemarker+word模板導(dǎo)出這里不做詳細(xì)解說(shuō)哈)
參考文章:Java 實(shí)現(xiàn)HTML富文本導(dǎo)出至word完美解決方案 - 廖飛 - 博客園
(ps:大神的東西太深?yuàn)W~~懵逼了
一周才搞定,為了方便后來(lái)在更加簡(jiǎn)單,清晰的學(xué)習(xí),樓主寫下這篇博客,感謝大神給了我個(gè)完善和進(jìn)步的機(jī)會(huì),也希望后來(lái)在繼續(xù)完善)
先說(shuō)一下思路:由于我們是要用word來(lái)解析帶圖片的富文本(說(shuō)白了就是解析一段html,當(dāng)然這段html代碼是包含img標(biāo)簽:圖片),so...傳統(tǒng)的word模板導(dǎo)出(word另存為xml,在修改后綴為ftl)是行不通的,因?yàn)樗馕霾涣薶tml代碼(至少我目前沒(méi)有找到這方便的解決方案,大神勿噴~),這樣的話我就要換用一種模板來(lái)處理這個(gè)模板:word模板另存為mht格式,再修改后綴為ftl。剩下的就是后臺(tái)操作了,找到你存富文本的字段(html代碼)獲取里面的img標(biāo)簽,找到圖片,并把圖片解析為base64字符串,填充到我們只做的模板上就ok了,大體思路就這樣了
一、模板制作(這個(gè)很重要)
提示:這里模板用office word來(lái)做,不要用wps
創(chuàng)建word文件:
,我這里用第二個(gè)content來(lái)顯示我們要的富文本,然后將我們的word文件另存為mht文件,
最后我們就拿到我們要的mht模板了,這僅僅是個(gè)開(kāi)始...各位看官往下看
打開(kāi)我們的mht文件并處理:在我們的文件里面找到下面這些東西,如果沒(méi)有找到呢?....這個(gè)問(wèn)題,我就只有呵呵了
${imagesBase64String} 和?${imagesXmlHrefString}這兩個(gè)是我們手動(dòng)加進(jìn)去的,簡(jiǎn)析富文本圖片的核心就在這里(反正我也是蒙的~)
全文檢索gb2312把他改成utf-8,同時(shí)需要加上3D前綴,對(duì)應(yīng)著格式來(lái)改 一般就這兩種:
<meta http-equiv=3DContent-Type content=3D"text/html; charset=3Dutf-8">和Content-Type: text/html; charset=3D"utf-8"
提示:所有的都要改成utf-8(你不改也是可以的)
然后保存一下,再把文件的后綴名改成ftl格式的就ok了(模板處理到此結(jié)束)
二、解析html
這個(gè)大家不陌生吧?陌生的自己打臉去,下面的那三個(gè)我依然懵逼
handler.handledHtml(false);
String bodyBlock = handler.getHandledDocBodyBlock();
data.put("content", bodyBlock); ? 處理后的html代碼塊
data.put("imagesXmlHrefString", xmlimaHref);
data.put("imagesBase64String", handledBase64Block); ?這兩個(gè)大家還有印象吧?沒(méi)錯(cuò)就是我們之前手動(dòng)在mht模板里加的那兩貨!
三、填充模板
String docFilePath = "d:\\temp.doc"; System.out.println(docFilePath); File f = new File(docFilePath); OutputStream out; try {out = new FileOutputStream(f);WordGeneratorWithFreemarker.createDoc(data, "temp.ftl", out);} catch (FileNotFoundException e) {} catch (MalformedTemplateNameException e) {e.printStackTrace(); } catch (ParseException e) {e.printStackTrace(); } catch (IOException e) {e.printStackTrace(); }?
四、導(dǎo)出word(帶富文本圖的喲)
public static void createDoc(Map<String, Object> dataMap,String templateName, OutputStream out)throws Exception {Template t = configuration.getTemplate(templateName);t.setEncoding("utf-8");WordHtmlGeneratorHelper.handleAllObject(dataMap);try {Writer w = new OutputStreamWriter(out,Charset.forName("utf-8"));t.process(dataMap, w);w.close();} catch (Exception ex) {ex.printStackTrace();throw new RuntimeException(ex);}}五、測(cè)試(main)
public static void main(String[] args) throws Exception {HashMap<String, Object> data = new HashMap<String, Object>();StringBuilder sb = new StringBuilder();sb.append("<div>");sb.append("<img style='height:100px;width:200px;display:block;' src='F:\\aaa.png' />");sb.append("<img style='height:100px;width:200px;display:block;' src='F:\\bbb.png' />");sb.append("</br><span>中國(guó)夢(mèng),幸福夢(mèng)!</span>");sb.append("</div>");RichHtmlHandler handler = new RichHtmlHandler(sb.toString());handler.setDocSrcLocationPrex("file:///C:/8595226D");handler.setDocSrcParent("file3405.files");handler.setNextPartId("01D214BC.6A592540");handler.setShapeidPrex("_x56fe__x7247__x0020");handler.setSpidPrex("_x0000_i");handler.setTypeid("#_x0000_t75");handler.handledHtml(false);String bodyBlock = handler.getHandledDocBodyBlock();System.out.println("bodyBlock:\n"+bodyBlock);String handledBase64Block = "";if (handler.getDocBase64BlockResults() != null&& handler.getDocBase64BlockResults().size() > 0) {for (String item : handler.getDocBase64BlockResults()) {handledBase64Block += item + "\n";}}data.put("imagesBase64String", handledBase64Block);String xmlimaHref = "";if (handler.getXmlImgRefs() != null&& handler.getXmlImgRefs().size() > 0) {for (String item : handler.getXmlImgRefs()) {xmlimaHref += item + "\n";}}data.put("imagesXmlHrefString", xmlimaHref);data.put("name", "張三");data.put("content", bodyBlock);String docFilePath = "d:\\temp.doc";System.out.println(docFilePath);File f = new File(docFilePath);OutputStream out;try {out = new FileOutputStream(f);WordGeneratorWithFreemarker.createDoc(data, "temp.ftl", out);} catch (FileNotFoundException e) {} catch (MalformedTemplateNameException e) {e.printStackTrace();} catch (ParseException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}?查看結(jié)果:
到此~導(dǎo)出word帶富文本圖片的功能就借宿了,詳細(xì)代碼我放在附件里面(這里著重講mht模板的一些改動(dòng),處理富文本的java代碼我就沒(méi)有單獨(dú)貼出來(lái)了哈,demo里面有哦)
有完整的demo,大家放心不會(huì)像我一樣懵逼一周了 哈哈
開(kāi)玩笑的~!話說(shuō)我從開(kāi)始到完整的做出來(lái) 還是花了5天左右的時(shí)間,
再次感謝參考的文章:Java 實(shí)現(xiàn)HTML富文本導(dǎo)出至word完美解決方案 - 廖飛 - 博客園
最后在再給大家擴(kuò)展一下:一個(gè)word 出現(xiàn)多個(gè)富文本,并且每個(gè)富文本有多個(gè)圖片的思路:
String old_handledBase64Block = "";if(data.containsKey("imagesBase64String")){old_handledBase64Block = (String) data.get("imagesBase64String");handledBase64Block = old_handledBase64Block + handledBase64Block;}data.put("imagesBase64String", handledBase64Block);簡(jiǎn)單說(shuō)一下 ,其實(shí)就是在處理下一個(gè)富文本的時(shí)候 要拿到上一個(gè)富文本里面處理中的"imagesBase64String" 再把它累加起來(lái),
不然后面的會(huì)給前面的覆蓋掉~"imagesXmlHrefString"這個(gè)也是一樣的
?
?各位看官!搞懂這個(gè)是不是覺(jué)得單純的圖片導(dǎo)出太簡(jiǎn)單了哇 哈哈(話說(shuō)我還沒(méi)用過(guò)單純的圖片導(dǎo)出)
demo源碼: https://pan.baidu.com/s/1U5-_9NaR80Q3bstL5i1atw
提取碼: 838a?
或者
鏈接:https://pan.baidu.com/s/1U_uFZpcrGlCsRxPjbHyeDg?
提取碼:etuo
總結(jié)
以上是生活随笔為你收集整理的java通过freemarker导出包含富文本图片的word文档的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: centos7通过startx后进入图形
- 下一篇: 实现左侧菜单二级下拉菜单,