Browse Source

VO추가 , 폴더경로추가

pull/3/head
lkd9125 1 year ago
parent
commit
1832faf12e
  1. 37
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java
  2. 54
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/dto/LanncPdfVO.java
  3. 16
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/dto/PdfBaseVO.java
  4. 2
      pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java
  5. 124
      pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java
  6. 8
      pav-server/src/main/resources/application.yml

37
pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java

@ -23,6 +23,8 @@ import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import com.palnet.biz.api.bas.flight.dto.LanncPdfVO;
import com.palnet.biz.api.bas.flight.model.BasFlightAprovRq;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel;
@ -37,7 +39,6 @@ import com.palnet.biz.api.comn.response.BasicResponse;
import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.jpa.entity.ComFileBas;
import com.palnet.biz.jpa.repository.com.ComFileBasRepository;
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.AreaUtils;
@ -58,15 +59,14 @@ public class BasFlightController {
private final Environment env;
private final CtrTrnsLctnService ctrTrnsLctnService;
private final AreaUtils utils;
private final PdfUtils pdfUtils;
private final PdfUtils pdfUtils;
@Autowired
public BasFlightController(BasFlightService basFlightService, Environment env, CtrTrnsLctnService ctrTrnsLctnService, AreaUtils AreaUtils, ComFileBasRepository comFileBasRepository, PdfUtils pdfUtils) {
public BasFlightController(BasFlightService basFlightService, Environment env, CtrTrnsLctnService ctrTrnsLctnService, AreaUtils AreaUtils, PdfUtils pdfUtils) {
this.basFlightService = basFlightService;
this.env = env;
this.ctrTrnsLctnService = ctrTrnsLctnService;
this.utils = AreaUtils;
this.comFileBasRepository = comFileBasRepository;
this.pdfUtils = pdfUtils;
}
@ -391,25 +391,22 @@ public class BasFlightController {
for(Coordinate a : coordList) {
System.out.println("["+a.getX() + ", " + a.getY()+"],");
}
}
private final ComFileBasRepository comFileBasRepository;
@GetMapping("/test/createLancePDF")
public void createLancePDF() {
}
@PostMapping("/lance-pdf/create")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiOperation(value = "Lannc 공문 PDF생성")
public void createLancePDF(@RequestBody LanncPdfVO vo) {
String airUser = vo.getUserName();
String etc = String.valueOf(System.currentTimeMillis());
String fileName = pdfUtils.getSaveName(airUser, etc);
HashMap<String, Object> param = new HashMap<>();
param.put("userName", "이경도");
param.put("userAge", 25);
param.put("userGender", "M");
// PDF 생성 및 저장
String htmlContent = pdfUtils.getHtmlToString(vo);
ComFileBas comFileBas = pdfUtils.generatePDF(htmlContent, fileName);
pdfUtils.getSaveName("LanncPDF.pdf");
String htmlContent = pdfUtils.getHtmlToString(param);
ComFileBas comFileBas = pdfUtils.generatePDF(htmlContent);
comFileBasRepository.save(comFileBas);
pdfUtils.save(comFileBas);
}

54
pav-server/src/main/java/com/palnet/biz/api/bas/flight/dto/LanncPdfVO.java

@ -0,0 +1,54 @@
package com.palnet.biz.api.bas.flight.dto;
import java.lang.reflect.Field;
import java.util.HashMap;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class LanncPdfVO extends PdfBaseVO{
// TODO : 아직 파라미터가 정해지지 않음
private String userName; // 조종사 이름
private int userAge; // 조종사 나이
private String userGender; // 조종사 성별
public LanncPdfVO (){
init();
}
public HashMap<String, Object> getParam(){
Field[] fields = getClass().getDeclaredFields();
HashMap<String, Object> result = new HashMap<>();
try {
for(Field field : fields){
Object value = field.get(this);
String key = field.getName();
result.put(key, value);
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e){
e.printStackTrace();
}
return result;
}
@Override
public void init() {
super.setTemplate("official_document");
}
}

16
pav-server/src/main/java/com/palnet/biz/api/bas/flight/dto/PdfBaseVO.java

@ -0,0 +1,16 @@
package com.palnet.biz.api.bas.flight.dto;
import java.util.Map;
import lombok.Data;
@Data
public abstract class PdfBaseVO {
private String template;
public abstract void init();
public abstract Map<String, Object> getParam();
}

2
pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java

@ -8,5 +8,5 @@ import com.palnet.biz.jpa.entity.ComFileBas;
@Repository
public interface ComFileBasRepository extends JpaRepository<ComFileBas, String>{
public ComFileBas findFirstByOrderByFileSnoDesc();
}

124
pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java

@ -11,8 +11,13 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
@ -35,7 +40,9 @@ import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.bas.flight.dto.PdfBaseVO;
import com.palnet.biz.jpa.entity.ComFileBas;
import com.palnet.biz.jpa.repository.com.ComFileBasRepository;
import lombok.extern.slf4j.Slf4j;
@ -49,23 +56,30 @@ public class PdfUtils {
@Autowired
private JwtTokenUtil jwtTokenUtil;
// @Value("${}") // 기본 경로 지정할 곳
private final String BASE_PATH = "";
@Autowired
private ComFileBasRepository comFileBasRepository;
private final String FILE_BASE_NAME = "LANNC_PDF";
@Value("${base-url}")
private String BASE_PATH;
private final String FILE_EXTENSION = ".pdf";
public String getSaveName(String baseName){
/**
* 파일명 만들기, 앞에 기본으로 금일 날짜있음
* @param etcName
* @return
*/
public String getSaveName(String ...etcName){
String date = InstantUtils.toDateString(Instant.now()).replace("-", "");
StringBuilder result = new StringBuilder();
result.append(date)
.append("_")
.append(System.currentTimeMillis())
.append("_")
.append(baseName);
result.append(date);
for(String name : etcName){
result.append("-")
.append(name);
}
return result.toString();
}
@ -73,19 +87,23 @@ public class PdfUtils {
/**
* Thymeleaf HTML 파일을 데이터 바인딩하여 String으로 변환
* @param <T>
* @param param
* @param pdfDto
* @return
*/
public <T extends HashMap<String, Object>> String getHtmlToString(T param){
public <T extends PdfBaseVO> String getHtmlToString(T pdfDto){
Map<String, Object> param = pdfDto.getParam();
// Thymeleaf 방식 html에 입힐 데이터 바인딩
Context context = new Context();
context.setVariable("userName", param.get("userName"));
context.setVariable("userAge", param.get("userAge"));
context.setVariable("userGender", param.get("userGender"));
Context context = new Context();
for(Entry<String, Object> entry : param.entrySet()){
context.setVariable(entry.getKey(), param.get(entry.getKey()));
}
// official_document은 html이름임 , 앞 뒤 prefix, suffix는 yml에 정의해놓음
// official_document html에 바인딩할 데이터 넣고 돌려서 String형식으로 뽑아옴
String htmlContent = templateEngine.process("official_document", context);
// 앞 뒤 prefix, suffix는 yml에 정의해놓음
// html에 바인딩할 데이터 넣고 파싱이후 String형식으로 뽑아옴
String htmlContent = templateEngine.process(pdfDto.getTemplate(), context);
return htmlContent;
}
@ -93,31 +111,42 @@ public class PdfUtils {
/**
* HTML 태그로 이루어진 String값을 PDF로 변환
* @param htmlContent
* @param fileName
* @return
*/
public ComFileBas generatePDF(String htmlContent){
public ComFileBas generatePDF(String htmlContent, String fileName){
// PDF 용지 설정하기
Document pdfDocument = new Document();
ComFileBas result = new ComFileBas();
String pdfPath = new StringBuilder()
.append(this.BASE_PATH)
.append(InstantUtils.toDateString(Instant.now()).replace("-", ""))
.append("/").toString();
try {
String fileName = getSaveName(this.FILE_BASE_NAME + this.FILE_EXTENSION);
// 폴더 생성
new File(pdfPath).mkdirs();
// File 저장 기본경로는 main 아래로 기본으로 잡힘
PdfWriter writer = PdfWriter.getInstance(pdfDocument, new FileOutputStream(fileName));
PdfWriter writer = PdfWriter.getInstance(pdfDocument, new FileOutputStream(pdfPath + fileName + this.FILE_EXTENSION));
writer.setInitialLeading(12.5f);
pdfDocument.open();
CSSResolver cssResolver = new StyleAttrCSSResolver();
// CSS
// jar변환 시 CSS파일을 못 찾을수도 있어서 InputStream 사용
// CSS의 색깔은 키워드로 표기 X, #e73a3a 등 16진법으로 표기 해야함
/*
CSS 설정 TODO : 추후 템플릿 CSS 맞춰야 할것
jar변환 CSS파일을 찾을수도 있어서 InputStream 사용
CSS의 색깔은 키워드로 표기 X, #e73a3a 16진법으로 표기 해야함
*/
InputStream cssStream = getClass().getClassLoader().getResourceAsStream("static/css/pdf.css");
CssFile cssFile = XMLWorkerHelper.getCSS(cssStream);
CSSResolver cssResolver = new StyleAttrCSSResolver();
cssResolver.addCss(cssFile);
// Font
// Font 설정 TODO : 추후 템플릿 CSS 맞춰야 할것
XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
fontProvider.register("static/font/NanumGothic.ttf", "NanumGothic");
CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
@ -136,10 +165,7 @@ public class PdfUtils {
XMLParser xmlParser = new XMLParser(xmlWorker, Charset.forName("UTF-8"));
xmlParser.parse(stringReader);
result.setFileSaveNm(fileName);
result.setFileOriNm(fileName);
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e1){
@ -151,13 +177,6 @@ public class PdfUtils {
pdfDocument.close();
}
try {
long fileSize = Files.size(Paths.get(this.BASE_PATH + result.getFileOriNm())) / 1024;
if(fileSize > 0) result.setFileSize(String.valueOf(fileSize));
} catch (IOException e) {
e.printStackTrace();
}
String userId = jwtTokenUtil.getUserIdByToken();
@ -166,10 +185,35 @@ public class PdfUtils {
result.setFileExt(this.FILE_EXTENSION);
result.setCreateDt(Instant.now());
result.setCreateUserId(userId);
result.setFileSaveNm(fileName);
result.setFileOriNm(fileName);
log.error("Entity -> {}", result);
try {
String filePath = this.BASE_PATH + result.getFileOriNm() + this.FILE_EXTENSION;
long fileSize = Files.size(Paths.get(pdfPath + filePath)) / 1024;
if(fileSize > 0) result.setFileSize(String.valueOf(fileSize));
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* DB 인서트, 최신데이터 가져온 Group NO 1추가함
* @param comFileBas
*/
@Transactional
public void save(ComFileBas comFileBas){
// DB Insert
ComFileBas lastComFileBas = comFileBasRepository.findFirstByOrderByFileSnoDesc();
int fileGroupNo = (lastComFileBas == null) ? 1 : lastComFileBas.getFileGroupNo() + 1;
comFileBas.setFileGroupNo(fileGroupNo);
comFileBasRepository.save(comFileBas);
}
}

8
pav-server/src/main/resources/application.yml

@ -63,6 +63,8 @@ api:
client-secret-key: Q4K4OtUYol
search-url : https://openapi.naver.com/v1/search/local.json
base-url:
---
spring:
@ -108,6 +110,7 @@ api:
client-secret-key: Q4K4OtUYol
search-url : https://openapi.naver.com/v1/search/local.json
base-url: /data/server/files
---
spring:
@ -162,6 +165,7 @@ api:
client-secret-key: Q4K4OtUYol
search-url : https://openapi.naver.com/v1/search/local.json
base-url: /data/server/files
---
spring:
@ -210,4 +214,6 @@ api:
naver:
client-id: WGEct3bJhQC0pyMsP_GK
client-secret-key: Q4K4OtUYol
search-url : https://openapi.naver.com/v1/search/local.json
search-url : https://openapi.naver.com/v1/search/local.json
base-url: /data/server/files
Loading…
Cancel
Save