我正在尝试使用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的值来设置水印的唯一方法,如此处所示

itextrups-screenshot

是否有人能够告诉我是否可以从代码或任何替代方法更改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();