Java

[java, javascript] 브라우저 화면 캡처

박진만 2017. 1. 9. 16:34
반응형

브라우져에 나타난 화면을 그대로 캡처하여 파일로 저장하는 방법입니다.

익스플로러, 크롬에서 테스트 완료하엿습니다.

* 윈도우 서버에서는 문제없이 잘 돌아갑니다. 운영서버는 Unix 서버인데 운영서버에서는 동작하지 않았습니다. 서비스 오픈 때문에 확인할 시간이 없어서 해당 소스코드는 Unix 서버에서 사용하지 않았습니다. Was 서버 설정을 변경하면 될 것 같은데 시간 관계상 포기 ㅠㅠ

javascript 파일(브라우저 화면의 좌표 값 추출 후 서버로 전송)

//출력 미리보기
function fnPrintPreview() {
	
	var top = "";
	var left = "";
	var height = "";
	var width = "";
	
	var agent = navigator.userAgent.toLowerCase();	
	
	if (agent.indexOf("chrome") != -1) {
		
		top = (typeof window.screenTop == "number") ? window.screenTop : window.screenY;
		left = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenX;
		
		top = top + 160;
		height = window.innerHeight;
		height = height -110;
		width = window.innerWidth;
		
	}else{
		
		top = (typeof window.screenTop == "number") ? window.screenTop : window.screenY;
		left = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenX;
		//var height = window.outerHeight;
		//var width = window.outerWidth;
		
		top = top + 110;
		height = window.innerHeight;
		height = height -110;
		width = window.innerWidth;
		
	}
	
	jQuery('#top').val(top);
	jQuery('#left').val(left);
	jQuery('#height').val(height);
	jQuery('#width').val(width);	
	
	console.log(document.printPreviewForm.top.value);
	console.log(document.printPreviewForm.left.value);
	console.log(document.printPreviewForm.height.value);
	console.log(document.printPreviewForm.width.value);
	
	jQuery.ajax({
		url:'/nor/map/mapmain/captureScreen.do',
		data:jQuery("#printPreviewForm").serialize(),
		type: 'POST',
		dataType:"json",
		beforeSend:function(){
			
		},
		success:function(data){
			try{
				//운영서버 반영시 확인해야 함!!
				//var imageSrc = data.imageSrc.replace("C:/eGovFrameDev-3.0.0-32bit/workspace/NOR/src/main/webapp/", "/nor/");
				
				var strUrl = window.location.protocol + "//" + window.location.host;
				strUrl += "/nor/map/mapmain/selectPrintSpatialAnalysisView.do?";
				strUrl += "&imageSrc=" + data.imageSrc;
				strUrl += "&imagePrintSrc=" + data.imagePrintSrc;
				
				if (gn_winPrintPreview_spatialAnalysis == null){
					gn_winPrintPreview_spatialAnalysis = window.open(strUrl, "PrintSpatialAnalysisView", "titlebar=yes, toolbar=no, scrollbars=yes, resizable=yes, top=0, left=0, width=815, height=800");
				}else{
					gn_winPrintPreview_spatialAnalysis.location = strUrl;
				}					
				
				//gn_winPrintPreview_spatialAnalysis.focus();
				
			}catch(e){
				alert(e);
			}	        
		},
		error:function(e){
			if(e.responseText.indexOf("해당 기능에 대한 권한이 없습니다.") > -1){
				//alert(e.responseText);
				alert("해당 기능에 대한 권한이 없습니다.");
			}else{
				alert(e.responseText);
			}
		}
	});	
	
}
 

java 파일(좌표값을 가지고 화면 캡처 후 파일 생성)

/**
	 * 지도화면 캡처
	 */
	@RequestMapping(value="/map/mapmain/captureScreen.do")
	public @ResponseBody Map<String, Object> captureScreen(@ModelAttribute("searchVO") MapMainVO mapMainVO) {
		
		log.debug("=********************* captureScreen ***************************************************");
		
		int top = Integer.parseInt(mapMainVO.getTop());
		int left = Integer.parseInt(mapMainVO.getLeft());
		int height = Integer.parseInt(mapMainVO.getHeight());
		int width = Integer.parseInt(mapMainVO.getWidth());
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
		
		String fileName = sdf.format(new java.util.Date()) + System.currentTimeMillis();
		String printFileName = sdf.format(new java.util.Date()) + System.currentTimeMillis();
    	        String tmpFilePath = "파일저장경로";
    	
		try {
				
	            //ChangeHeadless ch = new ChangeHeadless();
		
		    /*Field defaultHeadlessField = java.awt.GraphicsEnvironment.class.getDeclaredField("defaultHeadless");
		    defaultHeadlessField.setAccessible(true);
		    defaultHeadlessField.set(null,Boolean.FALSE);
		    Field headlessField = java.awt.GraphicsEnvironment.class.getDeclaredField("headless");
		    headlessField.setAccessible(true);
		    headlessField.set(null,Boolean.FALSE);
		    
		    System.setProperty("java.awt.headless", "false");*/
			
		    boolean headless = GraphicsEnvironment.isHeadless();
		    log.debug("headless : " + headless);
		    log.debug("System.getProperty : " + System.getProperty("java.awt.headless"));
			
		    Robot robot = new Robot();
                    String format = "jpg";
                    fileName = tmpFilePath + fileName + "." + format;
                    printFileName = tmpFilePath + printFileName + "rotate." + format;
            
                    log.debug("fileName : " + fileName);
                    log.debug("printFileName : " + printFileName);
            
                    Rectangle captureRect = new Rectangle(left, top, width, height);
                    BufferedImage screenImage = robot.createScreenCapture(captureRect);
            
                    /*defaultHeadlessField.setAccessible(true);
		    defaultHeadlessField.set(null,Boolean.TRUE);
		    headlessField.setAccessible(true);
		    headlessField.set(null,Boolean.TRUE);
		    System.setProperty("java.awt.headless", "true");*/
		    
		    boolean headlessa = GraphicsEnvironment.isHeadless();
		    log.debug("headless : " + headlessa);
		    log.debug("System.getProperty : " + System.getProperty("java.awt.headless"));
            
                    ImageIO.write(screenImage, format, new File(fileName));
            
                    //회전된 이미지 저장(프린트 때문에..)
                    BufferedImage rotateImg = rotate90CCW(screenImage);;
                    ImageIO.write(rotateImg, format, new File(printFileName));
            
		} catch (AWTException e) {
			log.debug("AWTException : " + e);
		} catch (IOException e) {
			log.debug("IOException : " + e);
		} catch (Exception e) {
			log.debug("Exception : " + e);
		}
		
		//log.debug("= CONTROLLER :: selectPrintSpatialAnalysisView :: imageSrc:: " + imageSrc);
		
		Map<String,Object> result = new HashMap<String,Object>();
		result.put("imageSrc", fileName);
		result.put("imagePrintSrc", printFileName);
		return result;
		
	}

반응형