본문 바로가기
Language & Library/JAVA

iText (java로 jpg를 PDF로 만들기 )

by 댓츠굿 2014. 4. 11.


1. iText를 시작하면서...

프로젝트를 진행하면서 출력 결과물을 PDF로 작성해야할 필요성으로 하여 PDF 레포트를 생성시켜주는 자바 라이브러리인 - iText를 사용하였습니다. 실제 iText를 이용하면 서버사이드에서 Jsp나 JavaBean을 이용하여 여러가지 형식의 PDF 레포트를 만드실수가 있습니다.

2. iText에 대한 간단한 소개
iText 유명한 오픈소스 배포사이트인 sourceforge에서 진행하고 있는 프로젝트중의 하나로써, PDF 문서를 만들어주는 Java 라이브러리입니다. iText를 이용하여 PDF 문서는 물론 RTF 문서도 만드실수가 있습니다. 또한 XML, HTML 문서도 PDF문서로 컨버팅 하실수도 있습니다.

3. iText를 이용하여 생성된 나의 첫 PDF 문서
iText를 이용하여 PDF 문서를 생성하는데는 모두 5가지 절차가 필요합니다.

com.lowagie.text.Document 클래스 인스턴스를 생성합니다.

Document document = new Document();

② Writer와 Document 사이의 연관을 맺어줍니다. Writer를 이용하여 문서를 하드디스크 상에 써넣을 수 가 있습니다.
PDFWriter.getInstance(document, new FileOutputStream("Helloworld.PDF"));

③ 문서를 오픈합니다.
document.open();

④ 문서에 내용을 첨부합니다.
document.add(new Paragraph("Hello World"));

⑤ 문서를 닫습니다.
document.close();

위 다섯가지 절차를 거치면 Helloworld.PDF 문서를 생성하실 수가 있습니다.

그럼 Document 클래스에 대하여 좀 더 자세히 알아볼가요?

com.lowagie.text.Document 인스턴스를 생성하는 방법은 모두 3가지가 있는데 그것들로는

public Document();
public Document(Rectangle pageSize);
public Document(Rectangle pageSize, int marginLeft, int marginRight, int marginTop, int marginBottom);

생성자 메소드 파라미터 pageSize는 생성한 문서의 페이지 크기이고, 실제 사이즈는 A4용지에 최적화 되여있습니다.
세번째 생성자 메소드 파라미터 marginLeft、marginRight、marginTop、marginBottom 는 좌, 우, 상, 하의 페이지 여백입니다.

그러면 Writer 객체는 멀가요?

일 단 document인스턴스가 만들어지면 이 문서를 실제 하드디스크 상에 쓸 라이터가 필요합니다. 실제 이런 라이터를 거쳐 만들어진 문서를 우리가 원하는 포맷으로 하드디스크 상에 써 넣을수가 있습니다. 예하면 com.lowagie.text.PDF.PDFWriter 는 문서를 PDF포맷으로 저장시킬수가 있고 com.lowagie.text.html.HtmlWriter 는 문서를 HTML 포맷으로 저장시킬수가 있습니다.

그렇다면 문서의 속성을 어떻게 지정할수 있을가요?

실제 문서를 오픈 하기전에 문서의 속성을 지정하실수가 있습니다. 문서의 속성들을 여러가지 펙터들이 있는데 그것들로는 타이틀, 주제, 저자, 키워드, 배포방식, 생성자, 프로듀서, 생성일자 등입니다.

실제 이런 속성들을 세팅해주기 위하여 아래와 같은 메소드가 필요합니다.

public boolean addTitle(String title)
public boolean addSubject(String subject)
public boolean addKeywords(String keywords)
public boolean addAuthor(String author)
public boolean addCreator(String creator)
public boolean addProducer()
public boolean addCreationDate()
public boolean addHeader(String name, String content)

그중 addHeader 은 PDF문서에서는 무효하고 HTML 문서에 한해서만 그 유효합니다.

또한 새페이지를 만들기전 페이지의 크기, 북마크, 헤더와 푸터 등도 설정할수가 있습니다. 위 속성들을 세팅하기 위하여 호출이 되여질 메소드들은

