티스토리 뷰

회사에서 HTML 을 -> PDF 로 출력하는 업무가 주어졌다.

그래서 구글링을 통해 찾은것이 ITEXT였다. 바로 실행함.


첫번째로 ITEXT 라이브러리를 사용하기위해서는 pom.xml에 dependency를 추가해줘야한다.


<!-- pdf --> 

<dependency>

   <groupId>com.itextpdf</groupId>

    <artifactId>itextpdf</artifactId>

    <version>5.5.13</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>


추가를 해준뒤에는 PDF로 변경해줄 HTML 을 작성해준다.


<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>

<html>

<head>

<link rel="stylesheet" href="/resources/css/sub.css">

<link rel="stylesheet" href="/resources/css/index.css">

<link rel="stylesheet" href="/resources/css/plugin/slick.css">

<link rel="stylesheet" href="/resources/css/pdf/contents.css">

<meta charset="UTF-8">

<title>convertpdf</title>

</head>

<body>

<div id="wrap">

<div>

<div>

<table>

<tr>

<td class="h1">라떼야의 개발일기</td>

</tr>  

<tr>

<td>

<table class="table_inner">

<tr class="certi_info">

<th>성<span class="interval"></span>명</th>

<td>라떼야</td>

</tr>

</table>

                 </td>

                 <!-- <div class="img">

<img src="이미지경로입력"/>

</div>  -->

</div>

</div>

</div>

<form id="pdf" action="/URL 경로입력" method="post">

<input type="hidden" id="pdf_value" name="pdf_value" value="">

<input type="button" id="button_pdf" value="pdf보기">

</form>

</body>

<script type="text/javascript">                                                                                                                                                                                                                                                                                                                                                                                                                                  

$('#button_pdf').click(function(){

  $("#pdf_value").val($('#wrap').html());

$("#pdf").submit(); 

})

</script>

</html>

 

HTML을 작성했으면 Controller 작성 


public void convertpdf(HttpServletRequest request, HttpServletResponse response,@RequestParam(required = false, value = "pdf_value") String pdf_value) {

Document document = new Document(PageSize.A4, 50, 50, 50, 50); 

PdfWriter writer;

try {

//인스턴스를 가져온후

writer = PdfWriter.getInstance(document, response.getOutputStream());

writer.setInitialLeading(12.5f);

response.setContentType("application/pdf");

String fileName = URLEncoder.encode("PDF 제목", "UTF-8"); 

response.setHeader("Content-Transper-Encoding", "binary");

response.setHeader("Content-Disposition", "inline; filename=" + fileName + ".pdf");


//문서를 연다.

document.open();

//XMLWorkerHelper helper = XMLWorkerHelper.getInstance();


// CSS

//css 규칙을 해석한다.

CSSResolver cssResolver = new StyleAttrCSSResolver();

//css 파일을 나타낸다. css 흐름을 pdf로 구문 분석하기 위한 클래스 

CssFile cssFile = XMLWorkerHelper.getCSS(new FileInputStream("CSS 경로"));

cssResolver.addCss(cssFile);


// HTML, 폰트 설정

XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);

//글꼴 파일을 적고 별칭을 정해줌

        fontProvider.register("FONT 경로"); // MalgunGothic은 alias,

        CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);


    //HtmlPipeline의 CustomContext 객체 , 이것을 사용하여 htmlPipeline을 구성한다.

HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);

//사용할 TagProcessorFactory를 설정하십시오. HTML의 경우 Tags.getHtmlTagProcessorFactory()

htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());

Image image1 = Image.getInstance("//파일//경로//입력");

image1.scaleToFit(1200, 800);

image1.setAbsolutePosition(10, 60);

Image image2 = Image.getInstance("//파일//경로//입력");

image2.scaleToFit(50,50);

image2.setAbsolutePosition(400, 200);

document.add(image1);

document.add(image2);

// Pipelines

PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer);

HtmlPipeline html = new HtmlPipeline(htmlContext, pdf);

CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);

//XMLParserListener의 구현입니다. 

//중요 : XMLWorker가 WorkerContext (WorkerContextImpl 인)를 ThreadLocalvariable에 저장하는이 클래스는                                   WorkerContext가 여기 스레드로 제한됩니다.

XMLWorker worker = new XMLWorker(css, true);

//XML 파일을 읽습니다. 이벤트 수신 용 XMLParserListener를 연결하십시오.

XMLParser xmlParser = new XMLParser(worker, Charset.forName("UTF-8"));


// 폰트 설정에서 별칭으로 줬던 "MalgunGothic"을 html 안에 폰트로 지정한다.

String htmlStr = "<html><head><body style='font-family: MalgunGothic;'>" + pdf_value+ "</body></head></html>";

StringReader strReader = new StringReader(htmlStr);

xmlParser.parse(strReader);

document.close();

writer.close();


} catch (DocumentException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}


이렇게 해주면 HTML 이 PDF로 변환이된다. 그런데 ITEXT의 문제점은 HTML 에서 <br> 태그나 <img> 태그등등... 이 안먹힌다. CSS 도 몇개만 먹히는걸로 알고있다.... 그래도 이미지는 컨트롤러에서 제어가 가능했지만 결국 못쓰게 되었다...

 

 

반응형

'FULL STACK > SPRING &EGOV' 카테고리의 다른 글

스프링에서의 트랜잭션  (0) 2018.12.10
웹페이지 에러 처리  (0) 2018.12.06
MyBatis(마이바티스) 설정하기  (0) 2018.12.05
Maven  (0) 2018.12.05
Spring MVC 프로젝트를 생성하여 톰캣에서 실행하기  (0) 2018.12.05
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/06   »
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
글 보관함