PDF格式的数字签名

时间:2008-12-22 16:12:50

标签: pdf digital-signature digital-certificate

我正在尝试使用THIS项目对PDF文件进行数字签名。

执行st.Close()时;我得到臭名昭着的“对象引用未设置为对象的实例”。

我不知道为什么会发生这种情况,st是一个对象的实例,它在上面使用。这个异常发生在.Close()中,因为我没有源代码,我只能猜测为什么......

我只能说:

  1. 原始PDF已成功阅读。
  2. 正在生成一个空的pdf(我猜.Close()将写入该文件)。
  3. 我的证书正在加载,但我不确定这是正确的方法。
  4. 以下是我如何加载证书:

    private void processCert(X509Certificate2 card)
    {
        X509CertificateParser cp = new org.bouncycastle.x509.X509CertificateParser(card.RawData);
        chain = new org.bouncycastle.x509.X509Certificate[] { cp.ReadCertificate() };
    }
    

    这就是我试图签署PDF的方式。

    public string Sign(string SigReason, string SigContact, string SigLocation, bool visible)
    {
        string bugLog ="";
        try
        {
            PdfReader reader = new PdfReader(this.inputPDF);
    
            //Activate MultiSignatures
            PdfStamper st = PdfStamper.CreateSignature(reader, new FileStream(this.outputPDF, FileMode.Create, FileAccess.Write), '\0', null, true);
    
            FileStream(this.outputPDF, FileMode.Create, FileAccess.Write), '\0'); 
    
            st.MoreInfo = this.metadata.getMetaData();
    
            st.XmpMetadata = this.metadata.getStreamedMetaData();
    
            PdfSignatureAppearance sap = st.SignatureAppearance;
    
            sap.SetCrypto(this.myCert.Akp, this.myCert.Chain, null, PdfSignatureAppearance.WINCER_SIGNED);
    
            sap.Reason = SigReason;
            sap.Contact = SigContact;
            sap.Location = SigLocation;
    
            if (visible)
               sap.SetVisibleSignature(new iTextSharp.text.Rectangle(100, 100, 250, 150), 1, null);
    
            st.Close();
        }
        catch (Exception e)
        {
            bugLog += " ERROR Sign: " + e.Message;
        }
    
        return buglog;
      }
    

    有没有人知道为什么我会得到这个例外,或者我该怎么做才能克服这个问题?

    iTextSharp文档没有多大帮助...

1 个答案:

答案 0 :(得分:1)

我现在已经设法使这项工作了:)这个例子的一些小改动就可以了;)

http://itextpdf.sourceforge.net/howtosign.html#signextitextsharp2