引入maven依赖
<!-- PDFBOX操作PDF文件組件 -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.4.3</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.4.1</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.1</version>
</dependency>
<!-- PDFBOX操作PDF文件組件 -->
生成带水印的PDF
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
import org.apache.pdfbox.util.Matrix;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
public class WatermarkUtils {
public static void main(String[] args) throws Exception {
imageFileWaterPrint("D:\\1.png", "D:\\360安全浏览器下载\\测试.pdf", "D:\\360安全浏览器下载\\测试-水印.pdf");
}
/**
* 生成印有二维码水印的附件
* @param imageUrl 二维码图片路径
* @param fileUrl 附件路径
* @param outFileUrl 水印附件的保存路径
* @throws Exception IOException
*/
public static void psWaterPrintFile(String imageUrl, String fileUrl, String outFileUrl) throws Exception {
PdfReader pdfReader = null;
PdfStamper pdfStamper = null;
try {
//文件夹如果不存在则新建
File outputFileP = new File(outFileUrl);
if (!outputFileP.getParentFile().exists()) {
outputFileP.getParentFile().mkdirs(); //创建文件夹
}
pdfReader = new PdfReader(fileUrl);
pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(outFileUrl));
PdfGState gs = new PdfGState();
gs.setFillOpacity(0.8f); // 设置透明度为0.8
Image img = Image.getInstance(imageUrl); // 选择图片
int total = pdfReader.getNumberOfPages(); // 获取要水印的附件的页数
for (int i = 1; i <= total; i++) {
Rectangle pageSize = pdfReader.getPageSize(i);
float width = pageSize.getWidth(); //长度
float height = pageSize.getHeight(); //高度
//System.out.println("width:" + width + ",height:" + height);
PdfContentByte content = pdfStamper.getOverContent(i);
// 设置透明度
content.setGState(gs);
// 设置等比缩放
img.scaleToFit(100, 100);
// 图片的位置控制
img.setAbsolutePosition(width - 120, height - 120);
content.addImage(img);
if (width > height) { //横向,再输出一份水印
img.setAbsolutePosition(400, 750);
content.addImage(img);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (pdfStamper != null) {
pdfStamper.close();
}
if (pdfReader != null) {
pdfReader.close();
}
}
}
/**
* 生成印有图片水印的PDF文件(铺满、倾斜)
* @param imageUrl 二维码图片路径
* @param fileUrl 附件路径
* @param outFileUrl 水印附件的保存路径
* @throws Exception IOException
*/
public static void imageFileWaterPrint(String imageUrl, String fileUrl, String outFileUrl) throws Exception {
PdfReader pdfReader = null;
PdfStamper pdfStamper = null;
try {
//文件夹如果不存在则新建
File outputFileP = new File(outFileUrl);
if (!outputFileP.getParentFile().exists()) {
outputFileP.getParentFile().mkdirs(); //创建文件夹
}
pdfReader = new PdfReader(fileUrl);
pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(outFileUrl));
PdfGState gs = new PdfGState();
gs.setFillOpacity(0.1f); // 设置透明度为0.1
Image img = Image.getInstance(imageUrl); // 选择图片
int interval = -50;
int imgH = (int) (img.getHeight() / 4);
int imgW = (int) (img.getWidth() / 7);
System.out.println("imgH:" + imgH + ",imgW:" + imgW);
int total = pdfReader.getNumberOfPages(); // 获取要水印的附件的页数
for (int i = 1; i <= total; i++) {
Rectangle pageRect = pdfReader.getPageSizeWithRotation(i);
PdfContentByte content = pdfStamper.getOverContent(i);
// 设置透明度
content.setGState(gs);
img.setRotationDegrees(45);//旋转 角度
for (int height = interval + imgH; height < pageRect.getHeight(); height = height + imgH * 3) {
for (int width = interval + imgW; width < pageRect.getWidth() + imgW; width = width + imgW * 2) {
// 设置等比缩放
img.scaleToFit(100, 100);
// 图片的位置控制
img.setAbsolutePosition(width - imgW, height - imgH);
content.addImage(img);
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (pdfStamper != null) {
pdfStamper.close();
}
if (pdfReader != null) {
pdfReader.close();
}
}
}
/**
* 获取要水印的附件的页数
* @param path PDF路径
* @return 附件的页数
*/
public static int efficientPDFPageCount(String path) {
int ret = 0;
try {
PdfReader reader = new PdfReader(path);
ret = reader.getNumberOfPages();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}
/**
* 校验附件,是否能加水印
* @param fileUrl 文件路径
* @return boolean
*/
public static boolean checkPdfWatermark(String fileUrl) {
File file = new File(fileUrl);
if (!file.exists()) { //不存在,不做校验
return true;
}
//在同一目录生成一份临时文件,uuid.pdf
String outFileUrl = file.getParent() + "/" + UUIdUtils.genId() + ".pdf";
PdfReader pdfReader = null;
PdfStamper pdfStamper = null;
try {
pdfReader = new PdfReader(fileUrl);
pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(outFileUrl));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (pdfStamper != null) {
try {
pdfStamper.close();
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
if (pdfReader != null) {
pdfReader.close();
}
}
//校验临时文件,是否能打开:报错,不能打开、不能加水印;否则,可以
InputStream is = null;
try {
is = new FileInputStream(outFileUrl);
PdfReader reader = new PdfReader(is);
reader.close();
//可以加水印
return true;
} catch (Exception e) {
//报错,不能打开、不能加水印;
return false;
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//删除临时文件
new File(outFileUrl).delete();
}
}
}
PDF文件