100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > java 上传图片 / 文件添加水印(png/jpg/pdf)

java 上传图片 / 文件添加水印(png/jpg/pdf)

时间:2019-05-16 08:08:33

相关推荐

java 上传图片 / 文件添加水印(png/jpg/pdf)

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

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

png/jpg加图片水印

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

import java.util.regex.Matcher;import java.util.regex.Pattern;/*** @Auther GXH* @Data /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 = pile(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 = pile(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 mons.fileupload.FileItem;import mons.fileupload.FileItemFactory;import mons.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.monsMultipartFile;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可直接私信

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。