반응형
브라우져에 나타난 화면을 그대로 캡처하여 파일로 저장하는 방법입니다.
익스플로러, 크롬에서 테스트 완료하엿습니다.
* 윈도우 서버에서는 문제없이 잘 돌아갑니다. 운영서버는 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;
}
반응형
'Java' 카테고리의 다른 글
| java 에서 ftp 접속 파일 다운로드, 업로드, 삭제 코드 (3) | 2012.10.29 |
|---|---|
| 파일 다운로드 한글 깨짐 (3) | 2012.10.27 |