public boolean setPageSize(Rectangle pageSize)
public boolean add(Watermark watermark)
public void removeWatermark()
public void setHeader(HeaderFooter header)
public void resetHeader()
public void setFooter(HeaderFooter footer)
public void resetFooter()
public void resetPageCount()
public void setPageCount(int pageN)

위 메소드들은 실제 위 속성이 세팅될 페이지를 만들기 전에 호출이 되여져야 합니다.

4. 텍스트 처리

iText에서는 Chunk, Phrase, Paragraph 등 을 이용하여 텍스트 처리를 하고 있습니다.
Chunk는 텍스트 처리상 가장 작은 단위로써 글자체, 색상, 크기 등 속성을 포함한 문자열로 구성이 되여져 있습니다. 아래 코드를 실행하면 글자체가 HELVETICA이고 크기가 10 이며 밑줄이 달린 텍스트를 그려줍니다.

Chunk chunk = new Chunk("This text is underlined", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE));

Phrase는 하나 또는 그 이상의 Chunk로 이루어 지며 Phrase에서도 실제 문자열의 폰트스타일이나 크기를 설정하실수가 있습니다. 단 이렇게 되면 Chunk속에 설정되여있던 폰트는 무시되게 됩니다. 실제 아래와 같은 식으로 Phrase에 Chunk를 넣을수가 있습니다.

phrase.add(chunk);

Paragraph는 하나 또는 그 이상의 Chunk나 Phrase로 이루어 지며 이 역시 단락중의 폰트스타일이나 크기를 세팅할수가 있습니다. 이걸 제외하고도 단락의 인덴테이션, 정열방식등도 설정 하실수가 있습니다.

5. 테이블 처리

iText에서 제공하는 테이블 클래스는 여러가지가 있습니다. 그중 늘 사용하는것들로는 com.lowagie.text.Table, com.lowagie.text.PDF.PDFPTable 이 두가지입니다. 그중에서도 com.lowagie.text.Table 이 클래스는 좀 단순한 형태의 테이블을 그릴때 사용이 되여지구요, 좀 더 복잡한 형태의 테이블을 구성할려면 com.lowagie.text.PDF.PDFPTable 이 클래스를 사용하여야 합니다.

그렇다면 먼저 간단한 com.lowagie.text.Table 부터 살펴 보도록 하지요.

클래스 com.lowagie.text.Table에는 모두 세가지 생성자가 있는데 그것들로는

①Table (int columns)
②Table(int columns, int rows)
③Table(Properties attributes)

파라미터 속성들에 대하여 알아보면 columns는 테이블 컬럼 갯수이고, rows는 테이블의 행 갯수이며 attributes는 테이블의 속성입니다.

테이블 클래스 속성을 아주 많으므로 일일이 소개를 못 드리겠습니다. 하지만 실제 사용이 되여지는 예제를 하나 선정하여 구체적으로 각 단계마다 멀 하고 있는지를 설명드리도록 하겠습니다.

1:Table table = new Table(3);
2:table.setBorderWidth(1);
3:table.setBorderColor(new Color(0, 0, 255));
4:table.setPadding(5);
5:table.setSpacing(5);
6:Cell cell = new Cell("header");
7:cell.setHeader(true);
8:cell.setColspan(3);
9:table.addCell(cell);
10:table.endHeaders();
11:cell = new Cell("example cell with colspan 1 and rowspan 2");
12:cell.setRowspan(2);
13:cell.setBorderColor(new Color(255, 0, 0));
14:table.addCell(cell);
15:table.addCell("1.1");
16:table.addCell("2.1");
17:table.addCell("1.2");
18:table.addCell("2.2");
19:table.addCell("cell test1");
20:cell = new Cell("big cell");
21:cell.setRowspan(2);
22:cell.setColspan(2);
23:table.addCell(cell);
24:table.addCell("cell test2");

1 - 5 까지는 새로운 테이블을 만드는 부분입니다.
두번째 라인에서 알수있다싶이 이 테이블의 테두리 두께는 1이고
세번째 라인에서는 테이블 테두리 색상을 파란색으로 설정해 두었네요.
네번째 다섯번째 라인에서는 각각 테이블 세페이싱과 패딩을 주었네요.

