由itextsharp提取的签名图象崩溃了

问题描述 投票:0回答:1

我从pdf中提取了一些盖章的签名图片(png文件)。像这样

很多都是正常的,但 少数 图像是 崩溃.crashed image

original appearance

我可以猜测一些原因:图像是加密的吗? 签名时困惑?

我是itext的新手,任何想法都将被感激。

itext
1个回答
2
投票

原因是你看到的图片是通过绘制那张大部分是红色的图片创建的

image

用从另一幅图像中提取的软掩模

soft mask

即在软性蒙版是白色的地方,图像中的红色是完全不透明地画出来的;在蒙版是黑色的地方,它是完全透明地画出来的,不可见;在蒙版是一些灰色的中间,红色是有些透明地画出来的。

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");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.