暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Java实现PDF水印添加教程,让你的文档更保密!

猿人刘先生 2023-11-10
137

每日一读

    人生就像一本书,每一天都是其中的一页。我们可以选择用积极的态度去书写自己的故事,也可以选择被消极的情绪所困扰。无论遇到什么困难和挑战,都要相信自己的能力,坚持不懈地追求自己的梦想。每一天都是一个新的开始,让我们用心去阅读生活的每一页,珍惜每一个机会,创造属于自己的精彩篇章。

前言

    在互联网时代,PDF文档已成为人们常用的文件格式之一。然而,由于PDF文件的易于复制和分享特性,我们经常会面临文档泄露和盗用的风险。为了保护PDF文档的安全性和保密性,给文档添加水印成为了一种常见的做法。今天,我将为大家介绍如何使用Java技术实现PDF水印添加,让你的文档更具价值和安全性。

正文

依赖导入

maven版本:3.5.3

Springboot版本:2.6.8

一、导入jar包

在Springboot项目中导入除其它必须的依赖之外的两个依赖包

    <!-- 文件水印添加 -->
    <dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13</version>
    </dependency>
    <dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
    </dependency>

    二、图片水印工具类

    该工具类主要是生成带有水印的背景图片:

      package com.liuxs.fusionx.utils;


      import java.awt.*;
      import java.awt.image.BufferedImage;


      /**
      * @author: Liu Yuehui
      * @ClassName: ImageUtil
      * @date: 2023/11/9 15:10
      * @description: 创建水印图片
      * @version:v1:2023/11/9 15:10:
      **/
      public class ImageUtil {


      /**
      * 生成背景透明的文字水印图片,文字位于中央,且倾斜
      * @param content 水印文字
      * @return
      */
      public static BufferedImage createWaterMark(String content) {
      //生成图片宽度
      int width = 250;
      //生成图片高度
      int heigth = 160;
      //获取bufferedImage对象
      BufferedImage image = new BufferedImage(width, heigth, BufferedImage.TYPE_INT_RGB);
      //得到画笔对象
      Graphics2D g2d = image.createGraphics();
      //使得背景透明
      image = g2d.getDeviceConfiguration().createCompatibleImage(width, heigth, Transparency.TRANSLUCENT);
      g2d.dispose();
      g2d = image.createGraphics();
      //设置对线段的锯齿状边缘处理
      g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
      //设置水印旋转,倾斜度
      g2d.rotate(-0.5, (double) image.getWidth()/2, (double) image.getHeight()/2);
      //设置颜色,这是黑色,第4个参数是透明度
      g2d.setColor(new Color(0, 0, 0, 20));
      //设置字体
      Font font = new Font("宋体", Font.ROMAN_BASELINE, 22);
      g2d.setFont(font);
      float fontSize = font.getSize();
      //计算绘图偏移x、y,使得使得水印文字在图片中居中
      float x = 0.5f * fontSize;
      float y = 0.5f * heigth + x;
      //取绘制的字串宽度、高度中间点进行偏移,使得文字在图片坐标中居中
      g2d.drawString(content, x, y);
      //释放资源
      g2d.dispose();
      return image;
      }
      }


      三、测试

            public static void main(String[] args) {
        BufferedImage bi = createWaterMark("猿人刘先生");
        try {
        ImageIO.write(bi, "png", new File("E:\\waterMark.png")); //写入文件
        } catch (IOException ioException) {
        ioException.printStackTrace();
        }
        }

        四、效果图

        五、PDF工具类

        该工具类中主要有两个方法 , 作用分别为 : 

        addPDFImageWaterMark :pdf文件添加图片水印

        addPDFWaterMark:pdf文件添加文字水印

          package com.liuxs.fusionx.utils;


          import com.itextpdf.text.Element;
          import com.itextpdf.text.Image;
          import com.itextpdf.text.pdf.*;


          import java.io.File;
          import java.io.FileOutputStream;


          /**
          * @author: Liu Yuehui
          * @ClassName: PDFUtil
          * @date: 2023/11/9 15:11
          * @description: PDF 添加水印
          * @version:v1:2023/11/9 15:11:
          **/
          public class PDFUtil {
          /**
          * pdf文件添加图片水印
          * @param srcPath 输入的文件路径
          * @param destPath 输出的文件路径
          * @param imagePath 水印图片的路径
          * @throws Exception
          */
          public static void addPDFImageWaterMark(String srcPath, String destPath, String imagePath)
          throws Exception {


          PdfReader reader = new PdfReader(srcPath);
          PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(destPath));


          //加载图片
          Image image = Image.getInstance(imagePath);


          PdfGState gs = new PdfGState();
          //gs.setFillOpacity(0.2f);//图片水印透明度
          //gs.setStrokeOpacity(0.4f);//设置笔触字体不透明度
          PdfContentByte content = null;


          int total = reader.getNumberOfPages();//pdf文件页数
          for (int i=0; i<total; i++) {
          float x = reader.getPageSize(i+1).getWidth();//页宽度
          float y = reader.getPageSize(i+1).getHeight();//页高度
          content = stamper.getOverContent(i+1);
          content.setGState(gs);
          content.beginText();//开始写入


          //每页7行,一行3个
          for (int j=0; j<3; j++) {
          for (int k=0; k<7; k++) {
          //setAbsolutePosition 方法的参数(输出水印X轴位置,Y轴位置)
          image.setAbsolutePosition(x/3*j-30, y/7*k-20);
          content.addImage(image);
          }
          }
          content.endText();//结束写入
          }
          //关闭流
          stamper.close();
          reader.close();
          }


          /**
          * pdf文件添加文字水印
          * @param srcPath 输入的文件路径
          * @param destPath 输出的文件路径
          * @param word 水印文字
          * @throws Exception
          */
          public static void addPDFWaterMark(String srcPath, String destPath, String word)
          throws Exception {


          PdfReader reader = new PdfReader(srcPath);
          PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(destPath));


          //使用系统字体
          String prefixFont = null;
          String os = System.getProperties().getProperty("os.name");
          if (os.startsWith("win") || os.startsWith("Win")) {
          prefixFont = "C:\\Windows\\Fonts\\SIMSUN.TTC,1";
          } else {
          prefixFont = "/usr/share/fonts/chinese/TrueType/uming.ttf";
          }


          //创建字体,第一个参数是字体路径
          BaseFont base = BaseFont.createFont(prefixFont, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
          //BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);


          PdfGState gs = new PdfGState();
          gs.setFillOpacity(0.2f);//图片水印透明度
          //gs.setStrokeOpacity(0.4f);//设置笔触字体不透明度
          PdfContentByte content = null;


          int total = reader.getNumberOfPages();//pdf文件页数
          for (int i=0; i<total; i++) {
          float x = reader.getPageSize(i+1).getWidth();//页宽度
          float y = reader.getPageSize(i+1).getHeight();//页高度
          content = stamper.getOverContent(i+1);
          content.setGState(gs);
          content.beginText();//开始写入
          content.setFontAndSize(base, 20);//字体大小
          //每页7行,一行3个
          for (int j=0; j<3; j++) {
          for (int k=0; k<7; k++) {
          //showTextAligned 方法的参数(文字对齐方式,位置内容,输出水印X轴位置,Y轴位置,旋转角度)
          content.showTextAligned(Element.ALIGN_CENTER, word, x/3*j+90, y/7*k, 25);
          }
          }
          content.endText();//结束写入
          }
          //关闭流
          stamper.close();
          reader.close();
          }








          测试:添加文字水印



            public static void main(String[] args) {
            // 获取指定路径的pdf
            File file = new File("E:\\学习\\面试题\\面试题分享");
            for (File listFile : file.listFiles()) {
            if(listFile.getName().endsWith(".pdf")){
            try {
            System.out.println(listFile.getName());
            addPDFWaterMark("E:\\学习\\面试题\\面试题分享\\" + listFile.getName() , "E:\\学习\\面试题\\面试题分享-水印\\" + listFile.getName() , "微信公众号 :猿人刘先生");
            } catch (Exception e) {
            e.printStackTrace();
            }
            }
            }


            }
            }


            效果

            测试:添加水印图片

              public static void main(String[] args) throws Exception {
              addPDFImageWaterMark("E:\\测试.pdf", "E:\\测试水印img.pdf", "E:\\waterMark.png");
              }

              效果

              非常之完美!!!

              写在最后

                  如果您觉得这些文章对您有所启发和帮助,何不将它们与您的好友分享呢?这样,他们也能够享受其中的精彩内容,并从中获得启发。谢谢您的支持与分享!~

                  同时也希望您用发财的手帮忙点个关注,可以通过下方菜单点击福利领取上千套简历模板、几千道的面试题pdf以及几百G涵盖了Java开发,前端开发,小程序开发,数据库,测试等等的相关学习书籍与资料。

              另外也可以通过点击交流群按钮添加我好友,然后拉您到自己的创建的Java知识分享群。一起去讨论、学习、成长、进步,谢谢~

              文章转载自猿人刘先生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论