IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java 上传图片 / 文件添加水印(png/jpg/pdf) -> 正文阅读

[Java知识库]java 上传图片 / 文件添加水印(png/jpg/pdf)

作者:recommend-item-box type_blog clearfix

png/jpg/pdf文件上传时添加水印

最近在公司遇到了一个还算是比较复杂的业务吧,因为这个业务是给png格式;jpg格式;还有pdf格式的文件添加水印,其实图片格式的文件用java做水印还是比较好做的,但是pdf的做起来很麻烦为了做这个业务也是呕心沥血啊,好了我们直接看代码吧.

png/jpg加图片水印

首先我们得判断文件格式这边是我自己写的一个判断图片格式的util 希望各位能够采纳

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Auther GXH
 * @Data 2022/6/2 14:38
 */
public class StringUtils {

    private final static String reg = ".+(.JPEG|.jpg|.jpeg|.JPG|.png|.PNG)$";

    private final static String PDF = ".+(.PDF|.pdf)$";

    /**
     * 判断是否是png/jpg格式
    */
    public static boolean isImg (String fileName){
        boolean isNull = nonEmpty(fileName);
        if (isNull) {
            Matcher matcher = Pattern.compile(reg).matcher(fileName);
            if (!matcher.find()) {
                return false;
            }
            return true;
        }
        return false;
    }

    /**
     * 判断是否是pdf格式
    */
    public static boolean pdf (String fileName){
        boolean isNull = nonEmpty(fileName);
        if (isNull) {
            Matcher matcher = Pattern.compile(PDF).matcher(fileName);
            if (!matcher.find()) {
                return false;
            }
            return true;
        }
        return false;
    }

    private static boolean nonEmpty(String str){
        if (null == str || "".equals(str) || str.length() == 0){
            return false;
        }
        return true;
    }

}

下面是给png/jpg加水印,当然了这个导入和导出都是MultipartFile,如果有其他需求可以自己自定义

// 水印横向位置
    private static int positionWidth;
    // 水印纵向位置
    private static int positionHeight;


    /**
     * 给图片添加水印图片、可设置水印图片旋转角度
     * @Param iconPath 水印在服务器或者本地的位置
     * @param srcFile 要添加的水印的文件 可以配合上面的代码一起使用
     * @param degree 水印图片旋转角度 可以不写直接给null  看个人需求
     */
    public static MultipartFile markImageByIcon(String iconPath, MultipartFile srcFile, Integer degree) {
        InputStream is = null;
        OutputStream os = null;
        try {
            InputStream inputImg = srcFile.getInputStream();
            Image srcImg = ImageIO.read(inputImg);
            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null),
                    BufferedImage.TYPE_INT_RGB);
            // 1、得到画笔对象
            Graphics2D g = buffImg.createGraphics();
            // 2、设置对线段的锯齿状边缘处理
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
            // 3、设置水印旋转
            if (null != degree) {
                g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
            }
            // 4、水印图片的路径 水印图片一般为gif或者png的,这样可设置透明度
            ImageIcon imgIcon = new ImageIcon(iconPath);
            // 5、得到Image对象。
            Image img = imgIcon.getImage();
            positionWidth = Math.max(srcImg.getWidth(null) - imgIcon.getIconWidth(), 0);
            positionHeight = Math.max(srcImg.getHeight(null) - imgIcon.getIconHeight(), 0);
            g.drawImage(img, positionWidth, positionHeight, null);
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
            // 7、释放资源
            g.dispose();
            // 8、生成图片
            // 获取图片文件名 xxx.png xxx
            String originFileName = srcFile.getOriginalFilename();
            // 获取原图片后缀 png
            int lastSplit = originFileName.lastIndexOf(".");
            String suffix = originFileName.substring(lastSplit + 1);
            // 获取图片原始信息
            String dOriginFileName = srcFile.getOriginalFilename();
            String dContentType = srcFile.getContentType();
            ByteArrayOutputStream bs = new ByteArrayOutputStream();
            ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);
            ImageIO.write(buffImg, suffix, imOut);
            is = new ByteArrayInputStream(bs.toByteArray());
            // 加水印后的文件上传
            srcFile = new MockMultipartFile(dOriginFileName, dOriginFileName, dContentType,
                    is);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != is)
                    is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (null != os)
                    os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return srcFile;
    }

