java springboot使用itext 为PDF添加文字水印并铺满屏

java springboot使用itextpdf 为PDF添加文字水印并铺满屏

    • 代码如下
            • 如果对你有帮助希望你能点个赞
    • 结尾

这是我第一次发博客,也是第一次使用itext添加水印。遇到一些大大小小的问题,不过总算了解决了。再次给大家分享一下我的代码,有什么问题都可以给我发消息、评论,我看到的都会回复。
我使用的是springboot+maven项目

代码如下

  1. pom依赖 ,不同的版本可能会冲突,这一套我已经试验过不会冲突,可以放心 食用。 jar包下载 提取码 26ok
<!--PDF加水印依赖 start-->
<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
       <dependency>
           <groupId>com.itextpdf</groupId>
           <artifactId>itextpdf</artifactId>
           <version>5.5.13</version>
       </dependency>
       <!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
       <dependency>
           <groupId>com.itextpdf</groupId>
           <artifactId>itext-asian</artifactId>
           <version>5.2.0</version>
       </dependency>
       <!--end-->
  1. 代码部分,这是一个写好的方法直接传参进去就能使用。
private boolean addwaterMark(String inputFile, String outputFile, String waterMarkName,
                               float opacity, int fontsize, int angle, int heightdensity, int widthdensity) {
      PdfReader reader = null;
      PdfStamper stamper = null;
      try {
          int interval = -5;
          reader = new PdfReader(inputFile);
          stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
          BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
          Rectangle pageRect = null;
          PdfGState gs = new PdfGState();
          //这里是透明度设置
          gs.setFillOpacity(opacity);
          //这里是条纹不透明度
          gs.setStrokeOpacity(0.2f);
          int total = reader.getNumberOfPages() + 1;
          System.out.println("合同页数:" + reader.getNumberOfPages());
          JLabel label = new JLabel();
          FontMetrics metrics;
          int textH = 0;
          int textW = 0;
          label.setText(waterMarkName);
          metrics = label.getFontMetrics(label.getFont());
          textH = metrics.getHeight();  //字符串的高,   只和字体有关
          textW = metrics.stringWidth(label.getText());  //字符串的宽
          PdfContentByte under;
          //这个循环是确保每一张PDF都加上水印
          for (int i = 1; i < total; i++) {
              pageRect = reader.getPageSizeWithRotation(i);
              under = stamper.getOverContent(i);  //在内容上方添加水印
              //under = stamper.getUnderContent(i);  //在内容下方添加水印
              under.saveState();
              under.setGState(gs);
              under.beginText();
              //under.setColorFill(BaseColor.PINK);  //添加文字颜色  不能动态改变 放弃使用
              under.setFontAndSize(base, fontsize); //这里是水印字体大小
              for (int height =  textH; height < pageRect.getHeight()*2; height = height + textH * heightdensity) {
                  for (int width =  textW; width < pageRect.getWidth()*1.5 + textW; width = width + textW * widthdensity) {
                      // rotation:倾斜角度
                      under.showTextAligned(Element.ALIGN_LEFT, waterMarkName, width - textW, height - textH, angle);
                  }
              }
              //添加水印文字
              under.endText();
          }
          System.out.println("添加水印成功!");
          return true;
      } catch (IOException e) {
          System.out.println("添加水印失败!错误信息为: " + e);
          e.printStackTrace();
          return false;
      } catch (DocumentException e) {
          System.out.println("添加水印失败!错误信息为: " + e);
          e.printStackTrace();
          return false;
      } finally {
          //关闭流
          if (stamper != null) {
              try {
                  stamper.close();
              } catch (DocumentException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
          if (reader != null) {
              reader.close();
          }
      }
  }
  1. 方法需要的参数
String inputFile= "C:/watermark/测试数据.pdf";   //需要添加水印的文件
String outputFile= "C:/watermark/(已加印)测试数据.pdf"; //添加完水印的文件存放路径
String waterMarkName="测试水印";   //需要添加的水印文字
float opacity=0.3f;//水印字体透明度
int fontsize=30;  //水印字体大小
int angle=30;   //水印倾斜角度(0-360)
int heightdensity=20; //数值越大每页竖向水印越少
int widthdensity=2;   //数值越大每页横向水印越少
//调用添加水印方法
addwaterMark(inputFile, outputFile, waterMarkName, opacity, fontsize, angle, heightdensity, widthdensity)
如果对你有帮助希望你能点个赞

结尾

项目源码还在整理,里面有从数据库获取流形式的文件放入本地以及把添加过水印的文件放入数据库中,等有时间整理再发一篇博客分享给大家,有需要源码的也可以直接私信我,留言发邮箱也行。我看到的话邮箱发给你们。

你可能感兴趣的:(java springboot使用itext 为PDF添加文字水印并铺满屏)