2016-04-20 3 views
1

So kam ich auf ein interessantes Problem. Also weiß ich, dass in itext/itextsharp, wenn Sie signieren, eine Einstellung für PdfSignatureAppearance hat, dass Sie die CertificationLevel setzen können, und das funktioniert wie erwartet, aber vor kurzem stieß ich auf das Problem, wo ich ein Dokument signieren, wo die erste Signatur darin Dokument ist signiert mit PdfSignatureAppearance.CERTIFIED_FORM_FILLING, so dass ich Signaturen nach hinten hinzufügen/signieren kann mit (PdfSignatureAppearance.NOT_CERTIFIED), die als Genehmigungssignaturen fungieren.PDF-Einstellung, die Änderungen nach der Unterzeichnung nicht erlaubt

So ist der Grund, warum ich die Frage bin zu fragen ist, dass ich über ein Problem kam, wo ich mit vorhandenen Signaturfelder in dem Dokument ein Dokument haben, ich die erste Signatur mit PdfSignatureAppearance.CERTIFIED_FORM_FILLING unterzeichnen und die Unterschriften danach mit PdfSignatureAppearance.NOT_CERTIFIED , aber wenn ich das zweite Unterschriftsfeld unterzeichne, wird das erste Unterschriftsfeld ungültig.

Dieses Dokument, das ich verwende, wurde mit FoxitPro erstellt, aber wenn ich das gleiche in Adobe DC Pro mache, funktioniert es wie erwartet.

Jeder Rat würde geschätzt werden.

