반응형

# Java iText API 활용 Excel에서 데이터 읽어서 PDF로 만들기

  • Excel 에 저장된 데이터를 읽어서 PDF로 생성. (Excel > PDF)
  • 기존에 키값에 해당하는 데이터를 입력하여 조회된 정보를 Excel 파일로 만드는 작업을 했었는데, 반대로 Excel 에 저장된 데이터를 가져와 PDF로 생성하는 작업 진행. (이전 작업 내역 종합하여 진행)

## 생성 결과

## 작업 소스

isbn.xls
0.25MB
bookList.pdf
0.31MB
malgun.ttf
12.83MB

import java.io.*;
import java.util.*;
import java.util.List;

import org.apache.poi.hssf.usermodel.*;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

import kr.inflearn.ExcelVO;

public class Project04_F {
	public static void main(String[] args) {
		// 엑셀 데이터 읽어와서 PDF 생성하기.
		// 1. 엑셀 불러오기
		String filename = "isbn.xls";	
		
		List<ExcelVO> data = new ArrayList<ExcelVO>();
		try (FileInputStream fis = new FileInputStream(filename)) {
			HSSFWorkbook workbook = new HSSFWorkbook(fis);
			HSSFSheet sheet = workbook.getSheetAt(0);
			Iterator rows = sheet.rowIterator();
			String[] imsi = new String[5];
			
			rows.next();	// 첫번째 줄은 헤더 이므로 다음줄로 이동.
			while (rows.hasNext()) { // 로우
				HSSFRow row = (HSSFRow) rows.next();
				Iterator cells = row.cellIterator();
				
				int i = 0;
				while (cells.hasNext()) {	// 셀 정보
					HSSFCell cell = (HSSFCell) cells.next();
					imsi[i] = cell.toString();
					i++;
					
					if (i == 5) {	// 5의 경우 이미지 정보로 필요없으므로 5일때 break.
						break;
					}
				}
				
				ExcelVO vo = new ExcelVO(imsi[0], imsi[1], imsi[2], imsi[3], imsi[4]);
				data.add(vo);
			}
			
			// 2. Excel 데이터 바탕으로 PDF 생성
			pdf_maker(data);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	private static void pdf_maker(List<ExcelVO> data) {
		// 헤더에 들어갈 값.
		String[] headers = new String[]{"제목", "저자", "출판사", "이미지"};
		
		Document doc = new Document(PageSize.A4);
		try {
			PdfWriter.getInstance(doc, new FileOutputStream(new File("bookList.pdf")));
			doc.open();
			
			// 폰트 설정.
			BaseFont bFont = BaseFont.createFont(
					"MALGUN.TTF", 
					BaseFont.IDENTITY_H	
					, BaseFont.NOT_EMBEDDED);
			Font headerFont = new Font(bFont, 12);	// 헤더 폰트
			Font rowFont = new Font(bFont, 10);	// row 폰트
			
			// 테이블 생성
			PdfPTable table = new PdfPTable(headers.length);
			
			for (String header : headers) {
				// 테이블_셀 생성
				PdfPCell cell = new PdfPCell();
				cell.setGrayFill(0.9f);
				cell.setPhrase(new Phrase(header.toUpperCase(), headerFont));
				table.addCell(cell);
			}	
			table.completeRow();	
			
			// Excel데이터 바탕, PDF에 들어갈 테이블에 정보 입력.
			for (ExcelVO vo : data) {
				Phrase phrase = new Phrase(vo.getTitle(), rowFont);
				table.addCell(new PdfPCell(phrase));
				
				phrase = new Phrase(vo.getAuthor(), rowFont);
				table.addCell(new PdfPCell(phrase));
				
				phrase = new Phrase(vo.getCompany(), rowFont);
				table.addCell(new PdfPCell(phrase));
				
				// 이미지
				Image image = Image.getInstance(vo.getImageUrl());
				table.addCell(image);
				
				table.completeRow();
			}
			doc.addTitle("PDF Table Demo");
			doc.add(table);	// document 에 생성한 테이블 추가.
			System.out.println("bookList 생성 완료.");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			doc.close();
		}		
	}
}
반응형
반응형

# Java iText API 활용 PDF 에 image 삽입 및 크기조절 하기

  • Java iText API 활용하여 PDF에 image 를 삽입 및 이미지의 크기를 조절할 수 있다.

## 활용 방법

파일에서 이미지 생성

import java.io.*;

import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfWriter;

public class Project04_C {
	public static void main(String[] args) {
		Document doc = new Document();

		try {
			PdfWriter.getInstance(doc, new FileOutputStream("ImageDemo.pdf"));
			doc.open();
			
			// 파일에서 이미지 생성
			String filename = "test_image.jpg";
			Image image = Image.getInstance(filename);
			doc.add(image);
            
			System.out.println("PDF 생성 완료.");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			doc.close();
		}
	}
}

URL에서 이미지 생성

import java.io.*;

import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfWriter;

public class Project04_C {
	public static void main(String[] args) {
		Document doc = new Document();

		try {
			PdfWriter.getInstance(doc, new FileOutputStream("ImageDemo.pdf"));
			doc.open();
	
			// URL로 부터 이미지 생성
			String url = "https://cdn.inflearn.com/public/main_sliders/90eee9de-869d-4906-aa7a-88998858dc6d/%5B%E1%84%8B%E1%85%B5%E1%84%87%E1%85%A6%E1%86%AB%E1%84%90%E1%85%B3%5D%E1%84%8B%E1%85%B5%E1%86%AB%E1%84%91%E1%85%B3%E1%84%8F%E1%85%A9%E1%86%AB_main_521.png";
			Image urlImage = Image.getInstance(url);
			doc.add(urlImage);

			System.out.println("PDF 생성 완료.");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			doc.close();
		}
	}
}

## 생성 결과

  • 아래와 같이 파일, URL 을 이용 이미지를 추가하여 PDF 생성. (이미지 크기 때문에 2페이지에 걸쳐서 출력)

## 작업 소스

import java.io.*;

import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfWriter;

public class Project04_C {
	public static void main(String[] args) {
		Document doc = new Document();

		try {
			PdfWriter.getInstance(doc, new FileOutputStream("ImageDemo.pdf"));
			doc.open();
			
			// 파일에서 이미지 생성
			String filename = "test_image.jpg";
			Image image = Image.getInstance(filename);
			doc.add(image);
			
			// URL로 부터 이미지 생성
			String url = "https://cdn.inflearn.com/public/main_sliders/90eee9de-869d-4906-aa7a-88998858dc6d/%5B%E1%84%8B%E1%85%B5%E1%84%87%E1%85%A6%E1%86%AB%E1%84%90%E1%85%B3%5D%E1%84%8B%E1%85%B5%E1%86%AB%E1%84%91%E1%85%B3%E1%84%8F%E1%85%A9%E1%86%AB_main_521.png";
			Image urlImage = Image.getInstance(url);
			doc.add(urlImage);

			System.out.println("PDF 생성 완료.");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			doc.close();
		}
	}
}

 

# Java iText API 활용 PDF 에  삽입한 image 크기조절 하기

  • 위에서 이미지를 추가하여 PDF 생성 시 크기 조절 문제 발생. 이를 해결하기 위해 추가 작업 진행.
  • scaleAbsolute, scalePercent, scaleToFit

## 활용방법

이미지 크기조절 방법 1_scaleAbsolute

Document doc = new Document();

try {
    PdfWriter.getInstance(doc, new FileOutputStream("ImageDemo.pdf"));
    doc.open();

    // 파일에서 이미지 생성
    String filename = "test_image.jpg";
    Image image = Image.getInstance(filename);
    image.scaleAbsolute(200f, 200f);	// 이미지 크기 조절
    doc.add(image);

    System.out.println("PDF 생성 완료.");
} catch (Exception e) {
    e.printStackTrace();
} finally {
    doc.close();
}

이미지 크기조절 방법 2_scalePercent

Document doc = new Document();

try {
    PdfWriter.getInstance(doc, new FileOutputStream("ImageDemo.pdf"));
    doc.open();

    // URL로 부터 이미지 생성
    String url = "https://cdn.inflearn.com/public/main_sliders/90eee9de-869d-4906-aa7a-88998858dc6d/%5B%E1%84%8B%E1%85%B5%E1%84%87%E1%85%A6%E1%86%AB%E1%84%90%E1%85%B3%5D%E1%84%8B%E1%85%B5%E1%86%AB%E1%84%91%E1%85%B3%E1%84%8F%E1%85%A9%E1%86%AB_main_521.png";
    Image urlImage = Image.getInstance(url);
    urlImage.scalePercent(200f);	// 이미지 크기 조절 (%)
    doc.add(urlImage);

    System.out.println("PDF 생성 완료.");
} catch (Exception e) {
    e.printStackTrace();
} finally {
    doc.close();
}

이미지 크기조절 방법 3_scaleToFit

Document doc = new Document();

try {
    PdfWriter.getInstance(doc, new FileOutputStream("ImageDemo.pdf"));
    doc.open();

    // 파일에서 이미지 생성
    String filename = "test_image.jpg";
    Image image = Image.getInstance(filename);
    image.scaleToFit(100f, 200f);	// 이미지 크기 조절 (정한 사이즈에 맞게)
    doc.add(image);

    System.out.println("PDF 생성 완료.");
} catch (Exception e) {
    e.printStackTrace();
} finally {
    doc.close();
}

## 실행 결과

## 작업 소스

import java.io.*;

import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfWriter;

public class Project04_D {
	public static void main(String[] args) {
		Document doc = new Document();

		try {
			PdfWriter.getInstance(doc, new FileOutputStream("ImageScalingDemo.pdf"));
			doc.open();
			
			// 1. scaleAbsolute 사용 이미지 크기 조절
			String filename1 = "test_image.jpg";
			Image image1 = Image.getInstance(filename1);
			image1.scaleAbsolute(200f, 200f);
			doc.add(image1);
			
			// 2. scalePercent 사용 이미지 크기 조절
			String filename2 = "test_image.jpg";
			Image image2 = Image.getInstance(filename2);
			image2.scalePercent(100f);
			doc.add(image2);
			
			// 3. scaleAbsolute 사용 이미지 크기 조절
			String filename3 = "test_image.jpg";
			Image image3 = Image.getInstance(filename3);
			image3.scaleToFit(100f, 200f);
			doc.add(image3);

			System.out.println("PDF 생성 완료. (이미지 크기 조절)");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			doc.close();
		}
	}
}
반응형
반응형

# Java iText API 활용 PDF 에 Paragraph (단락, 문단, 절) 만들기

  • Java iText API 활용하여 PDF에 단락, 문단, 절 등을 입력하여 생성할 수 있다.

## 활용 방법

Paragraph (단락, 문단, 절) 만들기

Paragraph paragraph = new Paragraph();

Chunk (부분, 규모가 큰) 만들기

String content = "hello world hello world hello world hello world hello world";

Chunk chunk = new Chunk(content);

Paragraph 줄 간격

String content = "hello world hello world hello world hello world hello world";
Paragraph paragraph1 = new Paragraph(32);
paragraph1.setSpacingBefore(50);
paragraph1.setSpacingAfter(50);

for (int i = 0; i < 20; i++) {
	Chunk chunk = new Chunk(content);
	paragraph1.add(chunk);
}

doc.add(paragraph1);

Paragraph paragraph2 = new Paragraph(32);	// 줄 간격
paragraph2.setSpacingBefore(50);		// 문단 앞 간격
paragraph2.setSpacingAfter(50);			// 문단 뒤 간격

for (int i = 0; i < 10; i++) {
	paragraph2.add(new Chunk(content));
}

doc.add(paragraph2);

## 생성 결과

## 작업 소스

import java.io.*;

import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;

public class Project04_B {
	public static void main(String[] args) {
		Document doc = new Document();
		
		try {
			FileOutputStream fos = new FileOutputStream("paragraphDemo.pdf");
			PdfWriter.getInstance(doc, fos);
			doc.open();
			
			String content = "Hello World Hello World Hello World Hello World Hello World Hello World";
			Paragraph par1 = new Paragraph(32);	// 줄 간격 32
			par1.setSpacingBefore(50);
			par1.setSpacingAfter(50);
			
			for (int i = 0; i < 20; i++) {
				Chunk chunk = new Chunk(content);
				par1.add(chunk);
			}
			
			doc.add(par1);
			
			Paragraph par2 = new Paragraph();
			
			for (int i = 0; i < 10; i++) {
				//Chunk chunk = new Chunk(content);
				//par2.add(chunk); 
				par2.add(new Chunk(content));
			}
			doc.add(par2);
			doc.close();
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}
반응형
반응형

# Java iText API 활용 PDF table 만들기 (Java PDF Handling)

## iText API 다운로드 및 적용방법

  • 다운로드 받은 jar 파일의 경우 별도의 공간(C:\JavaTPC\lib 등..) 에 저장 후 아래와 같이 설정 진행. 
  1. 프로젝트 우 클릭 Build Path > configure Build Path 클릭.
  2. Libraries > Add External JARs 클릭하여 저장한 jar 파일 추가. (자바가 12버전 이상인 경우 Modulepath(자바모듈) 와 Classpath(외부 API 모듈)로 나누어 표시(관리)되어 있어서 Classpath에 추가해주면 되는데, 자바가 그 이전 버전인 경우에는 Add ExternalJARs 해서 바로 추가해주면 됨) 
  3. 완료 후 아래와 같이 Referenced Libraries에 해당 API가 추가되어있는지 확인, 사용 시에는 import 하여 사용하면 된다.

## 테이블 스타일 설정.

테이블 (Table) 만들기

PdfPTable table = new PdfPTable();
table.setWidthPercentage(100);	// Table 의 폭 %로 조절 가능.

테이블 컬럼 폭 (Table Column Width) 조절

float[] columnWidths = new float[]{20f, 15f, 15f, 30f};
table.setWidths(columnWidths);

테이블 셀 (Table Cell) 정렬

// H정렬 (Element.ALIGN_LEFT, Element.ALIGN_RIGHT, Element.ALIGN_CENTER)
cell.setHorizontalAlignment(Element.ALIGN_CENTER);

// V정렬 (Element.ALIGN_TOP, Element.ALIGN_MIDDLE, Element.ALIGN_BOTTOM)
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);

테이블 셀 여백 (Table Cell Padding) 조절

// 전체 한번에 줄 때.
cell.setPadding(10);

// 개별로 줄 때.
cell.setPaddingTop(20);
cell.setPaddingRight(30);
cell.setPaddingBottom(20);
cell.setPaddingLeft(30);

테이블 컬럼 (Table Column) 합치기

cell.setColspan(2);

## 생성 결과

## 작업소스

import java.io.*;

import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

public class Project04_A {
	public static void main(String[] args) {
		// Java iText API 활용.
		String[] title = new String[]{"제목", "저자", "출판사", "이미지URL"};
		String[][] rows = new String[][] {
			{"강아지", "저자1", "출판사1", "http://image.yes24.com/goods/110791050/XL"},
			{"고양이", "저자2", "출판사2", "http://image.yes24.com/goods/110791050/XL"},
			{"흑염소", "저자3", "출판사3", "http://image.yes24.com/goods/110791050/XL"}
		};
		
		// PDF 생성 절차.
		// 1. 메모리에 PDF 파일 임시로 생성. (Document)
		Document doc = new Document(PageSize.A4);
		try {
			PdfWriter.getInstance(doc, new FileOutputStream(new File("book.pdf")));
			doc.open();
			
			// 한글 폰트
			BaseFont bf = BaseFont.createFont("malgun.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
			Font titleFont = new Font(bf, 12);
			Font rowsFont = new Font(bf, 10);
			
			// Table 생성
			PdfPTable table = new PdfPTable(title.length);	// 컬럼 갯수 지정.
			table.setWidthPercentage(100);	// Table 의 폭 %로 조절 가능.
			
			// 테이블 컬럼 폭 지정
			float[] colwidth = new float[]{20f, 15f, 15f, 30f};
			table.setWidths(colwidth);
			
			// 헤더 생성
			for (String header : title) {
				// Cell 생성
				PdfPCell cell = new PdfPCell();
				cell.setHorizontalAlignment(Element.ALIGN_CENTER);
				cell.setPadding(10);	// 셀 여백 지정
				cell.setGrayFill(0.9f);	// 셀 배경 지정.
				cell.setPhrase(new Phrase(header, titleFont));	// 셀에 글자 작성.
				table.addCell(cell);
			}
			table.completeRow();
			
			for (String[] row : rows) {
				for (String data : row) {
					Phrase phrase = new Phrase(data, rowsFont);
					PdfPCell cell = new PdfPCell(phrase);
					cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
					cell.setPaddingTop(20);
					cell.setPaddingRight(30);
					cell.setPaddingLeft(30);
					cell.setPaddingBottom(20);
					table.addCell(cell);
				}
				table.completeRow();
			}
			
			PdfPCell cell4 = new PdfPCell(new Phrase("Cell 5"));
			cell4.setColspan(2);
			
			PdfPCell cell5 = new PdfPCell(new Phrase("Cell 6"));
			cell5.setColspan(2);
			
			table.addCell(cell4);
			table.addCell(cell5);
			
			doc.addTitle("PDF Table Demo");
			doc.add(table);
			
			System.out.println("PDF 생성 완료");
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			doc.close();
		}
	}
}
반응형

+ Recent posts