Java项目如何导出数据为 PDF 文件?

news2024/10/7 14:28:50

文章目录

  • Java项目如何导出数据为 PDF 文件?
    • 一、代码结构如下
    • 二、代码说明
      • 1、添加依赖 pom.xml
      • 3、添加字体
      • 4、PDF 导出工具类
    • 三、效果图
  • 结语

Java项目如何导出数据为 PDF 文件?

一个小需求,需要将页面上的数据导出为PDF,正常情况下这个需求需要让前端来做,但是现在上面让咱们后端来做,也没问题。

直接上代码

一、代码结构如下

图片

二、代码说明

1、添加依赖 pom.xml

<dependency>
    <groupId>com.openhtmltopdf</groupId>
    <artifactId>openhtmltopdf-core</artifactId>
    <version>1.0.0</version>
</dependency>
<dependency>
    <groupId>com.openhtmltopdf</groupId>
    <artifactId>openhtmltopdf-pdfbox</artifactId>
    <version>1.0.0</version>
</dependency>
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
    <version>3.0.11.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring5</artifactId>
    <version>3.0.11.RELEASE</version>
</dependency>

2、HTML模板文件 audit_order_record.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
    <meta charset="UTF-8"/>
    <title th:text="${pdfFileName}"></title>
    <style>
        @page {
            size: A4;
            @top-center {
                content: element(header);
            }
            @bottom-center {
                content: '';
                font-family: 'stxihei', serif;
            }
        }
        html, body {
            font-family: 'stxihei', serif;
        }
        table {
            -fs-table-paginate: paginate;
            border-collapse: collapse;
        }
        #page-header {
            position: running(header);
            border-bottom: 1px solid #555;
            padding: 5px;
        }
        #page-header-text {
            font-size: 16px;
        }
        #page-header-num:after {
            float: right;
            text-align: right;
            content: counter(page) '/' counter(pages);
        }
        table {
            width: 100%;
            margin: auto 0;
        }
        table, td, th {
            border: 1px solid #555;
            padding: 10px;
            text-align: center;
        }
        th {
            background-color: #eff3fa;
            width: 200px;
        }
</style>
</head>
<body>
<div id="page-header">
    <span id="page-header-text">审批记录</span>
    <span id="page-header-num"></span>
</div>

<table>
    <tr>
        <th colspan="2">资源信息</th>
    </tr>
    <tr>
        <th>目录名称</th>
        <td>[[${resourceName}]]</td>
    </tr>
    <tr>
        <th>资源名称</th>
        <td>[[${infoName}]]</td>
    </tr>
    <tr>
        <th>资源类型</th>
        <td>[[${resourceType}]]</td>
    </tr>
    <tr>
        <th>数据提供方</th>
        <td>[[${resOrgName}]]</td>
    </tr>
    <tr>
        <th colspan="2">订阅信息</th>
    </tr>
    <tr>
        <th>资源需求方</th>
        <td>[[${orgName}]]</td>
    </tr>
    <tr>
        <th>需求方系统</th>
        <td>[[${systemName}]]</td>
    </tr>
    <tr>
        <th>联系人</th>
        <td>[[${linkMan}]]</td>
    </tr>
    <tr>
        <th>联系手机</th>
        <td>[[${linkPhone}]]</td>
    </tr>
    <tr>
        <th>申请日期</th>
        <td>[[${orderDate}]]</td>
    </tr>
    <tr>
        <th>申请理由</th>
        <td>[[${orderReason}]]</td>
    </tr>
    <tr>
        <th colspan="2">审核信息</th>
    </tr>
    <tr>
        <th>审核人</th>
        <td>[[${prejuUserName}]]</td>
    </tr>
    <tr>
        <th>审核结果</th>
        <td>[[${prejuResult}]]</td>
    </tr>
    <tr>
        <th>审核日期</th>
        <td>[[${prejuDate}]]</td>
    </tr>
    <tr>
        <th>审核意见</th>
        <td>[[${prejuSuggest}]]</td>
    </tr>
