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();
}
}
}
참고 사이트
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 |
---|
댓글