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 xxxString originFileName = srcFile.getOriginalFilename();// 获取原图片后缀 pngint 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 上传图片 / 文件添加水印(png/jpg/pdf)相关推荐

  1. java给文件添加水印_Java在PDF中添加水印(文本/图片水印)

    水印是一种十分常用的防伪手段,常用于各种文档.资料等.常见的水印,包括文字类型的水印.图片或logo类型的水印.以下Java示例,将分别使用insertTextWatermark(PdfPageBas ...

  2. java上传图片文件

    总的说图片上传有两种方式,一种是把图片文件写到数据库中,另一种是存到服务器文件目录中.写到数据库中的图片文件需要转换成二进制流的格式,占用数据库空间比较,适合少量图片的存储,比如说,系统中某些小图标, ...

  3. java上传图片 文件损坏_Java Servlet图像上传损坏(灰色底部)

    我们有一个接受图像上传的servlet.有时,当上传源于我们的iPhone客户端(脆弱的连接)时,保存的图像可能会部分或完全变灰.我怀疑这是由于连接过早终止,servlet最终处理的是不完整的图像. ...

  4. Java实现对PDF文件添加水印

    Java实现对PDF文件添加水印 目录 Java实现对PDF文件添加水印 导入依赖 工具方法 效果 最近项目中遇到对PDF添加水印,实现有多种,采取的是itextpdf 导入依赖 <!-- 对P ...

  5. 使用Java将Word文档转PDF

    使用Java将Word文档转PDF 首先新建 Maven 工程,然后再 src 同级下新建 lib 文件夹 下载 aspose-words-15.8.0-jdk16.jar 包,下载地址如下 链接:h ...

  6. java pdf水印排布问题_Java实现pdf文件添加水印,铺满全页。

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/duan1309/article/details/81232300 因项目需要将word文件(.doc ...

  7. Java实现pdf文件添加水印,铺满全页。

    因项目需要将word文件(.doc,.docx,.rtf)转换成pdf文件并添加水印,铺满全页. 现就将为pdf文件添加水印提取出来,word文件转换成pdf文件,网上的教程很多,如需需要联系我即可. ...

  8. itex将html转成pdf加水印,itext操作PDF文件添加水印

    功能描述:添加图片和文字水印 /** * * [功能描述:添加图片和文字水印] [功能详细描述:功能详细描述] * @param srcFile 待加水印文件 * @param destFile 加水 ...

  9. 给pdf、word、excel文件添加水印

    今天公司让给pdf.word.excel文件添加水印, 在网上导了一堆,最后总结了一下方法. /**  * @author CArom_XUE    2021-03-18  *  * TODO 生成文 ...

最新文章

  1. 航电 2041 超级楼梯
  2. 2017计算机基础教学大纲,2017级大学计算机基础教学大纲设计.doc
  3. ionic更改端口号
  4. php模板引擎循环start,PHP模板引擎Smarty内建函数section,sectionelse用法详解
  5. LeetCode-151 Reverse Worlds in a String
  6. Linux网络编程——原始套接字编程
  7. linux分区用来支持虚拟内存,Linux分区方案
  8. mysql安装包的下载
  9. Uipath打包流程为.nupkg文件
  10. 认知无线电的能量检测
  11. 方法重写与方法重载的区别
  12. 计算机驱动有必要更新,电脑各硬件驱动程序是否越新越好?需要经常更新驱动程序吗?...
  13. java 运行时获取泛型真实类型
  14. matlab滤波器滤除低频直流信号,对低频信号的滤波的方法
  15. OpenNI:深度图显示方法
  16. 90后魔术师李孟孟受邀参加中国圈子联合会活动
  17. httpClient post对长参数接口的测试
  18. 探秘SLAM之RANSAC算法
  19. matlab读jpg有三个通道,图像为“灰度图像”
  20. macd的python代码同花顺_同花顺定量结构MACD指标公式(图文)

热门文章

  1. 纸牌游戏十点半c语言,纸牌游戏十点半之Excel版
  2. 【干货】2019年最新高级前端视频教程,速度收藏!!
  3. 书到用时方恨少? 整理了一份初中、高中数学教材pdf 百度云
  4. Mantel test: 两个矩阵相关关系的检验
  5. 洛谷 P4094 [HEOI2016/TJOI2016]字符串 后缀数组+二分+主席树
  6. 咸鱼前端—CSS盒子模型
  7. IG541与七氟丙烷灭火系统到底有什么不一样呢?
  8. 护理和计算机哪个专业好,护理专业考研的就业前景和方向
  9. 快速搞定开源框架Flowable
  10. 在GATE中用ICTCLAS处理多个文档