使用PDFBox创建透明度组或设置图形状态软遮罩

使用PDFBox创建透明度组或设置图形状态软遮罩,pdf,pdf-generation,pdfbox,mask,Pdf,Pdf Generation,Pdfbox,Mask,我有一个用作软遮罩的灰度图像,我想在一组PDF对象(图像或路径)上使用它 掩码和对象不一定使用相同的变换矩阵,并且可能有多个对象要掩码,因此排除了使用ImageXObject字典的SMask属性的可能性 因此,在阅读了一些PDF规范之后,看起来我应该做以下工作:创建一个包含要遮罩的对象的透明度组,然后使用图形状态上设置的软遮罩绘制它 这样行吗?如何实现这一点,最好使用PDFBox? 这里有一个例子。我有两个图像:面具和另一个图像 遮罩图像为200x200。它是用矩阵[[4 0 100][

我有一个用作软遮罩的灰度图像,我想在一组PDF对象(图像或路径)上使用它

掩码和对象不一定使用相同的变换矩阵,并且可能有多个对象要掩码,因此排除了使用ImageXObject字典的
SMask
属性的可能性

因此,在阅读了一些PDF规范之后,看起来我应该做以下工作:创建一个包含要遮罩的对象的透明度组,然后使用图形状态上设置的软遮罩绘制它

这样行吗?如何实现这一点,最好使用PDFBox?
这里有一个例子。我有两个图像:面具和另一个图像

  • 遮罩图像为200x200。它是用矩阵
    [[4 0 100][0 4 100]]
    绘制的
  • 图像是400x300。它是用矩阵
    [[2 0 100][0 2 150]]
    绘制的
  • 此外,在没有变换矩阵的图像下方绘制一个400x400黑色正方形
因此,使用图像和正方形创建透明度组,然后使用遮罩图像绘制透明度组。以下是预期结果:


就效果而言相当难看,但这只是一个例子。

就我所见,在PDFBox中建立扩展图形状态软掩码是一项非常手动的任务。您可以按如下方式进行操作:

try(PDDocument=newpddocument()){
最终PDImageXObject图像=检索照片图像;
最终PDImageXObject掩码=检索掩码图像;
PDTransparencyGroupAttributes transparencyGroupAttributes=新的PDTransparencyGroupAttributes();
transparencyGroupAttributes.getCOSObject().setItem(COSName.CS,COSName.DEVICEGRAY);
PDTransparencyGroup transparencyGroup=新的PDTransparencyGroup(文档);
transparencyGroup.setbox(PDRectangle.A4);
transparencyGroup.setResources(新的PDResources());
transparencyGroup.getCOSObject().setItem(COSName.GROUP,transparencyGroupAttributes);
try(PDFormContentStream画布=新PDFormContentStream(透明组)){
drawImage(掩码,新矩阵(400,0,0,400,100,100));
}
COSDictionary softMaskDictionary=新COSDictionary();
setItem(COSName.S,COSName.LUMINOSITY);
setItem(COSName.G,transparencyGroup);
PDExtendedGraphicsState extendedGraphicsState=新的PDExtendedGraphicsState();
extendedGraphicsState.getCOSObject().setItem(COSName.SMASK,softMaskDictionary);
PDPage page=新的PDPage(PD矩形.A4);
文件。添加页(第页);
try(pdpagecontentstreamcanvas=newpdpagecontentstream(文档,页面)){
canvas.saveGraphicsState();
canvas.setGraphicsStateParameters(extendedGraphicsState);
canvas.setNonSrokingColor(Color.BLACK);
addRect(100100400400);
canvas.fill();
drawImage(图像,新矩阵(400,0,0,300,100,150));
canvas.restoreGraphicsState();
}
保存(新文件(结果文件夹“SoftMaskedImageAndRectangle.pdf”);
}
结果是:


如果我是你,我不会使用位图图像作为软遮罩,而是使用PDF渐变。结果很可能会少很多像素化。

非常感谢!我希望它是非常手动的,这不是一个问题。我通常会使用渐变,但我是从另一种格式转换的,所以我使用转换的任何文件作为遮罩。作为记录,在大多数查看器中,当将要遮罩的对象直接绘制到页面内容流时,我都会遇到渲染问题(对于单个对象来说效果很好)。因此,我使用了第二个透明度组对对象进行分组,以便将它们合成为单个对象。然后,我使用
drawForm
将这个组绘制到页面上。