java生成文字与图片_java生成word(文字和图片)
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(文字和图片)相关推荐
- java word添加图片_JAVA编辑WORD文件插入图片
展开全部 试试这个代码62616964757a686964616fe59b9ee7ad9431333431353936,需要添加spire.doc jar依赖import com.spire.doc. ...
- python图片二进制流转换成图片_微信如何将图片转换成word文字
每天和手机微信相依为命,小编想问问你们,对于微信的使用,你到底了解多少?比如,你知道原来微信也可以随时翻译多国语言,可以把图片直接转换成你需要的大片文字吗? 微信上的这些小技巧,你知道多少? 本文将为 ...
- 如何将图片转换成word文字
如何将图片转换成word文字 每天做着重复的工作会觉得非常的枯燥,但是如果每天有新鲜的.没经历过的工作任务又会觉得压力很大,这样一比较大多数人还是会选择自己熟悉的工作.就像我现在一样,每天都在办公室整 ...
- java 生成证书图片_java生成自定义证书图片1 - 制作证书word模板
最近做项目遇到一个需求,生成指定数据的证书图片(比如毕业证,在空的模板中输入自定义的姓名.日期等信息),尝试了许多方法,最终完美地实现了这个需求. 以下内容为制作证书图片的第一步,制作证书word模板 ...
- java poi 读取 word图片_Java Poi 根据文字内容 插入 word 图片-Go语言中文社区
需求描述 如下图,我需要在word里根据一个图片的名字,将名字替换成该图片(公章) 思路: 用POI遍历每一个表格里的每一行的每一个单元格,如果遇到我自己定义的"&章",则 ...
- java生成小图片_JAVA生成缩略小图片类
JAVA生成缩略小图片类 java.awt.image.BufferedImage是缓冲图片类主要将生成的图片对象缓冲起来:javax.imageio.ImageIO是图片IO控制类,可以将缓冲图片对 ...
- java 一维码架包_Java 生成、识别条形码
条形码是由一定的字符,数字及符号组成,用以表达一组信息的图形标识符.它可以标出物品的商品名称.生产日期.图书分类号,邮件起止地点等.因而在商品流通.图书管理.邮政管理等许多领域得以广泛的应用.本文将通 ...
- android 生成二维码_Java 生成二维码实战
简介 ZXing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码.其提供了多种平台下的客户端包括:J2ME. ...
- java web工程中如何添加图片_java web中如何添加图片
java web中如何添加图片 对于java可视化界面插入背景图片只需要background-image:url(图片路径)就行,而对于web项目中,并非如此 效果如下: 我们就需要在jsp页面中写J ...
最新文章
- TensorFlow2简单入门-三维张量
- Android开发:关于Android Settings中的八个问题
- Spring 基于注解(annotation)的配置之@Qualifier注解
- 解决iex -S mix报错
- python colorama模块
- vuex commit 传参数,传递多个参数
- 2012.02.17
- linux系统rc路由配置_Linux下路由配置梳理
- 销售管理软件系统的两大优势是什么?
- python测试开发django-155.bootbox使用(alert/confirm/prompt/dialog)
- Learn OpenGL 笔记6.2 Gamma Correction(伽马校正)
- 网站歌曲播放器php,推荐漂亮的flash网页MP3音乐播放器
- 数电快速入门(三)(卡诺图化简法的介绍)
- HDU5455 Fang Fang 模拟
- Zynga完成对快速增长的超休闲游戏领域的领导者——伊斯坦布尔的Rollic的收购
- css module模组化
- 【今日CV 计算机视觉论文速览 第133期】Wed, 19 Jun 2019
- 老子哲学与太极拳技击
- 阿里云天池机器学习task3
- 华为重度渗透的欧洲,美国如何清剿?
热门文章
- Ubunt 20.04 使用CDROM或ISO作为安装源
- 谷歌花54亿美元收购网络安全公司 Mandiant
- 科普:什么是企业的数字化转型,OA有何作用?
- 全新音乐搜索器多站合一源码V1.7.7修复版+PHP内核
- Wireshark嗅探数据包
- php新闻网页 毕设,【优质源码】校园新闻发布系统 php+mysql 毕设程序
- ups linux 电脑自动关机,停电后服务器自动关机工具(有UPS电源) 在UPS消耗完电前自动关机...
- 【网站加速器】浏览器一键加速神器SpeedyFox
- android 自定义progressbar demo,Android自定义View――动态ProgressBar之模仿360加速球
- 2018校招笔试真题汇总(java/C++)