Spring/Java

[ java ] PDF 만들기 (Spire.pdf for java)

snow_hong 2022. 3. 9. 12:47

java에서 pdf를 만드는 라이브러리는 다양하게 많다

예를 들어서 itextpdf, apache PDFBox, html2canvas, jsPDF 등등 다양하게 있다.

- itextpdf, apache PDFBox는 오픈소스이긴 하지만 만약에 상업적으로 쓰게 된다면 소스를 공개하거나 라이센스를 구입해야한다.

- html2canvas, jsPDF를 사용하여 html화면을 이미지화하여 pdf를 만드는 기능을 사용해보았다. 하지만 내가 원하는 pdf는 html이 길어서 그것들을 다 나오게할려니깐 화질이 안좋아지는 단점이 있었다.

그래서 나는 무료로 사용이 가능하면서 상업적으로 사용할 수 있는 Sprie.pdf라는 라이브러리를 사용해봤다.

Sprie.pdf는 상업적으로 사용해도 상관이 없지만 무료 버전은 PDF의 10페이지로 제한된다. 이 제한은 PDF를 작성하는 동안 적용되고 PDF를 이미지, XPS, Word, HTML로 변환할 때 파일의 처음 3페이지만 가져올 수 있다.

▶ 사용방법

1. Free Sprie.pdf for java 를 지원해주는 사이트에 접속하여 회원가입을 한 후 무료버전 밑에 있는 다운로드를 클릭해서 Spire.Pdf-FE_4.4.1.zip 파일을 다운받는다.

https://www.e-iceblue.com/Introduce/free-pdf-for-java.html#.YPjjzegzaUk

 

Free Java PDF Library – Create Read Modify Print Convert PDF Documents in Java

c#/vb.net excel,word,pdf component

www.e-iceblue.com

 

2. 다운받은 파일을 압축을 해제하고 Spire.Pdf-FE_4.4.1\lib\Spire.Pdf.jar를 프로젝트에 적용시킨다.

- 프로젝트 우클릭 → Properties → java Build Path → libraries → Add External JARs... 을 클릭하여 다운받은 Spire.Pdf.jar를 찾아서 선택해준다.

3. 코드 적용

import com.spire.pdf.*;
import com.spire.pdf.graphics.*;
import com.spire.pdf.tables.*;
import java.awt.*;

@RequestMapping(value = "/testPdf.do")
	public void testPdf( ) throws SQLException, RuntimeException, Exception{


		PdfDocument doc = new PdfDocument();

		//Set margin
        PdfUnitConvertor unitCvtr = new PdfUnitConvertor();
        PdfMargins margin = new PdfMargins();
        margin.setTop(unitCvtr.convertUnits(2.54f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point));
        margin.setBottom(margin.getTop());
        margin.setLeft(unitCvtr.convertUnits(3.17f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point));
        margin.setRight(margin.getLeft());

        // Create one page
        PdfPageBase page =   doc.getPages().add(PdfPageSize.A4, margin);

        float y = 10;

        //Draw title
        PdfBrush brush1 = PdfBrushes.getBlack();
        PdfTrueTypeFont font1 = new PdfTrueTypeFont(new Font("Batang",Font.BOLD ,16),true);
        PdfStringFormat format1 = new PdfStringFormat(PdfTextAlignment.Center);
        page.getCanvas().drawString("테스트", font1, brush1, page.getCanvas().getClientSize().getWidth() / 2, y, format1);
        y = y + (float) font1.measureString("Country List", format1).getHeight();
        y = y + 5;

        String[] data = {"Name;Capital;Continent;Area;Population", "Argentina;Buenos Aires;South America;2777815;32300003", "Bolivia;La Paz;South America;1098575;7300000", "Brazil;Brasilia;South America;8511196;150400000", "Canada;Ottawa;North America;9976147;26500000", "Chile;Santiago;South America;756943;13200000", "Colombia;Bagota;South America;1138907;33000000", "Cuba;Havana;North America;114524;10600000", "Ecuador;Quito;South America;455502;10600000", "El Salvador;San Salvador;North America;20865;5300000", "Guyana;Georgetown;South America;214969;800000", "Jamaica;Kingston;North America;11424;2500000", "Mexico;Mexico City;North America;1967180;88600000", "Nicaragua;Managua;North America;139000;3900000", "Paraguay;Asuncion;South America;406576;4660000", "Peru;Lima;South America;1285215;21600000", "United States of America;Washington;North America;9363130;249200000", "Uruguay;Montevideo;South America;176140;3002000", "Venezuela;Caracas;South America;912047;19700000"};

        String[][] dataSource = new String[data.length][];
        for (int i = 0; i < data.length; i++) {
            dataSource[i] = data[i].split("[;]", -1);
        }

        PdfTable table = new PdfTable();
        table.getStyle().setCellPadding(2);
        table.getStyle().setHeaderSource(PdfHeaderSource.Rows);
        table.getStyle().setHeaderRowCount(1);
        table.getStyle().setShowHeader(true);
        table.setDataSource(dataSource);

        PdfLayoutResult result = table.draw(page, new Point2D.Float(0, y));
        y = y + (float) result.getBounds().getHeight() + 5;

        PdfBrush brush2 = PdfBrushes.getGray();
        PdfTrueTypeFont font2 = new PdfTrueTypeFont(new Font("Batang", 0,9),true);
        page.getCanvas().drawString(String.format("* %1$s countries in the list.", data.length - 1), font2, brush2, 5, y);

        //Save pdf file.
        doc.saveToFile("C:\\Users\\hong\\simpleTable.pdf"); //파일을 저장할 경로를 지정하면 된다.


	}

해당 사이트에 예제가 많으므로 참고하면된다.

※ 한글로 pdf를 사용할려면 한글을 지원하는 폰트를 사용해야한다!! ( 한글이 안되어서 해당 라이브러리를 제작사한테 직접 문의해서 얻은 답변이다.)

▶ 결과화면

728x90