2016-06-15 7 views
0

私は任意のpdfのすべてのページにデジタル署名しようとしています。しかし、それは最初または最後のページにしか署名しません。私は問題がMakeSignature.SignDetached()メソッドにあることを理解していると思います。このメソッドはすべてのストリームを閉じ、さらに署名するためにpdfを閉じます。MakeSignature.SignDetached()メソッドを使用せずにpdfにデジタル署名する方法はありますか?

マイコード:

public static void SignInForEveryPage(string input, string output, PDFEncryption pdfEnc, bool encrypt, bool passCheck, string pass) { 
      X509CertificateParser cp = new X509CertificateParser(); 
      X509Certificate[] chain = { cp.ReadCertificate(CertInfo.MyCert.RawData) }; 

      IExternalSignature externalSignature = new X509Certificate2Signature(CertInfo.MyCert, "SHA-1"); 
      //Setup signature 
      if(File.Exists(output)) { 
       File.Delete(output); 
      } 
      PdfSignatureAppearance signatureAppearance=null; 
      PdfSignatureAppearance tempAppearance = null; 

      PdfReader reader = new PdfReader(input); 
      FileStream firstFileStream = new FileStream(output, FileMode.Create, FileAccess.ReadWrite); 
      PdfStamper pdfStamper = PdfStamper.CreateSignature(reader, firstFileStream, '\0', null, true); 

      for(int index = 1; index <= reader.NumberOfPages; index++) { 
       if(encrypt && pdfEnc != null) { 
        pdfEnc.Encrypt(pdfStamper); 
       } 
       if(passCheck) { 
        pdfStamper.SetEncryption(PdfWriter.STRENGTH128BITS, "123", "123", PdfWriter.ALLOW_COPY); 
        //Set password of output file 
       } 

       //Write the metadata 
       pdfStamper.MoreInfo = MetaData.GetMetaData(); 
       pdfStamper.XmpMetadata = MetaData.GetStreamedMetaData(); 

       //Set signature appearance 
       signatureAppearance = pdfStamper.SignatureAppearance; 
       signatureAppearance.Reason = ReasonText; //Reason 
       signatureAppearance.Contact = ContactText; //Contact 
       signatureAppearance.Location = LocationText; //Location 

       byte[] rawData = null; 
       var customText = ""; 

       //Set the text shown in signature 
       customText += "Digitally Signed by:\n"; 
       customText += CertInfo.CertName + "\n"; 

       if(!string.IsNullOrEmpty(LocationText)) { 
        customText += "Location: "; 
        customText += LocationText + "\n"; 
       } 

       if(!string.IsNullOrEmpty(ReasonText)) { 
        customText += "Reason: "; 
        customText += ReasonText + "\n"; 
       } 

       customText += "Date: "; 
       customText += DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss K") + "\n"; 
       customText = customText.TrimEnd(); 

       //set the image shown in signature 
       if(ShowImage && SignaturePictureImage != null) { 
        using(MemoryStream memoryStream = new MemoryStream()) { 
         SignaturePictureImage.Save(memoryStream, ImageFormat.Bmp); 
         rawData = memoryStream.ToArray(); 
        } 
       } 

       //For signature position and size 
       var sigX = Mm2Pt(LeftNumValue); 
       var sigY = Mm2Pt(BottomNumValue); 
       var sigW = Mm2Pt(WidthNumValue); 
       var sigH = Mm2Pt(HeightNumValue); 

       //Draw the rectangle for signature field 
       //pdfStamper.Reader.GetPageSize(index); 
       signatureAppearance.SignatureGraphic = rawData == null ? null : iTextSharp.text.Image.GetInstance(rawData); 
       signatureAppearance.Layer2Text = customText; 
       signatureAppearance.Layer4Text = ""; //if null or not set then it will show 'signature not valid' 
       signatureAppearance.Acro6Layers = true; 
       if(signatureAppearance.SignatureGraphic != null) { 
        signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.GRAPHIC_AND_DESCRIPTION; 
        //show image first then text in the signature 
       } 
       signatureAppearance.SetVisibleSignature(new Rectangle(sigX, sigY, sigX + sigW, sigY + sigH), index, null); 
       signatureAppearance.GetLayer(1); 
       tempAppearance = signatureAppearance; 
       MakeSignature.SignDetached(tempAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CMS); 
      } 
     } 

私はiTextSharpライブラリを使用しています。このコードを修正する方法はありますか?

+0

厳密には「iTextを使用しているすべてのドキュメントのページにデジタルPDF署名を表示する方法」(http://stackoverflow.com/a/35724742/1729265)はiTextではなくiTextSharpですが、そこからの引数同じように保持する。 – mkl

+0

ありがとう@mkl、私はyoyがすべての議論の概要を作ったのを知らなかった。私はちょうどそれをupvoted。 –

+0

@furiousNoob *このメソッドは、すべてのストリームを閉じ、さらに署名するためにpdfを閉じます。*すでに統合PDF署名の問題を認識していた場合は、 "1つの視覚化で複数の署名(複数の署名)"を私が参照した答え、そして現在は実装の難しさがありますので、それに応じてあなたの質問を更新してください。結局それは再び開かれ、答えられるでしょう。 – mkl

答えて

0

「PDFにはすべてのページに署名する」というようなものはありません。デジタル署名(可視または不可視のいずれか)が完全な文書に署名する。

「ページに署名する」という概念は、単にPDFには存在しません。

目に見える署名を使用する場合は、PDF内のページにウィジェットアノテーションを配置します。 1つの署名は、1つのページ上の1つのウィジェットアノテーションにのみ対応できます。

これは、ISO-32000-1を読むときにはっきりしない場合がありますが、ISO-32000-2では明示的に明記されています。

要約:あなたの質問が間違っているため、あなたの質問に答えがありません。あなたは、その署名のウィジェットアノテーションを使ってデジタル署名(おそらく不可視、完全な文書:すべてのページ、すべての添付ファイル、すべてのメタデータ)を混同しています。

PS:このメッセージは、ベルリンのthe PDF Daysから公開されています。ちょうど1時間半(ベルリンでは11時45分)に、iTextエンジニアがあなたに持ってきたこの件に関するライブストリームに従うことができます。 https://twitter.com/iText/status/742975159976493056

+0

*あなたはライブストリームに従うことができます* - おっと、私はライブストリームについて知りませんでした。ここでそれを切り替えました。 ;) – mkl

+0

私は昨日私の話であなたに言及しました:SOの3つのマスター(3つの金メダル)があります。これら3つのうち2つは、ベルリンのPDFデーにあります。私たちはあなたを見逃していた... –

関連する問題