承接第一篇文章,通过HTML模板渲染,使用Java中的itext将HTML转换成PDF遇到的坑
First step:pom.xml
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>core-renderer</artifactId>
<version>R8</version>
</dependency>
Second step: PdfUtil.java
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.*;
import java.net.MalformedURLException;
/**
* @author KK_Chen
* @version 1.0
* @date 2021/3/4 13:54
*/
public class PdfUtil {
/**
*
* @param htmlFile html文件存储路径
* @param pdfFile 生成的pdf文件存储路径
* @param chineseFontPath 中文字体存储路径
*/
public static void html2pdf(String htmlFile, String pdfFile, String chineseFontPath) {
// step 1
String url;
OutputStream os = null;
try {
url = new File(htmlFile.toString()).toURI().toURL().toString();
os = new FileOutputStream(pdfFile);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(url.toString());
// 解决中文不显示问题
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont(chineseFontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
System.out.println(os);
renderer.layout();
renderer.createPDF(os);
} catch (MalformedURLException e) {
System.out.println("html转换为pdf失败");
} catch (FileNotFoundException e) {
System.out.println("html转换为pdf失败");
} catch (IOException e) {
System.out.println("html转换为pdf失败");
} catch (DocumentException e) {
e.printStackTrace();
} finally {
if(os != null) {
try {
os.close();
} catch (IOException e) {
System.out.println("html转换为pdf失败");
}
}
}
}
public static void main(String[] args) {
try {
//html文件路径
String htmlFilePath = "E:/test/html/templateDone.html";
// 中文字体存储路径
String chineseFontPath = "E:/test/simsun.ttf";
// html转pdf
html2pdf(htmlFilePath,"E:/test/html/templateDone.pdf", chineseFontPath);
System.out.println("转换成功!");
} catch (Exception e) {
System.out.println("html转换为pdf失败");
}
}
}
需要注意的是:
需要下载字体文字,同时在HTML中加入style
String chineseFontPath = "E:/test/simsun.ttf";
/*解决html转pdf文件中文不显示的问题*/
body {
font-family: SimSun;
}
/*设定纸张大小*/
/* A4纸 */
/* @page{size:210mm*297mm} */
@page{size:a3}
// 解决中文不显示问题
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont(chineseFontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);