公司最近有需求需要对pdf文件进行加水印操作,这里使用的是itext(另一个要钱。。),经过测试发现如果是文字水印会可选中(无法操作)但是影响美观,所以自己去做了个透明文字水印。。itext官网上有好几种加水印方法,也可以去上面拿,直接用的那种,例如每隔几页水印变一下之类的。废话少说直接上代码 注:LOGGER为Log4j日志打印的代码初学者可以删除或者替换成System.out.print();
1.maven依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.9</version>
</dependency>
2.加水印代码
/**
* 文件加水印
*
* @param src 需要加水印的原文件路径
* @param dest 加完水印生成文件的路径
* @param watermark 水印图片地址
* @throws IOException
* @throws DocumentException
*/
public Map<String, String> manipulatePdf1(String src, String dest,String watermark) {
Map<String, String> map = new HashMap();
try {
logger.info("成功调用插入水印方法");
PdfReader reader = new PdfReader(src);
map.put("primary",src);
logger.info("准备插入水印前的文件路径为:"+src);
int n = reader.getNumberOfPages();
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
logger.info("插入水印后的文件路径为:"+dest);
map.put("show",dest);
// image watermark
Image img = Image.getInstance(watermark);
logger.info("水印图片地址为:"+img);
float w = img.getScaledWidth();
float h = img.getScaledHeight();
// transparency
PdfGState gs1 = new PdfGState();
gs1.setFillOpacity(0.4f);
// properties
PdfContentByte over;
Rectangle pagesize;
float x, y;
// loop over every page
for (int i = 1; i <= n; i++) {
pagesize = reader.getPageSizeWithRotation(i);
x = (pagesize.getLeft() + pagesize.getRight()) / 2;
y = (pagesize.getTop() + pagesize.getBottom()) / 2;
over = stamper.getOverContent(i);
over.saveState();
over.setGState(gs1);
over.addImage(img, w, 0, 0, h, x - (w / 2), y - (h / 2));
over.restoreState();
}
logger.info("插入水印成功文件页数为"+n);
stamper.close();
reader.close();
} catch (IOException ioexception) {
logger.error("文件异常" + ioexception);
} catch (DocumentException documentexception) {
logger.error("文件操作异常" + documentexception);
}
return map;
}
新手记录博客,有问题请联系2517411084@qq.com