前言
近期有个简单的需求要求给客户上传PDF文件添加水印后保存。下面是将关键代码提取后提供的公共方法。
代码
package com.watermarker.study;
import java.awt.*;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.*;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Rectangle;
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;
/**
* @author bozinan
*/
public class WarterMarkerUtil {
/**
*
* @param inputFile 原文件
* @param outputFile 加水印后的文件
* @param waterMarkName 水印字符
*/
public static void addWaterMark(String inputFile, String outputFile,String waterMarkName) {
PdfReader reader = null;
PdfStamper stamper = null;
try {
reader = new PdfReader(inputFile);
stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
//这里字体,记得要放在服务器上对应文件夹下
BaseFont base = BaseFont.createFont("src/main/webapp/ttf/arial.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Rectangle pageRect = null;
PdfGState gs = new PdfGState();
//填充不透明度 为1完全不透明
gs.setFillOpacity(0.1f);
//笔画不透明度, 为1完全不透明
gs.setStrokeOpacity(0.1f);
int total = reader.getNumberOfPages() + 1;
JLabel label = new JLabel();
FontMetrics metrics;
int textH = 0;
int textW = 0;
label.setText(waterMarkName);
metrics = label.getFontMetrics(label.getFont());
textH = metrics.getHeight();
textW = metrics.stringWidth(label.getText());
PdfContentByte under;
int interval = 0;
for (int i = 1; i < total; i++) {
pageRect = reader.getPageSizeWithRotation(i);
//在字体下方加水印
under = stamper.getOverContent(i);
under.beginText();
under.saveState();
under.setGState(gs);
//这里修改水印字体大小
under.setFontAndSize(base, 36);
//这里设置字体上下间隔
for (int height = interval + textH; height < pageRect
.getHeight(); height = height + textH * 9) {
//这里设置字体左右间隔
for (int width = interval + textW; width < pageRect
.getWidth() + textW; width = width + textW * 4) {
//这里设置倾斜角度
under.showTextAligned(Element.ALIGN_LEFT,
waterMarkName, width - textW, height - textH,
45);
}
}
under.endText();
}
stamper.close();
reader.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (stamper != null) {
stamper.close();
}
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (reader != null) {
reader.close();
}
}
}
}
测试
public class test {
public static void main(String[] args) {
WarterMarkerUtil.addWaterMark("C:\\Users\\m1347\\Downloads\\ElasticSearch.pdf",
"C:\\Users\\m1347\\Downloads\\ElasticSearchWithWaterMarker.pdf",
"TEST");
}
}
后记
如果本文有帮助到你,记得点赞收藏!!!