原因是你看到的图片是通过绘制那张大部分是红色的图片创建的
用从另一幅图像中提取的软掩模
即在软性蒙版是白色的地方,图像中的红色是完全不透明地画出来的;在蒙版是黑色的地方,它是完全透明地画出来的,不可见;在蒙版是一些灰色的中间,红色是有些透明地画出来的。
在 ImageRenderListener
你用 你之前的回答 是来自 这个旧答案 并且只提取基础图像,不提取遮罩。
你可以这样改进,也可以直接提取与各自基础图像相关联的软遮罩。
public class ExtImageRenderListener : IRenderListener
{
public List<System.Drawing.Image> Images = new List<System.Drawing.Image>();
public List<System.Drawing.Image> Masks = new List<System.Drawing.Image>();
public void BeginTextBlock()
{ }
public void EndTextBlock()
{ }
public void RenderText(TextRenderInfo renderInfo)
{ }
public void RenderImage(ImageRenderInfo renderInfo)
{
PdfImageObject imageObject = renderInfo.GetImage();
if (imageObject == null)
{
Console.WriteLine("Image {0} could not be read.", renderInfo.GetRef().Number);
}
else
{
Images.Add(imageObject.GetDrawingImage());
PRStream maskStream = (PRStream) imageObject.GetDictionary().GetAsStream(PdfName.SMASK);
if (maskStream != null)
{
PdfImageObject maskImageObject = new PdfImageObject(maskStream);
Masks.Add(maskImageObject.GetDrawingImage());
}
else
{
Masks.Add(null);
}
}
}
}
现在你可以同时处理图像和遮罩。
String source = @"stampForDebug.pdf";
String signatureFieldName = "Signature12";
using (PdfReader sourceReader = new PdfReader(source))
{
PdfStream xObject = (PdfStream)PdfReader.GetPdfObjectRelease(sourceReader.AcroFields.GetNormalAppearance(signatureFieldName));
PdfDictionary resources = xObject.GetAsDict(PdfName.RESOURCES);
ExtImageRenderListener strategy = new ExtImageRenderListener();
PdfContentStreamProcessor processor = new PdfContentStreamProcessor(strategy);
processor.ProcessContent(ContentByteUtils.GetContentBytesFromContentObject(xObject), resources);
System.Drawing.Image drawingImage = strategy.Images.First();
System.Drawing.Image drawingMask = strategy.Masks.First();
if (drawingImage != null)
{
drawingImage.Save(@"Signature12Image.png");
}
if (drawingMask != null)
{
drawingMask.Save(@"Signature12Mask.png");
}
}