내 블로그 목록

2018년 8월 1일 수요일

[SpringFramework] Java로 pdf 파일 생성하기

[해야할 일]


(1)pom.xml에 필요한 라이브러리 추가.
(2)servlet-context.xml에 InternalResourceViewResolver와 ViewResolver 빈 등록하기
(3) Controller 생성 [PageRankXlsController.java]
(4) 커스텀 뷰 생성 [PageRanksPdfView.java]
(5) 커스텀 뷰 servlet-context.xml에 빈으로 등록




(1) pom.xml에 필요한 라이브러리 추가.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
   <!-- PDF View 처리 -->
       <dependency>
           <groupId>com.lowagie</groupId>
           <artifactId>itext</artifactId>
           <version>2.1.7</version>
           <exclusions>
               <exclusion>
                   <groupId>bouncycastle</groupId>
                   <artifactId>bcmail-jdk14</artifactId>
               </exclusion>
               <exclusion>
                   <groupId>bouncycastle</groupId>
                   <artifactId>bcprov-jdk14</artifactId>
               </exclusion>
               <exclusion>
                   <groupId>bouncycastle</groupId>
                   <artifactId>bctsp-jdk14</artifactId>
               </exclusion>
           </exclusions>
       </dependency>

(2) servlet-context.xml에 InternalResourceViewResolver와 ViewResolver 빈 등록하기




1
2
3
4
5
6
7
8
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:order="2">
       <beans:property name="prefix" value="/WEB-INF/views/" />
       <beans:property name="suffix" value=".jsp" />
   </beans:bean>
   
   <!-- CustomView: BeannameViewResolver는 파일을 등록해놓으면 id로 찾아간다는 것. -->
   <beans:bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"
   p:order="1" />


우선순위 충돌을 막기위해 Namespace에서 p를 설정하고 p:order 태그를 걸어줬다.


참고로 p:order의 값은 작으면 작을수록 우선순위가 높다.

(3) Controller 생성 [PageRankXlsController.java]


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
package com.bitcampi.mvc0802;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class PageRankXlsController {
   @RequestMapping("/pageRanks/xls")
   public ModelAndView getXlsPage() {
       List<PageRank> pageRanks = new ArrayList<PageRank>();
       // 데이터는 여기서 넣어서 전송함
       pageRanks.add(new PageRank(1, "www.naver.com"));
       pageRanks.add(new PageRank(2, "www.daum.com"));
       pageRanks.add(new PageRank(3, "www.nate.com"));
       return new ModelAndView("pageRanks", "pageRanks", pageRanks);
   }
   @RequestMapping("/pageRanks/pdf")
   public ModelAndView getPdfPage() {
       List<PageRank> pageRanks = new ArrayList<PageRank>();
       // 데이터는 여기서 넣어서 전송함
       pageRanks.add(new PageRank(1, "www.naver.com"));
       pageRanks.add(new PageRank(2, "www.daum.com"));
       pageRanks.add(new PageRank(3, "www.nate.com"));
       return new ModelAndView("pageRanksPdf", "pageRanks", pageRanks);
   }
}


getXlsPage()는 앞서 엑셀을 넣기 위해 사용했으므로 여기서는 생략한다.

참고로

 return new ModelAndView("pageRanksPdf", "pageRanks", pageRanks);


이 문장의 뜻은 pageRanks 파일을 "pageRanks" 이름으로 pageRanksPdf 이름의 커스텀뷰
로 전송한다는 뜻이다.

그래서 나중에 커스텀 뷰 이름을 Bean으로 등록할 때, 맨 처음 변수와 ID를 똑같이 
등록 해줘야 한다.

여튼 우리는 여기서 getPdfPage()만 사용한다.



(4) 커스텀 뷰 생성 [PageRanksPdfView.java]


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
53
54
55
56
57
58
59
60
61
package com.bitcampi.mvc0802;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.view.document.AbstractPdfView;
import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfWriter;
public class PageRanksPdfView extends AbstractPdfView{
   @Override
   protected void buildPdfDocument(Map<String, Object> model, Document document, PdfWriter writer,
           HttpServletRequest request, HttpServletResponse response) throws Exception {
       
       //Controller에서 model 데이터 받기
       List<PageRank> pageRanks = (List<PageRank>)model.get("pageRanks");
       
       //테이블 생성(제목도 적어야 해서 +1)
       Table table = new Table(2, pageRanks.size() + 1);
       //테이블 padding값 주기
       table.setPadding(5);
       
       //Font 지정
       BaseFont bf = BaseFont.createFont("c:\\windows\\fonts\\batang.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
       Font font = new Font(bf);
       
       //첫번째 Cell 생성 및 테이블에 추가 : 제목1
       Cell cell = new Cell(new Paragraph("순위", font));
       cell.setHeader(true);  //Header처리를 하기위한 메서드
       table.addCell(cell);
       
       //두번째 Cell 생성 및 테이블에 추가 : 제목2
       cell = new Cell(new Paragraph("페이지", font));
       table.addCell(cell);
       table.endHeaders();   //Header처리는 여기서 끝이다.
       
       for(PageRank rank : pageRanks) {
       /*    table.addCell(new Cell(Integer.toString(rank.getRank())));*/
           table.addCell(Integer.toString(rank.getRank()));
           table.addCell(rank.getPage());
       }
       
       
       //document(pdf)에서 table을 넣어준다
       document.add(table);
   }
   
   
}



(5) 커스텀 뷰 servlet-context.xml에 빈으로 등록


1
2
<!-- pdf 파일 넘기기 -->
   <beans:bean id="pageRanksPdf" class="com.bitcampi.mvc0802.PageRanksPdfView"/>


빈 이름은 Controller에서 return 했던 ModelAndView 객체의 첫 번째 칸에 적은 변수와 이름을 같게 한다.



결과)



댓글 없음:

댓글 쓰기