JAVA根据模板生成PDF文件并导出

2023-11-05

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA根据模板生成PDF文件并导出 的相关文章

  • 表格固定标题和第一列 css/html

    我有一个包含大量行和列的表 但我想固定标题和第一列 这是我需要的图片 只有粉色部分必须水平和垂直滚动 但其他部分在滚动过程中必须保持可见 我的表位于 div 中 首先 我应该使用一张桌子还是四张桌子 蓝色桌子 红色桌子 绿色桌子和粉色桌子
  • BigDecimal汇总统计

    我有一个 BigDecimal 列表 List
  • 角度材质表-表内边框

    I am using Angular material table and I want to set border inside the table Using CSS I was able to set border Normal ca
  • 如何在 JmsMessagingTemplate.sendAndReceive 上设置等待超时

    我在 MVC 控制器中使用 JmsMessagingTemplate 的 sendAndReceive 但如果没有发送回复消息 它似乎会永远等待回复 该文档指出 返回 回复 如果无法接收消息 例如由于超时 则可能为 null 然而 我只是不
  • javadoc 子集/java 库组织

    我自己从来没有运行过javadoc 无论是在命令行还是ant 的 javadoc 任务 http ant apache org manual Tasks javadoc html 我将使用 ant 我需要为我编写的库生成 javadoc 问
  • 如何让 ExtJS ComboBox 与文本一起显示?

    我想让以下内容显示在一行中 我尝试过使用样式浮动和显示 Show this input
  • 为 REST API 生成 Swagger UI 文档

    我使用 Java 中的 JAX RS Jersey 开发了 REST API 我想为其转换 生成基于 Swagger 的 UI 文档 谁能以简单的方式告诉我如何做到这一点的精确 步骤 很抱歉 他们网站上给出的步骤对我来说有点模糊 有多种方法
  • Spring Security 角色层次结构不适用于 Thymeleaf sec:authorize

    我正在使用 Spring Security 3 2 5 RELEASE 和 ThymeLeaf 2 1 4 RELEASE 我已经在安全上下文中定义了角色层次结构 在我的视图层中我正在使用sec authorize属性来定义菜单项 我希望看
  • 获取接收者的设备令牌以在 Firebase 中发送通知

    所以我正在学习如何使用 firebase 发送设备到设备的通知 我看到了这个answer https stackoverflow com a 42548586 5237289发送通知 看起来很简单 现在 我知道要获取发件人的令牌 它应该如下
  • 在 Eclipse RCP 应用程序中禁用插件贡献

    我经常遇到这个问题 但尚未找到解决方案 每当我编写一个新的基于 Eclipse RCP 的应用程序并包含来自 Eclipse 平台的插件时 我都会 继承 其中一些插件的 UI 贡献 大多数贡献 菜单项 键盘快捷键 属性页 都很有用 但有时我
  • 如何在 JASPIC 中保存经过身份验证的用户?

    我开发了一个安全认证模块 SAM 并实现了validateRequest方法 我还有一个简单的 Web 应用程序配置为使用此 SAM In my validateRequest方法 我检查 clientSubject 并设置一个Caller
  • Ace Editor 自动完成和多种语言

    如何为 Ace 编辑器创建自动完成功能以及如何突出显示 php 中的 html javascript 和 csshttp ace ajax org http ace ajax org
  • 线程数组?

    所以我在理解如何避免线程的顺序执行时遇到了问题 我试图创建一个线程数组并在单独的循环中执行 start 和 join 函数 这是我现在拥有的代码示例 private static int w static class wThreads im
  • Spring 如何在运行时获取有关“强类型集合”的泛型类型信息?

    我在 Spring 3 0 文档中阅读了以下内容 强类型集合 仅限 Java 5 在 Java 5 及更高版本中 您可以使用强类型集合 使用泛型类型 也就是说 可以声明一个 Collection 类型 使其只能包含 String 元素 例如
  • 如何使弹出窗口溢出:在溢出内可见:自动上下文

    我有一个 div 列表 如果超过父框 overflow x 应该滚动 并且在悬停时 我想看到一个弹出窗口 我的问题是 如果我将鼠标悬停在任何子 div 上 弹出窗口将被考虑用于溢出计算 但我只想让它在所有内容之上可见 而不是使其扩展滚动区域
  • Spring MVC:通用 DAO 和服务类

    我正在 Spring MVC 中编写网页 我使用 Generic DAO 编写了所有 DAO 现在我想重写我的服务类 我该如何写 通用服务 我的 DAO 如下 DAO package net example com dao import j
  • junit4 使用特定测试方法创建测试套件

    在 junit4 中 我想执行来自不同类的特定测试方法 即想要使用来自不同类的特定测试方法创建一个测试套件 假设我有两门课 public class Test Login Test public void test Login 001 Sy
  • JQuery 设置动态最大宽度

    我不太擅长 jQuery 因此完整的代码解决方案将是理想的选择 该函数将 获取浏览器屏幕的 70 宽度 将该宽度转换为其相应的 px 值 设置最大宽度 mainContainer使用从转换 计算中获得的值 这是我要设置的容器的 CSS 样式
  • FetchType.LAZY 不适用于休眠中的 @ManyToOne 映射

    简而言之 我的 Child 类与 Parent 类之间存在多对一的关系 我想加载所有的孩子 而不必加载他们的父母详细信息 我的孩子班级是 Entity public class Child implements Serializable I
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所

