lkd9125
1 year ago
23 changed files with 12411 additions and 22482 deletions
@ -1,11 +1,16 @@
|
||||
package com.palnet.biz.api.acnt.terms.model; |
||||
|
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Builder; |
||||
import lombok.Data; |
||||
import lombok.NoArgsConstructor; |
||||
|
||||
@Data |
||||
@Builder |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
public class AcntTermsRqModel { |
||||
|
||||
private String siteCd; |
||||
|
||||
private String termsCtgryCd; |
||||
private String langDivCd; |
||||
} |
||||
|
@ -0,0 +1,26 @@
|
||||
package com.palnet.biz.api.bas.flight.model; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore; |
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Builder; |
||||
import lombok.Data; |
||||
import lombok.NoArgsConstructor; |
||||
|
||||
/** |
||||
* packageName : com.palnet.biz.api.bas.flight.model |
||||
* fileName : BasFlightPlanErrorRS |
||||
* author : dhji |
||||
* date : 2023-09-19(019) |
||||
* description : |
||||
* =========================================================== |
||||
* DATE AUTHOR NOTE |
||||
* ----------------------------------------------------------- |
||||
* 2023-09-19(019) dhji 최초 생성 |
||||
*/ |
||||
@Data |
||||
@Builder |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
public class BasFlightPlanCreateRs { |
||||
private String pdfUrl; |
||||
} |
@ -0,0 +1,109 @@
|
||||
package com.palnet.biz.api.bas.flight.template.service; |
||||
|
||||
import java.io.File; |
||||
import java.io.FileOutputStream; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.StringReader; |
||||
import java.nio.charset.Charset; |
||||
import java.nio.file.Files; |
||||
import java.nio.file.Paths; |
||||
import java.time.Instant; |
||||
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.Service; |
||||
|
||||
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; |
||||
import com.palnet.biz.api.bas.flight.template.vo.LaancPdfVO; |
||||
import com.palnet.biz.jpa.entity.ComFileBas; |
||||
import com.palnet.biz.jpa.repository.com.ComFileBasRepository; |
||||
import com.palnet.comn.utils.InstantUtils; |
||||
import com.palnet.comn.utils.PdfUtils; |
||||
|
||||
import lombok.extern.slf4j.Slf4j; |
||||
|
||||
@Service |
||||
@Slf4j |
||||
public class TemplateService { |
||||
|
||||
@Autowired |
||||
private PdfUtils pdfUtils; |
||||
|
||||
@Autowired |
||||
private JwtTokenUtil jwtTokenUtil; |
||||
|
||||
@Autowired |
||||
private ComFileBasRepository comFileBasRepository; |
||||
|
||||
@Value("${base-url}") |
||||
private String BASE_PATH; |
||||
|
||||
private final String FILE_EXTENSION = ".pdf"; |
||||
|
||||
/** |
||||
* 파일명 만들기, 앞에 기본으로 금일 날짜있음 |
||||
* [예시] 20230102_[추가파라미터] |
||||
* @param etcName |
||||
* @return |
||||
*/ |
||||
private String getLaancSaveName(String ...etcName){ |
||||
|
||||
String date = InstantUtils.toDateString(Instant.now()).replace("-", ""); |
||||
|
||||
StringBuilder result = new StringBuilder(); |
||||
result.append(date); |
||||
|
||||
for(String name : etcName){ |
||||
result.append("-") |
||||
.append(name); |
||||
} |
||||
|
||||
result.append(this.FILE_EXTENSION); |
||||
|
||||
return result.toString(); |
||||
} |
||||
|
||||
/** |
||||
* PDF 생성 |
||||
* @param vo |
||||
* @return |
||||
*/ |
||||
public ComFileBas makeLaancPdf(LaancPdfVO vo){ |
||||
|
||||
String airUser = vo.getUserName(); |
||||
String etc = String.valueOf(System.currentTimeMillis()); // 동명이인 방지
|
||||
String fileName = getLaancSaveName(airUser, etc); |
||||
|
||||
String htmlContent = pdfUtils.getHtmlToString(vo); |
||||
ComFileBas comFileBas = pdfUtils.generatePDF(htmlContent, fileName); |
||||
|
||||
String userId = jwtTokenUtil.getUserIdByToken(); |
||||
comFileBas.setCreateUserId(userId); |
||||
|
||||
return comFileBas; |
||||
} |
||||
|
||||
|
||||
|
||||
/** |
||||
* 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); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,54 @@
|
||||
package com.palnet.biz.api.bas.flight.template.vo; |
||||
|
||||
import java.lang.reflect.Field; |
||||
import java.util.HashMap; |
||||
|
||||
import lombok.Getter; |
||||
import lombok.Setter; |
||||
import lombok.ToString; |
||||
|
||||
@Getter |
||||
@Setter |
||||
@ToString |
||||
public class LaancPdfVO extends PdfBaseVO{ |
||||
|
||||
// TODO : 아직 파라미터가 정해지지 않음
|
||||
private String userName; // 조종사 이름
|
||||
|
||||
private int userAge; // 조종사 나이
|
||||
|
||||
private String userGender; // 조종사 성별
|
||||
|
||||
|
||||
public LaancPdfVO (){ |
||||
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"); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,16 @@
|
||||
package com.palnet.biz.api.bas.flight.template.vo; |
||||
|
||||
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(); |
||||
|
||||
} |
@ -0,0 +1,70 @@
|
||||
package com.palnet.biz.jpa.entity; |
||||
|
||||
import lombok.Data; |
||||
|
||||
import javax.persistence.*; |
||||
import java.io.Serializable; |
||||
import java.time.Instant; |
||||
|
||||
|
||||
/** |
||||
* The persistent class for the COM_IDNTF_BAS database table. |
||||
* |
||||
*/ |
||||
@Data |
||||
@Entity |
||||
@Table(name="COM_FILE_BAS") |
||||
@NamedQuery(name="ComFileBas.findAll", query="SELECT c FROM ComFileBas c") |
||||
public class ComFileBas implements Serializable { |
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
@Id |
||||
@Column(name="FILE_SNO") |
||||
private int fileSno; |
||||
|
||||
@Column(name="FILE_GROUP_NO") |
||||
private int fileGroupNo; |
||||
|
||||
@Column(name="FILE_SAVE_NM") |
||||
private String fileSaveNm; |
||||
|
||||
@Column(name="FILE_ORI_NM") |
||||
private String fileOriNm; |
||||
|
||||
@Column(name = "FILE_PATH") |
||||
private String filePath; |
||||
|
||||
@Column(name="FILE_EXT") |
||||
private String fileExt; |
||||
|
||||
// @Temporal(TemporalType.TIMESTAMP)
|
||||
@Column(name="FILE_SIZE") |
||||
private String fileSize; |
||||
|
||||
// @Temporal(TemporalType.TIMESTAMP)
|
||||
@Column(name="DEL_YN", columnDefinition = "TIMESTAMP") |
||||
private String delYn = "N"; |
||||
|
||||
@Column(name="DEL_USER_ID") |
||||
private String delUserId; |
||||
|
||||
@Column(name="DEL_DT") |
||||
private Instant delDt; |
||||
|
||||
@Column(name="CREATE_USER_ID") |
||||
private String createUserId; |
||||
|
||||
@Column(name="CREATE_DT" , columnDefinition = "TIMESTAMP") |
||||
private Instant createDt; |
||||
|
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,12 @@
|
||||
package com.palnet.biz.jpa.repository.com; |
||||
|
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
import org.springframework.stereotype.Repository; |
||||
|
||||
import com.palnet.biz.jpa.entity.ComFileBas; |
||||
|
||||
@Repository |
||||
public interface ComFileBasRepository extends JpaRepository<ComFileBas, String>{ |
||||
|
||||
public ComFileBas findFirstByOrderByFileSnoDesc(); |
||||
} |
@ -0,0 +1,169 @@
|
||||
package com.palnet.comn.utils; |
||||
|
||||
import java.io.File; |
||||
import java.io.FileOutputStream; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.StringReader; |
||||
import java.nio.charset.Charset; |
||||
import java.nio.file.Files; |
||||
import java.nio.file.Paths; |
||||
import java.time.Instant; |
||||
import java.util.Map; |
||||
import java.util.Map.Entry; |
||||
|
||||
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; |
||||
|
||||
import com.itextpdf.text.Document; |
||||
import com.itextpdf.text.DocumentException; |
||||
import com.itextpdf.text.pdf.PdfWriter; |
||||
import com.itextpdf.tool.xml.XMLWorker; |
||||
import com.itextpdf.tool.xml.XMLWorkerFontProvider; |
||||
import com.itextpdf.tool.xml.XMLWorkerHelper; |
||||
import com.itextpdf.tool.xml.css.CssFile; |
||||
import com.itextpdf.tool.xml.css.StyleAttrCSSResolver; |
||||
import com.itextpdf.tool.xml.html.CssAppliers; |
||||
import com.itextpdf.tool.xml.html.CssAppliersImpl; |
||||
import com.itextpdf.tool.xml.html.Tags; |
||||
import com.itextpdf.tool.xml.parser.XMLParser; |
||||
import com.itextpdf.tool.xml.pipeline.css.CSSResolver; |
||||
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline; |
||||
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.template.vo.PdfBaseVO; |
||||
import com.palnet.biz.jpa.entity.ComFileBas; |
||||
|
||||
@Component |
||||
public class PdfUtils { |
||||
|
||||
|
||||
@Autowired |
||||
private TemplateEngine templateEngine; |
||||
|
||||
@Value("${base-url}") |
||||
private String BASE_PATH; |
||||
|
||||
private final String FILE_EXTENSION = ".pdf"; |
||||
|
||||
|
||||
/** |
||||
* Thymeleaf HTML 파일을 데이터 바인딩하여 String으로 변환 |
||||
* @param <T> |
||||
* @param pdfDto |
||||
* @return |
||||
*/ |
||||
public <T extends PdfBaseVO> String getHtmlToString(T pdfDto){ |
||||
|
||||
Map<String, Object> param = pdfDto.getParam(); |
||||
|
||||
// Thymeleaf 방식 html에 입힐 데이터 바인딩
|
||||
Context context = new Context(); |
||||
|
||||
for(Entry<String, Object> entry : param.entrySet()){ |
||||
String key = entry.getKey(); |
||||
|
||||
context.setVariable(key, param.get(key)); |
||||
} |
||||
|
||||
// 앞 뒤 prefix, suffix는 yml에 정의해놓음
|
||||
// html에 바인딩할 데이터 넣고 파싱이후 String형식으로 뽑아옴
|
||||
String htmlContent = templateEngine.process(pdfDto.getTemplate(), context); |
||||
|
||||
return htmlContent; |
||||
} |
||||
|
||||
/** |
||||
* HTML 태그로 이루어진 String값을 PDF로 변환 |
||||
* @param htmlContent |
||||
* @param fileName |
||||
* @return |
||||
*/ |
||||
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 { |
||||
|
||||
// 폴더 생성
|
||||
new File(pdfPath).mkdirs(); |
||||
|
||||
// File 저장 기본경로는 main 아래로 기본으로 잡힘
|
||||
PdfWriter writer = PdfWriter.getInstance(pdfDocument, new FileOutputStream(pdfPath + fileName)); |
||||
writer.setInitialLeading(12.5f); |
||||
|
||||
pdfDocument.open(); |
||||
|
||||
/* |
||||
CSS 설정 |
||||
TODO : CSS 파일이 따로 있을시 임포트해주는 방법, 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 설정
|
||||
XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); |
||||
fontProvider.register("static/font/NanumGothic.ttf", "NanumGothic"); |
||||
CssAppliers cssAppliers = new CssAppliersImpl(fontProvider); |
||||
|
||||
// XML Worker에 넣을 PipeLine객체 생성, CssResolverPipeline 이 객체를 최종적으로 넣어야 Font,Css가 적용됨
|
||||
HtmlPipelineContext htmlPipelineContext = new HtmlPipelineContext(cssAppliers); |
||||
htmlPipelineContext.setTagFactory(Tags.getHtmlTagProcessorFactory()); |
||||
|
||||
PdfWriterPipeline pdfWriterPipeline = new PdfWriterPipeline(pdfDocument, writer); |
||||
HtmlPipeline htmlPipeline = new HtmlPipeline(htmlPipelineContext, pdfWriterPipeline); |
||||
CssResolverPipeline cssResolverPipeline = new CssResolverPipeline(cssResolver, htmlPipeline); |
||||
|
||||
StringReader stringReader = new StringReader(htmlContent); |
||||
|
||||
XMLWorker xmlWorker = new XMLWorker(cssResolverPipeline, true); |
||||
XMLParser xmlParser = new XMLParser(xmlWorker, Charset.forName("UTF-8")); |
||||
|
||||
xmlParser.parse(stringReader); |
||||
|
||||
} catch (IOException e) { |
||||
e.printStackTrace(); |
||||
} catch (DocumentException e){ |
||||
e.printStackTrace(); |
||||
} catch (Exception e){ |
||||
e.printStackTrace(); |
||||
} |
||||
finally{ |
||||
pdfDocument.close(); |
||||
} |
||||
|
||||
result.setFileGroupNo(0); |
||||
result.setFilePath(pdfPath); |
||||
result.setFileExt(this.FILE_EXTENSION); |
||||
result.setCreateDt(Instant.now()); |
||||
result.setFileSaveNm(fileName); |
||||
result.setFileOriNm(fileName); |
||||
|
||||
try { |
||||
String filePath = result.getFileOriNm(); |
||||
long fileSize = Files.size(Paths.get(pdfPath + filePath)) / 1024; |
||||
|
||||
if(fileSize >= 0) result.setFileSize(String.valueOf(fileSize)); |
||||
} catch (IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
|
||||
return result; |
||||
} |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,12 @@
|
||||
|
||||
body{ |
||||
font-family: NanumGothic; |
||||
} |
||||
|
||||
p{ |
||||
background-color: #e73a3a; |
||||
} |
||||
|
||||
div { |
||||
background-color: #e73a3a; |
||||
} |
Binary file not shown.
@ -0,0 +1,12 @@
|
||||
<html lang="ko" xmlns:th="http://www.thymeleaf.org"> |
||||
<head> |
||||
<meta charset="UTF-8" /> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
||||
</head> |
||||
<body> |
||||
<p>Thymeleaf Tutorials</p> |
||||
<p>이름 : [[${userName}]]</p> |
||||
<p>나이 : [[${userAge}]]</p> |
||||
<p>성별 : [[${userGender}]]</p> |
||||
</body> |
||||
</html> |
Loading…
Reference in new issue