강좌 Course 2. Part 4. ch1 3강 요약
iText API를 사용하여 제목, 저자, 출판사, 출판연도, 가격, 페이지 수 정보를 담은 책 목록을 PDF 파일로 만들 수 있다. 먼저 메이븐 의존성을 추가해준다.
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.1.15</version>
</dependency>
iText API를 사용하는 순서는 다음과 같다.
- PdfWriter 객체를 만들어 스트림을 지정해준다.
- PdfWriter 객체로 PdfDocument 객체를 생성한다.
- PdfDocument 객체로 Document 객체를 생성한다.
- PdfFontFactory로 폰트를 생성하고 Document 객체로 폰트를 설정한다.
- 작업이 끝나면 Document 객체를 닫아준다.
4번과 5번 사이에 PDF에 저장할 내용을 추가해주면 된다.
try{
// PdfWriter
PdfWriter writer = new PdfWriter(new FileOutputStream("book_info.pdf"));
// PdfDocument
PdfDocument pdf = new PdfDocument(writer);
// Document
Document document = new Document(pdf);
// Create font
PdfFont font = PdfFontFactory.createFont("KyoboHandwriting2020pdy.TTF", PdfEncodings.IDENTITY_H,true);
document.setFont(font);
for (String key: bookInfo.keySet()){
Paragraph paragraph = new Paragraph(key+": "+bookInfo.get(key));
document.add(paragraph);
}
document.close();
} catch (Exception e){
e.printStackTrace();
}
import com.itextpdf.io.image.*;
import com.itextpdf.kernel.font.*;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.*;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.property.UnitValue;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.*;
public class PDFFile {
public static void main(String[] args) throws MalformedURLException, IOException {
String dest = "book_table.pdf";
new PDFFile().createPdf(dest);
}
public void createPdf(String dest) throws MalformedURLException,IOException {
List<Map<String,String>> books = createDummyData();
// Initialize
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf, PageSize.A4);
// Font
PdfFont font = PdfFontFactory.createFont("KyoboHandwriting2020pdy.ttf"
,"Identity-H",true);
// Table
float[] columnWidths = {1,2,2,2,2,2};
Table table = new Table(UnitValue.createPercentArray(columnWidths));
// Table Header
Cell headerCell1 = new Cell().add(new Paragraph("#")).setFont(font);
Cell headerCell2 = new Cell().add(new Paragraph("title")).setFont(font);
Cell headerCell3 = new Cell().add(new Paragraph("author")).setFont(font);
Cell headerCell4 = new Cell().add(new Paragraph("publisher")).setFont(font);
Cell headerCell5 = new Cell().add(new Paragraph("year")).setFont(font);
Cell headerCell6 = new Cell().add(new Paragraph("image")).setFont(font);
table.addHeaderCell(headerCell1);
table.addHeaderCell(headerCell2);
table.addHeaderCell(headerCell3);
table.addHeaderCell(headerCell4);
table.addHeaderCell(headerCell5);
table.addHeaderCell(headerCell6);
int rowNum = 1;
for (Map<String, String> book:books){
String title = book.get("title");
String author = book.get("author");
String publisher = book.get("publisher");
String year = book.get("year");
String image = book.get("thumbnail");
Cell rowNumCell = new Cell().add(new Paragraph(String.valueOf(rowNum))).setFont(font);
table.addCell(rowNumCell);
Cell titleCell = new Cell().add(new Paragraph(title)).setFont(font);
table.addCell(titleCell);
Cell authorCell = new Cell().add(new Paragraph(author)).setFont(font);
table.addCell(authorCell);
Cell puclisherCell = new Cell().add(new Paragraph(publisher)).setFont(font);
table.addCell(puclisherCell);
Cell yearCell = new Cell().add(new Paragraph(year)).setFont(font);
table.addCell(yearCell);
ImageData imageData = ImageDataFactory.create(new File("thumbnail.jpg").toURI().toURL());
Image img = new Image(imageData);
Cell imageCell = new Cell().add(img.setAutoScale(true));
table.addCell(imageCell);
rowNum++;
}
document.add(table);
document.close();
}
private static List<Map<String,String>> createDummyData() {
Scanner scanner = new Scanner(System.in);
List<Map<String,String>> books = new ArrayList<>();
System.out.println("# of books? ");
int bookCount = scanner.nextInt();
scanner.nextLine();
for (int i=1;i<=bookCount;i++){
HashMap<String,String> book = new HashMap<>();
System.out.println("Book title: ");
book.put("title",scanner.nextLine());
System.out.println("Book author: ");
book.put("author",scanner.nextLine());
System.out.println("Book publisher: ");
book.put("publisher",scanner.nextLine());
System.out.println("Printed year: ");
book.put("year",scanner.nextLine());
System.out.println("Image URL: ");
book.put("image",scanner.nextLine());
books.add(book);
}
scanner.close();
return books;
}
}
책 정보를 입력받는 기능은 createDummyData() 메서드, 책 정보를 pdf에 입력하는 기능은 createPdf() 메서드로 분리하였다.
main 메서드가 실행되면 createPdf()를 호출하고, createPdf()는 createDummyData()를 호출한다. createDummyData() 실행되어 입력할 책의 개수를 입력하면, 그 개수만큼 반복문을 돌려 책 정보를 입력받는다. 입력받은 정보를 맵에 저장하고, 해시맵 객체를 리스트로 저장하고 이 리스트를 반환한다.
createPdf()는 이 리스트를 받고, pdf 객체를 초기화한 뒤 표를 그리고, 헤더 행을 작성한다. 전달받은 books 리스트의 size만큼 반복문을 실행하여 책 정보를 입력하고, 문서를 닫아 pdf파일을 저장한다.
실행 결과 실제로 pdf파일이 만들어지는 것을 확인할 수 있었다.
소스코드가 주어졌음에도 좀 헤맸는데, 그래도 한번 해놓으면 나중에 실제로 API를 사용할 때 조금 더 수월해질 것이라고 생각한다.