진이의 Developer Story

HTML TO EXCEL, PDF 본문

Java/Spring

HTML TO EXCEL, PDF

JIN3260 2016. 9. 29. 13:27

고객이 에디터로 작성한 글의 내용을 EXCEL, PDF로 출력해달라고 요청을 해왔습니다.

보통 에디터로 작성할 경우, HTML로 저장이 되겠죠.


해당 HTML을 가지고 EXCEL과 PDF로 출력하는 방법은 서버단, 클라단에서 할 수 있는데요.

저는 서버 사이드 측면에서 해결을 해봤습니다.


1. HTML TO EXCEL

엑셀로 출력하는 방법은 간단합니다.

엑셀 다뤄보신 분들은 알겠지만 저장할때 파일형식을 htm, html로 저장이 가능하다는 점 아시겠죠.


그 방법을 이용해보는거에요.

여러가지 어플리케이션에 적용할 수 있겠지만, 저는 웹서비스를 가정하고 작성하겠습니다.


게시판은 글제목과 글내용이 있겠죠.

그리고 글내용은 에디터로 저장이 되어, HTML 로 저장됩니다.

따라서 전제조건은

(1) DB에서 저장된 글을 가져와서 처리함.

(2) 글내용은 HTML로 저장이 되어있어야 함.


아래의 소스코드에서 2~7번 라인은 여러분의 환경에 맞게 수정해주시고요~

예제에서의 hashmap에는 title(제목)과 contents(내용, html)이 담겨있다는 가정하에 작성되었습니다.

// HashMap 객체를 생성하고 가져온 파일의 정보를 담습니다.
HashMap<String, Object> hashmapResult = new HashMap<String, Object>();
hashmapResult = (HashMap<String, Object>)  commonService.getFileInfo();

String fileNm = (String) hashmapResult.get("title");
byte[] fileByte[] = ((String) hashmapResult.get("contents")).getBytes();

response.setContentType("application/vnd.ms-excel");
response.setContentLength(fileByte.length);
response.setHeader("Content-Disposition", "attachment; fileName=\"" + URLEncoder.encode(fileNm,"UTF-8")+".xls\";");
response.setHeader("Content-Transfer-Encoding", "binary");
response.getOutputStream().write(fileByte);
				
response.getOutputStream().flush();
response.getOutputStream().close();

이렇게 하시면 엑셀 다운로드는 간단하게 끝이 납니다.



2. HTML TO PDF

엑셀은 간단하지만 pdf는 간단하지 않습니다.

PDF의 경우는 라이브러리를 사용하셔야 하는데요.

그 중에서도 가장 많이 쓰이는 라이브러리가 itext 입니다.

Document document = new Document();

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

response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; fileName=\"" + URLEncoder.encode(fileNm,"UTF-8")+".pdf\";");
response.setHeader("Content-Transfer-Encoding", "binary");

// 폰트 경로 지정
FontFactory.register(new File("/font/NanumGothic.ttf");

StringBuilder sb = new StringBuilder();
// html마크업을 넣어줌.
// 저의 경우는 html 마크업이 없어서 그렇구요~
// 상황에 맞춰서 사용하시면 됩니다.
sb.append("<html><head><body>");
sb.append((String) hashmapResult.get("chart_cntn"));
sb.append("</body></head></html>");
StringReader stringReader = new StringReader(sb.toString());

// 새로운 시트를 생성하고, 
StyleSheet sheet = new StyleSheet();

// 시트에 스타일을 지정합니다.
sheet.loadTagStyle("body", new HashMap<String, String>(){{
	put("face","나눔고딕");
	put("encoding", "Identity-H");
}});

// HTMLWorker 생성. (XMLWorker 방식도 있습니다.)
// 요즘은 대부분 XMLWorker를 쓰는듯합니다만;
HTMLWorker worker = new HTMLWorker(document);
PdfWriter.getInstance(document, response.getOutputStream());

// document를 열어줄때는 위의 셋팅이 전부 끝나야 합니다.
document.open();

// List형태로 시트를 입혀서 리스트 형태로 만들어준 후에.
List<Element> list = (List<Element>) HTMLWorker.parseToList(stringReader, sheet);
// 리스트의 엘리먼트를 삽입합니다.
for(Element e : list){
	document.add(e);
}

document.close();
writer.close();

우여곡절이 많았지만 결과적으로 성공이네요.

Comments