itext 7批量生成pdf文件并以压缩包形式下载

news2024/9/27 5:59:28

itext 7批量生成pdf文件并以压缩包形式下载

引入jar

<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itext7-core</artifactId>
			<version>7.0.3</version>
			<type>pom</type>
		</dependency>

代码实现–生成pdf文件

    /**
     * 生成pdf文件
     * @return java.io.ByteArrayOutputStream
     * @date 2023/6/25 16:29
     * @author fyh
     **/
    private ByteArrayOutputStream exportPdf(){
        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
            PageSize pageSize = PageSize.A4.rotate();
            PdfDocument pdfDoc = new PdfDocument(new PdfWriter(out));
            Document doc = new Document(pdfDoc, pageSize);
            float[] f = new float[]{0.01f};
            Table table = new Table(UnitValue.createPercentArray(f));
            table.setWidth(745);
            Cell cell = new Cell();
            //设置表格边框颜色
            cell.setBorder(new SolidBorder(new DeviceRgb(0xFFF, 0xFFF, 0xFFF),3));
            PdfFont font = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H",true);
            //背景图上写入汉字
            Paragraph p = new Paragraph("努尔哈赤")
                    .setFont(font).setFontSize(13f).setFontColor(DeviceGray.BLACK);
            //写入汉字坐标
            p.setFirstLineIndent(140f);
            p.setFixedLeading(418f);
            cell.add(p);
            //获取表格背景图
            URL resource = this.getClass().getClassLoader().getResource("honour.png");
            assert resource != null;
            Image img = new Image(ImageDataFactory.create(resource.getPath()));

            cell.setNextRenderer(new ImageBackgroundCellRenderer(cell, img));
            cell.setHeight(590 * img.getImageHeight() / img.getImageWidth());

            table.addCell(cell);
            doc.add(table);
            doc.close();
            out.flush();
            return out;
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }
        return new ByteArrayOutputStream();
    }

代码实现–生成并下载压缩包

    /**
     *生成压缩包
     * @date 2023/6/25 16:02
     * @author fyh
     **/
    private void downLoadZip(List<Map<String,Object>> fileList, HttpServletResponse httpResponse){
        try(ZipOutputStream zipOutputStream = new ZipOutputStream(httpResponse.getOutputStream())) {
            //下载压缩包
            httpResponse.setContentType("application/zip");
            httpResponse.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("附件.zip", "UTF-8"));
            // 创建 ZipEntry 对象
            for (Map<String,Object> map:fileList){
                ZipEntry zipEntry =  new ZipEntry((String) map.get("fileName"));
                zipOutputStream.putNextEntry(zipEntry);
                zipOutputStream.write((byte[]) map.get("outByte"));
            }
        } catch (IOException e) {
            log.error(e.getMessage(),e);
        }
    }

controller层 代码实现

    /**
     * 导出压缩包
     * @date 2023/6/25 16:15
     * @author fyh
     **/
    @GetMapping(value = "downLoadZip")
    public void downLoadZip2(HttpServletResponse httpServletResponse){
        //生成的文件
        ByteArrayOutputStream byteArrayOutputStream = exportPdf();
        Map<String,Object> excelOut = new HashMap<>();
        excelOut.put("fileName","努尔哈赤.pdf");
        excelOut.put("outByte",byteArrayOutputStream.toByteArray());
        List<Map<String,Object>> fileList = new ArrayList<>();
        fileList.add(excelOut);
        //文件压缩为zip
        downLoadZip(fileList,httpServletResponse);
    }

实现效果图

在这里插入图片描述

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

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

相关文章

逻辑漏洞小结之SRC篇(值得收藏,反复看!)

​​​​​最近在挖各大src&#xff0c;主要以逻辑漏洞为主&#xff0c;想着总结一下我所知道的一些逻辑漏洞分享一下以及举部分实际的案例展示一下&#xff0c;方便大家理解。 主要从两个方面看&#xff0c;业务方面与漏洞方面。&#xff08;接下来就从拿到网站的挖掘步骤进行…

