반응형
css 먹히지도 않는 itext5버전으로 열심히 삽질하다가ㅠ ㅠ
itext7버전으로 광명찾고 성공한 썰. css 다 잘 먹는다 ㅠ ㅠ 흑흑
환경 : VS Code / Spring boot / gradle 사용
1. 필요한 라이브러리 다운로드
- itext7 라이브러리
다운로드 링크
iText7-Core-7.1.14-only-jars.zip 을 받았다.
- html2pdf
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 기본 사용법 참고
- margin 세팅 관련
- itext 구버전으로 구현한 소스 참고
반응형
'코딩 관련 > Java' 카테고리의 다른 글
[JAVA] Reader (0) | 2021.03.21 |
---|---|
[JAVA] OutputStream (0) | 2021.03.21 |
[JAVA] InputStream (0) | 2021.03.16 |
[JAVA] 스레드 상태 제어, java.lang.IllegalMonitorStateException (0) | 2021.03.12 |
[JAVA] 임계영역 지정 : 동기화(synchronized) 메소드와 동기화 블록 (0) | 2021.03.12 |