java ext pagesize_更改透明图像的不透明度/更改extgstate字典的值

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

a2a5161b-7a36-4e02-b5b5-5ef2385d9980.png

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

Java中,可以使用`java.nio.ByteBuffer`类来进行内存分配和管理,其中就包括了`pagesize`的概念。具体使用方法如下: 首先,需要使用`ByteBuffer.allocateDirect(int capacity)`方法来分配一个直接内存缓冲区。这个方法会分配一个大小为`capacity`的连续内存块,并返回一个`ByteBuffer`对象。 然后,可以使用`ByteBuffer.limit(int newLimit)`方法来设置缓冲区的限制大小,即缓冲区中实际可用的数据大小。这个方法可以用来模拟内存页的大小,限制每个缓冲区的大小为一个pagesize。 最后,可以使用`ByteBuffer.slice()`方法来创建一个新的缓冲区,这个缓冲区和原来的缓冲区共享同一块内存。这个方法可以用来实现内存共享,提高程序的运行效率。 下面是一个示例代码,展示了如何使用`ByteBuffer`来管理内存: ```java import java.nio.ByteBuffer; public class Test { public static void main(String[] args) { int pagesize = 4096; int capacity = pagesize * 10; // 分配10个pagesize大小的内存 ByteBuffer buffer = ByteBuffer.allocateDirect(capacity); // 设置缓冲区的限制大小为一个pagesize buffer.limit(pagesize); // 创建一个新的缓冲区,和原来的缓冲区共享同一块内存 ByteBuffer slice = buffer.slice(); // 输出缓冲区的大小和限制大小 System.out.println("capacity = " + buffer.capacity() + ", limit = " + buffer.limit()); System.out.println("slice capacity = " + slice.capacity() + ", limit = " + slice.limit()); } } ``` 在这个示例中,我们首先分配了一个大小为10个pagesize的内存块,然后设置缓冲区的限制大小为一个pagesize,最后使用`slice()`方法创建了一个大小为一个pagesize的新缓冲区,并和原来的缓冲区共享同一块内存。输出结果如下: ``` capacity = 40960, limit = 4096 slice capacity = 4096, limit = 4096 ``` 可以看到,原来的缓冲区大小为10个pagesize,限制大小为一个pagesize,而新的缓冲区大小和限制大小都为一个pagesize。这样就实现了对内存的管理和分配,以及内存共享的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值