-
添加依赖
<!-- itext7 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.1.11</version>
<type>pom</type>
</dependency>
-
实现代码
/**
* 添加水印
* @param inputFilePath 输入文件路径
* @param outputFilePath 输出文件路径
* @param waterMarkContent 水印内容
*/
public static void waterMark(String inputFilePath,
String outputFilePath, String waterMarkContent) throws IOException {
FileOutputStream outputStream = new FileOutputStream(new File(outputFilePath));
PdfWriter pdfWriter = new PdfWriter(outputStream);
PdfDocument outDocument = new PdfDocument(pdfWriter);
PdfReader pdfReader = new PdfReader(inputFilePath);
PdfDocument redDocument = new PdfDocument(pdfReader);
// 添加事件,该事件拥有添加水印
WaterMarkHandler waterMarkHandler = new WaterMarkHandler(waterMarkContent);
outDocument.addEventHandler(PdfDocumentEvent.INSERT_PAGE, waterMarkHandler);
//获取总页数
int numberOfPages = redDocument.getNumberOfPages();
for (int i = 1; i <= numberOfPages; i++) {
PdfPage page = redDocument.getPage(i);
//复制每页内容添加到新的文件中
outDocument.addPage(page.copyTo(outDocument));
}
outDocument.close();
redDocument.close();
pdfReader.close();
}
/**
* 监听事件 添加水印
*/
protected static class WaterMarkHandler implements IEventHandler {
private String waterMarkContent = "";
public WaterMarkHandler(String str){
this.waterMarkContent = str;
}
@Override
public void handleEvent(com.itextpdf.kernel.events.Event event) {
PdfDocumentEvent documentEvent = (PdfDocumentEvent) event;
PdfDocument document = documentEvent.getDocument();
PdfPage page = documentEvent.getPage();
Rectangle pageSize = page.getPageSize();
JLabel label = new JLabel();
label.setText(this.waterMarkContent);
FontMetrics metrics = label.getFontMetrics(label.getFont());
int textHeight = metrics.getHeight();
int textWidth = metrics.stringWidth(label.getText());
PdfFont pdfFont = null;
try {
// 将字体包拖到路径下
pdfFont = PdfFontFactory.createFont("src/main/resources/static/font/font.ttf",PdfEncodings.IDENTITY_H,
false);
} catch (IOException e) {
e.printStackTrace();
}
//Canvas对象过期了,可以使用Document对象
Document document1 = new Document(document)
.setFont(pdfFont) //设置字体
.setFontColor(Color.convertRgbToCmyk(new DeviceRgb(java.awt.Color.LIGHT_GRAY))) //字体颜色
.setFontSize(16); //字体大小
//循环添加水印-posX表示横向起始位置,从左向右。posY表示纵向起始位置,从下到上。
for(float posX = 75f; posX < pageSize.getWidth(); posX = posX + textWidth * 3){
for(float posY = 50f; posY < pageSize.getHeight(); posY = posY + textHeight * 4){
/*document1.showTextAligned(new Paragraph(this.waterMarkContent), posX, posY, document.getPageNumber(page),
TextAlignment.CENTER, VerticalAlignment.MIDDLE, 145);*/
document1.showTextAligned(this.waterMarkContent,posX,posY,TextAlignment.CENTER, 145f);
}
}
}
}
完成。