Hier ist der Code, den ich für die Unterzeichnung eines PDF-Dokuments verwenden, es ist nur die Unterzeichner-Klasse, so dass andere Objekte und Verweise auf diese Klasse fehlen werden.

 public byte[] Sign(SignRequest request) 
    { 
     request.Document = SaveDocumentChanges(new SaveRequest 
     { 
      Document = request.Document, 
      FormFields = request.FormFields, 
      SigningBlocks = request.SigningBlocks 
     }, request.Information); 

     return SignDocument(request.Certificate, request.Information, request.SigningBlocks, request.SignatureImages, request.Document, request.IsFinalSignature); 
    } 

    private byte[] AddFormFields(List<FormField> formFields, byte[] document) 
    { 
     for (int i = 0; i < formFields.Count; i++) 
     { 
      using (MemoryStream outputStream = new MemoryStream()) 
      { 
       using (PdfReader reader = new PdfReader(document)) 
       { 
        using (PdfStamper stamper = CreatePdfStamper(reader, outputStream, false)) 
        { 
         if (!DoesFormFieldExist(reader, formFields[i].Name)) 
         { 
          CreateFormField(reader, stamper, formFields[i]); 
         } 
         else 
         { 
          UpdateFormField(stamper, formFields[i]); 
         } 
        } 
       } 

       document = outputStream.ToArray(); 
      } 
     } 

     return document; 
    } 

    private byte[] AddMetaData(SigningInformation information, byte[] document) 
    { 
     if (information.CustomProperties != null && information.CustomProperties.Any()) 
     { 
      using (MemoryStream outputStream = new MemoryStream()) 
      { 
       using (PdfReader reader = new PdfReader(document)) 
       { 
        using (PdfStamper stamper = CreatePdfStamper(reader, outputStream, false)) 
        { 
         Dictionary<string, string> currentProperties = reader.Info; 
         foreach (string key in information.CustomProperties.Keys) 
         { 
          AddMetaDataAddDictionaryValue(currentProperties, key, information.CustomProperties[key]); 
         } 

         AddMetaDataAddDictionaryValue(currentProperties, "Producer", "Signisure"); 
         AddMetaDataAddDictionaryValue(currentProperties, "Creator", "Signisure"); 
         AddMetaDataAddDictionaryValue(currentProperties, "Author", "Signisure"); 
         stamper.MoreInfo = currentProperties; 
        } 
       } 

       return outputStream.ToArray(); 
      } 
     } 

     return document; 
    } 

    private void AddMetaDataAddDictionaryValue(Dictionary<string, string> dictionary, string key, string value) 
    { 
     if (dictionary.ContainsKey(key)) 
     { 
      dictionary[key] = value; 
     } 
     else 
     { 
      dictionary.Add(key, value); 
     } 
    } 

    private void AddMetaDataAddDictionaryValue(PdfDictionary dictionary, PdfName key, PdfObject value) 
    { 
     if (!dictionary.Keys.Contains(key)) 
     { 
      dictionary.Put(key, value); 
     } 
    } 

    private byte[] AddSignatureFields(List<SigningBlock> signingBlocks, byte[] document) 
    { 
     for (int i = 0; i < signingBlocks.Count; i++) 
     { 
      using (MemoryStream outputStream = new MemoryStream()) 
      { 
       using (PdfReader reader = new PdfReader(document)) 
       { 
        using (PdfStamper stamper = CreatePdfStamper(reader, outputStream, false)) 
        { 
         if (!DoesSignatureFieldExist(reader, signingBlocks[i].Name)) 
         { 
          CreateSignatureField(stamper, signingBlocks[i]); 
         } 
        } 
       } 

       document = outputStream.ToArray(); 
      } 
     } 

     return document; 
    } 

    private void CreateFormField(PdfReader reader, PdfStamper stamper, FormField formField) 
    { 
     TextField field = new TextField(stamper.Writer, new Rectangle(formField.X, formField.Y, formField.X + formField.Width, formField.Y + formField.Height), formField.Name); 
     field.Text = formField.Value; 
     field.Font = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.EMBEDDED); 
     field.FontSize = 12; 
     field.Options = TextField.READ_ONLY; 

     stamper.AddAnnotation(field.GetTextField(), formField.Page); 
    } 

    private PdfSignatureAppearance CreatePdfAppearance(PdfStamper stamper, SigningInformation information, string location, bool certify) 
    { 
     PdfSignatureAppearance appearance = stamper.SignatureAppearance; 
     appearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.DESCRIPTION; 
     CreatePdfAppearanceCertifyDocument(appearance, certify); 

     if (information != null) 
     { 
      appearance.Location = location != String.Empty ? String.Format("{0} ({1})", location, information.IPAddress) : information.IPAddress; 
      appearance.Reason = information.SignatoryReason; 
      appearance.Contact = String.Format("{0} ({1})", information.Signatory, information.SignatoryEmail); 
     } 

     return appearance; 
    } 

    private void CreatePdfAppearanceCertifyDocument(PdfSignatureAppearance appearance, bool certify) 
    { 
     if (certify) 
     { 
      appearance.CertificationLevel = PdfSignatureAppearance.CERTIFIED_FORM_FILLING_AND_ANNOTATIONS; 
     } 
     else 
     { 
      appearance.CertificationLevel = PdfSignatureAppearance.NOT_CERTIFIED; 
     } 
    } 

    private PdfStamper CreatePdfStamper(PdfReader reader, MemoryStream outputStream, bool isSignature) 
    { 
     if (CreatePdfStamperIsPDFADocument(reader)) 
     { 
      if (isSignature) 
      { 
       return PdfAStamper.CreateSignature(reader, outputStream, _pdfVersion, null, true, PdfAConformanceLevel.PDF_A_1A); 
      } 
      else 
      { 
       return new PdfAStamper(reader, outputStream, _pdfVersion, true, PdfAConformanceLevel.PDF_A_1A); 
      } 
     } 
     else 
     { 
      if (isSignature) 
      { 
       return PdfStamper.CreateSignature(reader, outputStream, _pdfVersion, null, true); 
      } 
      else 
      { 
       return new PdfStamper(reader, outputStream, _pdfVersion, true); 
      } 
     } 
    } 

    private bool CreatePdfStamperIsPDFADocument(PdfReader reader) 
    { 
     if (reader.Metadata != null && reader.Metadata.Length > 0) 
     { 
      IXmpMeta xmpMeta = XmpMetaParser.Parse(reader.Metadata, null); 
      IXmpProperty pdfaidConformance = xmpMeta.GetProperty(XmpConst.NS_PDFA_ID, "pdfaid:conformance"); 
      IXmpProperty pdfaidPart = xmpMeta.GetProperty(XmpConst.NS_PDFA_ID, "pdfaid:part"); 

      if (pdfaidConformance == null || pdfaidPart == null) 
      { 
       return false; 
      } 

      return true; 
     } 

     return false; 
    } 

    private void CreateSignatureField(PdfStamper stamper, SigningBlock signingBlock) 
    { 
     if (signingBlock == null) 
     { 
      return; 
     } 

     PdfFormField signatureField = PdfFormField.CreateSignature(stamper.Writer); 
     signatureField.SetWidget(new Rectangle(signingBlock.X, signingBlock.Y, signingBlock.X + signingBlock.Width, signingBlock.Y + signingBlock.Height), null); 
     signatureField.Flags = PdfAnnotation.FLAGS_PRINT; 
     signatureField.FieldName = signingBlock.Name; 
     signatureField.Page = signingBlock.Page; 

     signatureField.Put(PdfName.CONTENTS, new PdfString(String.Empty)); 
     CreateSignatureFieldAddLockProperties(signatureField, signingBlock, stamper); 

     stamper.AddAnnotation(signatureField, signingBlock.Page); 
    } 

    private void CreateSignatureFieldAddLockProperties(PdfFormField signatureField, SigningBlock signingBlock, PdfStamper stamper) 
    { 
     if (signingBlock.LinkedFormFields != null && signingBlock.LinkedFormFields.Count > 0) 
     { 
      PdfSigLockDictionary lockDictionary = new PdfSigLockDictionary(PdfSigLockDictionary.LockAction.INCLUDE, signingBlock.LinkedFormFields.ToArray()); 
      signatureField.Put(PdfName.LOCK, stamper.Writer.AddToBody(lockDictionary).IndirectReference); 
     } 
    } 

    private bool DoesFormFieldExist(PdfReader reader, string formFieldName) 
    { 
     if (String.IsNullOrWhiteSpace(formFieldName)) 
     { 
      return false; 
     } 

     return reader.AcroFields.Fields.Where(vp => vp.Key == formFieldName).Any(); 
    } 

    private bool DoesSignatureFieldExist(PdfReader reader, string signatureFieldName) 
    { 
     if (String.IsNullOrWhiteSpace(signatureFieldName)) 
     { 
      return false; 
     } 

     return reader.AcroFields.DoesSignatureFieldExist(signatureFieldName); 
    } 

    private AcroFields.FieldPosition GetAcroFieldByName(PdfStamper stamper, string signatureBlockName) 
    { 
     return stamper.AcroFields.GetFieldPositions(signatureBlockName).FirstOrDefault(); 
    } 

    private List<string> GetAllSignatureFieldNames(PdfReader reader) 
    { 
     List<string> signatureFields = new List<string>(); 
     signatureFields.AddRange(reader.AcroFields.GetBlankSignatureNames()); 
     signatureFields.AddRange(reader.AcroFields.GetSignatureNames()); 

     return signatureFields; 
    } 

    private void GetDocumentFormFieldsBuildFormFields(List<FormField> formFields, PdfReader reader, PdfStamper stamper) 
    { 
     List<string> signatureFields = GetAllSignatureFieldNames(reader); 
     foreach (KeyValuePair<string, AcroFields.Item> field in reader.AcroFields.Fields) 
     { 
      string fieldName = field.Key.ToString(); 
      if (!signatureFields.Where(signatureFieldName => signatureFieldName == fieldName).Any()) 
      { 
       string fieldValue = reader.AcroFields.GetField(field.Key.ToString()); 
       AcroFields.FieldPosition formFieldPosition = GetAcroFieldByName(stamper, fieldName); 

       formFields.Add(GetDocumentFormFieldsBuildFormFieldsCreateField(formFieldPosition, fieldName, fieldValue)); 
      } 
     } 
    } 

    private FormField GetDocumentFormFieldsBuildFormFieldsCreateField(AcroFields.FieldPosition formFieldPosition, string fieldName, string fieldValue) 
    { 
     return new FormField 
     { 
      Height = (int)formFieldPosition.position.Height, 
      Name = fieldName, 
      Page = formFieldPosition.page, 
      Width = (int)formFieldPosition.position.Width, 
      X = (int)formFieldPosition.position.Left, 
      Y = (int)formFieldPosition.position.Top, 
      Value = fieldValue 
     }; 
    } 

    private void GetDocumentSignatureBlocksBuildSignatureBlocks(List<SigningBlock> signatureBlocks, List<string> signatureBlockNames, PdfReader reader, PdfStamper stamper, bool isSigned) 
    { 
     foreach (string signatureBlockName in signatureBlockNames) 
     { 
      AcroFields.FieldPosition signatureFieldPosition = GetAcroFieldByName(stamper, signatureBlockName); 
      signatureBlocks.Add(GetDocumentSignatureBlocksBuildSignatureBlocksCreateBlock(signatureFieldPosition, signatureBlockName, isSigned)); 
     } 
    } 

    private SigningBlock GetDocumentSignatureBlocksBuildSignatureBlocksCreateBlock(AcroFields.FieldPosition signatureFieldPosition, string fieldName, bool isSigned) 
    { 
     return new SigningBlock 
     { 
      Height = (int)signatureFieldPosition.position.Height, 
      Name = fieldName, 
      Page = signatureFieldPosition.page, 
      Width = (int)signatureFieldPosition.position.Width, 
      X = (int)signatureFieldPosition.position.Left, 
      Y = (int)signatureFieldPosition.position.Top, 
      IsSigned = isSigned 
     }; 
    } 

    private string GetFormFieldValueForName(PdfStamper stamper, string formFieldName) 
    { 
     AcroFields formFields = stamper.AcroFields; 
     return formFields.GetField(formFieldName); 
    } 

    private byte[] GetSignatureImage(List<MemberItemSignature> signatureImages, string signingBlockName) 
    { 
     MemberItemSignature signature = signingBlockName.Contains("Initial") ? signatureImages.Where(image => image.Use == SignatureUses.Initial).FirstOrDefault() : signatureImages.Where(image => image.Use == SignatureUses.Signature).FirstOrDefault(); 
     if (signature != null) 
     { 
      return signature.Image; 
     } 

     return null; 
    } 

    private byte[] SaveDocumentChanges(SaveRequest request, SigningInformation information) 
    { 
     request.Document = AddMetaData(information, request.Document); 
     request.Document = AddFormFields(request.FormFields, request.Document); 
     request.Document = AddSignatureFields(request.SigningBlocks, request.Document); 

     return request.Document; 
    } 

    private byte[] SignDocument(Certificate certificate, SigningInformation information, List<SigningBlock> signingBlocks, List<MemberItemSignature> signatureImages, byte[] document, bool isFinalSignature) 
    { 
     for (int i = 0; i < signingBlocks.Count; i++) 
     { 
      document = SignDocumentSignSignatureField(certificate, information, signingBlocks[i], signatureImages, document, true); 
     } 

     if (isFinalSignature) 
     { 
      return SignDocumentLTVVerification(certificate, document); 
     } 

     return document; 
    } 

    private byte[] SignDocumentLTVVerification(Certificate certificate, byte[] document) 
    { 
     using (MemoryStream outputStream = new MemoryStream()) 
     { 
      using (PdfReader reader = new PdfReader(document)) 
      { 
       using (PdfStamper stamper = PdfStamper.CreateSignature(reader, outputStream, '\0', null, true)) 
       { 
        SignDocumentSigningBlockAddLTVVerification(stamper, certificate); 
       } 
      } 

      return outputStream.ToArray(); 
     } 
    } 

    private void SignDocumentSigningBlock(SigningComponents components, SigningInformation information, SigningBlock block, PdfSignatureAppearance appearance, PdfStamper stamper, byte[] signatureImage) 
    { 
     appearance.SetVisibleSignature(block.Name); 
     SignDocumentSigningBlockWithImage(signatureImage, appearance); 
     SignDocumentSigningBlockWithText(appearance, information, appearance.SignDate); 

     if (components.Certificate != null) 
     { 
      using (RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)components.Certificate.PrivateKey) 
      { 
       PrivateKeySignature privateKeySignature = SignDocumentSigningBlockBuildDigestSigningMethod(information, rsa) as PrivateKeySignature; 
       SignatureHelper.Sign(appearance, privateKeySignature, components.CertificateChain, new List<ICrlClient> { components.CrlClient }, components.OcspClient, components.TimeStampingAuthority, Int32.Parse(_settingManager["DocumentSigningEstimatedDigestSize"]), CryptoStandard.CMS, SignDocumentSigningBlockCreateMetaData(information)); 
      } 
     } 
     else 
     { 
      HSMExternalSignature hsmExternalSignature = SignDocumentSigningBlockBuildDigestSigningMethod(information, null) as HSMExternalSignature; 
      SignatureHelper.Sign(appearance, hsmExternalSignature, components.TimeStampingAuthority, Int32.Parse(_settingManager["DocumentSigningEstimatedDigestSize"]), CryptoStandard.CMS, SignDocumentSigningBlockCreateMetaData(information)); 
     } 
    } 

    private void SignDocumentSigningBlockAddLTVVerification(PdfStamper stamper, Certificate certificate) 
    { 
     SigningComponents components = new SigningComponents(_settingManager, certificate); 
     LtvVerification ltvVerification = stamper.LtvVerification; 
     List<string> signatureFieldNames = stamper.AcroFields.GetSignatureNames(); 

     PdfPKCS7 pkcs7 = stamper.AcroFields.VerifySignature(signatureFieldNames.Last()); 
     if (pkcs7.IsTsp) 
     { 
      bool validationAddedSuccessfully = ltvVerification.AddVerification(signatureFieldNames.Last(), components.OcspClient, components.CrlClient, LtvVerification.CertificateOption.SIGNING_CERTIFICATE, LtvVerification.Level.OCSP_CRL, LtvVerification.CertificateInclusion.YES); 
     } 
     else 
     { 
      foreach (string name in stamper.AcroFields.GetSignatureNames()) 
      { 
       bool validationAddedSuccessfully = ltvVerification.AddVerification(name, components.OcspClient, components.CrlClient, LtvVerification.CertificateOption.WHOLE_CHAIN, LtvVerification.Level.OCSP_CRL, LtvVerification.CertificateInclusion.YES); 
      } 
     } 
     ltvVerification.Merge(); 

     PdfSignatureAppearance appearance = stamper.SignatureAppearance; 
     LtvTimestamp.Timestamp(appearance, components.TimeStampingAuthority, null); 
    } 

    private IExternalSignature SignDocumentSigningBlockBuildDigestSigningMethod(SigningInformation information, RSACryptoServiceProvider rsaCryptoProvider) 
    { 
     if (information.CertificateUse == CertificateUse.SignisureCertificate || rsaCryptoProvider == null) 
     { 
      return new HSMExternalSignature(_hsmService, _settingManager["DocumentSigningEncryptionHashAlgorithm"]); 
     } 
     else 
     { 
      return new PrivateKeySignature(DotNetUtilities.GetRsaKeyPair(rsaCryptoProvider).Private, _settingManager["DocumentSigningEncryptionHashAlgorithm"]); 
     } 
    } 

    private PdfDictionary SignDocumentSigningBlockCreateMetaData(SigningInformation information) 
    { 
     PdfDictionary signatureDictionary = new PdfDictionary(); 
     if (!String.IsNullOrWhiteSpace(information.IdentificationInformation)) 
     { 
      AddMetaDataAddDictionaryValue(signatureDictionary, new PdfName(".Signisure.IdentificationInformation"), new PdfString(information.IdentificationInformation)); 
     } 
     if (!String.IsNullOrWhiteSpace(information.JuristicEntity)) 
     { 
      AddMetaDataAddDictionaryValue(signatureDictionary, new PdfName(".Signisure.JuristicEntity"), new PdfString(information.JuristicEntity)); 
     } 
     if (!String.IsNullOrWhiteSpace(information.Capacity)) 
     { 
      AddMetaDataAddDictionaryValue(signatureDictionary, new PdfName(".Signisure.Capacity"), new PdfString(information.Capacity)); 
     } 

     return signatureDictionary; 
    } 

    private void SignDocumentSigningBlockWithImage(byte[] signatureImage, PdfSignatureAppearance appearance) 
    { 
     if (signatureImage != null && signatureImage.Length > 0) 
     { 
      Image signatureImageInstance = Image.GetInstance(ImageHelper.FlattenImage(signatureImage)); 

      appearance.Image = signatureImageInstance; 
      appearance.SignatureGraphic = signatureImageInstance; 
     } 
    } 

    private void SignDocumentSigningBlockWithText(PdfSignatureAppearance appearance, SigningInformation information, DateTime timestampDateTime) 
    { 
     BaseFont verdana = BaseFont.CreateFont(AssemblyDirectory + "\\Content\\Fonts\\Verdana\\Verdana.ttf", BaseFont.CP1252, BaseFont.EMBEDDED); 
     BaseFont helvetica = BaseFont.CreateFont(AssemblyDirectory + "\\Content\\Fonts\\Helvetica\\Helvetica.ttf", BaseFont.CP1252, BaseFont.EMBEDDED); 
     BaseFont comicSans = BaseFont.CreateFont(AssemblyDirectory + "\\Content\\Fonts\\ComicSans\\ComicSans.ttf", BaseFont.CP1252, BaseFont.EMBEDDED); 

     appearance.Layer2Text = SignDocumentSigningBlockWithTextBuildText(appearance, information, timestampDateTime); 
     appearance.Layer2Font = new Font(verdana); 
    } 

    private string SignDocumentSigningBlockWithTextBuildText(PdfSignatureAppearance appearance, SigningInformation information, DateTime timestampDateTime) 
    { 
     return String.Format("Signee: {0}\nSign date: {1}\nLocation: {2}\nReason: {3}", information.Signatory, timestampDateTime.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss zzz"), appearance.Location, appearance.Reason); 
    } 

    private byte[] SignDocumentSignSignatureField(Certificate certificate, SigningInformation information, SigningBlock signingBlock, List<MemberItemSignature> signatureImages, byte[] document, bool isVisible) 
    { 
     SigningComponents components = new SigningComponents(_settingManager, certificate); 
     using (MemoryStream outputStream = new MemoryStream()) 
     { 
      using (PdfReader reader = new PdfReader(document)) 
      { 
       using (PdfStamper stamper = CreatePdfStamper(reader, outputStream, true)) 
       { 
        PdfSignatureAppearance appearance = CreatePdfAppearance(stamper, information, SignDocumentSignSignatureFieldBuildLocation(stamper, signingBlock), false); 
        SignDocumentSigningBlock(components, information, signingBlock, appearance, stamper, GetSignatureImage(signatureImages, signingBlock.Name)); 
       } 
      } 

      return outputStream.ToArray(); 
     } 
    } 

    private string SignDocumentSignSignatureFieldBuildLocation(PdfStamper stamper, SigningBlock signingBlock) 
    { 
     StringBuilder builder = new StringBuilder(); 
     for (int index = 0; index < signingBlock.LinkedFormFields.Count; index++) 
     { 
      builder.Append(GetFormFieldValueForName(stamper, signingBlock.LinkedFormFields[index])); 
      if (index + 1 < signingBlock.LinkedFormFields.Count) 
      { 
       builder.Append(", "); 
      } 
     } 

     return builder.ToString(); 
    } 

    private void UpdateFormField(PdfStamper stamper, FormField formField) 
    { 
     AcroFields formFields = stamper.AcroFields; 
     if (formField.Value != null && GetFormFieldValueForName(stamper, formField.Name) != formField.Value) 
     { 
      formFields.SetField(formField.Name, formField.Value); 
      formFields.SetFieldProperty(formField.Name, "setfflags", PdfFormField.FF_READ_ONLY, null); 
     } 
    } 
} 

}

