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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