1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > java freemarker 图片_java通过freemarker导出包含富文本图片的word文档

java freemarker 图片_java通过freemarker导出包含富文本图片的word文档

时间:2023-08-15 10:06:33

相关推荐

java freemarker 图片_java通过freemarker导出包含富文本图片的word文档

废话不多说,进入正题!

本文重点在于:对富文本图片的导出(基础的freemarker+word模板导出这里不做详细解说哈)

(ps:大神的东西太深奥~~懵逼了

一周才搞定,为了方便后来在更加简单,清晰的学习,楼主写下这篇博客,感谢大神给了我个完善和进步的机会,也希望后来在继续完善)

先说一下思路:由于我们是要用word来解析带图片的富文本(说白了就是解析一段html,当然这段html代码是包含img标签:图片),so...传统的word模板导出(word另存为xml,在修改后缀为ftl)是行不通的,因为他解析不了html代码(至少我目前没有找到这方便的解决方案,大神勿喷~),这样的话我就要换用一种模板来处理这个模板:word模板另存为mht格式,再修改后缀为ftl。剩下的就是后台操作了,找到你存富文本的字段(html代码)获取里面的img标签,找到图片,并把图片解析为base64字符串,填充到我们只做的模板上就ok了,大体思路就这样了

一、模板制作(这个很重要)

提示:这里模板用office word来做,不要用wps

创建word文件:

,我这里用第二个content来显示我们要的富文本,然后将我们的word文件另存为mht文件,

最后我们就拿到我们要的mht模板了,这仅仅是个开始...各位看官往下看

打开我们的mht文件并处理:在我们的文件里面找到下面这些东西,如果没有找到呢?....这个问题,我就只有呵呵了

${imagesBase64String} 和${imagesXmlHrefString}这两个是我们手动加进去的,简析富文本图片的核心就在这里(反正我也是蒙的~)

全文检索gb2312把他改成utf-8,同时需要加上3D前缀,对应着格式来改 一般就这两种:

和Content-Type: text/html; charset=3D"utf-8"

提示:所有的都要改成utf-8(你不改也是可以的)

然后保存一下,再把文件的后缀名改成ftl格式的就ok了(模板处理到此结束)

二、解析html

这个大家不陌生吧?陌生的自己打脸去,下面的那三个我依然懵逼

handler.handledHtml(false);

String bodyBlock = handler.getHandledDocBodyBlock();

data.put("content", bodyBlock); 处理后的html代码块

data.put("imagesXmlHrefString", xmlimaHref);

data.put("imagesBase64String", handledBase64Block); 这两个大家还有印象吧?没错就是我们之前手动在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();

}

四、导出word(带富文本图的哟)

public static void createDoc(Map 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);

}

}

五、测试(main)

