首页 > 解决方案 > C# 使用带有外部服务的 itext 签署 pdf

问题描述

我需要使用外部网络服务签署 pdf。但是签名 pdf 上有一个错误,例如文档自签名以来已被更改或损坏。

这是屏幕截图

static void Main(string[] args)
    {
        //StreamSign();
        PdfReader reader = new PdfReader(@"E:\pdf-exampleSign\example.pdf");
        //MemoryStream os = new MemoryStream();
        FileStream os = File.OpenWrite(@"E:\pdf-exampleSign\example_tmp.pdf");

        PdfStamper stamper = PdfStamper.CreateSignature(reader, os, '\0');
        PdfSignatureAppearance appearance = stamper.SignatureAppearance;
        appearance.SetVisibleSignature(new iTextSharp.text.Rectangle(36, 748, 144, 780), 1, "Signature");
        IExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
        MakeSignature.SignExternalContainer(appearance, external, 20000);

        byte[] hash = SHA256Managed.Create().ComputeHash(appearance.GetRangeStream());

        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < hash.Length; i++)
        {
            builder.Append(hash[i].ToString("x2"));
        }
        var hex = builder.ToString();

        //HERE IS THE SERVER SIDE BASE64 STRING I GOT
        string ServerSideSignedBytes = "MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgE.....";
        byte[] signbytes = Convert.FromBase64String(ServerSideSignedBytes);

        X509Certificate2 certt = new X509Certificate2(signbytes);
        var cert = new Org.BouncyCastle.X509.X509CertificateParser().ReadCertificate(certt.GetRawCertData());
        Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[1];
        chain[0] = cert;

        using (PdfReader prereader = new PdfReader(@"E:\pdf-exampleSign\example_tmp.pdf"))
        {
            using (FileStream preos = File.OpenWrite(@"E:\pdf-exampleSign\example_signed.pdf"))
            {
                IExternalSignatureContainer externallast = new MyExternalSignatureContainer(signbytes, chain);
                MakeSignature.SignDeferred(prereader, "Signature", preos, externallast);
            }
        }
    }
public class MyExternalSignatureContainer : IExternalSignatureContainer
{
    protected byte[] sig;
    protected Org.BouncyCastle.X509.X509Certificate[] chain;
    public MyExternalSignatureContainer(byte[] sig, Org.BouncyCastle.X509.X509Certificate[] chain)
    {
        this.sig = sig;
        this.chain = chain;
    }
    public byte[] Sign(Stream s)
    {
        return sig;
    }
    public void ModifySigningDictionary(PdfDictionary signDic) { }
}

标签: c#itextdigital-signature

解决方案


推荐阅读