2016-06-15 2 views
0

Я пытаюсь подписать цифровую подпись на всех страницах любого данного pdf. Но он только подписывается на первой или последней странице. Я думаю, что я выяснил, что вопросы находятся в MakeSignature.SignDetached() метод. Этот метод закрывает весь поток и закрывает PDF для дальнейшего подписания.Как цифровая подпись PDF без метода MakeSignature.SignDetached()?

Мой код:

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

Строго говоря: «[Как показать цифровую подпись PDF на странице документа с помощью iText] (http://stackoverflow.com/a/35724742/1729265)» - это iText, а не iTextSharp, но аргументы оттуда тождественно. – mkl

+0

Спасибо @mkl, я не знал, что yoy сделал обзор всех аргументов. Я просто поддержал это. –

+0

@furiousNoob * Этот метод закрывает весь поток и закрывает PDF для дальнейшего подписания. * - если вы уже знали о проблемах встроенных подписей PDF, выбрали «Несколько подписей (по одной на страницу) с одной визуализацией каждый» из ответ, на который я ссылался, и теперь возникают трудности с реализацией, пожалуйста, обновите свой вопрос соответствующим образом. В конечном итоге он будет вновь открыт и дан ответ. – mkl

ответ

0

Нет такой вещи, как «подписывать каждую страницу в формате PDF». Цифровая подпись (видимая или невидимая) подписывает полный документ.

Концепция «подписания страницы» просто отсутствует в PDF.

Если вы используете видимую подпись, вы помещаете аннотацию виджета на страницу в формате PDF. Одна подпись может соответствовать только одной аннотации виджета только на одной странице.

Это может быть неясно при чтении ISO-32000-1, но в ИСО-32000-2 четко указывается.

Вкратце: на ваш вопрос нет ответа, потому что ваш вопрос неправильный. Вы вводите в заблуждение цифровую подпись (возможно, невидимую, подписывая полный документ: все страницы, все вложения, все метаданные) с аннотацией виджета этой подписи.

PS: сообщение сгенерировано в реальном времени с the PDF Days в Berlin. Всего за полтора часа (в 11:45 в Берлине) вы можете следить за живым потоком по этому вопросу, предоставленным вам инженером iText. См. «https://twitter.com/iText/status/742975159976493056»

+0

* вы можете следить за живым потоком * - oops, я не знал о потоке в прямом эфире. Просто включил его здесь, спасибо. ;) – mkl

+0

Я упомянул вас в своем выступлении вчера: на SO есть 3 мастера PDF (3 золотые медали). 2 из этих 3 - в дни PDF в Берлине. Нам не хватало вас ... –

Смежные вопросы