C# ABCpdf签名和加密不并发工作

C# ABCpdf签名和加密不并发工作,c#,pdf,abcpdf,C#,Pdf,Abcpdf,我有一个PDF文档,它需要进行数字签名和加密。 我使用的是ABCPDF,当我将数字签名应用于加密的文档时,签名将失效 Adobe Acrobat Reader提供的错误是:“对本文档所做的更改使签名无效” 源代码: using (Doc doc = new Doc()) { doc.Read(pdfPath); if (options.Encrypt) { doc.Encryption.Type = 4; doc.Encryption.S

我有一个PDF文档,它需要进行
数字签名
加密
。 我使用的是
ABCPDF
,当我将数字签名应用于加密的文档时,签名将失效

Adobe Acrobat Reader
提供的错误是:“对本文档所做的更改使签名无效”

源代码:

using (Doc doc = new Doc())
{
    doc.Read(pdfPath);
    if (options.Encrypt) 
    {
        doc.Encryption.Type = 4;
        doc.Encryption.SetCryptMethods(CryptMethodType.AESV3);
        doc.Encryption.Password = Encryption.Decrypt(options.UserPassword, PdfSecurityOptions.EncryptionPassword);
        doc.Encryption.OwnerPassword = Encryption.Decrypt(options.OwnerPassword, PdfSecurityOptions.EncryptionPassword);
    }
    if (options.Sign)
    {
        byte[] bytes = Convert.FromBase64String(options.Certificate);
        X509Certificate2 certificate = new X509Certificate2(bytes, Encryption.Decrypt(options.CertificatePassword, PdfSecurityOptions.EncryptionPassword), X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
        PdfUtils.DigitallySign(
            doc,
            options.SignatureText,
            options.Rectangle, 
           certificate
        );
    }  
    doc.Save(savePath);
}
我试过:

using (Doc doc = new Doc())
{
    doc.Read(pdfPath);
    if (options.Encrypt) 
    {
        doc.Encryption.Type = 4;
        doc.Encryption.SetCryptMethods(CryptMethodType.AESV3);
        doc.Encryption.Password = Encryption.Decrypt(options.UserPassword, PdfSecurityOptions.EncryptionPassword);
        doc.Encryption.OwnerPassword = Encryption.Decrypt(options.OwnerPassword, PdfSecurityOptions.EncryptionPassword);
    }
    if (options.Sign)
    {
        byte[] bytes = Convert.FromBase64String(options.Certificate);
        X509Certificate2 certificate = new X509Certificate2(bytes, Encryption.Decrypt(options.CertificatePassword, PdfSecurityOptions.EncryptionPassword), X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
        PdfUtils.DigitallySign(
            doc,
            options.SignatureText,
            options.Rectangle, 
           certificate
        );
    }  
    doc.Save(savePath);
}
  • 在签名之前应用加密
  • 签名后应用加密
  • 应用加密,保存文档,然后加载并签名

签名完成后,您不能再执行签名;这样做会损坏第一个签名

为了避免这种情况,您必须在每次签名完成时使用增量更新。 查看Abcpdf在线文档



我已经测试了你的代码,签名看起来还可以。我认为您添加字段的方式存在问题。我看到您正在使用Abcpdf示例代码。也许你需要一些改变。你能提供一个pdf样本吗

签名完成后,您不能再执行签名;这样做会损坏第一个签名

为了避免这种情况,您必须在每次签名完成时使用增量更新。 查看Abcpdf在线文档



我已经测试了你的代码,签名看起来还可以。我认为您添加字段的方式存在问题。我看到您正在使用Abcpdf示例代码。也许你需要一些改变。你能提供一个pdf样本吗

OP只想制作一个签名(与PDF中可能的并发加密相结合)…OP只想制作一个签名(与PDF中可能的并发加密相结合)…我编辑了应答器可能会尝试保存到流中,然后从中间重新加载文件?我编辑了应答器可能会尝试保存到流中,然后从中间重新加载文件?