</table>
</body>
</html>

3、添加字体

将字体文件 STXIHEI.TTF 放在 pdf/fonts 下面

4、PDF 导出工具类

 
package com.libin.pdf.demo.util;

import com.openhtmltopdf.pdfboxout.PdfRendererBuilder;
import org.springframework.util.ResourceUtils;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import org.thymeleaf.templateresolver.FileTemplateResolver;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.OutputStream;
import java.util.Map;

public class PdfUtil {

    /**
     * @param response     http请求后的相应
     * @param pdfFileName  pdf文件名称(不包含pdf后缀)
     * @param templateName 模板名称
     * @param variables    模板变量
     */
    public static void exportPdf(HttpServletResponse response, String pdfFileName, String templateName, Map<String, Object> variables) throws Exception {
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment;filename=" + new String((pdfFileName + ".pdf").getBytes(), "iso8859-1"));
        OutputStream os = response.getOutputStream();
        //构造模板引擎
        ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
        resolver.setPrefix("pdf/templates/"); //模板所在目录,相对于当前classloader的classpath。
        resolver.setSuffix(".html"); //模板文件后缀
//        FileTemplateResolver resolver = new FileTemplateResolver();
//        resolver.setPrefix(ServletActionContext.getServletContext().getRealPath("pdf/templates") + File.separator); // 如果放在web下
//        resolver.setSuffix(".html");

        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(resolver);
        //构造上下文(Model)
        Context context = new Context();
        context.setVariable("pdfFileName", pdfFileName);
        context.setVariables(variables);
        //渲染模板
        String example = templateEngine.process(templateName, context);
        PdfRendererBuilder builder = new PdfRendererBuilder();
        //设置字体文件
        builder.useFont(ResourceUtils.getFile("classpath:pdf/fonts/SIMHEI.TTF"), "stxihei");
//        builder.useFont(new File(ServletActionContext.getServletContext().getRealPath("/pdf/fonts/SIMHEI.TTF")), "stxihei"); // 如果是放在web下面
        builder.useFastMode();
        builder.withHtmlContent(example, null);
        builder.toStream(os);
        builder.run();
    }
}

5、导出接口

 package com.libin.pdf.demo.controller;

import com.libin.pdf.demo.util.PdfUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

@RestController
public class DemoController {

    @GetMapping("pdf")
    public void test(HttpServletResponse response) throws Exception {
        Map<String, Object> variables = new HashMap<>();
        // 资源信息
        // 资源名称
        variables.put("resourceName", "XXXXXXXXXX");
        // 目录名称
        variables.put("infoName", "XXXXXXXXXX");
        //资源类型
        variables.put("resourceType", "XXXXXXXXXX");
        // 数据提供方
        variables.put("resOrgName", "XXXXXXXXXX");

        // 资源需求方
        variables.put("orgName", "XXXXXXXXXX");
        // 需求方系统
        variables.put("systemName", "XXXXXXXXXX");
        // 联系人
        variables.put("linkMan", "XXXXXXXXXX");
        // 联系手机
        variables.put("linkPhone", "XXXXXXXXXX");
        // 申请日期
        variables.put("orderDate", "XXXXXXXXXX");
        // 申请理由
        variables.put("orderReason", "XXXXXXXXXX");

        // 审核人
        variables.put("prejuUserName", "XXXXXXXXXX");
        // 审核结果
        variables.put("prejuResult", "XXXXXXXXXX");
        // 审核日期
        variables.put("prejuDate", "XXXXXXXXXX");
        // 审核意见
        variables.put("prejuSuggest", "XXXXXXXXXX");

        PdfUtil.exportPdf(response, "审批记录", "audit_order_record.html", variables);
    }
}

6、打开浏览器测试

浏览器访问 localhost:8080/pdf 进行测试

三、效果图

图片

结语

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/51950.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11月业务安全月报 | 台湾2300万人信息泄露;黑客两分钟即可破解安卓锁屏;乌克兰“IT军团”入侵俄罗斯中央银行