下面是pdf加水印

首先这个比较复杂,因为这个是文件的格式,而且要加水印给每页都得加,就得得到总页数,所需我们需要用到一个工具jar “aspose” 在你的pom文件中引入下面这个坐标

<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-pdf<artifactI>
    <version>17.3.0</version>
</dependency>

然后再将jar包放到你的本地磁盘下,随便一个目录jar在最后

然后执行这个命令,当然了一定要配置mvn命令,没有配置maven环境变量的同学可以自己配置下
注: “F:\jars_aaa” 可以改成自己的磁盘位置


mvn install:install-file -Dfile="F:\jars_aaa\aspose.pdf-17.3.0.jar" -DgroupId=com.aspose -DartifactId=aspose-pdf -Dversion=17.3.0 -Dpackaging=jar

然后就可以开心的敲代码,我这边传入的文件和return的文件都是MultipartFile类型,你们可以自己更改


    /**
     * 缓存区路径 这个路径可以改成自己的
     */
    private static String CACHE_PATH = "E:/cache/";


/***
     * pdf加文字水印
     * @param srcPdf 要添加水印的源文件
     * @param path 水印的位置
     * @return
     * @throws IOException
     */
    public static MultipartFile addWatermark(MultipartFile srcPdf,String path){
        byte [] byteArr= new byte[0];
        try {
            byteArr = srcPdf.getBytes();
            InputStream inputStream = new ByteArrayInputStream(byteArr);
            Document pdfDocument = new Document(inputStream);
            //还可以设置文字水印,
            // TextStamp textStamp = new TextStamp("水印");
            // textStamp.setHeight();
            // textStamp.setWidth();
            //设置png格式的水印
            ImageStamp imageStamp = new ImageStamp(path);
            //设置水印背景的宽高,还有透明度
            imageStamp.setHeight(60);
            imageStamp.setWidth(120);
            imageStamp.setOpacity(0.5);
            //设置右下角
            imageStamp.setXIndent(470.0F);

            PageCollection pages = pdfDocument.getPages();
            int size = pages.size();
            for (int i = 1; i <= size; i++) {
                imageStamp.setRightMargin(-100.0F);
                pages.get_Item(i).addStamp(imageStamp); //设置图片水印
                //pages.get_Item(i).addStamp(textStamp);  //文字水印
            }
            //设置缓存区
            pdfDocument.save(CACHE_PATH + srcPdf.getOriginalFilename());
            //读取缓存区的文件
            srcPdf = fileToMultipart(CACHE_PATH + srcPdf.getOriginalFilename());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return srcPdf;
    }

    public static MultipartFile fileToMultipart(String path){
        File file = new File(path);
        //无参构造,文件大小最大值便是默认值10kb,超过10Kb便会通过生成临时文件转化不占用内存
        FileItemFactory factory = new DiskFileItemFactory();
        FileItem item = factory.createItem("textField", "text/plain", true, file.getName());
        int bytesRead;
        byte[] buffer = new byte[LENGTH];
        try (FileInputStream fis = new FileInputStream(file);
             OutputStream os = item.getOutputStream()) {
            while ((bytesRead = fis.read(buffer, 0, LENGTH)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            System.out.println("文件转化失败, fileUrl: "+ file.getName());
            System.out.println("e: "+e);
            return null;
        }finally {
            //操作完删除缓存区文件
            file.delete();
        }
        return new CommonsMultipartFile(item);
    }

再给大家贴一下import吧

import com.aspose.pdf.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import javax.swing.*;
import java.awt.*;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.*;
import static org.apache.poi.hpsf.ClassID.LENGTH;

好了今天就到这儿,如果需要jar可直接私信

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-14 22:21:09  更:2022-06-14 22:24:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 18:31:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码