2016-06-15 8 views
0

Ich versuche, jede Seite jedes gegebenen pdf digital zu unterzeichnen. Aber es meldet sich nur auf der ersten oder letzten Seite an. Ich denke, ich habe herausgefunden, dass die Probleme in MakeSignature.SignDetached() Methode ist. Diese Methode schließt den gesamten Stream und schließt die PDF-Datei für weitere Signaturen.Wie signiert man ein PDF ohne die MakeSignature.SignDetached() Methode?

Mein Code:

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); 
      } 
     } 

Ich verwende iTextSharp Bibliothek. Gibt es eine Möglichkeit, diesen Code zu reparieren?

+0

Streng genommen "[Wie digitale PDF-Signatur in allen Dokument-Seite mit iText anzeigen] (http://StackOverflow.com/A/35724742/1729265)" ist über iText, nicht iTextSharp, sondern die Argumente von dort identisch halten. – mkl

+0

Danke @mkl, ich wusste nicht, dass du einen Überblick über alle Argumente gemacht hast. Ich habe es gerade aufgewertet. –

+0

@furiousNoob * Diese Methode schließt den gesamten Stream und schließt die PDF-Datei für weitere Signaturen. * - Wenn Sie bereits die Probleme der integrierten PDF-Signaturen kennen, wählen Sie "Mehrere Signaturen (eine pro Seite) mit jeweils einer Visualisierung" aus die Antwort, auf die ich Bezug genommen habe, und jetzt Probleme bei der Implementierung haben, bitte aktualisieren Sie Ihre Frage entsprechend. Es wird irgendwann wieder geöffnet und beantwortet. – mkl

Antwort

0

Es gibt keine "jede Seite in einer PDF-Datei signieren". Eine digitale Signatur (sichtbar oder unsichtbar) signiert das gesamte Dokument.

Das Konzept der "Unterzeichnung einer Seite" existiert einfach nicht in PDF.

Wenn Sie eine sichtbare Signatur verwenden, fügen Sie eine Widget-Anmerkung auf eine Seite in der PDF-Datei ein. Eine Signatur kann nur einer Widget-Anmerkung auf nur einer Seite entsprechen.

Dies ist möglicherweise nicht klar beim Lesen von ISO-32000-1, aber es wird explizit in ISO-32000-2 deutlich gemacht.

Kurz gesagt: Es gibt keine Antwort auf Ihre Frage, weil Ihre Frage falsch ist. Sie verwirren die digitale Signatur (möglicherweise unsichtbar, signieren das gesamte Dokument: alle Seiten, alle Anhänge, alle Metadaten) mit der Widget-Annotation dieser Signatur.

PS: Diese Nachricht wird von the PDF Days in Berlin live gebracht. In genau 1 ½ Stunden (um 11:45 Uhr in Berlin) können Sie einen Live-Stream zu diesem Thema verfolgen, der Ihnen von einem iText-Techniker vorgestellt wurde. Siehe https://twitter.com/iText/status/742975159976493056

+0

* Du kannst einem Livestream folgen * - oops, ich wusste nichts über den Livestream. Habe es hier einfach eingeschaltet, danke. ;) – mkl

+0

Ich habe dich gestern in meinem Vortrag erwähnt: Es gibt 3 PDF-Master auf SO (3 Goldmedaillen). 2 von diesen 3 sind bei den PDF Days in Berlin. Wir haben dich vermisst ... –

Verwandte Themen