티스토리 뷰

728x90
반응형
기존에 pdf를 생성하려고 하면 프론트 단에서 css를 이용하거나 js를 이용해서 처리할 수 가 있다.
하지만 지금 정리하고 있는 내용은 조금 사뭇 다른 내용이다....
클라이언트로부터 등록하는 정보에 대한  pdf를 만드는 내용이다.
여기까지만 들었을 때는 그냥 정보가 등록되고 나면 해당 등록된 화면에서 스크립트 처리하면 되겠지 하지만 막상 세세하게 내용을 열어보면 다르다.
등록된 정보들을 토대로 조회했을 때 pdf 파일들을 뽑을 수 있도록 하는 것이다.
Spring 에서는 MVC 개념으로 해당 데이터를 db로 부터 가져와서 view 단에 뿌려주는 형식이다. 
그렇다보니 기본적인 pdf 파일로 변환하는건 거진 데이터가 뿌려지는 view단에서 스크립트를 통해 처리를 하게 된다.
하지만 지금은 그와 다른 형식으로 검색을 하면 자동적으로 pdf 파일들이 압축되어 다운로드가 되어야한다.
그렇게 하기 위해서는 서버단인 Controller에서 데이터 정보들을 pdf 파일화 작업을 진행하여 그 파일 정보들을 압축시켜 다운로드 될 수 있도록 해야하는 것이다. 
데이터들도 매번 다른 정보가 등록되기 떄문에 고민이 됬다.
그래서 생각한 방식은 Thymeleaf를 이용하여 서버단에서 탬플릿 파일로 저장을 해두고 동적인 데이터를 파일화 하여 처리하는 방식이었다.
Thymeleaf는 일종의 탬플릿으로 jstl 과 비스무리한 방식이다 흔히 Spring , java, jsp 에서 사용되는 탬플릿이다.
이 탬플릿을 이용하여 서버단에서 데이터가 등록되는 동시에 pdf 파일을 생성할 수가 있다.
 
생성 방법 
 
Thymeleaf 와 관련덴 라이브러리 파일을 선언

pom.xml

 <dependency>
   <groupId>org.thymeleaf</groupId>
   <artifactId>thymeleaf-spring5</artifactId>
   <version>3.0.11.RELEASE</version>
</dependency>
resource 아래에  html 파일 생성

예시)

pdf 파일 위치

Thymeleaf 를 해당 html에 선언하고 해당 아래 이미지 처럼 Thymeleaf 처리 메소드를 이용하여 데이터를 맞게 추가

Thymeleaf에 pdf 양식 적용

html을 String으로 변경처리해줄 메소드 선언
package kr.co.iacts.smartcms.modules.bizmoney.util;
import java.util.Map;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.templatemode.TemplateMode;
import  org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;

public class ThymeleafParser {

     //fileName : 확장명을 제외한 양식 html 명
     //variableMap : 해당 html에 들어가는 파일 데이터
     public static String parseHtmlFileToString(String  fileName, Map<String,Object> variableMap) {
           String result = "";
           try {
                final ClassLoaderTemplateResolver  templateResolver  =  new ClassLoaderTemplateResolver();
                
                templateResolver.setPrefix("/templates/thymeleaf/"); //html 정보가 있는 경로 
                templateResolver.setSuffix(".html");//html 확장명
                templateResolver.setTemplateMode(TemplateMode.HTML);
                templateResolver.setCharacterEncoding("UTF-8");
                templateResolver.setCacheable(false);
                
                final SpringTemplateEngine templateEngine = new  SpringTemplateEngine();
                templateEngine.setTemplateResolver(templateResolver);
                
                final Context context = new Context();
                context.setVariables(variableMap);
                
                result =  templateEngine.process(fileName,  context);
           }catch (Exception e) {
                e.printStackTrace();
           }
           return result;
     }
}​
String화 한 html을 pdf로 변환하는 처리 방식 itextpdf 를 이용하여 처리
itextpdf 라이브러리 선언
pom.xml
<!-- html -> pdf 화 작업을 위한 라이브러리 itext -->
           <dependency>
               <groupId>com.itextpdf</groupId>
               <artifactId>itextpdf</artifactId>
               <version>5.5.9</version>
           </dependency>
           <dependency>
               <groupId>com.itextpdf</groupId>
               <artifactId>itext-pdfa</artifactId>
               <version>5.5.9</version>
           </dependency>
           <dependency>
               <groupId>com.itextpdf</groupId>
               <artifactId>itext-xtra</artifactId>
               <version>5.5.9</version>
           </dependency>
           <dependency>
               <groupId>com.itextpdf.tool</groupId>
               <artifactId>xmlworker</artifactId>
               <version>5.5.9</version>
           </dependency>
           <dependency>
               <groupId>com.itextpdf</groupId>
               <artifactId>itext-asian</artifactId>
               <version>5.2.0</version>
           </dependency>
           <dependency>
               <groupId>com.itextpdf</groupId>
               <artifactId>html2pdf</artifactId>
               <version>2.0.2</version>
           </dependency>
html을 pdf로 변환 처리 메소드
public static void convertHtmlToPdf(String html, String path,  String fontPath) throws IOException {
                ConverterProperties properties = new  ConverterProperties();
                FontProvider fontProvider = new  DefaultFontProvider(false,false,false);
                FontProgram fontProgram =  FontProgramFactory.createFont(fontPath+"malgun.ttf"); //폰트 파일
                fontProvider.addFont(fontProgram);
                properties.setFontProvider(fontProvider);
                HtmlConverter.convertToPdf(html, new  FileOutputStream(path), properties);
                
     //         List<IElement> elements =  HtmlConverter.convertToElements(html,properties);
     //         PdfDocument pdf = new PdfDocument(new  PdfWriter("D:/temp/upload/gnepabizmoney/"+vo.getAppNum()+".pdf"));
     //         Document document = new Document(pdf);
     //         document.setMargins(25, 0, 25, 0);
     //        for (IElement element : elements) {
     //            document.add((IBlockElement) element);
     //        }
     //        document.close();
  }

※알아야할 사항 : 폰트 같은 경우 ttf 파일을 등록하여 경로를 지정해서 불러서 사용할 수 있도록 해야함

 

파일 처리 해보기
//html -> pdf 변환 및 생성
String html =  ThymeleafParser.parseHtmlFileToString("temp_file_html",variableMap);//html -> string 처리
PdfGenerator.convertHtmlToPdf(html,path+"테스트파일_"+".pdf", fontPath); //pdf 생성

변수 html 은 Thymeleaf 파일에 등록된 데이터들 포함 양식을 string으로 뽑아 올 수 있다.

뽑아서 해당 Html을 pdf화하여 파일을 저장한다.

728x90
반응형
250x250
반응형
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함