当前位置: 首页 > article >正文

easyPOI生成的excel添加水印

项目场景:

需求要求生成的excel添加水印,这个还是第一次听到,于是研究了一下。


引入依赖

代码如下:

implementation ('cn.afterturn:easypoi-base:4.5.0') {
        exclude  group: 'com.google.guava', module: 'guava'
        exclude  group: 'org.apache.commons', module: 'commons-compress'
    }

    implementation ('org.apache.poi:ooxml-schemas:1.4')

排除的两个因为对代码没有影响,主要是因为有代码漏洞,排除掉就OK了,但是easy POI引入的apache POI并不全,导致无法添加水印,所以必须要引入org.apache.poi:ooxml-schemas:1.4


代码:

直接上代码了。

@Slf4j
public class ExcelWaterMarkUtil {
    private ExcelWaterMarkUtil() {}

    public static void excelWaterMark(Workbook workbook, String append, String username){
        ByteArrayOutputStream os = null;
        try {
            //生成水印图片并导出字节流
            BufferedImage image = createWatermarkImage(append,username);
            os = new ByteArrayOutputStream();
            ImageIO.write(image, "png", os);
            int pictureIdx = workbook.addPicture(os.toByteArray(), Workbook.PICTURE_TYPE_PNG);
            POIXMLDocumentPart poixmlDocumentPart = (POIXMLDocumentPart) workbook.getAllPictures().get(pictureIdx);
            //获取每个Sheet表并插入水印
            for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
                XSSFSheet sheet1 = (XSSFSheet) workbook.getSheetAt(i);
                PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();
                String relType = XSSFRelation.IMAGES.getRelation();
                //add relation from sheet to the picture data
                PackageRelationship pr = sheet1.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType, null);
                //set background picture to sheet
                sheet1.getCTWorksheet().addNewPicture().setId(pr.getId());
            }

        } catch (Exception e) {
            log.error("excel文件添加水印异常",e);
        }finally {
            if (os != null){
                try {
                    os.close();
                }catch (Exception e){
                    log.error("水印图片字节流关闭异常",e);
                }
            }
        }
    }

    private static BufferedImage createWatermarkImage(String append, String username) {

        Graphics2D g = null;
        try {
            Font font = new Font("microsoft-yahei", Font.PLAIN, 20);
            int width = 300, height = 170;
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            g = image.createGraphics();

            // 背景透明 结束
            g.setColor(Color.white);
            g.fillRect(0, 0, width , height);

            g.setColor(new Color(Integer.parseInt("C5CBCF", 16)));// 设定画笔颜色
            g.setFont(font);// 设置画笔字体
            g.shear(0.1, -0.20);// 设定倾斜度

            //        设置字体平滑
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            String[] textArray = new String[]{ "FRP - " + append, username };

            int y = 50;
            for (int i = 0; i < textArray.length; i++) {
                g.drawString(textArray[i], 0, y);// 画出字符串
                y = y + font.getSize();
            }

            g.drawString(LocalDateTime.now(ZoneId.of(CommonConstant.CHINA_ZONE)).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), 0, y);// 画出字符串
            return image;
        }finally {
            g.dispose();// 释放画笔
        }
    }

}

http://www.kler.cn/a/287277.html

相关文章:

  • 麒麟时间同步搭建chrony服务器
  • java基础知识全集(一篇看到爽)(持续更新中)
  • [Qt platform plugin问题] Could not load the Qt platform plugin “xcb“
  • java版询价采购系统 招投标询价竞标投标系统 招投标公告系统源码
  • 【计算机网络】水平触发与边缘触发有什么优缺点呢?
  • Linux的桌面
  • Spark MLlib模型训练—分类算法Multinomial Logistic Regression
  • 【生活英语】2、喜欢与讨厌
  • 四足机器人控制算法——建模、控制与实践(unitree_guide配置)
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • FreeRTOS中任务通知的使用
  • 两句话解决ChatGPT 502 Bad Gateway问题
  • 前后端分离项目遇到的跨域问题解决方案(后端为主)
  • uniapp按钮点击过快导致请求数据混乱
  • 【学习笔记】卫星通信NTN 3GPP标准化进展分析(五)- 3GPP Release19 研究计划
  • 一图打尽C++内存分区(分段)
  • 内核开发具有哪些特点?大致流程是怎样的?
  • <C++> 红黑树
  • golang make 函数的三个参数分别有什么作用
  • 峟思大坝安全监测系统:科技筑牢工程稳定的基石
  • TCP ISO/OSI模型
  • 开启ROS 2中的geometry坐标模拟展示
  • SQLi-LABS靶场56-60通过攻略
  • [Python]之深拷贝与浅拷贝
  • Flask之Hello world 详解
  • 【补-办公室】拟批语的区别