2016-06-15 2 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)"은 iTextSharp가 아니라 iText에 관한 것이지만 그곳의 인수는 동일하게 유지하십시오. – mkl

+0

감사합니다. @mkl, 나는 모든 주장을 요약 한 것을 몰랐습니다. 나는 방금 그것을 upvoted. –

+0

@furiousNoob *이 메서드는 모든 스트림을 닫고 추가 서명을 위해 pdf를 닫습니다. * 이미 통합 된 PDF 서명 문제를 알고있는 경우 "각 단일 시각화로 여러 서명 (한 페이지 당 하나씩)"을 선택했습니다. 내가 참조한 대답, 그리고 지금 구현에 어려움이 있으니 그에 맞게 질문을 업데이트하십시오. 결국 다시 열리고 대답 될 것입니다. – mkl

답변

0

"PDF의 모든 페이지에 서명하십시오."와 같은 것은 없습니다. 디지털 서명 (보이거나 보이지 않음)은 전체 문서에 서명합니다.

"페이지 서명"이라는 개념은 단순히 PDF에 존재하지 않습니다.

보이는 서명을 사용하는 경우 PDF의 페이지에 위젯 주석을 넣습니다. 하나의 서명은 한 페이지에서만 하나의 위젯 주석과 만 대응할 수 있습니다.

ISO-32000-1을 읽을 때 명확하지 않을 수도 있지만 ISO-32000-2에서 명확하게 설명되어 있습니다.

간단히 말해서 질문이 잘못 되었기 때문에 귀하의 질문에 대한 답변이 없습니다. 해당 서명의 위젯 주석을 사용하여 디지털 서명 (보이지 않는 것, 전체 문서에 서명 : 모든 페이지, 모든 첨부 파일, 모든 메타 데이터)을 혼동하는 것입니다.

추신 :이 메시지는 베를린의 the PDF Days에서 생중계됩니다. 정확하게 1 시간 반 (베를린에서 11시 45 분)에 iText 엔지니어가 가져온이 주제에 대한 실시간 스트림을 따라갈 수 있습니다. https://twitter.com/iText/status/742975159976493056

+0

* 라이브 스트림을 팔로우 할 수 있습니다. * - 죄송합니다. 라이브 스트림에 대해 알지 못했습니다. 여기서 스위치를 켰어, 고맙습니다. ;) – mkl

+0

나는 어제 내 이야기에서 당신을 언급했다. 거기에는 3 개의 주인공이있다 (3 개의 금메달). 이 3 개 중 2 개가 베를린의 PDF 데이 (PDF Days)에 있습니다. 우린 너를 그리워 했어. –

관련 문제