springboot为导出的pdf和excel加水印
相信很多小伙伴们在做导出pdf或者excel文件时会被要求在文件上加上水印,本篇博客就来讲讲如何为pdf和excel加水印。
导出pdf加水印
其实在导出pdf时加上水印并不难,因为itext提供了添加水印的方法,而且能设置水印的位置角度等等,直接来看一下代码
public void createPDF(String filename) throws IOException {
Document document = new Document(PageSize.A4);
try {
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
document.addTitle("example of PDF");
document.open();
PdfPTable table = createTable(writer);
document.add(table);
// 加入水印
PdfContentByte waterMar = writer.getDirectContentUnder();
// 开始设置水印
waterMar.beginText();
// 设置水印透明度
PdfGState gs = new PdfGState();
// 设置填充字体不透明度为0.2f
gs.setFillOpacity(0.2f);
// 设置水印字体参数及大小 (这里在上一篇博客中已经讲过了)
BaseFont baseFont = BaseFont.createFont(JavaPdfHelloWorld.class.getResource("/simsun.ttf").getPath(), BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
waterMar.setFontAndSize(baseFont,);
// 设置透明度
waterMar.setGState(gs);
// 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
waterMar.showTextAligned(Element.ALIGN_RIGHT, "我是水印" , , , );
//结束设置
waterMar.endText();
waterMar.stroke();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} finally {
document.close();
}
}

createTable()方法的代码就不贴了,就是生成一个pdf表格,这在之前的博客中已经提过了。
导出excel加水印
接下来我们着重看一下excel文件怎么加水印,现在业界对excel文件读写大多采用poi这个东西,而poi没有提供添加水印的方法,所以要怎么办呢,我在网上搜索了好久也没找到能直接拿来用的办法,但是看到有人提供思路,先准备一份打了水印的模版Excel,然后加载该模版,再将内容输出到该模版中,以达到为Excel添加水印的目的。这个思路看起来的确可行,然后就开干了,先看代码
public class ExcelUtilTest{
public void createExcel(HttpServletResponse response)throws Exception {
//获取excel文件
File finalXlsxFile = new File("src/main/resources/watermark.xlsx");
//获取excel文件流
FileInputStream inputStream = new FileInputStream(finalXlsxFile);
//根据文件流创建XSSFWorkbook对象
XSSFWorkbook wb = new XSSFWorkbook(inputStream);
XSSFSheet sheet = wb.getSheetAt(0);
sheet.setDefaultColumnWidth(16);//设置默认列宽
sheet.setDefaultRowHeightInPoints(20);//设置默认行高
for(int j = 0;j < 5;j++) {
XSSFRow row = sheet.createRow(j);
for(int i = 0;i<5;i++) {
XSSFCell cell=row.createCell(i);
cell.setCellValue("第"+j+"行第"+i+"列");
}
}
//输出Excel文件
OutputStream output= response.getOutputStream();
response.reset();
String fileName = "水印测试文件";
response.setHeader("Content-Disposition",
"attachment; filename=" +new String(fileName.getBytes("UTF-8"), "iso-8859-1")+".xlsx");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
wb.write(output);
output.close();
}
}
这个代码换一下文件地址可以直接拿来用,值得注意的是这是用springboot以附件形式导出的,不是用java程序生成的,也就是说我还有一个controller文件,只是没贴出来。
和我们直接生成excel文件代码有所不同的是下面两句代码,如果是直接生成excel文件这构造方法参数是空的,然后getSheetAt()方法改为createSheet()方法即可
XSSFWorkbook wb = new XSSFWorkbook(inputStream);
XSSFSheet sheet = wb.getSheetAt(0);
至于如何设计excel文件上的水印这个网上教程很多,随便找一个来看就行,我就不赘述了,看一下效果如何

这是原始excel

这是生成后的excel
如果要将其打包部署的话,不能直接根据文件来获取inputStream,需要将代码改一改,将最上面两句代码改成springboot提供的获取类路径下文件流的方法,然后文件文件要放在类路径下。当然,这个在打包所有需要通过文件路径来获取文件的springboot项目情况都适用。
InputStream finalXlsxFile = new ClassPathResource("watermark.xlsx").getInputStream();
总结
相对pdf生成水印的方法,excel这个方法还是有很多不足之处的,比如生成水印的位置不能通过代码更改,如果有多个sheet不能全都加上去(除非事先知道有几个sheet),生成后的excel中的水印可以随意拖动位置(这个貌似可以改进)。总之这份代码是非常简陋的,只能解决最简单的为导出excel文件加水印的需求。
springboot为导出的pdf和excel加水印的更多相关文章
- [转]为ReportViewer导出的PDF文档加上水印
接到一個頗富挑戰性的需求,Reporting Service或RDLC報表可匯出成Excel.PDF等檔案格式,對一般麻瓜型使用者而言,PDF唯讀,Excel則可修改,業務單位希望在拿到報表紙本時加以 ...
- C# 操作Excel加水印
首先下载免费版的Excel组件- Spire.XLS,安装完成后在bin目录里面有需要用到的dll文件,引用到自己项目里面. 我这里全引进来了,一共就四个: 界面 效果 全部代码 private st ...
- Java使用POI为Excel打水印,调整列宽并设置Excel只读(用户不可编辑)
本文介绍在Java语言环境下,使用POI为Excel打水印的解决方案,具体的代码编写以及相关的注意事项. 需求描述: 要求通过系统下载的Excel都带上公司的水印,列宽调整为合适的宽度,并且设置为不可 ...
- Java给图片和PDF文件添加水印(图片水印和文字水印)
有时候我们看到的图片或者PDF文件会自动加上水印.分为文字水印和图片水印. ----------------------------图片水印---------------------------- 1 ...
- phpExcel常用方法详解【附有php导出excel加超级链接】
phpExcel常用方法详解[附有php导出excel加超级链接] 发表于4年前(-- :) 阅读() | 评论() 0人收藏此文章, 我要收藏 赞0 http://www.codeplex.com/ ...
- 手把手教你springboot中导出数据到excel中
手把手教你springboot中导出数据到excel中 问题来源: 前一段时间公司的项目有个导出数据的需求,要求能够实现全部导出也可以多选批量导出(虽然不是我负责的,我自己研究了研究),我们的项目是x ...
- Ireport 报表导出 Poi + ireport 导出pdf, word ,excel ,htm
Ireport 报表导出 Poi + ireport 导出pdf, doc ,excel ,html 格式 下面是报表导出工具类reportExportUtils 需要导出以上格式的报表 只需要调用本 ...
- Java实现PDF和Excel生成和数据动态插入以及导出
一.序言 Excel.PDF的导出.导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便记个笔记以防下次遇到相同的问题而束手无策. 公司有这么两个需求: 需求一.给了一个表单,让把 ...
- SpringBoot集成文件 - 集成POI之Excel导入导出
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能.本文主要介绍通过Spr ...
随机推荐
- Java多线程父子线程关系 多线程中篇(六)
有的时候对于Java多线程,我们会听到“父线程.子线程”的概念. 严格的说,Java中不存在实质上的父子关系 没有方法可以获取一个线程的父线程,也没有方法可以获取一个线程所有的子线程 子线程的消亡与父 ...
- springmvc 项目完整示例07 设置配置整合springmvc springmvc所需jar包springmvc web.xml文件配置
前面主要是后台代码,spring以及mybatis的整合 下面主要是springmvc用来处理请求转发,展现层的处理 之前所有做到的,完成了后台,业务层和持久层的开发完成了 接下来就是展现层了 有很多 ...
- SSH连接GitHub并配置ssh key
SSH连接GitHub并配置ssh key 配置git的ssh提交,主要需要以下三步: 1.设置Git的user name和email 2.生成ssh 3.配置git 的ssh key 一.设置Git ...
- Electron 创建一个空白的界面
添加应用 首先添加一个Lorikeet版本的Electron应用. 'use strict' const electron = require('electron'); const app = ele ...
- 36.QT-解决无边框界面拖动卡屏问题(附带源码)
1.简介 看到很多才学QT的人都会问为啥无边框拖动为啥会花屏? 那是因为你每次拖动的过程中都一直在调用move()函数让QT重新绘制界面,如果资源过大,就会导致当前图形还未绘制完,便又重新改变坐标了, ...
- Android项目刮刮奖详解(三)
Android项目刮刮奖详解(二) 前言 上一期我们已经实现了一个简易的刮刮卡功能,这一期我们来将其完善一下 目标 将刮刮奖的宽高改为合适高度 将刮刮奖位置居中 将信息层的图片换成文字(重点) 实现 ...
- vue 常用语法糖
//来自 https://www.cnblogs.com/lhl66/p/8021730.html 侵删 el:element 需要获取的元素,一定是HTML中的根容器元素 data:用于数据的存储 ...
- js 递归修改json无限级key值
var tree = [ { name: 'node1' }, { name: 'node2', children: [{ name: 'node-2-1' }, { name: 'node2-2' ...
- android找不到aar包
转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/9939663.html 在做项目的时候引入aar包,编译的时候却提示错误(这个错误大概说的是...... ...
- ASP.NET Zero--前端应用程序
前端应用程序 ASP.NET Zero包含可以作为您的公共网站或应用程序着陆页的起点的前端页面.首次运行项目时,您会看到主页如下所示: 这里有两页:主页和关于.这些页面的内容只是占位符和演示目的.您可 ...