+0

Bitte entfernen Sie den Widerspruch in Ihrer Frage. Sie fragen * Gibt es eine andere Einstellung auf Dokumentebene, die das Ungültigmachen von Signaturen erzwingt, sobald Sie versuchen, nachfolgende Signaturen zu signieren? * Für jemanden, der kein Experte ist, scheint es, als ob Sie die Antwort in dem Absatz vor der Frage bereitstellen : * Ich versuche ein Dokument mit PdfSignatureAppearance.CERTIFIED_FORM_FILLING zu signieren ... es macht meine nachfolgende Signatur-Signatur ungültig. * –

+0

Hallo bruno, tut mir leid, also was ich zu spezifizieren versuchte, war, ob es irgendwelche anderen Einstellungen gab, von denen ich nichts weiß . Ich werde versuchen, die Frage ein wenig klarer zu machen. Danke für die Antwort – Johandre

+0

Wenn Leute ihren Code nicht zeigen, frustrieren sie immer die Leute, die ihnen helfen könnten. Ich habe nie verstanden, warum du Leute frustrieren willst, wenn du Hilfe von ihnen erwartest. Ein möglicher Grund, warum Ihre ursprüngliche Signatur beschädigt ist, könnte die Tatsache sein, dass Sie vergessen haben, 'PdfStamper' im * Append-Modus * zu verwenden. Bitte haben Sie Verständnis dafür, dass Sie kein * Ratespiel * spielen sollten. –

