【问题标题】:c# itextsharp how to get digital signature imagec#itextsharp如何获取数字签名图片
【发布时间】:2016-11-20 17:19:35
【问题描述】:

是否可以使用 c# 代码通过 itextsharp 获取 pdf 文件中任何数字签名的图像?

PdfReader pdf = new PdfReader("location.pdf");
AcroFields acroFields = pdf.AcroFields;
List<string> names = acroFields.GetSignatureNames();

foreach (var name in names)
{
    PdfDictionary dict = acroFields.GetSignatureDictionary(name);
}

通过这些简单的行,我可以获取签名字典,但无法从该对象获取图像的内容。 有人可以帮忙吗?

【问题讨论】:

    标签: c# pdf itext digital-signature


    【解决方案1】:

    我回答我自己的问题...如果它对其他人有用,我就是这样做的。 我找到了一个 Java 类来做我正在寻找的事情,并用 C# 翻译了它。

    class XyzmoSignatureDataExtractor
    {
        private PdfReader reader;
    
        public XyzmoSignatureDataExtractor(PdfReader reader)
        {
            this.reader = reader;
        }
    
        public PdfImageObject extractImage(String signatureName) 
        {
            MyImageRenderListener listener = new MyImageRenderListener();
    
            PdfDictionary sigFieldDic = reader.AcroFields.GetFieldItem(signatureName).GetMerged(0);
            PdfDictionary appearancesDic = sigFieldDic.GetAsDict(PdfName.AP);
            PdfStream normalAppearance = appearancesDic.GetAsStream(PdfName.N);
    
            PdfDictionary resourcesDic = normalAppearance.GetAsDict(PdfName.RESOURCES);
    
            PdfContentStreamProcessor processor = new PdfContentStreamProcessor(listener);
            processor.ProcessContent(ContentByteUtils.GetContentBytesFromContentObject(normalAppearance), resourcesDic);        
    
            return listener.image;
        }
    
        class MyImageRenderListener : IRenderListener
        {
            public void BeginTextBlock() { }
    
            public void EndTextBlock() { }
    
            public void RenderImage(ImageRenderInfo renderInfo)
            {
                try
                {
                    image = renderInfo.GetImage();
                }
                catch (Exception e)
                {
                    throw new Exception("Failure retrieving image", e);
                }
            }
    
            public void RenderText(TextRenderInfo renderInfo) { }
    
            public PdfImageObject image = null;
        }
    
    }
    

    要使用该类并保存图像,我只是这样做:

    PdfReader reader = new PdfReader("location.pdf");
    XyzmoSignatureDataExtractor extractor = new XyzmoSignatureDataExtractor(reader);
    AcroFields acroFields = reader.AcroFields;
    
    foreach (string name in  acroFields.GetSignatureNames())
    {
    
      PdfImageObject image = extractor.extractImage(name);
    
      var _image = image.GetDrawingImage();
      string file_name = "sig." + image.GetFileType();
      _image.Save(file_name);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      相关资源
      最近更新 更多