1

PDF ドキュメントを認証する C# アプリケーションを開発しています。認証プロセスは完了しましたが、スマートカードに保存されている署名画像を取得して、指定された PDF ファイルに配置する必要があります。証明書を取得するために使用されるコードは次のとおりです。

public static X509Certificate2 GetCertificate()
    {
        X509Store st = new X509Store(StoreName.My, StoreLocation.CurrentUser);
        st.Open(OpenFlags.ReadOnly);
        X509Certificate2Collection col = st.Certificates;
        X509Certificate2 card = null;
        X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(col, "Certificates", "Select one to sign", X509SelectionFlag.SingleSelection);
        if (sel.Count > 0)
        {
            X509Certificate2Enumerator en = sel.GetEnumerator();
            en.MoveNext();
            card = en.Current;
        }
        st.Close();
        return card;
    }

そして、選択したものをここのドキュメントに適用します。

            if(card == null)
            {
            ChooseCertified:
                card = GetCertificate();

                if (card == null)
                {
                    DialogResult result = MessageBox.Show("Unable to identify certificates" +
                                           Environment.NewLine + "Would you like to try again?", "Certification error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question);

                    if (result.CompareTo(DialogResult.Retry) == 0)
                        goto ChooseCertified;
                    else
                        return 1;
                }
            }

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

            PdfReader reader = new PdfReader(original_pdf_file);

            PdfStamper stp = PdfStamper.CreateSignature(reader, new FileStream(result_pdf_file, FileMode.Create), '\0', null, true);

            PdfSignatureAppearance sap = stp.SignatureAppearance;

            sap.Layer2Text = "Document signed by " + Environment.NewLine +
                                card.GetNameInfo(X509NameType.SimpleName, false) + Environment.NewLine +
                                "Date: " + date.ToString("dd-MM-yyyy") + Environment.NewLine +
                                "Reason: " + REASON;        
            iTextSharp.text.Rectangle rct = reader.GetPageSizeWithRotation(1);
            float lowerx = 0, upperx = 0, lowery = 0, uppery = 0;
            if (valign == "top")
            {
                lowery = (rct.Height - height) - vert_margin;
                uppery = rct.Height - vert_margin;
            }
            else
            {
                lowery = vert_margin;
                uppery = vert_margin + height;
            }
            if (halign == "left")
            {
                lowerx = hor_margin;
                upperx = hor_margin + width;
            }
            else
            {
                lowerx = (rct.Width - width) - hor_margin;
                upperx = rct.Width - hor_margin;
            }
            sap.SetVisibleSignature(new iTextSharp.text.Rectangle(lowerx, lowery, upperx, uppery),1, null);
            sap.SignDate = date;
            sap.SetCrypto(null, chain, null, null);
            sap.Reason = REASON;
            sap.Location = LOCATION;
            iTextSharp.text.Font f = new iTextSharp.text.Font(iTextSharp.text.Font.HELVETICA, 7, 1, iTextSharp.text.Color.BLACK);
            f.SetStyle("Bold");
            sap.Layer2Font = f;
            sap.Acro6Layers = true;

            PdfSignature dic = new PdfSignature(PdfName.ADOBE_PPKMS, PdfName.ADBE_PKCS7_SHA1);
            dic.Date = new PdfDate(date);
            dic.Name = PdfPKCS7.GetSubjectFields(chain[0]).GetField("CN");
            dic.Reason = REASON;
            dic.Location = LOCATION;
            sap.CryptoDictionary = dic;
            int csize = 4000;
            Hashtable exc = new Hashtable();
            exc[PdfName.CONTENTS] = csize * 2 + 2;
            sap.PreClose(exc);

            HashAlgorithm sha = new SHA1CryptoServiceProvider();
            Stream s = sap.RangeStream;
            int read = 0;
            byte[] buff = new byte[8192];
            while ((read = s.Read(buff, 0, 8192)) > 0)
            {
                sha.TransformBlock(buff, 0, read, buff, 0);
            }
            sha.TransformFinalBlock(buff, 0, 0);

            byte[] pk = SignMsg(sha.Hash, card, false);

            byte[] outc = new byte[csize];

            PdfDictionary dic2 = new PdfDictionary();

            Array.Copy(pk, 0, outc, 0, pk.Length);

            dic2.Put(PdfName.CONTENTS, new PdfString(outc).SetHexWriting(true));
            sap.Close(dic2);

だから私が今必要としているのは、カードに保存されている署名画像を取得する方法であり、多くのグーグル検索の後、この問題に関して何も見つかりませんでした. 誰かがこれで私を助けることができれば、私は本当に感謝しています。

前もって感謝します :)

4

0 に答える 0