진이의 Developer Story
HTML TO EXCEL, PDF 본문
고객이 에디터로 작성한 글의 내용을 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();
우여곡절이 많았지만 결과적으로 성공이네요.
'Java > Spring' 카테고리의 다른 글
Apache PDFBOX (pdf to image) (1) | 2016.10.27 |
---|---|
(6) Spring+MyBatis 게시판 만들기 - 수정 및 삭제 추가 (12) | 2016.10.19 |
(5) Spring+MyBatis 게시판 만들기 - 파일 업로드 [작성중] (3) | 2016.08.02 |
구글 Analytics OAuth 2.0 for server side (0) | 2016.04.05 |
Log4j formatter (0) | 2016.03.28 |
Comments