diff --git a/pav-server/build.gradle b/pav-server/build.gradle index 101ec16c..fb2a0292 100644 --- a/pav-server/build.gradle +++ b/pav-server/build.gradle @@ -43,6 +43,15 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-cache' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-jdbc' + developmentOnly 'org.springframework.boot:spring-boot-devtools' + + // thymeleaf + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + + // pdf create + implementation 'com.itextpdf:itextpdf:5.5.13' + implementation 'com.itextpdf.tool:xmlworker:5.5.13' + implementation 'com.itextpdf:pdfa:7.2.3' // db runtimeOnly 'mysql:mysql-connector-java' @@ -95,6 +104,7 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testAnnotationProcessor "org.mapstruct:mapstruct-processor:1.5.5.Final" + } tasks.named('test') { diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java index 44136075..821ca9f1 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java @@ -40,6 +40,7 @@ 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; +import com.palnet.comn.utils.PdfUtils; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -56,14 +57,16 @@ public class BasFlightController { private final Environment env; private final CtrTrnsLctnService ctrTrnsLctnService; private final AreaUtils utils; + private final PdfUtils pdfUtils; @Autowired - public BasFlightController(BasFlightService basFlightService, Environment env, CtrTrnsLctnService ctrTrnsLctnService, AreaUtils AreaUtils, ComFileBasRepository comFileBasRepository) { + public BasFlightController(BasFlightService basFlightService, Environment env, CtrTrnsLctnService ctrTrnsLctnService, AreaUtils AreaUtils, ComFileBasRepository comFileBasRepository, PdfUtils pdfUtils) { this.basFlightService = basFlightService; this.env = env; this.ctrTrnsLctnService = ctrTrnsLctnService; this.utils = AreaUtils; this.comFileBasRepository = comFileBasRepository; + this.pdfUtils = pdfUtils; } @GetMapping("/area") @@ -395,7 +398,12 @@ public class BasFlightController { public void createLancePDF() { log.warn("안뇽"); - log.error("dd -> {}", comFileBasRepository.findAll()); + HashMap param = new HashMap<>(); + param.put("userName", "이경도"); + param.put("userAge", 25); + param.put("userGender", "M"); + + pdfUtils.generatePDF(param); } diff --git a/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java b/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java new file mode 100644 index 00000000..22e21d02 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java @@ -0,0 +1,110 @@ +package com.palnet.comn.utils; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.nio.charset.Charset; +import java.util.HashMap; + +import org.springframework.beans.factory.annotation.Autowired; +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 lombok.extern.slf4j.Slf4j; + +@Component +@Slf4j +public class PdfUtils { + + @Autowired + private TemplateEngine templateEngine; + + private final String BASE_PATH = ""; + + private final String FILE_BASE_NAME = "LANNC_PDF.pdf"; + + public > void generatePDF(T param){ + + // Thymeleaf 방식 html에 입힐 데이터 바인딩 + Context context = new Context(); + context.setVariable("userName", param.get("userName")); + context.setVariable("userAge", param.get("userAge")); + context.setVariable("userGender", param.get("userGender")); + + // official_document은 html이름임 , 앞 뒤 prefix, suffix는 yml에 정의해놓음 + // official_document html에 바인딩할 데이터 넣고 돌려서 String형식으로 뽑아옴 + String htmlContent = templateEngine.process("official_document", context); + + log.error("htmlContent -> {}", htmlContent); + + // PDF 용지 설정하기 + Document pdfDocument = new Document(); + + try { + PdfWriter writer = PdfWriter.getInstance(pdfDocument, new FileOutputStream(this.FILE_BASE_NAME)); + writer.setInitialLeading(12.5f); + + pdfDocument.open(); + + CSSResolver cssResolver = new StyleAttrCSSResolver(); + // jar변환 시 CSS파일을 못 찾을수도 있어서 InputStream 사용 + InputStream cssStream = getClass().getClassLoader().getResourceAsStream("static/css/pdf.css"); + CssFile cssFile = XMLWorkerHelper.getCSS(cssStream); + cssResolver.addCss(cssFile); + + // 폰트 + XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); + fontProvider.register("static/font/NanumGothic.ttf", "NanumGothic"); + CssAppliers cssAppliers = new CssAppliersImpl(fontProvider); + + log.info("fontProvider -> {}",fontProvider.getRegisteredFonts()); + log.info("cssFile -> {}", cssFile); + + 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 e1){ + e1.printStackTrace(); + } catch (Exception e2){ + e2.printStackTrace(); + } + finally{ + pdfDocument.close(); + } + + } + +} diff --git a/pav-server/src/main/resources/application.yml b/pav-server/src/main/resources/application.yml index cbf486e8..cccf1b53 100644 --- a/pav-server/src/main/resources/application.yml +++ b/pav-server/src/main/resources/application.yml @@ -30,6 +30,12 @@ spring: ddl-auto: none properties: hibernate: + thymeleaf: + mode: HTML5 + cache: false + encoding: UTF-8 + prefix: classpath:/templates/ + suffix: .html server: port: 8080 diff --git a/pav-server/src/main/resources/static/css/pdf.css b/pav-server/src/main/resources/static/css/pdf.css new file mode 100644 index 00000000..6a89f1d1 --- /dev/null +++ b/pav-server/src/main/resources/static/css/pdf.css @@ -0,0 +1,8 @@ + +body{ + font-family: NanumGothic; +} + +p{ + background-color: aquamarine; +} \ No newline at end of file diff --git a/pav-server/src/main/resources/static/font/NanumGothic.ttf b/pav-server/src/main/resources/static/font/NanumGothic.ttf new file mode 100644 index 00000000..75d010a5 Binary files /dev/null and b/pav-server/src/main/resources/static/font/NanumGothic.ttf differ diff --git a/pav-server/src/main/resources/templates/official_document.html b/pav-server/src/main/resources/templates/official_document.html new file mode 100644 index 00000000..f79021aa --- /dev/null +++ b/pav-server/src/main/resources/templates/official_document.html @@ -0,0 +1,8 @@ + + +

Thymeleaf Tutorials

+

이름 : [[${userName}]]

+

나이 : [[${userAge}]]

+

성별 : [[${userGender}]]

+ + \ No newline at end of file