코드 6 - 10 까지에서는 테이블의 헤더를 정의하고 있겠습니다.
라인 7에서 cell.setHeader(true); 이렇게 세팅이되여져 있는데 이것은 새로 만든 셀을 테이블의 헤더로 설정하는 작용을 합니다.
라 인 8에서는 셀이 몇개의 Row를 병합할건지를 설정하고 있으며 라인 10에서는 헤더가 끝나는 위치를 정해주고 있습니다. 이렇게 되면 여러페이지가 있을 경우 첫페이지가 아닌 두번째, 세번째 페이지에서도 똑같은 셀로 구성된 헤더를 그릴수가 있게 됩니다.

6. 이미지 처리
iText에서 이미지를 처리해주는 클래스는 com.lowagie.text.Image 입니다.
현 재 iText에서 지원해주는 이미지 포맷들로는 GIF, Jpeg, PNG, WMF 등이 있습니다. 부동한 이미지들에 대하여 iText는 동일한 생성자 메소드를 사용하여 자동으로 인식을 해주고 있습니다. 아래 코드를 이용하여 GIF, JPG, PNG 인스턴스를 만드실수가 있습니다.

Image gif = Image.getInstance("vonnegut.gif");
Image jpeg = Image.getInstance("myKids.jpg");
Image png = Image.getInstance("hitchcock.png");

이미지 정열방식은 public void setAlignment(int alignment) 메소드를 이용하여 세팅할수가 있습니다.
파라미터로 들어오는 값들은 실제 Emu타입닌데 Image.RIGHT, Image.MIDDLE, Image.LEFT 등이 있습니다.
만약 텍스트를 이미지 옆으로 배치하고 싶으시다면 Image.TEXTWRAP, Image.UNDERLYING
속성을 세팅하면 됩니다. 위 정열방식중 여러가지를 결합하여 사용할려면 | 기호로 구분시켜서 세팅하면 됩니다. 예, setAlignment(Image.RIGHT|Image.TEXTWRAP)

7. 한글 처리
iText.jar 만 이용하여 한글이나 중문 처리를 할수 없습니다. 영문이 아닌 다른 언어를 지원할려면 iTextAsian.jar 를 별도록 프로젝트에 포함시켜야 합니다.

실제 PDF 보고서 출력폼에서 많이 사용이 되여지고 있는 폰트 "명조체" 인스턴스를 만드는것을 예로 들어서 설명하드록 하겠습니다.

String fontFace = "HYGoThic-Medium";
String fontName = "UniKS-UCS2-H";
BaseFont bf = BaseFont.createFont( fontFace, fontName, BaseFont.NOT_EMBEDDED );
Font font = new Font( bf, 12 );
Paragraph pragraph=new Paragraph("안녕하세요.", font );

끝으로 iText.jar, iTextAsian.jar를 첨부하도록 하겠습니다.




====================================================

출처: http://wjkim-info.tistory.com/626


* iText 한글처리

*출처 : http://blog.pointbre.com/2835/itext%EB%A5%BC-%EC%96%B4%EB%96%BB%EA%B2%8C-%EA%B0%96%EA%B3%A0-%EB%86%80%EA%B9%8C.html

iText 한글 깨짐 문제 해결

라이브러리 설치

iText 2.x.x 선택해야 함, iText 5.x.x는 해보니 아무리 찾아보고 시도해봐도 안되더군요 ㅠ.ㅠ

iTextAsian.jar 설치 : http://sourceforge.net/projects/itextpdf/files/Asian%20Support/Asian%20CMAPS/iTextAsian.jar/download

코딩

BaseFont objBaseFont = BaseFont.createFont("HYGoThic-Medium", "UniKS-UCS2-H", false);

Font objFont = new Font(objBaseFont, 12);

objDocument.add(new Paragraph("한글테스트", objFont));

폰트설치

이전 게시물 참조 : http://blog.pointbre.com/2816/jfreechart-한글깨짐-문제-해결.html

윈도우, 리눅스에서 모두 동작하는 것을 확인했습니다 ^^*

Related posts:


====================================================

또다른 해결


*출처 : http://mixellaneous.tistory.com/76

===================

Jasper Server에서 리포트를 PDF로 출력하는데 몇가지 설정이 필요하다.
Jasper Server에는 기본적으로 PDF의 CJK지원을 위한 jar파일이 빠져있다.

정상적인 한글을 보기위해서는...
http://itextdocs.lowagie.com/tutorial/fonts/getting/index.html

반응형