【问题标题】:Signature image extracted by itextsharp is crasheditextsharp 提取的签名图片崩溃
【发布时间】:2020-05-12 09:56:20
【问题描述】:

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

其中很多是正常的,但很少图像崩溃

我可以猜到一些原因:图像被加密了?使困惑?签名时。

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

【问题讨论】:

  • 第二张图是原图。
  • 请分享一个出现问题的示例 PDF 以供分析。
  • @mkl 感谢您的回复。这是sample pdf

标签: itext


【解决方案1】:

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

使用从另一个图像派生的软掩码

即在软蒙版为白色的情况下,图像中的红色被完全不透明地绘制;在面具是黑色的地方,它被完全透明地绘制,不可见;在蒙版中间有些灰色的地方,红色被绘制得有些透明。

您在your previous answer 中使用的ImageRenderListener 来自this older answer,并且只提取基本图像,而不是掩码。

您可以像这样对其进行改进,以提取与相应基础图像直接关联的软蒙版:

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");
    }
}

【讨论】:

  • 感谢您的宝贵时间。它工作正常!但现在它们都是黑底白图像。通过自定义软蒙版(我猜)是否可以获得与基本图像相同的外观(即白底红色图像)? @mkl
  • 掩码是掩码。要从基础图像和蒙版图像中获取单个图像,您必须将每个蒙版图像像素值作为不透明度 (alpha) 值添加到相应的基础图像像素。不幸的是,我不太了解位图 API,而且我所知道的是 Java API,而不是 .Net API。
  • 谢谢@mkl。你总是给出最好的答案和绝妙的主意:D
猜你喜欢
  • 2016-11-20
  • 2021-03-27
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 2021-02-06
  • 2019-03-08
相关资源
最近更新 更多