PDF文件JAVA去水印源码,给pdf文件添加防伪水印logo(附工程源码下载)

pdf添加水印logo这种需求场景确实很少,有些时候一些销售单据生成pdf添加一个水印logo,做一个简单的防伪效果,虽然实际上并没有太大作用,但是产品经理说要,巴拉巴拉……省略一万字。

下面将源码分享给猿友们,有用就looklook,没用就转移视线吧。

一、效果展示

没加水印的pdf:

1e7c63f145919f2fc2ea3b8a94bebb7f.png

添加水印后的pdf:

074aaab3feece14edf5781313018220e.png

这里截图效果可能不是很明显,有需要的猿友可以直接下载下面的源码压缩包,里面有添加水印后的pdf文件。

二、源码下载

里面的pdf_project.zip是源码,源码环境eclipse+maven

三、实例说明

工程需要添加itextpdf包依赖,maven依赖为:

com.itextpdf

itextpdf

5.5.3

除了依赖以外,就一个类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,每行左边一个右边一个,然后其位置上下左右在一定范围内随机。代码实现就这样,如果还有什么不明白的可以留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值