导语&#xff1a;随着数字化的深入普及&#xff0c;业务愈加开放互联。企业的关键数据、用户信息、基础设施、运营过程等均处于边界模糊且日益开放的环境中&#xff0c;涉及利益流和高附加值的业务面临多样的安全隐患&#xff0c;随时可能遭遇损失&#xff0c;进而影响企业运营…

Android 8.0网络DNS

1 Linux DNS规范 Linux上并没有一个单独的方法可以完成DNS查询工作&#xff1b;没有一个有这样的明确接口的核心系统调用system call。不过&#xff0c;glibc (nss)的getaddrinfo (3), gethostbyname (3)等相关API (RFC3493)提供了DNS查询功能。 1&#xff09;不支持nscd&#…

关于使用STM32CubeMx配置串口出现的一些问题

一、使用CubeMX配置好串口中断的工程&#xff0c;打开工程添加相关代码后串口没有数据输出或者看不见数据但串口助手的RX会一直增加的问题。 参考&#xff1a;这里 大概意思就是时钟的原因&#xff0c;需要把stm32f4xx_hal_conf.h文件中的时钟改一下&#xff0c;将25MHz改为8…

Ansys Zemax | 使用 OpticStudio 进行闪光激光雷达系统建模(中)

在消费类电子产品领域&#xff0c;工程师可利用激光雷达实现众多功能&#xff0c;如面部识别和3D映射等。尽管激光雷达系统的应用非常广泛而且截然不同&#xff0c;但是 “闪光激光雷达” 解决方案通常都适用于在使用固态光学元件的目标场景中生成可检测的点阵列。凭借具有针对…

我要涨知识——TypeScript 经典高频面试题(二)

又是一个年底来了&#xff0c;好大一批人可能又准备跑路了&#xff0c;翻了翻掘金和 CSDN 发现好多大佬都有大厂 Offer &#xff0c;看着看着我心动了&#xff01; 话不多说&#xff0c;赶紧开干&#xff0c;给自己整了一个前端面试小助手——微信小程序内搜索 “WEB学习学习加…

jar启动指定JDK/JRE 安装路径教程

前言 因为疫情在家办公的缘故&#xff0c;有个老项目&#xff0c;需要改个接口&#xff0c;然后需要前端联调&#xff0c;因为外网服务器没有多余的空间了&#xff0c;想着把jar给前端让前端开发人员&#xff0c;在自己的本机启动后端服务&#xff0c;进行接口联调&#xff0c;…

streptavidin-PEG-6-FAM 链霉亲和素-聚乙二醇-6-羧甲基荧光素

产品名称&#xff1a;链霉亲和素-聚乙二醇-6-羧甲基荧光素 英文名称&#xff1a;streptavidin-PEG-6-FAM 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体&#xff0c;取决于分子量 PEG分子量可选&#xff1a;350、550、75…

虚拟内存系统【如何支持巨大的虚拟地址空间】

如何支持巨大的虚拟地址空间&#x1f4d6;1. 为什么要支持巨大的虚拟地址空间&#x1f4d6;2. 交换空间&#x1f4d6;3. 存在位&#x1f4d6;4. 页错误&#x1f4d6;5. 为了处理页错误&#xff0c;操作系统大致做了什么&#xff1f;&#x1f4d6;6. 页面换出&#x1f4d6;7. 当…

IDEA 中使用 SparkSQL 远程连接 Hive

文章目录第一步&#xff0c;环境配置第二步&#xff0c;IDEA 配置第三步&#xff0c;授权第四步&#xff0c;连接测试扩展——华为云/阿里云集群报错第一步&#xff0c;环境配置 首先&#xff0c;你要确保你的集群可以正常运行。 我们在 Windows 电脑中安装 Hadoop&#xff0…

【新知实验室--音视频通话】腾讯云TRTC-实时音视频---多人会议视频通话SDK基础搭建

