項目中有涉及到在線預覽生成圖片的需求,因剛學習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");
}
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;
}