Java 在线预览并右键下载

项目中有涉及到在线预览生成图片的需求,因刚学习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;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值