我正在尝试使用java中的itext 7实现一个不可见的水印功能。到目前为止,我已设法使用以下代码实现将水印嵌入到所有页面:
PdfDocument pdfdoc = new PdfDocument(new PdfReader(source),new PdfWriter(dest));
Document doc = new Document(pdfdoc);
PdfCanvas canvas;
Rectangle pagesize;
PdfExtGState qrcode = new PdfExtGState();
qrcode.setFillOpacity(0); // sets opacity of watermark.
byte[] bytearray = convertBI(watermark);
ImageData imgd = ImageDataFactory.create(bytearray);
float w = imgd.getWidth() , h = imgd.getHeight();
float x,y;
for(int i = 1;i<=pdfdoc.getNumberOfPages();i++)
{
PdfPage page = pdfdoc.getPage(i);
pagesize = page.getPageSizeWithRotation();
page.setIgnorePageRotationForContent(true);
x = (pagesize.getLeft() + pagesize.getRight())/ 2;
y = (pagesize.getTop() + pagesize.getBottom())/ 2;
canvas = new PdfCanvas(pdfdoc.getPage(i));
canvas.saveState();
canvas.setExtGState(qrcode);
canvas.addImage(imgd,w,0,0,h,x-(w/2),y-(h/2),true);
canvas.restoreState();
}
doc.close();
然而,我在检索水印时遇到了麻烦。到目前为止,我已经尝试在另一个画布上重新绘制页面并设置填充不透明度,但无济于事。我设法通过使用itext-rup并手动更改extGS的值来设置水印的唯一方法,如此处所示
是否有人能够告诉我是否可以从代码或任何替代方法更改extGState字典的值以实现相同的结果?
更新:所以我试图在代码中访问字典,但它只返回空值。
PdfDocument pdfdoc = new PdfDocument(new PdfReader(source),new PdfWriter(dest)); 文件doc = new Document(pdfdoc);
for(int pageNo = 1; pageNo<= pdfdoc.getNumberOfPages();pageNo++)
{
PdfPage pdfpage = pdfdoc.getPage(pageNo);
PdfResources rsrc = pdfpage.getResources();
PdfDictionary pExtGSD = rsrc.getResource(PdfName.ExtGState);
if(!pExtGSD.isEmpty())
{
System.out.println(pExtGSD.getAsFloat(new PdfName("/Gs1")));
}
}
doc.close();