JAVA根据模板生成并导出PDF
实现功能
根据模板生成PDF文件,模板文件参数可配,可手动修改.
一 : PDF导出效果
先看一下导出的demo文件,具体样式可手动修改
下图为demo_pdf.ftl导出PDF文件
下图为list_pdf.ftl导出PDF文件
二 : 编写PDF模板
PDF文件模板,使用原生HTML文件编写,编写完成样式等参数,将文件后缀名修改为 .ftl 模板文件配置
demo模板(数据替换模板中的配置参数) : demo_pdf.ftl
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<style type="text/css">
body {font-family: SimSun;}
.mybody h1 {font-size: 24px;text-align: center;line-height: 30px;padding: 20px 0;padding-top: 30px;}
.content_class p {display: block;margin-block-start: 1em;margin-block-end: 1em;margin-inline-start: 0px;margin-inline-end: 0px;}
.content_class{box-shadow:none;line-height:30px;margin:15px auto;height: auto !important;padding: 30px 75px 100px 75px !important;}
.t_tail{ position:relative;text-align:right;}
.Gzimg{ position:absolute;left: 400px;top:-35px;width: 140px;height: 140px;}
</style>
</head>
<body>
<div class="mybody">
<div class="header"></div>
<h1>PDF导出模板<br/>demo</h1>
<div class="content_class">
<p>配置参数<u>${data}</u></p>
<p class="t_tail">单位名称<br/>
<img src="${image}" class="Gzimg"/>
</p>
<p class="t_tail">${date}</p>
</div>
<div class="footer"></div>
</div>
</body>
</html>
demo模板(导出数据列表) : list_pdf.ftl
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<style type="text/css">
body {font-family: SimSun;}
.mybody h1 {font-size: 24px;text-align: center;line-height: 30px;padding: 20px 0;padding-top: 30px;}
.mybody h3 {font-size: 24px;text-align: center;}
.content_class p {display: block;margin-block-start: 1em;margin-block-end: 1em;margin-inline-start: 0px;margin-inline-end: 0px;}
.content_class{box-shadow:none;line-height:30px;margin:15px auto;height: auto !important;padding: 30px 75px 100px 75px !important;}
.Gzimg{ position:absolute;left: 400px;top:-35px;width: 140px;height: 140px;}
.table tb1{ border-collapse:collapse; margin:0px auto; }
.table tr{ width:700px; text-align:center; border:1pxsolid #000000; }
.table td{ border:1pxsolid; text-align:center; vertical-align:middle; }
.table th{ margin:0auto; text-align:center; border:1pxsolid; }
</style>
</head>
<body>
<div class="mybody">
<div class="header"></div>
<h1>PDF导出列表</h1>
<h3>demo</h3>
<div class="content_class">
<table border="1" width="500" cellspacing="0" cellpadding="0" >
<thead>
<tr>
<th style="text-align: center">序号</th>
<th style="text-align: center">demo</th>
</tr>
</thead>
<tbody>
<#assign oneNum=1/>
<#list queryList as list>
<tr>
<td style="text-align: center">${oneNum}</td>
<td style="text-align: center">${list.demo}</td>
</tr>
<#assign oneNum++/>
</#list>
</tbody>
</table>
</div>
</div>
</body>
</html>
三 : 引入所需maven依赖
项目采用springboot框架
<!--PDF导出POM-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.13</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</artifactId>
<version>9.0.3</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
四 : JAVA代码工具类
PDF导出工具类 PdfUtil.java
package com.chang.pdf;
import com.lowagie.text.pdf.BaseFont;
import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.extern.slf4j.Slf4j;
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.File;
import java.io.OutputStream;
import java.io.StringWriter;
import java.util.Locale;
/**
* 生成pdf文件工具类
* @author message丶小和尚
* @create 2020/01/10
*/
@Slf4j
public class PdfUtil {
private final static String TEMPLATE_BASE_PATH = "/app/static/template/";//存放文件模板的地址
private final static String IMG_BASE_PATH = "/app/static/conf/";//存放图片文件的地址(logo图片、机构公章等)
private final static String FONT_BASE_PATH = "/app/static/conf/";//存放字体资源文件的地址
private final static String DEFAULT_FONT = "simsun.ttc";//默认字体资源文件([宋体][simsun.ttc])
private final static String ENCODING = "UTF-8";//指定编码
public final static String PDF_DEMO_IMAGE = "demo_image.png";//图片名称
public final static String PDF_DEMO_TEMPLATE = "demo_pdf.ftl";//模板名称
public final static String PDF_DEMO_LIST_TEMPLATE = "list_pdf.ftl";//列表模板名称
/**
* 生成pdf
* @param templateCode 模板
* @param data 传入到freemarker模板里的数据
* @param out 生成的pdf文件流
*/
public static void createPDF(String templateCode, Object data, OutputStream out, String imgName) {
try {
// 创建一个FreeMarker实例, 负责管理FreeMarker模板的Configuration实例
Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
// 指定FreeMarker模板文件的位置
cfg.setDirectoryForTemplateLoading(new File(TEMPLATE_BASE_PATH));
ITextRenderer renderer = new ITextRenderer();
// 设置 css中 的字体样式(暂时仅支持宋体和黑体)
renderer.getFontResolver().addFont(FONT_BASE_PATH + DEFAULT_FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
// 设置模板的编码格式
cfg.setEncoding(Locale.CHINA, ENCODING);
// 获取模板文件 template.ftl
Template template = cfg.getTemplate(templateCode, ENCODING);
StringWriter writer = new StringWriter();
// 将数据输出到html中
template.process(data, writer);
writer.flush();
String html = writer.toString();
// 把html代码传入渲染器中
renderer.setDocumentFromString(html);
// 解决图片的相对路径问题 ##必须在设置document后再设置图片路径,不然不起作用
// 如果使用绝对路径依然有问题,可以在路径前面加"file:/"
if(null != imgName && !"".equals(imgName)){
renderer.getSharedContext().setBaseURL("file:" + IMG_BASE_PATH + imgName);
}
renderer.layout();
renderer.createPDF(out, false);
renderer.finishPDF();
out.flush();
out.close();
} catch (Exception e) {
log.error("PDF导出异常", e);
}
}
}
PDF导出接口 PdfController.java
package com.chang.pdf;
import org.apache.commons.lang.time.DateFormatUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* PDF导出
* @author message丶小和尚
* @create 2020/01/10
*/
@Controller
public class PdfController {
@RequestMapping("exportPdfDemo")
@ResponseBody
public void exportPdfDemo(HttpServletResponse response, @RequestParam("param")String param) throws Exception{
ResultDTO resultDTO = new ResultDTO();
resultDTO.setImage(PdfUtil.PDF_DEMO_IMAGE);//设置图片,没有图片设置空即可
resultDTO.setData(param);//参数
resultDTO.setDate(DateFormatUtils.format(new Date(),"yyyy年MM月dd日"));//时间
PdfUtil.createPDF(PdfUtil.PDF_DEMO_TEMPLATE,resultDTO,response.getOutputStream(),resultDTO.getImage());
}
@RequestMapping("exportPdfList")
@ResponseBody
public void exportPdfList(HttpServletResponse response, @RequestParam("param")String param) throws Exception{
ResultDTO resultDTO = new ResultDTO();
List<ResultVO> resultVOList = new ArrayList<>();
//设置list值
ResultVO resultVO = new ResultVO();
resultVO.setDemo("JAVA");
resultVOList.add(resultVO);
ResultVO resultVO1 = new ResultVO();
resultVO1.setDemo("PDF");
resultVOList.add(resultVO1);
resultDTO.setQueryList(resultVOList);
PdfUtil.createPDF(PdfUtil.PDF_DEMO_LIST_TEMPLATE,resultDTO,response.getOutputStream(),resultDTO.getImage());
}
}
PDF导出参数实体类 ResultDTO.java
package com.chang.pdf;
import java.io.Serializable;
import java.util.List;
public class ResultDTO implements Serializable {
private static final long serialVersionUID = 1L;
//数据
public String data;
//日期
public String date;
//图片
public String image;
//集合
public List<ResultVO> queryList;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public List<ResultVO> getQueryList() {
return queryList;
}
public void setQueryList(List<ResultVO> queryList) {
this.queryList = queryList;
}
}
PDF导出参数实体类 ResultVO.java
package com.chang.pdf;
import java.io.Serializable;
public class ResultVO implements Serializable {
private static final long serialVersionUID = 1L;
//送达日期
public String demo;
public String getDemo() {
return demo;
}
public void setDemo(String demo) {
this.demo = demo;
}
}
五 : 配置信息
在PDF工具类中有配置文件的地址,即存放所需配置文件,可设置导出的PDF的文件字体,以及在文件中放入图片
附件附上配置链接,文中有下载地址,也可使用下面百度云链接地址,如失效请留言
百度网盘下载地址: https://pan.baidu.com/s/1nnRwYn–mHgJAim5AJf9cQ
提取码: yfv5
CSDN资源下载,0积分: https://download.csdn.net/download/qq_38254635/12094978
六 : 说明
关于FTL表格内容不能自动换行
https://blog.csdn.net/qq_38254635/article/details/108872425
七 : 相关资源
JAVA生成Zip文件并导出:
https://blog.csdn.net/qq_38254635/article/details/127364398
JAVA导出Excel文件:
https://blog.csdn.net/qq_38254635/article/details/126691175
JAVA根据模板生成WORD文件并导出:
https://blog.csdn.net/qq_38254635/article/details/103952823
JAVA根据PDF文件生成图片:
https://blog.csdn.net/qq_38254635/article/details/112029941