java pdf加水印的方法
作者:诚实可靠的悟空 发布时间:2022-09-03 06:06:50
标签: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();
}
}
来源:https://blog.csdn.net/qq_20519453/article/details/94596060


猜你喜欢
- 前言WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏
- java中字符串转整数及MyAtoi方法的实现 该题虽然和我们正常使
- 把spring-boot项目按照平常的web项目一样发布到tomcat容器下一、修改打包形式在pom.xml里设置 <packagin
- 本文实例讲述了C#设计模式之Builder生成器模式解决带老婆配置电脑问题。分享给大家供大家参考,具体如下:一、理论定义生成器模式 又叫:建
- 效果图如下所示:先给大家说下实现android 跳转到通讯录的实现思路:1.点击跳转到通讯录界面2.获取通讯录姓名和手机号码3.回调显示姓名
- 本文讲述了在Java中如何创建和结束线程的最基本方法,只针对于Java初学者。一些高级知识如线程同步、调度、线程池等内容将会在后续章节中逐步
- 在项目中遇到try...catch...语句,因为对Java异常处理机制的流程不是很清楚,导致对相关逻辑代码不理解。所以现在来总结Java异
- OSS.Http项目对于.Net Standard标准库的支持已经迁移完毕,OSS开源系列两个最底层的类库已经具备跨运行时支持的能力。由于O
- 绘制圆形锯齿问题普通绘制圆形形状时可以看到图形边缘会有明显锯齿现象并不像真实圆形形状一样圆润边缘平滑。在glsl中这种情况是常见情况,这里是
- 一、XML DOM概述XML 文档大小写敏感、属性用引号括起来,每一个标记都要闭合。DOM是XML文档的内存中树状的表示形式。继承关系图:X
- spring cloud快速搭建Spring Cloud是一个微服务框架,它基于spring boot, Spring Cloud
- 协议做如下规定:规定数据协议:序列号 长度 状态字 数据长度 数据1 &n
- 1. 项目背景最近参加了Compose挑战赛的终极挑战,使用Compose完成了一个天气app。之前几轮挑战也都有参与,每次都学到不少新东西
- 大家使用Android的原生UI都知道,Android的Activity跳转就是很生硬的切换界面。其实Android的Activity跳转可
- 博主最近在做一个内网项目,内部可以访问外部数据,但是外部访问不了内部数据,这也就造成了可能文件无法上传,所以博主另辟蹊径,在本地服务器上建立
- Spring多配置文件有什么好处? 按照目的、功能去拆分配置文件,可以提高配置文件的可读性与维护性,如将配置事务管理、数据源等少改动的配置与
- 什么是JSON?JSON (JavaScript Object Notation) is a lightweight data-interc
- 调用示例: 执行效果: 2.实现代码:/// <summary> 2 &
- 前言由于刚写项目不久,在写 web 后台接口时,经常会对前端传入的参数进行一些规则校验,如果入参较少还好,一旦需要校验的参数比较多,那么使用
- HashMap的get()方法的NullPointerException今天写代码发现一个 bug,HashMap的 get() 方法一直报