1、整体思路

利用xml模板,在模板中预留占位标识(${yourContent}),然后将xml转为ftl文件,通过Map传值填充对应的内容即可,word其实和html一样,也有自己的xml标签,表头、段落、图片、以及字体、标题等的标签。文字必须包含在段落中,如:

${yourContent}

,图片必须是在

${image}

其中、和有几个必填参数,后面的代码会涉及到。集合的循环遍历通过${alias.property}...#list>方式实现。

2、生成模板

新建word模板,设置自己要替换的内容。比如下面例子:

我的文档

作者:author 时间:time 内容:content

把新建好的word导出成word2003xml文件,然后将author改成${author},time改成${time},content改成${content}然后修改后缀名为ftl文件,存到项目里面。

3、替换内容

实际操作中,不光会遇到纯文字的,经常会遇到文字加图片。图片的实现:先转换成base64的字符串,然后填充到图片的标签中(网络图片,必须先下载到本地才能转换)。下面是转换的代码:

----------

/**

* 替换内容中的图片,样式

*

* @param content

* @return

* @throws Exception

*/

public String replaceImage(String content) throws Exception {

try {

Pattern p = Pattern.compile("]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>");

Matcher m = p.matcher(content);

int i = 0;

content = StyleFilter.shieldStyle(content);

while (m.find()) {

String width = getWidth(m.group());

String height = getHeight(m.group());

String target = getWholeImage(m.group(1), width, height);

content = content.replace(m.group(), target);

}

} catch (ConfigurationException e) {

e.printStackTrace();

}

return content;

}

public String getWidth(String content) {

String regex = "width=['\"]?(.*?)['\"]?\\s.*?>";

Pattern p = Pattern.compile(regex);

Matcher m = p.matcher(content);

while (m.find()) {

return m.group(1);

}

return null;

}

public String getHeight(String content) {

String regex = "height=['\"]?(.*?)['\"]?\\s.*?>";

Pattern p = Pattern.compile(regex);

Matcher m = p.matcher(content);

while (m.find()) {

return m.group(1);

}

return null;

}

/**

* 生成图片(独立成段落的图片,仅前半部分,后半部分手动拼接)

*

* @param imgUrl

* @param width

* @param height

* @return

* @throws Exception

*/

public String getWholeImage(String imgUrl, String width, String height) throws Exception {

String result = "";

try {

if (null != width && null != height) {

String no = Math.random() * 100 + "";

String binData1 = "";

String binData2 = "

+ ";height:" + height + "\">

";

result = binData1 + getImageStr(imgUrl) + binData2 + "";

} else {

String no = Math.random() * 100 + "";

String binData1 = "";

String binData2 = "

+ "\" type=\"#_x0000_t75\">

";

result = binData1 + getImageStr(imgUrl) + binData2 + "";

}

} catch (ConfigurationException e) {

e.printStackTrace();

}

return result;

}

其中这两块的名字必须是一致的![](leanote://file/getImage?fileId=57885a94128c7b03ba000000)

/**

* 图片转码

*

* @return 返回图片base64字符串

* @throws Exception

*/

public static String getImageStr(String imgUrl) throws Exception {

String imgPath = download(imgUrl, Math.random() * 100 + ".png", Config.ReadStringPropertie("pictureDownload"));

InputStream in = null;

byte[] data = null;

try {

in = new FileInputStream(imgPath);

data = new byte[in.available()];

in.read(data);

in.close();

} catch (Exception e) {

e.printStackTrace();

}

BASE64Encoder encoder = new BASE64Encoder();

return encoder.encode(data);

}

/**

* 下载图片的方法(图片下载到本地后才可转化成base64字符串)

*

* @param urlString

* @param fileName

* @param savePath

* @return

* @throws Exception

*/

public static String download(String urlString, String fileName, String savePath) throws Exception {

// 构造URL

URL url = new URL(urlString);

// 打开连接

URLConnection con = url.openConnection();

// 设置请求超时为5s

con.setConnectTimeout(5 * 1000);

// 输入流

InputStream is = con.getInputStream();

// 1K的数据缓冲

byte[] bs = new byte[1024];

// 读取到的数据长度

int len;

// 输出的文件流

File sf = new File(savePath);

if (!sf.exists()) {

sf.mkdirs();

}

String imgUrl = sf.getPath() + "\\" + fileName;

OutputStream os = new FileOutputStream(sf.getPath() + "\\" + fileName);

// 开始读取

while ((len = is.read(bs)) != -1) {

os.write(bs, 0, len);

}

// 完毕,关闭所有链接

os.close();

is.close();

return imgUrl;

}

enter code here

调用replaceImage方法获取处理过的字符串,然后赋值到Map中,再调用创建word的方法:

public String createWord(Map dataMap) {

String path = "/myWrongBook" + Math.random() * 3 + ".doc";

try {

Template t = null;

configuration.setClassForTemplateLoading(this.getClass(), "your template path"); // FTL文件所存在的位置

t = configuration.getTemplate("template.ftl");

File outFile = new File(Config.ReadStringPropertie("wrongBooks") + path);

Writer out = null;

out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"));

t.process(dataMap, out);

out.close();

path = Config.ReadStringPropertie("serverPath") + "/wrongBooks" + path;

//Config.ReadStringPropertie("serverPath")是获取服务器路径的方法,就不给出了

} catch (IOException ie) {

ie.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

return path;

}

----------

path就是最终生成的word下载地址,不过这样的地址会比较长,给用户体验不是很爽,可以利用新浪云计算短网址转换成短链接http://jump.sinaapp.com/

enter code here

java生成文字与图片_java生成word(文字和图片)相关推荐

  1. java word添加图片_JAVA编辑WORD文件插入图片

    展开全部 试试这个代码62616964757a686964616fe59b9ee7ad9431333431353936,需要添加spire.doc jar依赖import com.spire.doc. ...

  2. python图片二进制流转换成图片_微信如何将图片转换成word文字

    每天和手机微信相依为命,小编想问问你们,对于微信的使用,你到底了解多少?比如,你知道原来微信也可以随时翻译多国语言,可以把图片直接转换成你需要的大片文字吗? 微信上的这些小技巧,你知道多少? 本文将为 ...

  3. 如何将图片转换成word文字

    如何将图片转换成word文字 每天做着重复的工作会觉得非常的枯燥,但是如果每天有新鲜的.没经历过的工作任务又会觉得压力很大,这样一比较大多数人还是会选择自己熟悉的工作.就像我现在一样,每天都在办公室整 ...

  4. java 生成证书图片_java生成自定义证书图片1 - 制作证书word模板

    最近做项目遇到一个需求,生成指定数据的证书图片(比如毕业证,在空的模板中输入自定义的姓名.日期等信息),尝试了许多方法,最终完美地实现了这个需求. 以下内容为制作证书图片的第一步,制作证书word模板 ...

  5. java poi 读取 word图片_Java Poi 根据文字内容 插入 word 图片-Go语言中文社区

    需求描述 如下图,我需要在word里根据一个图片的名字,将名字替换成该图片(公章) 思路: 用POI遍历每一个表格里的每一行的每一个单元格,如果遇到我自己定义的"&章",则 ...

  6. java生成小图片_JAVA生成缩略小图片类

    JAVA生成缩略小图片类 java.awt.image.BufferedImage是缓冲图片类主要将生成的图片对象缓冲起来:javax.imageio.ImageIO是图片IO控制类,可以将缓冲图片对 ...

  7. java 一维码架包_Java 生成、识别条形码

    条形码是由一定的字符,数字及符号组成,用以表达一组信息的图形标识符.它可以标出物品的商品名称.生产日期.图书分类号,邮件起止地点等.因而在商品流通.图书管理.邮政管理等许多领域得以广泛的应用.本文将通 ...

  8. android 生成二维码_Java 生成二维码实战

    简介 ZXing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码.其提供了多种平台下的客户端包括:J2ME. ...

  9. java web工程中如何添加图片_java web中如何添加图片

    java web中如何添加图片 对于java可视化界面插入背景图片只需要background-image:url(图片路径)就行,而对于web项目中,并非如此 效果如下: 我们就需要在jsp页面中写J ...

最新文章

  1. TensorFlow2简单入门-三维张量
  2. Android开发:关于Android Settings中的八个问题
  3. Spring 基于注解(annotation)的配置之@Qualifier注解
  4. 解决iex -S mix报错
  5. python colorama模块
  6. vuex commit 传参数,传递多个参数
  7. 2012.02.17
  8. linux系统rc路由配置_Linux下路由配置梳理
  9. 销售管理软件系统的两大优势是什么?
  10. python测试开发django-155.bootbox使用(alert/confirm/prompt/dialog)
  11. Learn OpenGL 笔记6.2 Gamma Correction(伽马校正)
  12. 网站歌曲播放器php,推荐漂亮的flash网页MP3音乐播放器
  13. 数电快速入门(三)(卡诺图化简法的介绍)
  14. HDU5455 Fang Fang 模拟
  15. Zynga完成对快速增长的超休闲游戏领域的领导者——伊斯坦布尔的Rollic的收购
  16. css module模组化
  17. 【今日CV 计算机视觉论文速览 第133期】Wed, 19 Jun 2019
  18. 老子哲学与太极拳技击
  19. 阿里云天池机器学习task3
  20. 华为重度渗透的欧洲,美国如何清剿?

热门文章

  1. Ubunt 20.04 使用CDROM或ISO作为安装源
  2. 谷歌花54亿美元收购网络安全公司 Mandiant
  3. 科普:什么是企业的数字化转型,OA有何作用?
  4. 全新音乐搜索器多站合一源码V1.7.7修复版+PHP内核
  5. Wireshark嗅探数据包
  6. php新闻网页 毕设,【优质源码】校园新闻发布系统 php+mysql 毕设程序
  7. ups linux 电脑自动关机,停电后服务器自动关机工具(有UPS电源) 在UPS消耗完电前自动关机...
  8. 【网站加速器】浏览器一键加速神器SpeedyFox
  9. android 自定义progressbar demo,Android自定义View――动态ProgressBar之模仿360加速球
  10. 2018校招笔试真题汇总(java/C++)