Antwort

2

Kurze Antwort:

Wenn Sie ein Dokument mit einer Zertifizierung Signatur mit Level PdfSignatureAppearance.CERTIFIED_FORM_FILLING unterschreiben, dann können Sie so viele zusätzliche Genehmigung Signaturen hinzufügen, wie Sie das Original, ohne brechen wollen (oder vorhergehende) Signaturen.

Lange Antwort:

Niemand wird ihr glauben, wenn Sie schreiben:

Ich versuche, ein Dokument mit PdfSignatureAppearance.CERTIFIED_FORM_FILLING zuerst zu unterzeichnen, die erlauben sollte mir mehr Signaturfelder hinzuzufügen, Formularfelder bearbeiten oder andere Unterschriftsfelder signieren, aber stattdessen wird meine nachfolgende Unterschriftssignierung ungültig.

Was Sie hier sagen, ist falsch.

Sie signieren das PDF jedoch möglicherweise nicht korrekt. Erlauben Sie mir, meine kurze Antwort zu wiederholen:

Wenn Sie ein Dokument mit einer Zertifizierung Unterschrift mit Level PdfSignatureAppearance.CERTIFIED_FORM_FILLING unterschreiben, dann können Sie fügen Sie so viele zusätzliche Genehmigung Unterschriften, wie Sie wollen, ohne das Original zu brechen (oder vor) Unterschriften .

