|
|
|
@ -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); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|