I extracted some stamped signature images(png file) from pdf. like this
Lots of them are normal but few images are crashed.
I can guess some reasons: the image is encrypted? confused? when signing.
I'm new to itext, any idea will be appreciated.
I extracted some stamped signature images(png file) from pdf. like this
Lots of them are normal but few images are crashed.
I can guess some reasons: the image is encrypted? confused? when signing.
I'm new to itext, any idea will be appreciated.
The reason is that the image you see is created by drawing that mostly red image
with a soft mask derived from another image
I.e. where the soft mask is white, the red from the image is drawn completely opaquely; where the mask is black it is drawn completely transparently, invisibly; and where the mask is some gray in-between, the red is drawn somewhat transparently.
The ImageRenderListener
you use in your previous answer is from this older answer and only extracts the base image, not the mask.
You can improve it like this to also extract the soft masks directly associated with the respective base image:
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);
}
}
}
}
Now you can process both the image and the mask:
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");
}
}