2015-03-11 3 views
0

Когда я подписываю документ, подпись появляется только на первой странице. Есть ли что-нибудь, что я могу сделать, чтобы оно отображалось на каждой странице? Это метод я использую сейчас, чтобы подписать PDF, надеюсь, это поможет найти решение:Как создать подпись iTextSharp на каждой странице документа?

public static PdfStamper SignHashedUser(string Target, SysX509.X509Certificate2 Certificate, string Reason, string Location, bool AddVisibleSign, PdfReader objReader, int pags) 
    { 
     X509CertificateParser objCP = new X509CertificateParser(); 
     X509Certificate[] objChain = new X509Certificate[] { objCP.ReadCertificate(Certificate.RawData) }; 

     PdfStamper objStamper = PdfStamper.CreateSignature(objReader, new FileStream(Target, FileMode.Create), '\0'); 
     PdfSignatureAppearance objSA = objStamper.SignatureAppearance; 
     int[] perms = { PdfWriter.AllowPrinting, PdfWriter.AllowFillIn }; 


     if (AddVisibleSign) 
      objSA.SetVisibleSignature(new Rectangle(50, 50, 250, 100), pags, null); 
//pags define in which page of the PDF will the signature appear 
     objSA.SignDate = DateTime.Now; 
     objSA.SetCrypto(null, objChain, null, null); 
     objSA.Acro6Layers = true; 
     objSA.Render = PdfSignatureAppearance.SignatureRender.NameAndDescription; 
     PdfSignature objSignature = new PdfSignature(PdfName.ADOBE_PPKMS, PdfName.ADBE_PKCS7_SHA1); 
     objSignature.Date = new PdfDate(objSA.SignDate); 
     objSignature.Name = PdfPKCS7.GetSubjectFields(objChain[0]).GetField("CN"); 
     if (objSA.Reason != null) 
      objSignature.Reason = objSA.Reason; 
     if (objSA.Location != null) 
      objSignature.Location = objSA.Location; 
     objSA.CryptoDictionary = objSignature; 
     int intCSize = 4000; 
     Hashtable objTable = new Hashtable(); 
     objTable[PdfName.CONTENTS] = intCSize * 2 + 2; 
     objSA.PreClose(objTable); 

     HashAlgorithm objSHA1 = new SHA1CryptoServiceProvider(); 

     Stream objStream = objSA.RangeStream; 
     int intRead = 0; 
     byte[] bytBuffer = new byte[8192]; 
     while ((intRead = objStream.Read(bytBuffer, 0, 8192)) > 0) 
      objSHA1.TransformBlock(bytBuffer, 0, intRead, bytBuffer, 0); 
     objSHA1.TransformFinalBlock(bytBuffer, 0, 0); 

     byte[] bytPK = SignMsg(objSHA1.Hash, Certificate, false); 
     byte[] bytOut = new byte[intCSize]; 

     PdfDictionary objDict = new PdfDictionary(); 

     Array.Copy(bytPK, 0, bytOut, 0, bytPK.Length); 

     objDict.Put(PdfName.CONTENTS, new PdfString(bytOut).SetHexWriting(true)); 
     objSA.Close(objDict); 

     return objStamper; 
    } 

EDIT: PdfSignatureAppearance.SetVisibleSignature() представляет собой метод, в том числе параметр, указывающий на страницу, где подпись должна быть отображается. Однако он не может использоваться для определения количества страниц, на которых будет отображаться подпись.

+0

Если я не ошибаюсь в документации, указанно 'поля подписи никогда не будут ссылаться на несколько аннотаций.' Вы читали или консультировались с документацией, и эта ссылка может быть альтернативой - http: // www .mazsoft.com/blog/post/2008/04/30/Code-sample-for-use-iTextSharp-PDF-library.aspx – MethodMan

+0

Не помогло, также я проверил официальную документацию itext. И многие другие сайты, все без ответов. В любом случае спасибо за отзывы. – SantLev

+3

Технически ничто не мешает вам иметь несколько явлений для одной и той же подписи, но, и всегда есть, но не рекомендуется Adobe, а в следующей версии pdf это будет запрещено явно. –

ответ

2

Позвольте мне скопировать предложение и примечание из ISO-32000-2. Этот документ пока не доступен, так как он будет выпущен только в 2016 году, однако, совершенно ясно, по поводу этого вопроса:

enter image description here

Это всегда было верно, однако: это было только документально в документации, принадлежащей Adobe. Начиная с PDF 2.0, он будет нормативным.

Вкратце: вы просите что-то, что является нарушением спецификации PDF.

+0

Вау, я этого не знал. Большое спасибо, что спасли меня от неприятностей. – SantLev

0

На самом деле у вас может быть одно поле подписи и одна соответствующая аннотация виджета, а также помещать изображения или другие объекты, представляющие эту подпись во всех других местах.

+1

Если ранее документ был подписан, заполнение существующего или даже нового поля подписи может быть разрешено, но добавление * изображений или других объектов, представляющих эту подпись *, может не совпадать. – mkl

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