본문 바로가기

HTML을 PDF로 저장하기 (iText)

by 뚜벅초 2016. 7. 1.

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
jqGrid 모음  (0) 2016.05.19
jqgrid 위키  (0) 2016.04.06
spring mvc+tiles에서 매핑 실행하기  (0) 2016.04.06