반응형

css 먹히지도 않는 itext5버전으로 열심히 삽질하다가ㅠ ㅠ 

itext7버전으로 광명찾고 성공한 썰. css 다 잘 먹는다 ㅠ ㅠ 흑흑

환경 : VS Code / Spring boot / gradle 사용 

 


1. 필요한 라이브러리 다운로드 

  •  itext7 라이브러리

다운로드 링크

 

Releases · itext/itext7

iText 7 for Java represents the next level of SDKs for developers that want to take advantage of the benefits PDF can bring. Equipped with a better document engine, high and low-level programming c...

github.com

iText7-Core-7.1.14-only-jars.zip 을 받았다.

  •  html2pdf 
 

Maven Repository: com.itextpdf » html2pdf » 3.0.3

pdfHTML is an iText 7 add-on that lets you to parse (X)HTML snippets and the associated CSS and converts them to PDF. com.itextpdf html2pdf 3.0.3 // https://mvnrepository.com/artifact/com.itextpdf/html2pdf implementation group: 'com.itextpdf', name: 'html2

mvnrepository.com

html2pdf-3.0.3.zip 를 받았다.

 

  • (한글 폰트)

한글 텍스트가 포함되어있는 경우 한글 표시를 위해 한글 폰트가 필요하다.

ttf파일은 검색하면 쉽게 구할 수 있음!

사용한 폰트는 맑은고딕임.

 

 


2. 라이브러리 적용(build.gradle)

libs 폴더에 다운받은 jar 파일을 넣고 build.gradle에 명시


3.  A ) html을 String으로 넘기는 경우 

//import 리스트 참고. itext7 은 com.itext.pdf.text나 tool이 아니다.
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.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;



//BODY : html string , dest : pdf를 만들 경로(D:\\sample.pdf)
public void makepdf(String BODY, String dest) throws IOException {
    //한국어를 표시하기 위해 폰트 적용 
    String FONT = "D:\\malgun.ttf";
    //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(BODY, properties);
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    Document document = new Document(pdf);
    //setMargins 매개변수순서 : 상, 우, 하, 좌
    document.setMargins(50, 0, 50, 0);
    for (IElement element : elements) {
      document.add((IBlockElement) element);
    }
    document.close();
}

 


반응형

3.  B) html을 파일로 넘기는 경우

//src : html파일 경로("D:\\sample.html") , dest : pdf를 만들 경로("D:\\sample.pdf")
public void makepdf(String src, String dest) throws IOException {
    //한국어를 표시하기 위해 폰트 적용 
    String FONT = "D:\\malgun.ttf";
    //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 페이지 크기를 조정. convertToElements의 매개변수 부분만 다름.
    List<IElement> elements = HtmlConverter.convertToElements(new FileInputStream(src), properties);
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    Document document = new Document(pdf);
    //setMargins 매개변수순서 : 상, 우, 하, 좌
    document.setMargins(50, 0, 50, 0);
    for (IElement element : elements) {
       document.add((IBlockElement) element);
    }
    document.close();
}

string인 경우랑 거의 똑같음.ㅎㅎ 


아무 옵션 안 주고 ... 텍스트만 덜렁 변환하는 거면 사실

public void createPdf(String html, String dest) throws IOException {
    HtmlConverter.convertToPdf(html, new FileOutputStream(dest));
}

요 소스만으로도  변환이 된다

근데 한국어 표시도 해야되고... 크기도 조절해야 하니까.. ㅎㅎ


변환했던 html 예제

html 소스를 string으로 작성하여 이용함

StringBuilder body = new StringBuilder();
 
String header = "<!DOCTYPE html>" + "<html lang='ko-KR'>" + "<head>" + "<titlet>test</title>"
                + "	<meta charset='UTF-8'/>" + "	<meta name='description' content='Free Web tutorials'/>"
                + "	<meta name='keywords' content='HTML,CSS,XML,JavaScript'/>"
                + "	<meta name='viewport' content='width=device-width, initial-scale=1.0'/>"
                + "	<meta http-equiv='X-UA-Compatible' content='IE=Edge'/>"
                + "<script src='https://use.fontawesome.com/releases/v5.2.0/js/all.js'></script>" + "</head>";
                
String middle = "<body style='margin:auto; padding: 0;'>"
                + "	<div class='logo' style='width: 780px;height: 40px;padding: 10px; margin: auto;'>"
                + "		<a href='#' style='color: #000000;text-decoration: none;'><img src='img/logo.png' alt='로고'/></a>"
                + "	</div>";

String footer = "	<div class='footer' style='width: 780px;height: 60px;padding: 20px;text-align: center;font-size: 0.75em; margin: auto;'>"
                + "	본 메일은 발신전용 입니다. 자세한 사항은 홈페이지를 확인해 주시기 바랍니다.	" + "	</div>" + "</body>" + "</html>";
                
body.append(header);
body.append(middle);
body.append(footer);

String BODY = body.toString();

// html to pdf
makepdf(BODY, today);

 


 

 

참고한 페이지

 

  • itext7 기본 사용법 참고
 

Chapter 1: Hello HTML to PDF

 

kb.itextpdf.com

  • margin 세팅 관련
 

iText 7 can not set margin

I have an HTML string, i need to convert it to pdf, but pdf that i need must have specific size and margin. I did as the example show, now i have pdf with width and height that i set, BUT i can`t c...

stackoverflow.com

  • itext 구버전으로 구현한 소스 참고
 

iText 로 html에서 pdf 만들기

코드를 약간 수정 하였습니다.다음의 궁금한 점에 대해서 자 답을 하지 못했습니다.복잡한 css 파일의 경우...

blog.naver.com

 

반응형

+ Recent posts