java完美实现html转pdf
1.pom依赖:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.9</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.9</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.0.3</version>
</dependency>
2.工具类代码:
package club.jiajiajia.test;
import com.itextpdf.text.pdf.BaseFont;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class FileTypeConvertUtil {
/**
* 将HTML转成PD格式的文件。html文件的格式比较严格
* @throws Exception
*/
public static void html2pdf(String htmlFile, String pdfFile) throws Exception {
String url = new File(htmlFile).toURI().toURL().toString();
OutputStream os = new FileOutputStream(pdfFile);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(url);
ITextFontResolver fontResolver = renderer.getFontResolver();
if("linux".equals(getCurrentOperatingSystem())){
fontResolver.addFont("simsun.ttc", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
}else{
fontResolver.addFont("simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}
renderer.getSharedContext().setBaseURL("file:/E:/test/m/");//本地文件
//renderer.getSharedContext().setBaseURL("http://photo.jiajiajia.club/img/photo/");//网络文件
renderer.layout();
renderer.createPDF(os);
os.close();
System.out.println("create pdf done!!");
}
public static String getCurrentOperatingSystem(){
String os = System.getProperty("os.name").toLowerCase();
return os;
}
public static void main(String[] args) {
String htmlFile = "E:\\test\\m\\a.html";
String pdfFile = "E:\\test\\m\\a.pdf";
try {
FileTypeConvertUtil.html2pdf(htmlFile, pdfFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.html测试文件
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></meta>
</head>
<body style = "font-family: SimSun;">
sdfsdf dfgdfg asfdfgdfg<br></br>sfsdf是否
<div style="width:100px;height:200px; word-wrap:break-word;">
深刻的方式的发挥砍杀事件的雷锋精神动力
风机收到了客户发送了的回复路上看到回复
</div>
<table border="1">
<tr>
<th>Month</th>
<th>Savings</th>
</tr>
<tr>
<td>January</td>
<td>$100</td>
</tr>
</table>
<img src="b2d9a10e-94c3-4b76-a8ec-52c3fc92a694.png"/>
</body>
</html>
4.测试结果:

5.注意点:
1.simsun.ttc文件可以到百度上下载,后期本站将会提供下载功能
2.设置图片路径:
本地图片
renderer.getSharedContext().setBaseURL("file:/E:/test/m/");
在html文件中使用相对路径:
<img src="b2d9a10e-94c3-4b76-a8ec-52c3fc92a694.png"/>
如果是网络上的图片则设置:
renderer.getSharedContext().setBaseURL("http://photo.jiajiajia.club/img/photo/")
在html文件中使用相对路径
<img src="b2d9a10e-94c3-4b76-a8ec-52c3fc92a694.png"/>
3.div的文字换行
在生成的pdf中,默认不会换行;实现换行在div的style中加入 word-wrap:break-word;
<div style="width:100px;height:200px; word-wrap:break-word;">
4.在转换pdf的时候对html文件的格式要求比较严格,标签必需有结束标签,否则将会报一系列错误
例如:换行只有一个<br>标签
则会报异常:
ERROR: '元素类型 "br" 必须由匹配的结束标记 "</br>" 终止。'
而<br></br>则不会报异常