使用到的jar包:【支持识别CSS换行】
<!-- pdf生成 itext工具包 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.4.2</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.1.16</version>
</dependency>
<!-- freemarke引擎依赖引入 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.29</version>
</dependency>
PDFUtil工具类
package demo.util;
import com.itextpdf.text.pdf.BaseFont;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
/**
* @author
* @description: 根据html模板生成pdf工具类
* @date 2019/10/19
*/
public class PDFUtil {
private String tempFilePath;
private String tempFileName;
public PDFUtil() {
}
public PDFUtil(String tempFilePath, String tempFileName) {
this.tempFilePath = tempFilePath;
this.tempFileName = tempFileName;
}
public String getTempFilePath() {
return tempFilePath;
}
public void setTempFilePath(String tempFilePath) {
this.tempFilePath = tempFilePath;
}
public String getTempFileName() {
return tempFileName;
}
public void setTempFileName(String tempFileName) {
this.tempFileName = tempFileName;
}
/**
* 日志
*/
private static Logger logger = LoggerFactory.getLogger(PDFUtil.class);
/**
* 填充模板
*
* @param paramMap
* @throws Exception
*/
public FileItem fillTemplate(Map<String, Object> paramMap) throws Exception {
File modelFile = new File(tempFilePath);
if (!modelFile.exists()) {
modelFile.mkdirs();
}
Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
configuration.setDirectoryForTemplateLoading(modelFile);
configuration.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_23));
configuration.setDefaultEncoding("UTF-8"); //这个一定要设置,不然在生成的页面中 会乱码
//获取或创建一个模版。
Template template = configuration.getTemplate(tempFileName);
StringWriter stringWriter = new StringWriter();
BufferedWriter writer = new BufferedWriter(stringWriter);
template.process(paramMap, writer); //把值写进模板
String htmlStr = stringWriter.toString();
writer.flush();
writer.close();
String tmpPath = tempFilePath + "temp";
File tmepFilePath = new File(tmpPath);
if (!tmepFilePath.exists()) {
tmepFilePath.mkdirs();
}
String tmpFileName = System.currentTimeMillis() + ".pdf";
FileItemFactory factory = new DiskFileItemFactory(16, null);
((DiskFileItemFactory) factory).setDefaultCharset("utf-8");
FileItem item = factory.createItem(tmpFileName, "application/pdf", true, tmpFileName);
OutputStream outputFile = item.getOutputStream();
htmlToPdf(outputFile, htmlStr);
outputFile.close();
return item;
}
/**
* 生成html模板
*
* @param content
* @return
*/
public String createdHtmlTemplate(String content) {
String fileName = tempFilePath + "/" + tempFileName;
//使用try-with-resource方式关流
try(PrintStream printStream = new PrintStream(new FileOutputStream(fileName))) {
File file = new File(tempFilePath);
if (!file.isDirectory()) {
file.mkdir();
}
file = new File(fileName);
if (!file.isFile()) {
boolean sign = file.createNewFile();
if(! sign){
logger.info("file.createNewFile失败");
}
}
//将HTML文件内容写入文件中
printStream.println(content);
printStream.flush();
logger.info("生成html模板成功!");
} catch (Exception e) {
logger.info(e.getMessage());
}
return fileName;
}
/**
* @throws IOException
* @Param: [url]
* @return: java.lang.String
* 文章内容获取
*/
public static String getHTML(String pageURL, String encoding) {
StringBuilder pageHTML = new StringBuilder();
try {
URL url = new URL(pageURL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("User-Agent", "MSIE 7.0");
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), encoding));
String line = null;
while ((line = br.readLine()) != null) {
pageHTML.append(line);
pageHTML.append("\r\n");
}
connection.disconnect();
} catch (Exception e) {
logger.info(e.getMessage());
}
return pageHTML.toString();
}
/**
* 填充模板 输出文件流
*
* @param paramMap
* @throws Exception
*/
public FileItem fillTemp(Map<String, Object> paramMap) throws Exception {
File modelFile = new File(tempFilePath);
if (!modelFile.exists()) {
modelFile.mkdirs();
}
Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
configuration.setDirectoryForTemplateLoading(modelFile);
configuration.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_23));
configuration.setDefaultEncoding("UTF-8"); //这个一定要设置,不然在生成的页面中 会乱码
//获取或创建一个模版。
Template template = configuration.getTemplate(tempFileName);
StringWriter stringWriter = new StringWriter();
BufferedWriter writer = new BufferedWriter(stringWriter);
template.process(paramMap, writer); //把值写进模板
String htmlStr = stringWriter.toString();
writer.flush();
writer.close();
String tmpPath = tempFilePath + "temp";
File tmepFilePath = new File(tmpPath);
if (!tmepFilePath.exists()) {
tmepFilePath.mkdirs();
}
String tmpFileName = System.currentTimeMillis() + ".html";
FileItemFactory factory = new DiskFileItemFactory(16, null);
FileItem item = factory.createItem(tmpFileName, "text/html", true, tmpFileName);
OutputStream output = item.getOutputStream();
output.write(htmlStr.getBytes());
output.close();
return item;
}
/**
* 将HTML转成PD格式的文件。html文件的格式比较严格
*
* @param os
* @param htmlContext
* @throws Exception
*/
// <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
public static void htmlToPdf(OutputStream os, String htmlContext) throws Exception {
ITextRenderer iTextRenderer = new ITextRenderer();
iTextRenderer.setDocumentFromString(htmlContext);
//解决中文编码
ITextFontResolver fontResolver = iTextRenderer.getFontResolver();
//fontResolver.addFont("/static/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
if ("linux".equals(getCurrentOperationSystem())) {
fontResolver.addFont("/usr/share/fonts/lyx/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
} else {
fontResolver.addFont("c:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}
iTextRenderer.layout();
iTextRenderer.createPDF(os);
os.flush();
os.close();
}
private static String getCurrentOperationSystem() {
return System.getProperty("os.name").toLowerCase();
}
}