Browse Source

Template HTML -> Pdf변환

pull/3/head
lkd9125 1 year ago
parent
commit
55a84cb7b9
  1. 10
      pav-server/build.gradle
  2. 12
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java
  3. 110
      pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java
  4. 6
      pav-server/src/main/resources/application.yml
  5. 8
      pav-server/src/main/resources/static/css/pdf.css
  6. BIN
      pav-server/src/main/resources/static/font/NanumGothic.ttf
  7. 8
      pav-server/src/main/resources/templates/official_document.html

10
pav-server/build.gradle

@ -43,6 +43,15 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-cache' implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-jdbc' 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 // db
runtimeOnly 'mysql:mysql-connector-java' runtimeOnly 'mysql:mysql-connector-java'
@ -95,6 +104,7 @@ dependencies {
testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.boot:spring-boot-starter-test'
testAnnotationProcessor "org.mapstruct:mapstruct-processor:1.5.5.Final" testAnnotationProcessor "org.mapstruct:mapstruct-processor:1.5.5.Final"
} }
tasks.named('test') { tasks.named('test') {

12
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.biz.scheduler.ctr.service.CtrTrnsLctnService;
import com.palnet.comn.exception.CustomException; import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.AreaUtils; import com.palnet.comn.utils.AreaUtils;
import com.palnet.comn.utils.PdfUtils;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -56,14 +57,16 @@ public class BasFlightController {
private final Environment env; private final Environment env;
private final CtrTrnsLctnService ctrTrnsLctnService; private final CtrTrnsLctnService ctrTrnsLctnService;
private final AreaUtils utils; private final AreaUtils utils;
private final PdfUtils pdfUtils;
@Autowired @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.basFlightService = basFlightService;
this.env = env; this.env = env;
this.ctrTrnsLctnService = ctrTrnsLctnService; this.ctrTrnsLctnService = ctrTrnsLctnService;
this.utils = AreaUtils; this.utils = AreaUtils;
this.comFileBasRepository = comFileBasRepository; this.comFileBasRepository = comFileBasRepository;
this.pdfUtils = pdfUtils;
} }
@GetMapping("/area") @GetMapping("/area")
@ -395,7 +398,12 @@ public class BasFlightController {
public void createLancePDF() { public void createLancePDF() {
log.warn("안뇽"); log.warn("안뇽");
log.error("dd -> {}", comFileBasRepository.findAll()); HashMap<String, Object> param = new HashMap<>();
param.put("userName", "이경도");
param.put("userAge", 25);
param.put("userGender", "M");
pdfUtils.generatePDF(param);
} }

110
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 <T extends HashMap<String, Object>> 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();
}
}
}

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

@ -30,6 +30,12 @@ spring:
ddl-auto: none ddl-auto: none
properties: properties:
hibernate: hibernate:
thymeleaf:
mode: HTML5
cache: false
encoding: UTF-8
prefix: classpath:/templates/
suffix: .html
server: server:
port: 8080 port: 8080

8
pav-server/src/main/resources/static/css/pdf.css

@ -0,0 +1,8 @@
body{
font-family: NanumGothic;
}
p{
background-color: aquamarine;
}

BIN
pav-server/src/main/resources/static/font/NanumGothic.ttf

Binary file not shown.

8
pav-server/src/main/resources/templates/official_document.html

@ -0,0 +1,8 @@
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p id="d1">Thymeleaf Tutorials</p>
<p>이름 : [[${userName}]]</p>
<p>나이 : [[${userAge}]]</p>
<p>성별 : [[${userGender}]]</p>
</body>
</html>
Loading…
Cancel
Save