Java导出pdf格式文件
Java实现导出pdf |word |ppt 格式文件
controller层:
@ApiOperation("导出")@GetMapping("/download")public void download(@RequestParam("userId") Long userId ,HttpServletResponse response) {reportResultService.generateWordXWPFDocument(userId,response);}
serviceimpi层:
/*** 下载word* @param userId* @param response*/
// @Override
// public void generateWordXWPFDocument(Long userId,HttpServletResponse response) {
// try {
// XWPFDocument doc = new XWPFDocument();
// List<ReportDetail> ReportDetail = reportResultMapper.reportDetails(userId);
// createParagraph(doc, ReportDetail.get(0).getReport());
// response.reset();
// response.setContentType("application/octet-stream");
// response.setHeader("Content-disposition",
// "attachment;filename=user_word_" + System.currentTimeMillis() + ".docx");
// OutputStream os = response.getOutputStream();
// doc.write(os);
// os.close();
// } catch (Exception e) {
// e.printStackTrace();
// }
// }/*** 下载pdf* @param userId* @param response*/@Overridepublic void generateWordXWPFDocument(Long userId,HttpServletResponse response) {try {response.reset();response.setContentType("application/octet-stream");response.setHeader("Content-disposition", "attachment;filename=user_pdf_" + System.currentTimeMillis() + ".pdf");OutputStream os = response.getOutputStream();// documentcom.itextpdf.text.Document document = new com.itextpdf.text.Document(PageSize.A4);PdfWriter pdfWriter = PdfWriter.getInstance(document, os);// opendocument.open();List<ReportDetail> reportDetails = reportResultMapper.reportDetails(userId);if (!reportDetails.isEmpty()) {String report = reportDetails.get(0).getReport();document.add(createParagraph(report));}document.close();os.close();} catch (Exception e) {e.printStackTrace();}}/*** 下载word* @param doc* @param content*/private void createParagraph(XWPFDocument doc, String content) {XWPFParagraph actType = doc.createParagraph();XWPFRun runText2 = actType.createRun();runText2.setText(content);runText2.setFontSize(11);// 设置段落对齐方式actType.setAlignment(ParagraphAlignment.CENTER); // 居中对齐actType.setVerticalAlignment(TextAlignment.CENTER); // 垂直居中对齐}/*** 下载pdf* @param content* @return* @throws IOException* @throws DocumentException*/private com.itextpdf.text.Paragraph createParagraph(String content) throws IOException, DocumentException {Font font = new Font(getBaseFont(), 12, Font.NORMAL);Paragraph paragraph = new Paragraph(content, font);paragraph.setAlignment(Element.ALIGN_LEFT);paragraph.setIndentationLeft(12); //设置左缩进paragraph.setIndentationRight(12); //设置右缩进paragraph.setFirstLineIndent(24); //设置首行缩进paragraph.setLeading(20f); //行间距paragraph.setSpacingBefore(5f); //设置段落上空白paragraph.setSpacingAfter(10f); //设置段落下空白return paragraph;}private BaseFont getBaseFont() throws IOException, DocumentException {return BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);}
或者可以使用以下工具类实现
package com.zllms.common.utils.poi;import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;import java.io.IOException;
import java.util.List;
import java.util.Objects;/*** @Author: wangjj* @Date: 2020/11/4 15:53* @Description pdf生成工具类*/
@Slf4j
public class PdfCreateUtil {/*** @Author Yangy* @Description 创建document* @Date 16:24 2020/11/5* @Param []* @return com.itextpdf.text.Document**/public static Document getDocumentInstance(){//此处方法可以初始化document属性,document默认A4大小Document document = new Document();return document;}/*** @Author Yangy* @Description 设置document基本属性* @Date 16:24 2020/11/5* @Param [document]* @return com.itextpdf.text.Document**/public static Document setDocumentProperties(Document document,String title,String author,String subject,String keywords,String creator){// 标题document.addTitle(title);// 作者document.addAuthor(author);// 主题document.addSubject(subject);// 关键字document.addKeywords(keywords);// 创建者document.addCreator(creator);return document;}/*** @Author Yangy* @Description 创建段落,可设置段落通用格式* @Date 16:24 2020/11/5* @Param []* @return com.itextpdf.text.Paragraph**/public static Paragraph getParagraph(String content,Font fontStyle,int align,int lineIdent,float leading){//设置内容与字体样式Paragraph p = new Paragraph(content,fontStyle);//设置文字居中 0=靠左,1=居中,2=靠右p.setAlignment(align);//首行缩进p.setFirstLineIndent(lineIdent);//设置左缩进
// p.setIndentationLeft(12);//设置右缩进
// p.setIndentationRight(12);//行间距p.setLeading(leading);//设置段落上空白p.setSpacingBefore(5f);//设置段落下空白p.setSpacingAfter(10f);return p;}/*** @Author Yangy* @Description 获取图片* @Date 16:39 2020/11/5* @Param [imgUrl]* @return com.itextpdf.text.Image**/public static Image getImage(String imgUrl,int align,int percent){Image image = null;try {image = Image.getInstance(imgUrl);} catch (BadElementException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}//设置图片位置image.setAlignment(align);//依照比例缩放image.scalePercent(percent);return image;}/*** @Author Yangy* @Description 创建表格* @Date 16:43 2020/11/5* @Param [dataList=数据集合,maxWidth=表格最大宽度,align=位置(0,靠左 1,居中 2,靠右)* @return com.itextpdf.text.pdf.PdfPTable**/public static PdfPTable getTable(List<List<String>> dataList,int maxWidth,int align,Font font){if(Objects.isNull(dataList) || dataList.size() == 0){log.warn("data list is empty when create table");return null;}int columns = dataList.get(0).size();PdfPTable table = new PdfPTable(columns);table.setTotalWidth(maxWidth);table.setLockedWidth(true);table.setHorizontalAlignment(align);//设置列边框table.getDefaultCell().setBorder(1);//此处可自定义表的每列宽度比例,但需要对应列数
// int width[] = {10,45,45};//设置每列宽度比例
// table.setWidths(width);table.setHorizontalAlignment(Element.ALIGN_CENTER);//居中//边距:单元格的边线与单元格内容的边距table.setPaddingTop(1f);//间距:单元格与单元格之间的距离table.setSpacingBefore(0);table.setSpacingAfter(0);for (int i = 0; i < dataList.size(); i++) {for (int j = 0; j < dataList.get(i).size(); j++) {table.addCell(createCell(dataList.get(i).get(j),font));}}return table;}/*** @Author Yangy* @Description 自定义表格列样式属性* @Date 16:54 2020/11/5* @Param [value, font]* @return com.itextpdf.text.pdf.PdfPCell**/private static PdfPCell createCell(String value, Font font) {PdfPCell cell = new PdfPCell();//设置列纵向位置,居中cell.setVerticalAlignment(Element.ALIGN_MIDDLE);//设置列横向位置,居中cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setPhrase(new Phrase(value, font));return cell;}/*** @Author Yangy* @Description 获取自定义字体* @Date 11:38 2020/11/6* @Param [size=字大小, style=字风格, fontFamily=字体, color=颜色]* @return com.itextpdf.text.Font**/public static Font setFont(float size, int style, String fontFamily, BaseColor color)throws IOException, DocumentException {//设置中文可用BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);Font font = new Font(bfChinese,size,style);font.setFamily(fontFamily);font.setColor(color);return font;}/*** @Author Yangy* @Description 创建水印设置* @Date 12:04 2020/11/6* @Param [markContent]* @return xxx.xxx.data.util.PdfCreateUtil.Watermark**/public static Watermark createWaterMark(String markContent) throws IOException, DocumentException {return new Watermark(markContent);}/*** @Author Yangy* @Description 设置水印* @Date 12:03 2020/11/6* @Param* @return**/public static class Watermark extends PdfPageEventHelper {Font FONT = PdfCreateUtil.setFont(30f, Font.BOLD, "",new GrayColor(0.95f));private String waterCont;//水印内容public Watermark() throws IOException, DocumentException {}public Watermark(String waterCont) throws IOException, DocumentException {this.waterCont = waterCont;}@Overridepublic void onEndPage(PdfWriter writer, Document document) {for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++) {ColumnText.showTextAligned(writer.getDirectContentUnder(),Element.ALIGN_CENTER,new Phrase(StringUtils.isEmpty(this.waterCont) ? "" : this.waterCont, FONT),(50.5f + i * 350),(40.0f + j * 150),writer.getPageNumber() % 2 == 1 ? 45 : -45);}}}}public static HeaderFooter createHeaderFooter(){return new HeaderFooter();}/*** @Author Yangy* @Description 页眉/页脚* @Date 12:25 2020/11/6* @Param* @return**/public static class HeaderFooter extends PdfPageEventHelper {// 总页数PdfTemplate totalPage;Font hfFont;{try {hfFont = setFont(8, Font.NORMAL,"",BaseColor.BLACK);} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}// 打开文档时,创建一个总页数的模版@Overridepublic void onOpenDocument(PdfWriter writer, Document document) {PdfContentByte cb =writer.getDirectContent();totalPage = cb.createTemplate(30, 16);}// 一页加载完成触发,写入页眉和页脚@Overridepublic void onEndPage(PdfWriter writer, Document document) {PdfPTable table = new PdfPTable(3);try {table.setTotalWidth(PageSize.A4.getWidth() - 100);table.setWidths(new int[] { 24, 24, 3});table.setLockedWidth(true);table.getDefaultCell().setFixedHeight(-10);table.getDefaultCell().setBorder(Rectangle.BOTTOM);table.addCell(new Paragraph("我是页眉/页脚", hfFont));table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);table.addCell(new Paragraph("第" + writer.getPageNumber() + "页/", hfFont));// 总页数PdfPCell cell = new PdfPCell(Image.getInstance(totalPage));cell.setBorder(Rectangle.BOTTOM);table.addCell(cell);// 将页眉写到document中,位置可以指定,指定到下面就是页脚table.writeSelectedRows(0, -1, 50,PageSize.A4.getHeight() - 20, writer.getDirectContent());} catch (Exception de) {throw new ExceptionConverter(de);}}// 全部完成后,将总页数的pdf模版写到指定位置@Overridepublic void onCloseDocument(PdfWriter writer,Document document) {String text = "总" + (writer.getPageNumber()) + "页";ColumnText.showTextAligned(totalPage, Element.ALIGN_LEFT, new Paragraph(text,hfFont), 2, 2, 0);}}}
相关文章:
Java导出pdf格式文件
Java实现导出pdf |word |ppt 格式文件 controller层: ApiOperation("导出")GetMapping("/download")public void download(RequestParam("userId") Long userId ,HttpServletResponse response) {reportResul…...

Socket、UDP、TCP协议和简单实现基于UDP的客户端服务端
目录 Socket TCP和UDP区别 UDP:无连接,不可靠传输,面向数据报,全双工 TCP:有连接,可靠传输,面向字节流,全双工 无连接和有连接 可靠传输和不可靠传输 面向数据报和面向字节流…...

发布订阅模式:观察者模式的一种变体
发布-订阅模型(Publish-Subscribe Model)的底层机制通常基于观察者模式。 发布-订阅模型是观察者模式的一种变体。 在观察者模式中,主题(或被观察者)维护了一组观察者,当主题的状态发生变化时,…...

TiDB离线部署、Tiup部署TiDB
先做tidb准备工作: 部署 TiDB 前的环境检查操作:TiDB 环境与系统配置检查 | PingCAP 文档中心 1.查看数据盘 fdisk -l (2,3)本人的分区已经是 ext4 文件系统不用分区,具体官方文档的分区: 4.查看数据盘…...
10GBase-T万兆电口模块助力数据中心实现高效数据传输
10GBase-T万兆电口模块一种高速、高效的网络连接解决方案,具有快速传输速度和稳定可靠的特点。它可以在数据中心中广泛应用,提供出色的网络性能和可扩展性,为数据中心的发展做出了重要的贡献。 一、10GBase-T万兆电口模块的特点与优势 高速传…...
使用Docker中部署GitLab 避坑指南
在容器化的世界中,Docker已经成为了我们部署和管理应用程序的首选工具。然而,在使用Docker部署GitLab时,我们可能会遇到一些问题,本文将为你提供一份详细的避坑指南。网上的教程有的都没说清楚,或者干脆是错的。摸索了…...

我的NPI项目之设备系统启动(八) -- Android14的GKI2.0开发步骤和注意事项
GKI是什么? Google为什么要推行GKI? GKI全称General Kernel Image。GKI在framework和kernel之间提供了标准接口,使得android OS能够轻松适配/维护/兼容不同的设备和linux kernel。 Google引入GKI的目的是将Framework和Kernel进一步的解耦。因…...

鼠标右键助手专业版 MouseBoost PRO for Mac v3.3.6中文破解
MouseBoost Pro mac版是一款简单实用的鼠标右键助手专业版,MouseBoost Pro for Mac只要轻点你的鼠标右键,就可以激活你想要的各种功能,让你的工作效率大幅度提高,非常好用。 软件下载:MouseBoost PRO for Mac v3.3.6中…...
React学习计划-react-hooks补充
React Hooks 1. 使用hooks理由 高阶组件为了复用,导致代码层级复杂生命周期的复杂 2. useState(保存组件状态) const [state, setstate] useState(initialState)3. useEffect(处理副作用)和useLayoutEffect(同步执行副作用) 使用方式: useEffect(…...

KTV点歌系统vue+springboot音乐歌曲播放器系统
目前现有的KTV点歌系统对于用户而言其在线点歌流程仍然过于繁琐,对于歌曲而言其系统安全性并不能保障。同时整套系统所使用的技术相对较为落后,界面不能动态化展示。相比较于其它同类型网站而言不能体现技术先进性。 1.2 项目目标 KTV点歌系统的后台开发…...

vue video 多个视频切换后视频不显示的解决方法
先说一下我这边的需求是视频需要轮播,一个人员有多个视频,左右轮播是轮播某个人员下的视频,上下切换是切换人员。 vue 代码 <el-carouselindicator-position"none"ref"carousel"arrow"always":interval&qu…...
多态与代码屎山
到底什么是多态呢?多态是面向未来的,比如企业采购为例: 一般分为线上合线下两种, 我们设计一个父类叫做"采购", 里面做一些共通的处理: 申请, 承认, 支付, 购买方式. 然后让各自的子类(线上,线下)实现自己的方法.实际调用过程中传入不同的对象就可以.到此为止项目开…...

Git基本操作(2)
Git基本操作(2) 上交文件之后,git文件的变化git cat-file HEAD指针里面有啥文件被修改git statusgit diff 文件名 版本回退(git reset)撤销回退git reflog 撤销的三种情况还没有addgit checkout -- [file] 已经add还没…...
编程笔记 Golang基础 023 切片
编程笔记 Golang基础 023 切片 一、切片二、定义与初始化三、基本操作四、示例 Go语言中的切片(slices)是基于数组的抽象数据类型,它提供了一种灵活的方式来处理可变长度的数据序列。切片本身不存储任何数据,而是指向底层数组的一…...

qt 软件发布(Windows)
1. 开发环境 QtCreator MSVC编译器 2. 源码编译 生成release或者debug版本的exe可执行文件(x64或x86) 3. windeployqt 打包 ①左下角开始菜单栏找到QT的命令交互对话框,如下图MSVC 2017 64-bit(根据第二步编译的类型选择64位或者32位)。 ②cd 切换到第二步可…...

《汇编语言》- 读书笔记 - 第11章-标志寄存器
《汇编语言》- 读书笔记 - 第11章-标志寄存器 标志寄存器指令与标志位关系11.1 ZF(Zero Flag,零标志位)11.2 PF(Parity Flag,奇偶标志位)11.3 SF(Sign Flag,符号标志位)处…...

1.QT简介(介绍、安装,项目创建等)
1. QT介绍 Qt(官方发音 [kju:t])是一个跨平台的C开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序 Qt 是纯 C 开发的,正常情况下需要先学习C语言、然后在学习C然后才能使用…...

【服务器】服务器推荐
一、引言 在数字世界的浪潮中,服务器作为数据存储和处理的基石,其重要性不言而喻。而在这个繁星点点的市场中,雨云以其独特的优势和超高的性价比,逐渐成为众多企业和个人的首选。今天,就让我带你走进雨云的世界&#…...

信号系统之线性图像处理
1 卷积 图像卷积的工作原理与一维卷积相同。例如,图像可以被视为脉冲的总和,即缩放和移位的delta函数。同样,线性系统的特征在于它们如何响应脉冲。也就是说,通过它们的脉冲响应。系统的输出图像等于输入图像与系统脉冲响应的卷积…...

uniapp腾讯地图JavaScript Api,H5端和原生APP端可用
因项目需要,在uniapp中集成使用腾讯地图,为了方便维护,希望通过一套代码实现H5和APP同时可用。H5显示相对简单,APP端比较麻烦,记录下实现过程 一、集成步骤 1.使用 renderjs script标签使用renderjs,因为…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...