如何使用模板化消息进行客户服务?(参考salesmartly)

如何使用模板化消息进行客户服务&#xff1f;&#xff08;参考salesmartly&#xff09; 一整天一遍又一遍地重复相同的答案可能会很乏味&#xff0c;尤其是对于您的客户服务团队而言。模板化消息&#xff0c;也称为预制回复或回复模板&#xff0c;已成为许多客户服务团队必备功…

Kong(Without DB)的安装和基本使用

下载和安装 Docs 这里以Centos为例 sudo yum install kong-enterprise-edition-3.3.0.0.rpm配置 ​ Kong的官网提供了两个配置模式一个是 Using a database 另一个是使用 yaml配置文件的形式&#xff0c;安装好后默认配置文件默认是/etc/kong/kong.conf.default 二者对比 …

React V6实现类似与vue的eventBus

功能背景 想要实现类似于vue的eventBus的功能&#xff0c;由一个组件通知其他一个或多个组件。应用场景&#xff1a;比如一个可视化大屏的界面&#xff0c;当筛选条件变化的时候&#xff0c;要同时通知到大屏中所有图表一起变化。&#xff08;当然使用store也是可以的&#xff…

逻辑回归算法实现

目录 1.关于逻辑回归的原理解析和准备工作 2.关于激活函数 3.关于数据集 4.编写LogisticsRegression类 5.逻辑回归测试 6.结果 1.关于逻辑回归的原理解析和准备工作 逻辑回归原理相关内容&#xff0c;请参考博主的另一篇文章&#xff1a;机器学习&#xff08;二&#xff…

菜鸟重磅推出多款科技新品,“工业大脑”PLC国产化获突破

“决策参谋”供应链计划、“工业大脑”PLC、“智能制造”科技解决方案……6月28日&#xff0c;在2023全球智慧物流峰会上&#xff0c;菜鸟自研的一批新产品、新方案正式曝光。菜鸟物流科技深耕制造业的成绩单也在峰会期间公布&#xff0c;华晨宝马等一批头部汽车企业已与其展开…

六种提高自己工作效率的方法!

为什么同样的时间&#xff0c;同样的都在休息都在玩&#xff0c;而别人工作却在玩的同时已经完成了一大半了。究竟是怎么做到的呢&#xff1f; 不仅仅是因为别人的工作效率高&#xff0c;而是因为他们会巧用工具。 那么你肯定想知道&#xff0c;这款工具是什么样的呢&#xf…

hutool工具类实现excel上传 支持03和07

一直感觉excel表的导入有很多代码&#xff0c;写一次忘一次&#xff0c;类太多&#xff0c;要知道怎么获取Workbook、Sheet、Cell、row等等&#xff0c;这么多类不可能一直记的住&#xff0c;都是写过之后保存&#xff0c;使用的时候拿出来改改&#xff0c;更烦人的是针对offic…

Vue Router replace 编程式导航 缓存路由组件

6.9.路由跳转的 replace 方法 作用&#xff1a;控制路由跳转时操作浏览器历史记录的模式浏览器的历史记录有两种写入方式&#xff1a;push和replace push是追加历史记录replace是替换当前记录&#xff0c;路由跳转时候默认为push方式 开启replace模式 <router-link :replac…

松翰单片机keil环境芯片包

松翰单片机keil环境芯片包&#xff08;SN8F5700系列&#xff09;&#xff1a;安装时与Keil安装位置相同可以直接使用。 安装后依次点击可查看芯片包具体型号&#xff1a; 芯片包下载链接&#xff1a;阿里云盘分享https://www.aliyundrive.com/s/TnHchMhYeh1

