在 PDF 中添加水印需要依赖 http://www.itextpdf.com/
提供的 jar 包,我们新建 maven 项目,依赖如下:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.2</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
代码结构如下:
package net.haicoder.watermark;
import com.itextpdf.text.Element;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import javax.swing.*;
import java.awt.*;
import java.io.FileOutputStream;
/**
* @author 嗨客网
* @description pdf 支持水印
*/
public class PdfWaterMarkUtil {
private static int interval = -5;
/**
* @param filePath 你的PDF文件地址
* @param outputFile 添加水印后生成PDF存放的地址
* @param waterMarkContent 你的水印
* @return
*/
public static boolean pdfWaterMark(String filePath, String outputFile, String waterMarkContent) {
try {
PdfReader reader = new PdfReader(filePath);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
//这里的字体设置比较关键,这个设置是支持中文的写法
BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 使用系统字体
PdfGState gs = new PdfGState();
gs.setFillOpacity(0.3f);
gs.setStrokeOpacity(0.4f);
int total = reader.getNumberOfPages() + 1;
JLabel label = new JLabel();
FontMetrics metrics;
label.setText(waterMarkContent);
metrics = label.getFontMetrics(label.getFont());
int textH = metrics.getHeight();
int textW = metrics.stringWidth(label.getText());
PdfContentByte under;
Rectangle pageRect;
for (int i = 1; i < total; i++) {
pageRect = reader.getPageSizeWithRotation(i);
under = stamper.getOverContent(i);
under.saveState();
under.setGState(gs);
under.beginText();
under.setFontAndSize(base, 22);
// 水印文字成30度角倾斜
//你可以随心所欲的改你自己想要的角度
for (int height = interval + textH; height < pageRect.getHeight(); height = height + textH * 10) {
for (int width = textW + 20; width < pageRect.getWidth() + textW; width = width + textW * 3) {
under.showTextAligned(Element.ALIGN_LEFT, waterMarkContent, width - textW, height, 30);
}
}
// 添加水印文字
under.endText();
}
stamper.close();
reader.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
import net.haicoder.watermark.PdfWaterMarkUtil;
/**
* @author 嗨客网
* @description
*/
public class TestMain {
public static void main(String[] args) {
PdfWaterMarkUtil.pdfWaterMark("/Users/haicoder/Documents/code/haicoder/javautil/src/main/java/图片添加水印.pdf",
"/Users/haicoder/Documents/code/haicoder/javautil/src/main/java/图片添加水印1.pdf",
"你好,嗨客网");
}
}
运行效果如下: