java pdf加水印的方法

 更新时间:2019年08月22日 08:41:40   作者:诚实可靠的悟空  
这篇文章主要为大家详细介绍了java pdf加水印的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java pdf加水印的具体代码,供大家参考,具体内容如下

引入依赖

<dependency>
 <groupId>com.itextpdf.tool</groupId>
 <artifactId>xmlworker</artifactId>
 <version>5.5.10</version>
</dependency>
<dependency>
 <groupId>com.itextpdf</groupId>
 <artifactId>itextpdf</artifactId>
 <version>5.5.10</version>
</dependency>

‘/static/fonts/SIMYOU.TTF' 字体 本机没有的话, 可以百度下载

/**
  * pdf 加水印
  *
  * @return
  */
 public byte[] pdfAddWaterMark(byte[] byes) {

  String fileName = UUID.randomUUID().toString() + ".pdf";
  String courseFile = "";
  try {
   // 第二种:获取项目路径 D:\git\daotie\daotie
   //生成临时文件 , 读取完删除
   File directory = new File("");// 参数为空
   courseFile = directory.getCanonicalPath() + "/";
  } catch (IOException e) {
   e.printStackTrace();
  }
  byte[] returnBytes = null;
  // 待加水印的文件
  PdfReader reader = null;
  PdfStamper stamper = null;
//  ByteArrayOutputStream baos = null;
  FileOutputStream os = null;
  try {
   reader = new PdfReader(byes);
   // 加完水印的文件
//   baos = new ByteArrayOutputStream();
//   stamper = new PdfStamper(reader, baos);
   // 加完水印的文件
   os = new FileOutputStream(courseFile + fileName);
   stamper = new PdfStamper(reader, os);

   int total = reader.getNumberOfPages() + 1;
   PdfContentByte content;
   // BaseFont font = BaseFont.createFont();
   BaseFont basefont = BaseFont.createFont("/static/fonts/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
   //这里的字体设置比较关键,这个设置是支持中文的写法
   /*BaseFont base = BaseFont.createFont("STSong-Light",
     "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 使用系统字体*/

   /*//设置透明度
   PdfGState gs = new PdfGState();
   gs.setFillOpacity(1f);
   gs.setStrokeOpacity(1f);*/

   PdfContentByte under;
   com.itextpdf.text.Rectangle pageRect = null;

   // 循环对每页插入水印
   for (int i = 1; i < total; i++) {
    pageRect = stamper.getReader().getPageSizeWithRotation(i);
    // 计算水印X,Y坐标
    float x = (float) (pageRect.getWidth() / 1.98);
    float y = (float) (pageRect.getHeight() / 2.8);
    // 获得PDF最顶层
    under = stamper.getOverContent(i);
    under.saveState();
    // set Transparency
    PdfGState gs = new PdfGState();
    // 设置透明度为0.2
    gs.setFillOpacity(1.f);
    under.setGState(gs);
    under.restoreState();
    under.beginText();
    under.setFontAndSize(basefont, pageRect.getHeight() / 17);
    under.setColorFill(BaseColor.RED);

    // 水印文字成45度角倾斜
    System.out.println("width" + pageRect.getWidth());
    System.out.println("height" + pageRect.getHeight());
    System.out.println("x" + x);
    System.out.println("y" + y);
    under.showTextAligned(Element.ALIGN_CENTER, "图片仅供预览,不可用于商业用途", x, y, 45);
    // 添加水印文字
    under.endText();
    under.setLineWidth(1f);
    under.stroke();
   }
//   returnBytes = baos.toByteArray();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (DocumentException e) {
   e.printStackTrace();
  } finally {
   try {
    stamper.close();
    if (os != null) {
     os.close();
    }
    if (reader != null) {
     reader.close();
    }
   } catch (DocumentException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • MyBatisPlus报错:Failed to process,please exclude the tableName or statementId问题

    MyBatisPlus报错:Failed to process,please exclud

    这篇文章主要介绍了MyBatisPlus报错:Failed to process,please exclude the tableName or statementId问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • JavaMe开发绘制可自动换行文本

    JavaMe开发绘制可自动换行文本

    JavaMe Graphics类中的drawString不支持文本换行,这样绘制比较长的字符串时,文本被绘制在同一行,超过屏幕部分的字符串被截断了。如何使绘制的文本能自动换行呢?
    2015-09-09
  • SpringBoot启动失败的原因及其解决方法

    SpringBoot启动失败的原因及其解决方法

    对于springboot的启动失败,相信大家都有经历,但是为什么会启动失败,以及怎么解决都只能通过日志进行查看,在这里,我会将常见的springboot启动失败的报错一一展示,需要的朋友可以参考下
    2024-06-06
  • SpringBoot整合Hbase的实现示例

    SpringBoot整合Hbase的实现示例

    这篇文章主要介绍了SpringBoot整合Hbase的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java中Comparator与Comparable排序的区别详解

    Java中Comparator与Comparable排序的区别详解

    这篇文章主要介绍了Java中Comparator与Comparable排序的区别详解,如果你有一个类,希望支持同类型的自定义比较策略,可以实现接口Comparable,如果某个类,没有实现Comparable,但是又希望对它进行比较,则可以自定义一个Comparator,需要的朋友可以参考下
    2024-01-01
  • 解决IDEA创建第一个spring boot项目提示cannot resolve xxx等错误

    解决IDEA创建第一个spring boot项目提示cannot resolve xxx等

    这篇文章主要介绍了解决IDEA创建第一个spring boot项目提示cannot resolve xxx等错误问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java使用DOM对XML文档进行增删改查操作实例代码

    java使用DOM对XML文档进行增删改查操作实例代码

    这篇文章主要介绍了java使用DOM对XML文档进行增删改查操作实例代码,实例涉及对xml文档的增删改查,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Springboot整合mybatis的步骤

    Springboot整合mybatis的步骤

    这篇文章主要介绍了Springboot整合mybatis的步骤,帮助大家更好的理解和学习使用
    2021-04-04
  • 使用Spring Boot+gRPC构建微服务并部署的案例详解

    使用Spring Boot+gRPC构建微服务并部署的案例详解

    这篇文章主要介绍了使用Spring Boot+gRPC构建微服务并部署,Spring Cloud仅仅是一个开发框架,没有实现微服务所必须的服务调度、资源分配等功能,这些需求要借助Kubernetes等平台来完成,本文给大家介绍的非常详细,需要的朋友参考下吧
    2022-06-06
  • Java中的反射机制基本运用详解

    Java中的反射机制基本运用详解

    这篇文章主要介绍了Java 反射机制原理与用法,结合实例形式详细分析了Java反射机制的相关概念、原理、基本使用方法及操作注意事项,需要的朋友可以参考下
    2021-08-08

最新评论