在(一)的背景下,直接上代码:(里面出现的几个特别的类要注意:如 PdfReader PdfStamper)
/**
* 对一个图片对象设置展示位置等信息,该对象重复利用,减少PDF文件大小
* @param waterMarkImage
* @param xPosition
* @param yPosition
* @return
*/
public static Image getSingletonWaterMarkImage(Image waterMarkImage,float xPosition,float yPosition){
waterMarkImage.setAbsolutePosition(xPosition, yPosition);//坐标
waterMarkImage.setRotation(-20);//旋转 弧度
waterMarkImage.setRotationDegrees(-45);//旋转 角度
waterMarkImage.scalePercent(100);//依照比例缩放
return waterMarkImage;
}
/**
* 对于已存在的PDF文件增加图片水印
* @param sourceUrl
* @param outfileUrl
* @param imgUrl
*/
public static void addPictureWaterMark(String sourceUrl,String outfileUrl,String imgUrl) {
try {
//Read file using PdfReader
PdfReader pdfReader = new PdfReader(sourceUrl);
//Modify file using PdfReader
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(outfileUrl));
//仅设置一个图片实例对象,整个PDF文档只应用一个图片对象,极大减少因为增加图片水印导致PDF文档大小增加
Image image = Image.getInstance(imgUrl);
// image.scaleAbsolute(100, 50);
// image.setAbsolutePosition(100f, 700f);
float pageWidth = 0;
float pageHeight = 0;
for(int i=1; i<= pdfReader.getNumberOfPages(); i++){
pageWidth = pdfReader.getPageSize(i).getWidth();
pageHeight = pdfReader.getPageSize(i).getHeight();
PdfContentByte content = pdfStamper.getUnderContent(i);
content.addImage(getSingletonWaterMarkImage(image,pageWidth*0.2f,pageHeight*0.4f));
}
pdfStamper.close();
pdfReader.close();
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
}
/**
* 对于已存在的PDF文件增加文字水印
* @param sourceUrl
* @param outfileUrl
* @param waterMarkText
* @throws IOException
* @throws DocumentException
*/
public static void addTextWaterMark(String sourceUrl,String outfileUrl,String waterMarkText,BaseFont baseFont) throws IOException, DocumentException {
PdfReader reader = new PdfReader(sourceUrl);
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(outfileUrl)));
PdfContentByte under;
int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数
for(int i = 1; i <= pageSize; i++) {
under = stamp.getUnderContent(i);// 水印在之前文本下
under.beginText();
under.setColorFill(BaseColor.CYAN);// 文字水印 颜色
under.setFontAndSize(baseFont,38);// 文字水印 字体及字号
under.setTextMatrix(300, 350);// 文字水印 起始位置
under.showText(waterMarkText);
under.endText();
// PdfGState gs = new PdfGState();
// gs.setFillOpacity(0.1f);// 设置透明度为0.2
// under.setGState(gs);
}
stamp.close();// 关闭
reader.close();
}