java freemarker 导出富文本到Word文档

最近一直在加班 导致看到代码就想吐 今天抽出时间来记录一下 用freemaker导出富文本信息

之前使用freemaker导出图片等信息时 使用的是xml方式,不明白的 可以看 freemaker生成Word文档(图片、超链接)

由于xml方式 不识别

等这种HTML标签,所以只能使用mht方式来解决,话不多说 干起来!

我是看到 前辈 的文章 才 有所启发!

1.准备好模板

这里我要强调一下 模板里面插入图片时 不要使用插入->上传图片,这样会是超链接的形式,里面使用的绝对路径 当把文档转给他人时 图片显示不出来

java freemarker 导出富文本到Word文档_第1张图片   这种上传图片方式是错误的  应该直接复制图片到Word文档中

此时,模板已生成

java freemarker 导出富文本到Word文档_第2张图片

将模板内容替换为占位符(${})形式  此时建议保留图片 这样分析文档结构 方便些

java freemarker 导出富文本到Word文档_第3张图片

后另存为 单个文件网页(*.mht,*.mhtml)文件,于是生成一个.mht文件  最后调整后缀名为ftl文件

 

2.ftl占位符修改

  • 全文检索gb2312/utf-8把他改成utf-8,同时需要加上3D前缀

java freemarker 导出富文本到Word文档_第4张图片

  • ${}占位符 中间会生成一些其他字符 需要将其他扰乱信息去掉 只保留占位符

  • 记住这三处标识  【NextPart_ 和 Content-Location】 这里文档 全都是一样的 所以在生成图片base64定义时  也要保持一致

java freemarker 导出富文本到Word文档_第5张图片

  • 添加  ${imagesBase64String!""} 标识    在folHlink下面添加 该标识 存放图片base64信息

java freemarker 导出富文本到Word文档_第6张图片

  • 添加  ${imagesXmlHrefString!""} 标识    在filelist.xml 上面添加 该标识 存放图片base64的链接信息

java freemarker 导出富文本到Word文档_第7张图片

  • 去掉之前 保留的图片信息对应代码

其实添加的 ${imagesBase64String}和${imagesXmlHrefString}标识 就是 首先定义一个图片的base64,然后在下面引用,随后在正文中 直接调用图片的引用即可。

不明白的 可以看一下 其他图片的生成方式 【上面建议保留一张图片, 就是为了方便文档结构中图片的分析】

例如:看一下图片 image004.jpg

  • 图片base64的定义

java freemarker 导出富文本到Word文档_第8张图片

  • 图片链接的引用

java freemarker 导出富文本到Word文档_第9张图片

  • 图片的显示 调用图片链接的引用   xxxxx及后面的 这些是页面显示的图片 需要动态生成

java freemarker 导出富文本到Word文档_第10张图片

此时 报告的模板修改 已经完成,下面开始上代码

因为 本项目的富文本存储的形式 为base64,而不是存储图片的地址,所以需要先根据base64生成图片 在进行操作。

  • 测试数据
Map dataMap = new HashMap<>();
List photoNameList=new ArrayList<>();
String handledBase64Block = ""; //base64
String xmlimaHref = ""; //图片链接
//模拟数据
StringBuilder sb = new StringBuilder();
sb.append("
"); sb.append("

概况



去掉ip校验

"); sb.append("

利用word来解析带base64图片的富文本,思路是:word模板另存为mht格式,再修改后缀为ftl。将base64字符串的图片,填充到制作的模板上。

首先我们需要填充的word模板如下:

"); sb.append("
"); RichHtmlHandler test1handler = new RichHtmlHandler(sb.toString()); test1handler.setDocSrcLocationPrex("file:///C:/5181FBD1"); test1handler.setDocSrcParent("file3105.files"); test1handler.setNextPartId("01D73090.2D92D3A0"); test1handler.setShapeidPrex("_x56fe__x7247__x0020"); test1handler.setSpidPrex("_x0000_i"); test1handler.setTypeid("#_x0000_t75"); try { test1handler.handledHtml(false,filePath); } catch (IOException e) { e.printStackTrace(); } if (test1handler.getDocBase64BlockResults() != null && test1handler.getDocBase64BlockResults().size() > 0) { for (String item : test1handler.getDocBase64BlockResults()) { handledBase64Block += item + "\n"; } } if (test1handler.getXmlImgRefs() != null && test1handler.getXmlImgRefs().size() > 0) { for (String item : test1handler.getXmlImgRefs()) { xmlimaHref += item + "\n"; } } String bodyBlock = test1handler.getHandledDocBodyBlock(); dataMap.put("test1",bodyBlock); StringBuilder sbTest2 = new StringBuilder(); sbTest2.append("
"); sbTest2.append("

你可能感兴趣的:(工作中遇到的问题,java,freemarker)