&#x1f996;我是Sam9029&#xff0c;一个前端 Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主 &#x1f431;‍&#x1f409;&#x1f431;‍&#x1f409;恭喜你&#xff0c;若此文你认为写的不错&#xff0c;不要吝啬你的赞扬&#xff0c;求收…

基于STM32单片机的篮球计时记分器proteus仿真原理图PCB

功能&#xff1a; 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示比赛剩余时间&#xff0c;球队分数 2.默认计时器为4节&#xff0c;每节10分钟&#xff0c;每节比赛结束&#xff0c;蜂鸣器报警 3.按键功能介绍: 1’键——加1分 4’键——减1分 2’键——加2分 5’键—…

基于java+springmvc+mybatis+vue+mysql的水果食品果蔬生鲜商城销售系统

项目介绍 网络购物作为一种全新的销售方式赢得了越来越多销售者的青睐&#xff0c;近年来销售额更是以连年翻番的惊人速度成倍增长&#xff0c;网络购物已经形成了自身特有的网络销售市场和全新的网络营销模式&#xff0c;也使网络营销渠道应运而生&#xff0c;同时&#xff0…

SRM供应商平台哪些好用?

SRM系统是管理供应商的系统&#xff0c;旨在与供应商建立高效的协同关系&#xff0c;是一种围绕采购业务的双赢管理模式。 但市面上SRM系统供应商层出不穷&#xff0c;很多企业在数字化转型中不知如何挑选合适自己企业的SRM系统&#xff0c;或是选错了系统&#xff0c;效率提升…

成功的项目管理工具拥有的五大功能

如果您决定投资一种新的项目管理工具&#xff0c;那么您需要确保购买的是最适合自己的。在为您的企业寻找最佳项目管理软件时&#xff0c;不要被所有的花里胡哨分心&#xff0c;因为某些东西看起来很漂亮并不意味着它有实质。不要错过对团队成功至关重要的关键功能&#xff0c;…

【论文精读7】MVSNet系列论文详解-PVA-MVSNet

PVA-MVSNet论文名为&#xff1a;Pyramid Multi-view Stereo Net with Self-adaptive View Aggregation&#xff0c;主要是用了一个自适应的聚合模块来在构建代价体时不用均匀的方差、而是让不同的特征体具有一定的选择注意力权重来对最终的代价体做贡献&#xff0c;同时对于多尺…

星起航跨境:跨境卖家可以这样获得好评,稳步提升销量

据调查数据显示&#xff0c;90%以上的消费者购物之前会先查看产品评论&#xff0c;好的评价能促进产品更快地转化&#xff0c;不好的评价还会对产品listing权重产生一定的影响。例如&#xff1a;在产品listing的评价较少的情况下&#xff0c;一个1星差评在listing展示超过3天之…

WebRTC实战-第一章-理论基础

目录webrtc-demo基础理论ICE server/信令server/webrtc server的区别和联系coturn安装coturn穿透和转发服务器安装依赖ubuntu系统centos系统编译安装coturn快速测试启动自定义配置启动自定义配置真实配置新建start.sh测试地址&#xff0c;分别测试stun 和 turn打开测试地址测试…

jsp汽车销售管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp汽车销售管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使用…

Spire.Doc 10.11.9 支持设置形状填充颜色的透明度

度娘找破解版Spire.Doc for .NET是一个专业的Word .NET库&#xff0c;专门为开发人员设计&#xff0c;用于在任何.NET 平台&#xff08;Target .NET Framework、.NET Core、.NET Standard、 .NET 5.0、.NET 6.0、Xamarin 和 Mono Android&#xff09;&#xff0c;具有快速和高质…

纷享销客2022新增长系列之《高科技行业橙皮书》重磅发布

二十大报告进一步提出建设数字中国&#xff0c;加快发展数字经济。这意味着&#xff0c;对于各行业而言&#xff0c;充分运用数字化技术推动业务变革、效率变革、流程变革&#xff0c;是各行各业发展的必经之路。 高科技行业作为一个知识与技术密度性高的行业&#xff0c;具备技…