如何使用iTextSharp密码保护数字签名的pdf?

时间:2012-09-22 06:57:59

标签: c# asp.net pdf digital-signature pfx

我正在使用c#,itextsharp创建和签署pdf。现在我使用此代码进行密码保护和数字签名。首先我用密码保护。我正在签名。

传输的pdf在打开时没有询问密码? 有人能告诉我为什么会这样吗?

谢谢..

string passprotectedfile = filename;

using (Stream input = new FileStream(signedfile, FileMode.Open, FileAccess.Read,
                                     FileShare.Read))
{
    using (Stream output = new FileStream(passprotectedfile, FileMode.Create, 
                                          FileAccess.Write, FileShare.None))
    {
        PdfReader reader = new PdfReader(input);
        PdfEncryptor.Encrypt(reader, output, true, regno.ToString(), "",
                             PdfWriter.ALLOW_SCREENREADERS);
    }
}

我用于数字签名的代码。

        PdfReader reader = new PdfReader(filename,pass);
        Stream output = new FileStream(signedfile, FileMode.Create, FileAccess.Write, FileShare.None);
        PdfStamper stamper = PdfStamper.CreateSignature(reader, output, '\0');

        Rectangle rect = new Rectangle(455, 105, 555, 170);
        PdfSignatureAppearance appearance = stamper.SignatureAppearance;
        appearance.SetVisibleSignature(rect, 1, "sign");
        PdfSignature dic = new PdfSignature(PdfName.ADOBE_PPKLITE, new PdfName("adobe.pkcs7.detached"));
        PrivateKeySignature pks = new PrivateKeySignature(pk, "SHA-256");
        MakeSignature.SignDetached(appearance, pks, chain, null, null, null, 0, true);
        return filename;

然后我正在传播。

            Response.ContentType = "application/pdf";
            Response.AddHeader("content-disposition", "attachment;filename=tes2.pdf");
            Response.TransmitFile(signedfile);
            Response.Flush();

            File.Delete(signedfile);
            File.Delete(newfile);
            File.Delete(passprotectedfile);

1 个答案:

答案 0 :(得分:2)

您正在使用所有者密码创建PdfReader实例,该密码允许iText解密受密码保护的PDF。这就解释了为什么密码保护消失了:你告诉iText解密文件。

如果您想要一个已签名和加密的文件,您需要一次性执行这两项操作,而不是按顺序执行! PdfStamper类具有允许您设置加密的不同方法。在stamper对象上使用这些方法之一。