package froala.editor.web; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import egovframework.com.cmm.service.EgovProperties; import egovframework.rte.fdl.cmmn.exception.EgovBizException; import froala.editor.EditorFileVO; import froala.editor.File; import froala.editor.service.EditorService; import froala.editor.service.ParallelExcutorService; import froala.editor.utils.CommonUtil; import froala.editor.utils.FileUtil; import froala.editor.utils.view.DownloadView; import froala.editor.utils.view.ImageView; import froala.editor.utils.view.VideoView; /** * 각종 뷰 컨트롤러 */ @Controller public class ViewController { private static final Logger logger = LoggerFactory.getLogger(ViewController.class); private static final String tempFileRoute = EgovProperties.getProperty("editor.fileTempRoute"); /** EgovSampleService */ @Resource(name = "editorService") private EditorService editorService; /** * 이미지를 호출한다. * * @param request * @param path * @param model * @return */ @RequestMapping(value = "/imageview.do", method = RequestMethod.GET) public ImageView imageView(HttpServletRequest request, @RequestParam String fileId, Model model) throws EgovBizException { String deStr = CommonUtil.decryptAES256(fileId); EditorFileVO fileVO = editorService.selectEditorFile(deStr); model.addAttribute("path", fileVO.getFullPath()); model.addAttribute("origin_file_nm", fileVO.getOriginFileNm()); return new ImageView(); } /** * 파일을 다운로드 한다. * * @param request * @param path * @param origin_file_nm * @param model * @return */ @RequestMapping(value = "/download.do", method = RequestMethod.GET) public DownloadView fileDownload(HttpServletRequest request, @RequestParam String fileId, Model model) throws EgovBizException { // CommonUtil.viewRequestParams(request); String deStr = CommonUtil.decryptAES256(fileId); EditorFileVO fileVO = editorService.selectEditorFile(deStr); model.addAttribute("path", fileVO.getFullPath()); model.addAttribute("origin_file_nm", fileVO.getOriginFileNm()); return new DownloadView(); } /** * 멀티 파일을 zip으로 압축 후 다운로드 한다. * * @Author : 임종호 * @Date : 2020. 8. 18. * @Method Name : multiDownload * @return : void */ @RequestMapping(value = "/multiDownload.do", method = RequestMethod.GET) public void multiDownload(@RequestParam String fileId, HttpServletRequest request, HttpServletResponse response) throws EgovBizException { List list = new ArrayList<>(); if (fileId != null && fileId != "") { for (String tmp : fileId.split(",")) { EditorFileVO fileVO = editorService.selectEditorFile(tmp); if (fileVO != null) { list.add(fileVO); } } ; } // 압축파일 생성 후 다운로드 // fileTempRoute - 임시파일 경로 File.zipDown(request, response, list, tempFileRoute); } /** * pdf, tiff, tif에 대한 이미지를 렌더링 하여 호출한다. * * @param request * @param fileId * @param pageSn * @param model * @return * @throws EgovBizException */ @RequestMapping(value = "/multiImageview.do", method = RequestMethod.GET) public ImageView tmpImageView(HttpServletRequest request, @RequestParam String fileId, @RequestParam Integer pageSn, @RequestParam(required = false) Boolean print, Model model) throws EgovBizException { EditorFileVO fileVO = editorService.selectEditorFile(fileId); String fileExtSn = fileVO.getFileExtsn(); if ("pdf".indexOf(fileExtSn) > -1) { if (fileExtSn.equals("pdf")) { try { String returnFileRoute = tempFileRoute + fileVO.getSysFileNm(); String returnFilePath = returnFileRoute + "/" + fileVO.getSysFileNm() + '_' + pageSn + ".png"; // 기존파일생성 확인 java.io.File existCheck = new java.io.File(returnFilePath); // 기존파일이 없을 시 PDF를 PNG로 변환한다. if (!existCheck.exists()) { Files.createDirectories(Paths.get(returnFileRoute)); // PDF 2 Img에서는 경로가 없는 경우 이미지 파일이 생성이 안되기 때문에 디렉토리를 만들어준다. java.io.File file = new java.io.File(fileVO.getFullPath()); PDDocument pdfDoc = PDDocument.load(file); // Document 생성 int pageCount = pdfDoc.getNumberOfPages(); PDFRenderer pdfRenderer = new PDFRenderer(pdfDoc); // 첫페이지 생성, 이미지 리사이즈 이후 저장 FileUtil.pdfImageWrite(pdfRenderer, pageSn - 1, returnFilePath); // 쓰레드 각 service마다 3개씩 처리 ParallelExcutorService service = new ParallelExcutorService(); service.pdfSubmit("job1", pageSn, 3, pageCount, pdfRenderer, returnFileRoute + "/" + fileVO.getSysFileNm()); service.pdfSubmit("job2", pageSn + 1, 3, pageCount, pdfRenderer, returnFileRoute + "/" + fileVO.getSysFileNm()); service.pdfSubmit("job3", pageSn + 2, 3, pageCount, pdfRenderer, returnFileRoute + "/" + fileVO.getSysFileNm()); service.close(); // pdfDoc.close(); // 모두 사용한 PDF 문서는 닫는다. } model.addAttribute("path", returnFilePath); } catch (IOException e) { logger.error("fail to process PDF Render {}", e); } } } else { String imgFileName = fileVO.getFullPath(); // BufferedImage image = ImageIO.read(new java.io.File(fileVO.getFullPath())); // int width = image.getWidth(); // int height = image.getHeight(); // if (print != null && print && width > height) { // // 프린트용 이미지 크기가 세로보다 가로가 클 경우 회전 // imgFileName = FileUtil.transRotate(90, image, imgFileName); // } model.addAttribute("path", imgFileName); } return new ImageView(); } /** * 임시파일을 다운로드 한다. * * @param request * @param fileId * @param model * @return * @throws EgovBizException */ @RequestMapping(value = "/tempDownload.do", method = RequestMethod.GET) public DownloadView tempFileDownload(HttpServletRequest request, @RequestParam String fileId, Model model) throws EgovBizException { // CommonUtil.viewRequestParams(request); String deStr = CommonUtil.decryptAES256(fileId); EditorFileVO fileVO = editorService.selectTmpFile(deStr); model.addAttribute("path", fileVO.getFullPath()); model.addAttribute("origin_file_nm", fileVO.getOriginFileNm()); model.addAttribute("mime", "application/octet-stream"); return new DownloadView(); } /** * 동영상 스트리밍 * * @param fileId * @param model * @return * @throws EgovBizException */ @RequestMapping(value = "/streaming.do", method = RequestMethod.GET) public VideoView streaming(@RequestParam("fileId") String fileId, Model model, HttpServletRequest request, HttpServletResponse response) throws EgovBizException { String deStr = CommonUtil.decryptAES256(fileId); EditorFileVO fileVO = editorService.selectEditorFile(deStr); request.setAttribute("path", fileVO.getFullPath()); request.setAttribute("originFileNm", fileVO.getOriginFileNm()); return new VideoView(); } /** * 이미지파일 인쇄 * * @Author : 임종호 * @Date : 2020. 6. 15. * @Method Name : print * @return : String * @throws IOException */ @RequestMapping(value = "/imagePrint/{paperSize}.do") public String imagePrint(ModelMap model, @PathVariable("paperSize") String paperSize, @RequestParam(value = "fileId", required = false) String fileId, @ModelAttribute EditorFileVO editorFileVO) throws EgovBizException, IOException { // 리턴 메시지 String resultMsg = ""; // 파일 데이터 세팅 List list = new ArrayList(); for (EditorFileVO tmp : editorFileVO.getFileList()) { EditorFileVO resultVO = editorService.selectEditorFile(tmp.getFileId()); String fileExtSn = resultVO.getFileExtsn().toLowerCase(); if ("pdf,png,jpg,jpeg".indexOf(fileExtSn) > -1) { // 페이지수(pdf,tif,tiff) if (fileExtSn.equals("pdf")) { java.io.File file = new java.io.File(resultVO.getFullPath()); PDDocument pdfDoc = PDDocument.load(file); // Document 생성 resultVO.setPageCnt(pdfDoc.getPages().getCount()); } else { resultVO.setPageCnt(1); } list.add(resultVO); } else { resultMsg += resultVO.getOriginFileNm() + " "; } } ; if (!resultMsg.equals("")) { resultMsg += "파일은 인쇄 할 수 없습니다."; } model.addAttribute("resultMsg", resultMsg); model.addAttribute("resultList", list); Map SizeVO = new HashMap<>(); SizeVO.put("paperSize", paperSize); // 용지 크기 세팅 model.addAttribute("SizeVO", SizeVO); return "egovframework/custom/com/print"; } }