티스토리 뷰

HTML을 PDF로 저장하기 (iText)

공부중인 뚜벅초 2016.07.01 10:12

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<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
cs


html

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<!DOCTYPE html>
<html>
<head>
<style>
thead {color:green;}
tbody {color:blue;}
tfoot {color:red;}
table, th, td {
    border: 1px solid black;
}
</style>
</head>
 
<body>
 
<table>
  <colgroup>
    <col width="30%">
    <col width="70%">
  </colgroup>
  <thead>
    <tr>
      <th>Month</th>
      <th>Savings</th>
    </tr>
  </thead>
  <tfoot>
    <tr>
      <td>Sum</td>
      <td>$180</td>
    </tr>
  </tfoot>
  <tbody>
    <tr>
      <td>January</td>
      <td>$100</td>
    </tr>
    <tr>
      <td>February</td>
      <td>$80</td>
    </tr>
  </tbody>
</table>
 
<p><b>Tip:</b> The thead, tbody, and tfoot elements will not affect the layout of the table by default. However, you can use CSS to style these elements.</p>
 
</body>
</html>
cs


다음과 같이 있을 때  <col>는 itext에서 오류로 뱉어냅니다. 마찬가지로 <img>나 <input>도 동일합니다.

그래서 <colgroup>그룹을 제외한 <thead><tbody>등 필요한 부분만 가져옵니다.

(*위는 예시일 뿐 제 테이블에는 <tbody>만 있습니다.)


js에서 보낼 html

1
2
3
4
5
6
var html = "<div class='boardWrite'>";
$('.printView>tbody').each(function(idx, el) { 
    console.log($(this).html());
    html+="<table class='tableStyle'>"+$(this).html()+"</table>";
});
html+="</div>";
cs


css를 적용 시킬 예정이라면 실제 css class나 id를 적어주세요.

참고로 iText에서 <input ~ />나 <col /> <br /> 같은 tag는 오류가 발생됩니다. (그래서 <tbody> 아래만 가져왔어요)



그리고 js에서 controller로 form이나 ajax로 데이터를 보내주세요.

저는 json을 통해 ajax로 보냈습니다.


.java

1
2
3
4
5
6
7
//파일을 만들어 주세요.
File file = new File(savePath + saveName);
 
//css
String css = request.getSession().getServletContext().getRealPath("/css/content.css");
//font
String font = request.getSession().getServletContext().getRealPath("/font/printFont.ttf");
cs


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
try {
    // Document 생성
    Document document = new Document(PageSize.A4, 50505050);
 
    // PdfWriter 생성
    // PdfWriter writer = PdfWriter.getInstance(document, new
    // FileOutputStream("d:/test.pdf")); // 바로 다운로드.
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
    writer.setInitialLeading(12.5f);
 
    // 파일 다운로드 설정
    response.setContentType("application/pdf");
 
    response.setHeader("Content-Transper-Encoding""binary");
    response.setHeader("Content-Disposition""inline; filename=" + save);
 
    // Document 오픈
    document.open();
    XMLWorkerHelper helper = XMLWorkerHelper.getInstance();
 
    // CSS
    CSSResolver cssResolver = new StyleAttrCSSResolver();
    CssFile cssFile = helper.getCSS(new FileInputStream(scss));
    cssResolver.addCss(cssFile);
 
    // HTML, 폰트 설정
    XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
    fontProvider.register(sfont, "MalgunGothic"); // MalgunGothic은
 
    CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
 
    HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
    htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
 
    // Pipelines
    PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer);
    HtmlPipeline html = new HtmlPipeline(htmlContext, pdf);
    CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);
 
    XMLWorker worker = new XMLWorker(css, true);
    XMLParser xmlParser = new XMLParser(worker, Charset.forName("UTF-8"));
 
    // 폰트 설정에서 별칭으로 줬던 "MalgunGothic"을 html 안에 폰트로 지정한다.
    String sHtml = "<html><head></head><body style='font-family:MalgunGothic;'>" + map.get("printData").toString() + "</body></html>";
    // byte[] bHtml = (map.get("printData").toString()).getBytes();
 
    xmlParser.parse(new StringReader(sHtml));
    document.close();
    writer.close();
