java對PDF文件添加水印(文本水印、圖片水印)
添加 pom 依賴
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
文本水印
public static String addTxtWaterMaker(String inputFile, String outputFile, String waterMarkName){
logger.debug("==========addTxtWaterMaker==========start");
try {
PdfReader reader = new PdfReader(inputFile);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
// 使用系統字體
BaseFont base = BaseFont.createFont("STSong-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Rectangle pageRect;
PdfGState gs = new PdfGState();
//設置文字透明度
gs.setFillOpacity(0.6f);
gs.setStrokeOpacity(0.6f);
//獲取pdf總頁數
int total = reader.getNumberOfPages() + 1;
JLabel label = new JLabel();
FontMetrics metrics;
int textH;
int textW;
label.setText(waterMarkName);
metrics = label.getFontMetrics(label.getFont());
//得到文字的寬高
textH = metrics.getHeight();
textW = metrics.stringWidth(label.getText());
PdfContentByte under;
for (int i = 1; i < total; i++) {
pageRect = reader.getPageSizeWithRotation(i);
//得到一個覆蓋在上層的水印文字
under = stamper.getOverContent(i);
under.saveState();
under.setGState(gs);
under.beginText();
//設置水印文字顏色
under.setColorFill(BaseColor.LIGHT_GRAY);
//設置水印文字和大小
under.setFontAndSize(base, 12);
//這個position主要是爲了在換行加水印時能往右偏移起始座標
int position = 0;
int interval = -3;
for (int height = interval + textH; height < pageRect.getHeight(); height = height + textH * 3) {
for (int width = interval + textW -position * 150; width < pageRect.getWidth() + textW; width = width + textW) {
//添加水印文字,水印文字成25度角傾斜
under.showTextAligned(Element.ALIGN_LEFT, waterMarkName, width - textW , height - textH, 25);
}
position++;
}
// 添加水印文字
under.endText();
}
//關閉流
stamper.close();
reader.close();
logger.debug("==========addTxtWaterMaker==========end");
} catch (Exception e) {
e.printStackTrace();
logger.error("文件{}增加水印異常:{}",inputFile,e.getMessage());
return inputFile;
}
return outputFile;
}
圖片水印
public static String addImgWaterMaker(String inputFile, String outputFile, String imgFilePath) {
logger.debug("==========addImgWaterMaker==========start");
try {
PdfReader reader = new PdfReader(inputFile);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
PdfGState gs1 = new PdfGState();
// 設置透明度
gs1.setFillOpacity(0.7f);
Image image = Image.getInstance(imgFilePath);
// 獲取PDF頁數
int num = reader.getNumberOfPages();
PdfContentByte under;
for (int i = 1; i <= num; i++) {
PdfContentByte pdfContentByte = stamper.getOverContent(i);
// 獲得PDF最頂層
under = stamper.getOverContent(i);
pdfContentByte.setGState(gs1);
// 行
for (int y = 0; y < 10; y++) {
// 列
for (int x = 0; x < 8; x++) {
// 設置旋轉角度
image.setRotationDegrees(30);// 旋轉 角度
// 設置等比縮放
under.setColorFill(BaseColor.GRAY);
image.scaleToFit(80,120);
image.setRotation(30);
image.setAbsolutePosition(60 + 140 * x, 110 * y);
pdfContentByte.addImage(image);
}
}
}
stamper.close();
reader.close();
logger.debug("==========addImgWaterMaker==========end");
} catch (Exception e) {
e.printStackTrace();
logger.error("文件{}增加水印異常:{}",inputFile,e.getMessage());
return inputFile;
}
return outputFile;
}
Main 測試
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Element;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.swing.*;
import java.awt.*;
import java.io.FileOutputStream;
/**
* @Describe: PDF文件加水印工具
* @Author: zml
* @Date: 2020-5-19 09:08:40
*/
public class PDFWaterUtils {
private static Logger logger = LoggerFactory.getLogger(PDFWaterUtils.class);
public static void main(String[] args) {
String inputFile = "D:\\liang\\office加水印\\水印測試-前.pdf";
// 文字水印
// String outputFile = "D:\\liang\\office加水印\\水印測試-後-文字.pdf";
// String waterMarkName = "成長的小亮亮";
// addTxtWaterMaker(inputFile, outputFile, waterMarkName);
// 圖片水印
String outputFile = "D:\\liang\\office加水印\\水印測試-後-圖片.pdf";
String imgFilePath = "D:\\liang\\office加水印\\圖片1.png";
addImgWaterMaker(inputFile, outputFile, imgFilePath);
}
}
示例