添加水印后效果
相关依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
实现与调用代码
package itetxt.com.cs;
import java.io.FileOutputStream;
import java.io.IOException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
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 com.itextpdf.text.pdf.PdfWriter;
public class Util {
/**
* 给pdf文件加文字水印
* @param inputFile 源文件路径
* @param outputFile 输出文件路径
* @param waterMarkName 水印内容
* @param picFilePath 图片文件路径
* @param picHeight 图片水印高度
* @param picWidth 图片水印宽度
* @param picRowNum 水印平铺行数
* @param picColNum 水印平铺列数
* @param rotateDegree 水印逆时针旋转度数
* @param transDegree 水印透明度设置(范围0-1)
* @return 方法是否成功调用
*/
public static boolean waterMark(String inputFile,String outputFile, String waterMarkName,
String picFilePath, float picHeight, float picWidth, int picRowNum, int picColNum,
int rotateDegree, float transDegree) {
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);// 使用系统字体
int total = reader.getNumberOfPages() + 1;
PdfContentByte watermark;
// 遍历pdf文件的每页以处理
for (int i = 1; i < total; i++) {
// 获得PDF最顶层
watermark = stamper.getOverContent(i); //在内容上方加水印
watermark.saveState();
PdfGState gs = new PdfGState();
// 设置透明度范围为0到1
gs.setFillOpacity(transDegree);
watermark.setGState(gs);
watermark.beginText();
watermark.setFontAndSize(base, 15); //字体大小
watermark.setColorFill(BaseColor.BLACK); //字体颜色
// 计算水印X,Y坐标
float x = reader.getPageSize(i).getWidth() / (picColNum+1);
float y = reader.getPageSize(i).getHeight() / (picRowNum+1);
for (int col = 1; col < picColNum+1; col++) {
for (int row = 1; row < picRowNum+1; row++) {
// 设置文字水印
watermark.showTextAligned(Element.ALIGN_CENTER, waterMarkName, x*col, y*row, rotateDegree);
if (picFilePath != null || !"".contentEquals(picFilePath)) {
// 设置图片水印
Image image = Image.getInstance(picFilePath);
image.setAbsolutePosition(col*x, row*y); // 设置坐标 绝对位置 X Y
image.setRotationDegrees(rotateDegree); // 旋转 角度
image.scaleAbsolute(picHeight, picWidth); // 自定义大小
watermark.setGState(gs); // 设置透明度
watermark.addImage(image); // 添加水印图片
}
}
}
// 添加水印文字
watermark.endText();
watermark.setLineWidth(1f);
watermark.stroke();
}
stamper.close();
reader.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 方法调试
*/
public static void main(String[] args) throws Exception {
String inputPath = "C:\\Users\\erik\\Desktop\\inputPDF.pdf";
String outputPath = "C:\\Users\\erik\\Desktop\\outputPDF.pdf";
String picFilePath = "C:\\Users\\erik\\Desktop\\profile.jpg";
waterMark(inputPath, outputPath, "机密文件", picFilePath, 40, 40, 4, 3, 30, 0.3f);
System.out.println("添加水印成功!");
}
}