Baumer工业相机堡盟工业相机如何通过BGAPISDK进行定序器编程:根据每次触发信号移动感兴趣区域(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK进行定序器编程:根据每次触发信号移动感兴趣区域&#xff08;C&#xff09; Baumer工业相机Baumer工业相机BGAPISDK和定序器编程的技术背景Baumer工业相机通过BGAPISDK进行定序器编程功能1.引用合适的类文件2.Baumer工业相机通过BGA…

laravel+vue共用一个域名,使用目录区分接口和项目的nginx配置

1、打包好的项目&#xff1a; 首先将打包好的项目放置public下&#xff0c;如下图 2、nginx配置文件 不带注释的伪静态&#xff08;推荐&#xff09; 备注&#xff1a;若在 location /admin 中的 admin 后面不加 “斜杠/”&#xff0c;则会出现访问 /admin-user 路由&#x…

Oracle Net Services 配置:LISTENER:没有为主机 VM-16-7-centos 返回有效的 IP 地址

问题描述&#xff1a; [rootVM-16-7-centos oracle]# /etc/init.d/oracledb_ORCLCDB-21c configure Configuring Oracle Database ORCLCDB. 准备执行数据库操作 已完成 8% 复制数据库文件 已完成 31% 已完成 100% [FATAL] 正在对命令行参数进行语法分析: 参数"silent&quo…

CLIP论文详细解析

论文链接&#xff1a;Learning Transferable Visual Models From Natural Language Supervision&#xff08;通过自然语言处理的监督信号&#xff0c;学习可迁移的视觉模型&#xff09;. 代码链接&#xff1a;CLIP. CLIP 摘要1.引言2.方法3.实验4.与人对比实验5.数据集去重6.L…

汽车远程启动程序APP的设计与实现(源码+文档+报告+任务书)

以 CAN (Controller Local Network&#xff0c;简称 CAN&#xff09;为基础的车辆遥控起动技术&#xff0c;通过将车辆的 PBD接口与车辆的 CAN总线相连&#xff0c;并与相应的控制系统相连&#xff0c;实现对车辆遥控启动。 此系统主要使用了Java、Android Studio、 MySQL数据…

Visual studio(VS)运行障碍指北

文章目录 VS: ....Microsoft.CppCommon.targets: error MSB6006: “CL.exe”已退出-VS2017许可证过期VS下Visual Assist X番茄插件安装失败子工程引用&#xff08;无法解析的外部符号&#xff09;无法打开.ui文件&#xff08;qt&#xff09;VS中qt子工程无法加载 VS: …Microso…

云原生应用交付平台 Orbit 主要功能与核心能力

GitOps GitOps 于 2017 年首创&#xff0c;是一种管理由 Kubernetes 提供支持的云原生系统的现代方式。它利用策略即代码方法来定义和管理现代应用程序堆栈的每一层——基础设施、网络、应用程序代码和 GitOps 管道本身。Orbit 基于 GitOps 方法理念提供以下能力&#xff1a; …

Revit中用楼板创建散水和批量成板

​一、Revit中用楼板创建散水 在Revit中用楼板来创建散水&#xff0c;散水&#xff1a;散水是指房屋外墙四周的勒脚处(室外地坪上)用片石砌筑或用混凝土浇筑的有一定坡度的散水坡。散水的作用是迅速排走勒脚附近的雨水&#xff0c;避免雨水冲刷或渗透到地基&#xff0c;防止基础…

三、云尚办公-角色管理前端

云尚办公系统&#xff1a;角色管理前端 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布&#xff0c;并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步&#xff01;&#xff01;&am…

2023-06-27-mimics,slicer软件将.nii.gz转为.ply格式

文章目录 一、前言二、步骤2.1.slicer将.nii.gz格式转为.dcm格式2.1.1导入.nii.gz文件2.1.2.可视化渲染2.1.3.新建一个segmentation2.1.4.添加到segmenation2.1.5.导出为.dcm文件 2.2.Mimics将.dicom导为.ply格式2.2.1.加载.dicom文件2.2.2.调thresholding2.2.3.calculate2.2.4…