项目中有涉及到在线预览生成图片的需求,因刚学习web知识,在此做个记录,以便后续方便查看。
一.在jsp页面设置点击按钮
<button onclick="viewAdvice('+ rows.userid + ');">预览</button>';
点击预览按钮,调用方法
function viewAdvice(userId){
window.open("/xx/xx/pic?userId="+userId);
}
二.在controller类中接收
@RequestMapping(path="/pic")
public void pic(HttpServletRequest request, HttpServletResponse response,Integer userId) throws Exception {
//此为项目具体需求逻辑,可以按需使用
User user=userService.get(userId);
Notice notice = noticeService.findByUserId(userId);
if(notice==null ) {
WebUtil.responseOut(response,ResponseObject.newErrorResponseObject(ErrorInfo.EMPTY_ERROR));
return;
}
if(!StringUtils.hasText(notice.getNoticeCode())||!StringUtils.hasText(user.getName())||!StringUtils.hasText(user.getIdentityCard())
|| notice.getReportTime()==null ||notice.getCreateDate()==null) {
WebUtil.responseOut(response,"信息不全,请联系系统管理员!");
return ;
}
//设置响应头,使下载格式为jpg类型
String fileName="自定义名称.jpg";
String agent = request.getHeader("User-Agent").toUpperCase(); //获得浏览器信息并转换为大写
if(agent.indexOf("MSIE") > 0 || (agent.indexOf("GECKO")>0 && agent.indexOf("RV:11")>0)){//IE浏览器和Edge浏览器
fileName = URLEncoder.encode(fileName, "UTF-8");
}else {
fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
}
//可以自定义下载时弹框内的文件名称为filename
response.setHeader("Content-Disposition", "filename=" + fileName);
String webpath = request.getSession().getServletContext().getRealPath("/");
File file =new File(webpath,"/template/底板图片.jpg"); //这两张图片放在了webapp文件夹下的template子文件夹,可替换
File srcImgFile = new File(webpath,"/template/水印图片.png");
BufferedImage image =ImageUtil.adviceNote(student, notice, file,srcImgFile);
ImageIO.write(image, "JPEG", response.getOutputStream());
response.getOutputStream().flush();
}
其中adviceNote方法为
public static BufferedImage adviceNote(Student student,Notice notice,File file,File srcImgFile) throws Exception{
Calendar createTime =Calendar.getInstance();
createTime.setTime(notice.getCreateDate());
Calendar reportTime =Calendar.getInstance();
reportTime.setTime(notice.getReportTime());
//生成缓冲区image类
BufferedImage image =ImageIO.read(file);
//产生image类的Graphics用于绘制操作
Graphics g = image.getGraphics();
g.setFont(new Font("黑体", Font.BOLD, 18));
g.setColor(new Color(0,102,162));
//图片上的文字,后两个参数为x ,y 坐标
g.drawString(notice.getNoticeCode(), 805, 128);
g.drawString(user.getName(), (250-user.getName().length()*20), 330);
g.drawString(user.getIdentityCard(), 405, 330);
g.drawString("xxxxx", 405, 387);
g.drawString(CommonUtil.toHanStr(reportTime.get(Calendar.MONTH)+1), 405, 440);//
g.drawString(CommonUtil.toHanStr(reportTime.get(Calendar.DAY_OF_MONTH)), 495, 440);
g.drawString(CommonUtil.toHanStr(createTime.get(Calendar.MONTH)+1), 755, 525);
g.drawString(CommonUtil.toHanStr(createTime.get(Calendar.DAY_OF_MONTH)), 835, 525);
// 增加水印
Image srcImg = ImageIO.read(srcImgFile);
int srcImgWidth = srcImg.getWidth(null);
int srcImgHeight = srcImg.getHeight(null);
g.drawImage(srcImg, 710, 450, srcImgWidth, srcImgHeight, null);
g.dispose();
return image;
}
CommonUtil的toHanStr方法
private static String[] hanArr = { "零", "一", "二", "三", "四", "五", "六", "七","八", "九" };
private static String[] unitArr = { "十", "百", "千", "万", "十", "白", "千", "亿", "十", "百", "千" };
/*
* @Title: toHanStr
* @Description: 数字转中文
* @param @param number
* @param @return
* @return String
* @throws
*/
public static String toHanStr(Integer number) {
String numStr = number + "";
String result = "";
int numLen = numStr.length();
for (int i = 0; i < numLen; i++) {
int num = numStr.charAt(i) - 48;
if (i != numLen - 1 && num != 0) {
result += hanArr[num] + unitArr[numLen - 2 - i];
if (number >= 10 && number < 20) {
result = result.substring(1);
}
} else {
if (!(number >= 10 && number % 10 == 0)) {
result += hanArr[num];
}
}
}
return result;
}