Ich unterstreiche zwei Konzepte. Ein PDF kann höchstens eine Zertifizierungssignatur (aka Autorensignatur) haben und diese Signatur sollte die erste Signatur im Dokument sein. Ein PDF kann mehrere Genehmigungssignaturen haben (auch als Empfängersignaturen bezeichnet).

Vielleicht signieren Sie das Dokument mit einer Zertifizierungssignatur (ich nehme an, das stimmt, weil Sie über die Zertifizierungsstufe sprechen).Und vielleicht versuchen Sie, eine zweite Zertifizierungssignatur hinzuzufügen. Offensichtlich würden dadurch die Signaturen im PDF-Dokument durchbrochen, da die PDF-Spezifikation nur eine einzige Zertifizierungssignatur zulässt.

Vielleicht ist Ihr Problem gelöst, indem Sie Genehmigungssignaturen anstelle von Zertifizierungssignaturen hinzufügen.

+0

Hallo bruno, danke für die Antwort, ich denke in meiner ursprünglichen Erklärung habe ich mich nicht richtig erklären so tut mir leid für das, also was ich tue ist, dass die erste Unterschrift mit PdfSignatureAppearance.CERTIFIED_FORM_FILLING unterzeichnet die Signaturen Die Signaturen, die signiert werden, nachdem das Unterschriftsfeld signiert wurde, werden mit PdfSignatureAppearance.NOT_CERTIFIED signiert, dh dies sind meine Genehmigungssignaturen. Ich hoffe, dass das Sinn macht, oder verstehe ich etwas falsch? – Johandre

+0

Ich habe die Frage aktualisiert, ich hoffe, dass es jetzt klarer ist, Entschuldigung für den Widerspruch und die Verwirrung. Mit freundlichen Grüßen – Johandre

+0

Wenn Sie 'NOT_CERTIFIED' verwenden, sollten die Originalsignaturen nicht beschädigt werden. Natürlich: nur wenn Sie richtig signieren. Du zeigst deinen Code nicht, also woher wissen wir, ob du 'PdfStamper' im * append mode * verwendest? –

Verwandte Themen