pdf添加水印logo这种需求场景确实很少,有些时候一些销售单据生成pdf添加一个水印logo,做一个简单的防伪效果,虽然实际上并没有太大作用,但是产品经理说要,巴拉巴拉……省略一万字。
下面将源码分享给猿友们,有用就looklook,没用就转移视线吧。
### 一、效果展示
没加水印的pdf:
![](https://box.kancloud.cn/2016-03-15_56e77db773081.jpg)
添加水印后的pdf:
![](https://box.kancloud.cn/2016-03-15_56e77db799316.jpg)
这里截图效果可能不是很明显,有需要的猿友可以直接下载下面的源码压缩包,里面有添加水印后的pdf文件。
### 二、源码下载
[http://download.csdn.net/detail/u013142781/9421432](http://download.csdn.net/detail/u013142781/9421432)
里面的pdf_project.zip是源码,源码环境eclipse+maven
### 三、实例说明
工程需要添加itextpdf包依赖,maven依赖为:
~~~
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.3</version>
</dependency>
~~~
除了依赖以外,就一个类PDFAddWaterMark.java了,其代码如下:
~~~
package com.luo.pdf;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Random;
public class PDFAddWaterMark {
static final float IAMGE_HEIGHT = 110f; // 限制水印图片的的高度
static final float IAMGE_WIDTH = 110f; // 限制水印图片的的宽度
/**
* 给pdf文件添加水印
* @param file 要加水印的原pdf文件
* @throws Exception
*/
public static void addPdfMark(File file) throws Exception {
// 如果是web项目,应该从web项目里面获取logo
// String markImagePath =
// request.getSession().getServletContext().getRealPath("/") +
// "resources/images/logo.jpg";
String markImagePath = "C:/Users/luoguohui/Desktop/logo.jpg"; // 水印图片路径
PdfReader reader = new PdfReader(file.getPath(), "PDF".getBytes());
// 如果是web项目,直接下载应该放到response的流里面
// PdfStamper stamp = new PdfStamper(reader,
// response.getOutputStream());
// 添加水印之后的pdf文件
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(
"C:/Users/luoguohui/Desktop/afterAddPdfMark.pdf"));
int pageSize = reader.getNumberOfPages();
float pageHeight = reader.getPageSize(1).getHeight();
float pageWidth = reader.getPageSize(1).getWidth();
try {
// 每两行显示两个 左边一个,右边一个
int lineNum = (int) (pageHeight / IAMGE_HEIGHT); // 行数
int middleY = (int) pageWidth / 2;
for (int i = 1; i <= pageSize; i++) {
for (int j = 0, k = 0; j < lineNum; j = j + 2, k++) {
Random random = new Random();
Image img = Image.getInstance(markImagePath);// 插入水印
img.scaleAbsolute(IAMGE_WIDTH, IAMGE_HEIGHT * 184 / 455);
img.setAlignment(Image.UNDERLYING); // 在字下面
int trueY;
while (true) {
trueY = random.nextInt(middleY);
if (trueY > IAMGE_WIDTH / 2
&& trueY < (middleY - IAMGE_WIDTH)) {
break;
}
}
img.setAbsolutePosition(trueY, j * IAMGE_HEIGHT
+ (float) random.nextInt((int) IAMGE_HEIGHT)
- (k % 2) * 10); // 水印的位置
img.setRotationDegrees(random.nextInt(360));// 旋转 角度
PdfContentByte under = stamp.getUnderContent(i);
PdfGState gs = new PdfGState();
gs.setFillOpacity(0.3f); // 设置透明度为0.3
under.setGState(gs);
under.addImage(img);
while (true) {
trueY = random.nextInt(middleY) + middleY;
if (trueY > middleY + IAMGE_WIDTH / 2
&& trueY < (2 * middleY - IAMGE_WIDTH)) {
break;
}
}
img.setAbsolutePosition(trueY, j * IAMGE_HEIGHT
+ (float) random.nextInt((int) IAMGE_HEIGHT)
- (k % 2) * 10); // 水印的位置
img.setRotationDegrees(random.nextInt(360));// 旋转 角度
under.addImage(img);
}
}
} catch (Exception e) {
throw e;
} finally {
stamp.close();// 关闭
reader.close();
}
}
public static void main(String[] args) throws Exception {
// 添加水印之前的pdf文件
File file = new File("C:/Users/luoguohui/Desktop/beforeAddPdfMark.pdf");
addPdfMark(file);
}
}
~~~
这里有必要对上面的代码说明的是:其实就是在pdf里面加入图片logo,只是这些图片logo不会遮挡住文字,而且有一定的透明度。另外logo随机旋转一定的角度。再另外,其出现的位置,根据当前页的高度计算出一页需要多少行logo,每行左边一个右边一个,然后其位置上下左右在一定范围内随机。代码实现就这样,如果还有什么不明白的可以留言。
- 前言
- Java生成中间logo的二维码(还可以加上二维码名称哦)
- Java我的高效编程之常用函数
- AES加密解密&&SHA1、SHA加密&&MD5加密
- Java中synchronized的使用实例
- Java基础之集合
- Java基础之泛型
- Java基础之枚举妙用
- 那些年用过的一些前端框架
- 关于正则,那些年一直存在的疑惑解答(正则菜鸟不容错过)
- 给pdf文件添加防伪水印logo(附工程源码下载)
- SpringMVC+BUI实现文件上传(附详解,源码下载)
- Java异常封装(自己定义错误码和描述,附源码)
- javaweb异常提示信息统一处理(使用springmvc,附源码)
- 关于Java,那些我心存疑惑的事(不断更新中...)
- 深入Java虚拟机(1)——Java体系结构
- 深入Java虚拟机(2)——Java的平台无关性
- 深入Java虚拟机(3)——安全
- 深入Java虚拟机(4)——网络移动性
- Linux文件编辑命令详细整理
- 阿里云服务器云数据库免费体验(Java Web详细实例)
- 项目部署、配置、查错常用到的Linux命令
- Shell脚本了解
- Ajax原理学习
- linux下安装apache(httpd-2.4.3版本)各种坑
- JSP九大内置对象
- Servlet再度学习
- 开发人员系统功能设计常用办公软件分享
- java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener问题解决
- tomcat内存溢出解决,java.lang.OutOfMemoryError: PermGen space
- 《Java多线程编程核心技术》推荐
- 关于跳槽,是我心浮气躁?还是我确实该离开了?
- Java I/O学习(附实例和详解)
- Java经典设计模式之五大创建型模式(附实例和详解)
- Java经典设计模式之七大结构型模式(附实例和详解)
- Java经典设计模式之十一种行为型模式(附实例和详解)
- Java内存管理
- SQL实例整理
- 数据库面试常问的一些基本概念