最近要求添加水印,我们所做的都是先生成预览pdf,然后用户自行下载,所以本代码展示的是预览pdf添加水印。
-
文字水印:
/**
* 添加文字水印
*/
public class Watermark extends PdfPageEventHelper {
/*
该方案只能添加字母,汉字添加不上
protected Phrase watermark = new Phrase("测试水印zzzzz", new Font(Font.FontFamily.HELVETICA, 60, Font.NORMAL, BaseColor.LIGHT_GRAY));
@Override
public void onEndPage(PdfWriter writer, Document document) {
PdfContentByte canvas = writer.getDirectContentUnder();//默认当前页
//PdfContentByte under = stamp.getUnderContent(1);// 拿到层,可以有页数
ColumnText.showTextAligned(canvas, Element.ALIGN_CENTER, watermark, 298, 421, 45);
}*/
private String waterMarkText;
public Watermark(String waterMarkText){
this.waterMarkText = waterMarkText;
}
public void onEndPage(PdfWriter writer, Document document) {
try{
float pageWidth = document.right()+document.left();//获取pdf内容正文页面宽度
float pageHeight = document.top()+document.bottom();//获取pdf内容正文页面高度
//设置水印字体格式
BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
Font waterMarkFont = new Font(base, 20, Font.BOLD, BaseColor.LIGHT_GRAY);
PdfContentByte waterMarkPdfContent = writer.getDirectContentUnder();
Phrase phrase = new Phrase(waterMarkText, waterMarkFont);
//两行三列
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*0.25f,pageHeight*0.2f,45);
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*0.25f,pageHeight*0.5f,45);
ColumnText.showTextAligned(waterMarkPdfContent, Element.ALIGN_CENTER,phrase,
pageWidth*0.25f,pageHeight*0.8f,45);
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*0.65f,pageHeight*0.2f,45);
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*0.65f,pageHeight*0.5f,45);
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*0.65f,pageHeight*0.8f,45);
}catch(DocumentException de) {
de.printStackTrace();
}catch(IOException de) {
de.printStackTrace();
}
}
}
效果图:
-
图片水印:
/**
* 添加图片水印实体类
*/
public class PictureWaterMark extends PdfPageEventHelper {
private String waterMarkFullFilePath;
private Image waterMarkImage;
public PictureWaterMark(String waterMarkFullFilePath){
this.waterMarkFullFilePath = waterMarkFullFilePath;
}
public void onEndPage(PdfWriter writer, Document document) {
try{
float pageWidth = document.right()+document.left();//获取pdf内容正文页面宽度
float pageHeight = document.top()+document.bottom();//获取pdf内容正文页面高度
PdfContentByte waterMarkPdfContent = writer.getDirectContentUnder();
//仅设置一个图片实例对象,整个PDF文档只应用一个图片对象,极大减少因为增加图片水印导致PDF文档大小增加
if(waterMarkImage == null){
waterMarkImage = Image.getInstance(waterMarkFullFilePath);
}
//添加水印图片,文档正文内容采用横向三列,竖向两列模式增加图片水印
waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.1f));
waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.4f));
// waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,500,600));
waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.7f));
waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.1f));
waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.4f));
waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.7f));
PdfGState gs = new PdfGState();
gs.setFillOpacity(0.2f);//设置透明度为0.2
waterMarkPdfContent.setGState(gs);
}catch(DocumentException de) {
de.printStackTrace();
}catch(IOException de) {
de.printStackTrace();
}
}
/**
* 对一个图片对象设置展示位置等信息,该对象重复利用,减少PDF文件大小
* @param waterMarkImage
* @param xPosition
* @param yPosition
* @return
*/
private Image getSingletonWaterMarkImage(Image waterMarkImage,float xPosition,float yPosition){
waterMarkImage.setAbsolutePosition(xPosition, yPosition);//坐标
waterMarkImage.setRotation(-20);//旋转 弧度
waterMarkImage.setRotationDegrees(-45);//旋转 角度
waterMarkImage.scalePercent(100);//依照比例缩放
return waterMarkImage;
}
}
效果图:
调用方法:
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
Document doc = new Document(PageSize.A4, 20, 20, 20, 20);
PdfPTable table = new PdfPTable(1);
try {
PdfWriter writer = PdfWriter.getInstance(doc, buffer);
doc.addTitle(pdfTitle);
doc.open();
doc.newPage();
//通过PDF页面事件模式添加图片水印功能
// writer.setPageEvent(new PictureWaterMark("http://localhost:8080/assets/test/logo.jpg"));
// 通过PDF页面事件模式添加文字水印功能
writer.setPageEvent(new Watermark("测试水印"));
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//省略画表代码
doc.add(table);
doc.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}