본문 바로가기
개발/Java

[JAVA] html 을 PDF 파일로 변환

by ispie 2022. 12. 14.

DB에서 html 로 보관중인 문서정보를 PDF 파일로 변환해야 해서 작성한 코드 기록..

 

1. HTML -> PDF

itext 를 Maven으로 추가..

 

pom.xml

<!-- https://mvnrepository.com/artifact/com.itextpdf/itext7-core -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.1.14</version>
    <type>pom</type>
</dependency>

<!-- https://mvnrepository.com/artifact/com.itextpdf/html2pdf -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>html2pdf</artifactId>
    <version>3.0.3</version>
</dependency>

 

Html2PdfConvert.java

import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
import com.itextpdf.io.font.FontProgram;
import com.itextpdf.io.font.FontProgramFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.IBlockElement;
import com.itextpdf.layout.element.IElement;
import com.itextpdf.layout.font.FontProvider;

public class Html2PdfConvert {
	
	/**
	 * html 문자열로 요청경로에 pdf 파일 작성
	 * 
	 * @param BODY  본문html
	 * @param pdfPath  
	 * @param size
	 * @throws IOException
	 */
	//BODY : html string , pdfPath : pdf를 만들 경로, 
	public void CreatePdf(String html, String pdfPath, String pageSize) throws IOException {
		//한국어를 표시하기 위해 폰트 적용 
	    String FONT = "E:\font\malgun.ttf";
	    
	    // 기존에 PDF 변환한 파일이 존재하지 않을때만 새로 생성..
	    File f = new File(pdfPath);
        if (!f.exists()) {
    	    //ConverterProperties : htmlconverter의 property를 지정하는 메소드인듯
    	    ConverterProperties properties = new ConverterProperties();
    	    FontProvider fontProvider = new DefaultFontProvider(false, false, false);
    	    FontProgram fontProgram = FontProgramFactory.createFont(FONT);
    	    fontProvider.addFont(fontProgram);
    	    properties.setFontProvider(fontProvider);	    
    	    
    		//pdf 페이지 크기를 조정
    		List<IElement> elements = HtmlConverter.convertToElements(html, properties);
    	    PdfDocument pdf = new PdfDocument(new PdfWriter(pdfPath)); 

    	    // 용지 사이즈 
    	    PageSize ps;
    	    
        	// A4세로
        	if(pageSize.equals("A4")){
        		ps = PageSize.A4;
        	// A4가로
        	}else if (pageSize.equals("A4rotate")){
        		ps = PageSize.A4.rotate();
        	// B4세로
        	}else if (pageSize.equals("B4")){
        		ps = PageSize.B4;
        	// B4가로
        	}else if (pageSize.equals("B4rotate")){
        		ps = PageSize.B4.rotate();
        	// A3세로
        	}else if (pageSize.equals("A3")){
        		ps = PageSize.A3;
        	// A3가로
        	}else if (pageSize.equals("A3rotate")){
        		ps = PageSize.A3.rotate();
        	}else{
        		ps = PageSize.A4;
        	}	    
    	    
    	    Document document = new Document(pdf, ps);
    	    
        	//setMargins 매개변수순서 : 상, 우, 하, 좌
            document.setMargins(50, 0, 50, 0);
            for (IElement element : elements) {
                document.add((IBlockElement) element);
            }
            document.close();
        }
	}
}

 

참고 사이트 

[JAVA] itext로 html 을 pdf로 변환하기. convert html to pdf using itext7 / java html to pdf :: 메리 (tistory.com)

 

[JAVA] itext로 html 을 pdf로 변환하기. convert html to pdf using itext7 / java html to pdf

css 먹히지도 않는 itext5버전으로 열심히 삽질하다가ㅠ ㅠ itext7버전으로 광명찾고 성공한 썰. css 다 잘 먹는다 ㅠ ㅠ 흑흑 환경 : VS Code / Spring boot / gradle 사용 1. 필요한 라이브러리 다운로드 itext7

mchch.tistory.com

 

2. HTML 가로폭 조정

html 을 PDF 로 변환시에 가로/세로 폭 조절하고 싶으면 아래 모듈로 한번 처리 한 다음에 PDF 변환하면 됩니다.

저의 경우는 Table 태그에 width 값이 외부 테이블보다 내부 테이블이 길게 설정되는 케이스 였기 때문에 아래와 같이 대응했습니다.

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;


/** 
 * PDF변환시 html 가로폭 체크
 * 문서의 세로형, 가로형에 따라 최대가로길이가 존재하는데 그 이상의 가로폭을 가진 테이블이 삽입되어 있을 경우 pdf 변환시에 잘려버리므로 width값을 리셋처리함
 * (예) 세로양식(670px)인 경우, table 태그에 width="1200" 설정이 존재하는 경우 등)
 * @param html
 * @param maxWidth
 * @return
 */
public String CheckTableWitdthForPdf(String html, int maxWidth) {
    Document doc = Jsoup.parse(html);

    // table
    Elements tags = doc.getElementsByTag("table");
    String style = ""; // style="width:00px".. 현재는 사용하지 않으나 차후 style 에 삽입된 내용 변경 필요시 사용
    String tmpWidth = ""; // width="00"

    for(int i=0; i<tags.size(); i++){
        Element ele = tags.get(i);

        style = ele.attr("style");
        tmpWidth = ele.attr("width");
        try{
            int number = Integer.parseInt(tmpWidth);
            // table 의 width 속성값이 허용최대값보다 큰 경우는 width 값 리셋
            if(number > maxWidth){
                ele.attr("width", "");
            }
        }
        catch (NumberFormatException ex){
            // tmpWidth 가 숫자가 아닌 경우는 처리 안함
        }			
    }

    return doc.toString();
}

 

CheckTableWitdthForPdf 로 html 길이값 맞추기..

// 문서양식이 세로형은 width=670px, 가로형은 width=1177px를 기본으로 하기 때문에
// table태그에 width가 최대 가로값보다 큰 경우(내용에 사용자(연동결재 등)가 억지로 삽입한 테이블)강제적으로 width 값을 리셋(width="")시킨다.
// 세로 
if(pageSize.equals("A4") || pageSize.equals("B4") || pageSize.equals("A3")){
	html = regHelper.CheckTableWitdthForPdf(html, 700);
}else{
	// 가로
	html = regHelper.CheckTableWitdthForPdf(html, 1250);// 1290 만 되어도 B4가로 용지에서 옆이 잘림..
}

'개발 > Java' 카테고리의 다른 글

[JAVA]mht 파일을 html 문자열로 변환  (0) 2022.12.14

댓글