catch (Exception e) {
    throw e;
cs


참고사이트

http://zero-gravity.tistory.com/251

http://www.rgagnon.com/javadetails/java-html-to-pdf-using-itext.html



★이미지는 base64로!!!

다시 view에서 pdf 파일을 여는 것은 진행중 입니다.



참고

http://developers.itextpdf.com/question/how-convert-html-table-pdf

'' 카테고리의 다른 글

jqgrid colmodel select/checkbox/datepicker  (0) 2016.07.05
jqgrid cell value danyamic/calcuate  (0) 2016.07.05
HTML을 PDF로 저장하기 (iText)  (7) 2016.07.01
jqGrid 모음  (0) 2016.05.19
jqgrid 위키  (0) 2016.04.06
spring mvc+tiles에서 매핑 실행하기  (0) 2016.04.06
댓글
  • 프로필사진 이십삼분 안녕하세요 !
    신입 개발자 입니다.
    iText를 이용하여 특정 페이지에서 버튼을 누르면 pdf 파일로 저장하여야 합니다.
    전자정부프레임워크를 사용하고 있습니다.
    맨 위에 pom.xml 추가는 하였고 js에서 보낼 html 이 아래 부분부터 이해가 되질 않는데요..ㅠㅠ
    js가 javascript잖아요? 그런데 저기서 쓰신걸로만으로는 컨트롤러로 데이터를 보내는게 없는데
    form 태그를 이용해서 보내는게 맞나요??
    나머지도 잘 모르지만 우선 차근차근 알고싶습니다 답변 주시면 감사하겠습니다.
    2016.08.23 16:36
  • 프로필사진 공부중인 뚜벅초 반갑습니다.
    댓글 읽은 후 내용을 조금 수정하였습니다.
    버튼을 누른 후 pdf로 만들 table을 지정하여 json방식으로 ajax를 통해 controller에 전달 하였습니다.

    해당 javascript를 적지 않은 이유는 현재 사용중에 따로 함수를 만들어 작성하기 때문에 상세하게 적지 않았습니다~

    form태그를 통해 전달해도 되고
    ajax를 통해 비동기/동기 방식으로 보내도 상관 없습니다!
    2016.08.24 08:16 신고
  • 프로필사진 이십삼분 뚜벅초님~!! 답글 감사합니다.
    댓글과 소스를 다시한번 보면서 질문이 있는데요~!!
    1. controller로 전달할 때 html 태그만 보내것 같은데 실제 페이지에 있는 값(ex: 이름, 나이, 성별 같은 값들)은 따로 보내야 하나요?
    2. 올려주신 소스만으로는 javascript에서 controller로 보낸 데이터를 어디 부분에서, 어떻게 처리하는지 감이 안옵니다 ㅠ.ㅠ
    혹시 controller에 대한 전체 소스는 오픈 안될까요..?
    감사합니다.
    2016.08.24 09:30
  • 프로필사진 공부중인 뚜벅초 contorller로 데이터를 보낼 때는
    json형식으로 [{key:vale}]의 형태로 보냈습니다.
    value에는 인쇄하고자하는 html태그들이 들어있지요.
    ajax json만 검색해도 충분히 나올 거라고 생각합니다.
    현재 사용중인 소스를 공개했을 때 spring 환경이 달라서 같은 결과가 나오지 않을 거라고 생각됩니다..ㅎㅎ..
    ajax도 현재 따로 함수를 만들어 사용 중이라 공개는 어렵습니다...ㅠㅠ
    2016.08.24 11:47 신고
  • 프로필사진 이십삼분 뚜벅초님 답변 감사합니다.
    json 형태로 controller로 데이터를 보내는건 거의 완성 했지만 컨트롤러단이 문제네요 ㅠㅠ
    며칠 삽푸다보면 되겠지요...? ㅠㅠ
    더운날 몸관리 잘하세요~!!!
    2016.08.24 15:10
  • 프로필사진 공부중인 뚜벅초 네~감사합니다 ㅎㅎ 2016.08.25 08:17 신고
  • 프로필사진 ㅠㅠ 필요한 태그들이 안먹히다니.. html 전체 태그를 먹일 수 있는 그런 라이브러리가 없을까요 흠.. 2018.11.09 13:59
댓글쓰기 폼