public static void main(String[] args) throws Exception {

HashMap data = new HashMap();

StringBuilder sb = new StringBuilder();

sb.append("

");

sb.append("");

sb.append("");

sb.append("中国梦,幸福梦!");

sb.append("

");

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();

}

}

查看结果:

到此~导出word带富文本图片的功能就借宿了,详细代码我放在附件里面(这里着重讲mht模板的一些改动,处理富文本的java代码我就没有单独贴出来了哈,demo里面有哦)

有完整的demo,大家放心不会像我一样懵逼一周了 哈哈

开玩笑的~!话说我从开始到完整的做出来 还是花了5天左右的时间,

最后在再给大家扩展一下:一个word 出现多个富文本,并且每个富文本有多个图片的思路:

String old_handledBase64Block = "";

if(data.containsKey("imagesBase64String")){

old_handledBase64Block = (String) data.get("imagesBase64String");

handledBase64Block = old_handledBase64Block + handledBase64Block;

}

data.put("imagesBase64String", handledBase64Block);

简单说一下 ,其实就是在处理下一个富文本的时候 要拿到上一个富文本里面处理中的"imagesBase64String" 再把它累加起来,

不然后面的会给前面的覆盖掉~"imagesXmlHrefString"这个也是一样的

各位看官!搞懂这个是不是觉得单纯的图片导出太简单了哇 哈哈(话说我还没用过单纯的图片导出)

freemarker导出带图片的word文档

最近做一个关于文档导出功能, 顺便学习了下freemarker,做了个关于导出带图片的word文档,模板并没有写全,只是验证代码的正确性 这只是做一个小功能,故只做了后台代码关于导出的代码,并未与前台 ...

C#导出文本内容到word文档源码

将做工程过程中较好的代码片段珍藏起来,下面的代码内容是关于C#导出文本内容到word文档的代码,希望能对小伙伴们也有好处.

java 在MySQL中存储文件,读取文件(包括图片,word文档,excel表格,ppt,zip文件等)

转自:/u014475796/article/details/49893261 在设计到数据库的开发中,难免要将图片或文档文件(如word)插入到数据库中的情 ...

解决图片插入word文档后清晰度降低的问题

解决图片插入word文档后清晰度降低的问题 在默认情况下,word程序会自动压缩插入word文档中的图片以减小整个word文档的.当我们需要插入word文档中的图片保持原始清晰度时,可以通过设置wor ...

.net下将富文本编辑器文本原样读入word文档

关键词:富文本编辑器 生成word 样式 为了解决标题中提出的问题,首选需要了解,在.net环境下读取数据库中的内容动态生成word至少有2种方式,[方式一]一种方式是在项目中添加引用,例如在“添 ...

批量导出access某表内容到word文档

一.需求: 需要将表中每一条记录中的某些内容导出在一个word文档中,并将这些文档保存在指定文件夹目录下 二.界面,简单设计如下: 三.添加office相关引用 添加后可在解决方案资源管理器中看到: ...

java 使用 POI 操作 XWPFDocumen 创建和读取 Office Word 文档基础篇

注:有不正确的地方还望大神能够指出,抱拳了 老铁! 参考 API:/apidocs/org/apache/poi/xwpf/usermodel/XWPFDoc ...

csdn的blog可以直接导入内含图片的word文档吗?

目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

Java Web用Freemarker生成带图片的Word文档

步骤一:模板制作 用world做一个导出模板,如果有图片则加入一张图片占位,将world另存为xml,将xml中需要导出的内容用Freemarker标签表示,最后另存为.ftl结尾的模板: 步 ...

随机推荐

异步Promise实现

简介 异步回调的书写往往打乱了正常流的书写方式,在ECMAScript 6中实现了标准的Promise API,旨在 解决控制回调流程的问题. 简单的实现了Promise API: (function ...

android 时间 格式

/yudajun/article/details/7939552

ppt 制作海报 导出高分辨率图片

用ppt做海报,导出图片的时候,发现导出的图片的分辨率只有96ppi,清晰度不太好. 怎么能这样呢! 网上搜了一下,发现微软提供了一个修改注册表的方法,点击这里访问.不过那里讲的最新只有,我的 ...

MySQL JDBC 出现多个 SHOW VARIABLES 语句。

一次偶然的机会,show processlist 的时候,发现有个 Client 一直在执行 "mysql-connector-java-5.1.21 ( Revision: ${bzr. ...

密码学初级教程(六)数字签名 Digital Signature

密码学家工具箱中的6个重要的工具: 对称密码 公钥密码 单向散列函数 消息认证码 数字签名 伪随机数生成器 提问: 有了消息认证码为什么还要有数字签名? 因为消息认证码无法防止否认.消息认证码可以识别 ...

让Xcode的 stack trace信息可读

让Xcode的 stack trace信息可读 昨天在写 iOS 代码的时候,调试的时候模拟器崩溃了.异常停在了如下整个 main 函数的入口处: int main(int argc, char *a ...

Python-爬虫初学

#爬取网站中的图片 1 import re #正则表达式库 import urllib #url链接库 def getHtml(url): page = urllib.urlopen(url) #打开 ...

指向函数的指针数组(C++)

我们能够创建一个指向函数的指针数组.为了选择一个函数,只需要使用数组的下标,然后间接引用这个指针.这种方式支持表格式驱动码的概念:可以根据状态变量去选择被执行函数,而不用条件语句或case语句.这种设 ...

.NET托管代码和非托管代码

.net托管代码是运行在.NET FRAMEWORK上的,类似于JAVA虚拟机托管代码:属安全代码,因为不涉及指针,但相对性能上较低,C#写出来的东西就可以认为是托管代码非托管代码:非安全的,可以使用 ...

JavaScript 变量及类型

在JavaScript中,所有的number都是以64位浮点型数据来存储的.所有的编程语言,包括js,对浮点型数据的精度都很难确定. var a = 0.1 + 0.2; console.log(a ...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。