C#iTextSharp的如何获得数字签名图像 [英] c# itextsharp how to get digital signature image

查看:2536
本文介绍了C#iTextSharp的如何获得数字签名图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有可能使用C#代码来获得任何数字签名的图像与iTextSharp的PDF文件?

Is it possible to get the image of any digital signatures in a pdf file with itextsharp using c# code?

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

通过这个简单的线条,我可以拿到签名的词典,但从此对象我是不能够获得图像的内容。
谁能帮助?

With this simple lines i can get the signature dictionaries but from this object i am not able to get the content of the image. Can anyone help?

推荐答案

我回答我的问题...如果它可能是有用的,以别人我这样做是这样。
我发现了一个Java类做什么,我一直在寻找,我把它翻译在C#。

I answer my own question... if it could be usefull to someone else i did it like this. I found a Java class to do what i was looking for and I translated it in 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;
    }

}

要使用的类和保存像我只是做这样的:

To use the class and save the image i just do like that:

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

这篇关于C#iTextSharp的如何获得数字签名图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