Java - iText API

강서진·2023년 11월 21일
0

Java

목록 보기
30/35
post-custom-banner

강좌 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를 사용하는 순서는 다음과 같다.

  1. PdfWriter 객체를 만들어 스트림을 지정해준다.
  2. PdfWriter 객체로 PdfDocument 객체를 생성한다.
  3. PdfDocument 객체로 Document 객체를 생성한다.
  4. PdfFontFactory로 폰트를 생성하고 Document 객체로 폰트를 설정한다.
  5. 작업이 끝나면 Document 객체를 닫아준다.

4번과 5번 사이에 PDF에 저장할 내용을 추가해주면 된다.

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();
        }

PDF에 사진 넣기

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를 사용할 때 조금 더 수월해질 것이라고 생각한다.

post-custom-banner

0개의 댓글