随机推荐

  • Java——JavaWeb

    文章目录 1 Tomcat 1 1 安装Tomcat 1 2 Tomcat启动和配置 1 3 配置文件 2 HTTP 2 1 HTTP请求 2 2 HTTP响应 3 Maven 3 1 Maven项目架构管理工具 3 2 下载安装Maven
  • Dictionary用法总结

    说明 必须包含名空间System Collection Generic Dictionary里面的每一个元素都是一个键值对 由二个元素组成 键和值 键必须是唯一的 而值不需要唯一的 键和值都可以是任何类型 比如 string int 自定义
  • 嵌入式硬件 入门路线

    嵌入式硬件 入门路线 文章目录 嵌入式硬件 入门路线 前言 C语言 推荐学习方法 推荐资料 51单片机 学习51单片机的收获 推荐学习方法 推荐资料 学习成本 stm32单片机 前置知识需求 推荐学习法 推荐资料 学习线路推荐说明 学习成本
  • matlab的详细使用方法

    help命令 格式help 函数名 例 局部上 1 help plot 二维绘图 2 help elfun 基本函数 初等函数的帮助 3 help exp 指数函数的简单帮助 4 网页格式的帮助doc exp 5 Lookfor 模糊查询
  • vscode连接远程服务器+SFTP同步本地文件

    vscode连接远程服务器 SFTP同步本地文件 前言 准备工作 配置远程服务器 SFTP 前言 最近在做毕设 本来使用的是kaggle的gpu资源 但是上传数据 修改数据实在不方便 于是向实验室学长要了一个单卡服务器 下面介绍如何使用vs
  • Android使用SharedPreferences(sp)存储基本数据类型、List集合、Map集合、对象都在这了

    基于一些小伙伴说在取出对象的时候出现null 这个问题可能是因为你的对象没有序列化的原因 如果存在内部类的也需要进行序列化 看下面的例子 public class Test implements Serializable 内部类 publi
  • c语言蛇形填充数组,蛇形

    题目描述 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形 例如 当输入5时 应该输出的三角形为 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 请注意本题含有多组样例输入 输入描述 输入正整数N N不大于10
  • vue中使用简单的回调函数

    使用场景 比如 多个新增接口一样 只是新增之后调用的列表接口不一致 this getTalkBy 列表接口的回调 调用 this getAddTalkLike this getTalkBy 新增接口 getAddTalkLike callb
  • 大神总结的图像处理学习路线

    图像处理 第一阶段 熟悉图像算法 推荐中科院研究生院刘定生老师的数字图像处理与分析 视频 配套的书籍 冈萨雷斯版数字图像处理 同时用matlab软件 仿真每一个图像算法案例 推荐 matlab宝典 第二阶段 认真学习C 推荐 C Prime
  • 基于Smack3.0.4+ Openfire3.10.2开发之Android 客户端之四

    我们在之前依次介绍openfire部署以及smack常用API的使用 这一节中我们着力介绍如何基于asmack开发一个Android的客户端 本篇的重点在实践 讲解和原理环节 大家可以参考前面我所发布的OpenFire和Smack的相关文章
  • 10.JavaWeb-logback日志

    1 日志的概念 日志是用于记录软件系统运行时状态和事件的重要工具 在软件开发中 日志是一种常用的调试和故障排查手段 同时也可以用于性能分析 用户行为追踪和系统监控等方面 1 1日志特点 灵活性 可以根据需要配置日志的级别和输出目标 方便在不
  • MCU和DSP区别

    1 概述 随着处理器技术的不断发展 目前来看CPU Central Processing Unit 逐渐出现三种分支 分别是DSP Digital Signal Processing Processor 数字信号处理 以及MCU Micro
  • 第四天笔记

    1 盒子模型 内边距 应用于所有边 padding 1em 上边下边 左边右边 padding 5 10 上边 左边右边 下边 padding 1em 2em 2em 上边 右边 下边 左边 padding 5px 1em 0 2em 全局
  • JavaScript给URL追加参数

    代码 appendQuery url key value gt var options key if typeof options string options options key value options param options
  • 傅里叶变换在图像处理中的应用

    目录 基本概念 超详细的图像中傅里叶理解及常用模板 请参考 https blog csdn net m0 37264397 article details 70186390 应用一 使用C opencv对图像进行傅里叶变换 再根据频谱图对原
  • STM32----IIC详解

    一 IIC简介 1 IIC总线概述 IIC总线是飞利浦公司研发的两线制串行通信总线 IIC两线制包括 串行时钟线 SCL 和串行数据线 SDA 串行时钟线 SCL 只能由主器件控制 串行数据线 SDA 实现双向数据传输 IIC通信属于同步
  • 在IE中使用ActiveX控件,需要使用HTML中的标志是

    在 中使用ActiveX控件 需要使用HTML中的标志是
  • 【C语言】二分查找(含图解)

    文章目录 1 二分查找思想 2 代码实现 2 1 未封装函数 2 2 封装函数 使用while循环 2 3 封装函数 使用递归 1 二分查找思想 二分法 二分查找算法是一种在有序数组中查找某一特定元素的搜索算法 其思想就是不断地将有序查找表
  • 5.2 可变参数

    5 2 可变参数 Lua函数可以接受可变数目的参数 和C语言类似在函数参数列表中使用三点 表示函数有可变的参数 Lua将函数的参数放在一个叫arg的表中 除了参数以外 arg表中还有一个域n表示参数的个数 例如 我们可以重写print函数
  • JAVA根据模板生成PDF文件并导出

    JAVA根据模板生成并导出PDF 实现功能 根据模板生成PDF文件 模板文件参数可配 可手动修改 一 PDF导出效果 先看一下导出的demo文件 具体样式可手动修改 下图为demo pdf ftl导出PDF文件 下图为list pdf ft