<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="RSS_xslt_style.asp" version="1.0" ?>
<rss version="2.0" xmlns:WebWizForums="http://syndication.webwiz.co.uk/rss_namespace/">
 <channel>
  <title>Debenu Quick PDF Library - PDF SDK Community Forum : Digital Signature</title>
  <link>http://www.quickpdf.org/forum/</link>
  <description><![CDATA[This is an XML content feed of; Debenu Quick PDF Library - PDF SDK Community Forum : I need help - I can help : Digital Signature]]></description>
  <copyright>Copyright (c) 2006-2013 Web Wiz Forums - All Rights Reserved.</copyright>
  <pubDate>Thu, 07 May 2026 19:01:50 +0000</pubDate>
  <lastBuildDate>Mon, 28 Nov 2022 11:49:46 +0000</lastBuildDate>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Web Wiz Forums 11.01</generator>
  <ttl>360</ttl>
  <WebWizForums:feedURL>www.quickpdf.org/forum/RSS_post_feed.asp?TID=3995</WebWizForums:feedURL>
  <image>
   <title><![CDATA[Debenu Quick PDF Library - PDF SDK Community Forum]]></title>
   <url>http://www.quickpdf.org/forum/forum_images/QPDF_Forum_Title.png</url>
   <link>http://www.quickpdf.org/forum/</link>
  </image>
  <item>
   <title><![CDATA[Digital Signature : I have QuickPdf v15.11 licensed....]]></title>
   <link>http://www.quickpdf.org/forum/digital-signature_topic3995_post16202.html#16202</link>
   <description>
    <![CDATA[<strong>Author:</strong> <a href="http://www.quickpdf.org/forum/member_profile.asp?PF=3344">MauricioPt</a><br /><strong>Subject:</strong> 3995<br /><strong>Posted:</strong> 28 Nov 22 at 11:49AM<br /><br />I have QuickPdf v15.11 licensed. <br>I can't send Delphi binaries.<br>]]>
   </description>
   <pubDate>Mon, 28 Nov 2022 11:49:46 +0000</pubDate>
   <guid isPermaLink="true">http://www.quickpdf.org/forum/digital-signature_topic3995_post16202.html#16202</guid>
  </item> 
  <item>
   <title><![CDATA[Digital Signature : Hi MauricioWhat is your Debenu...]]></title>
   <link>http://www.quickpdf.org/forum/digital-signature_topic3995_post16199.html#16199</link>
   <description>
    <![CDATA[<strong>Author:</strong> <a href="http://www.quickpdf.org/forum/member_profile.asp?PF=3346">samukinha</a><br /><strong>Subject:</strong> 3995<br /><strong>Posted:</strong> 25 Nov 22 at 2:22PM<br /><br /><span style=": rgb251, 251, 253;">Hi Mauricio</span><div style=": rgb251, 251, 253;">What is your Debenu version? I have 13.12 version.</div><div style=": rgb251, 251, 253;">I don't have binaries for Delphi 11 to test, if you can send me...</div><div style=": rgb251, 251, 253;">Regards</div>]]>
   </description>
   <pubDate>Fri, 25 Nov 2022 14:22:55 +0000</pubDate>
   <guid isPermaLink="true">http://www.quickpdf.org/forum/digital-signature_topic3995_post16199.html#16199</guid>
  </item> 
  <item>
   <title><![CDATA[Digital Signature : Hi MauricioWhat is your Debenu...]]></title>
   <link>http://www.quickpdf.org/forum/digital-signature_topic3995_post16198.html#16198</link>
   <description>
    <![CDATA[<strong>Author:</strong> <a href="http://www.quickpdf.org/forum/member_profile.asp?PF=3346">samukinha</a><br /><strong>Subject:</strong> 3995<br /><strong>Posted:</strong> 23 Nov 22 at 6:08PM<br /><br />Hi Mauricio<div>What is your Debenu version? I have 13.12 version.</div><div>I don't have binaries for Delphi 11 to test, if you can send me...</div><div>Regards</div>]]>
   </description>
   <pubDate>Wed, 23 Nov 2022 18:08:13 +0000</pubDate>
   <guid isPermaLink="true">http://www.quickpdf.org/forum/digital-signature_topic3995_post16198.html#16198</guid>
  </item> 
  <item>
   <title><![CDATA[Digital Signature :  I can see the certificate but...]]></title>
   <link>http://www.quickpdf.org/forum/digital-signature_topic3995_post16190.html#16190</link>
   <description>
    <![CDATA[<strong>Author:</strong> <a href="http://www.quickpdf.org/forum/member_profile.asp?PF=3344">MauricioPt</a><br /><strong>Subject:</strong> 3995<br /><strong>Posted:</strong> 31 Oct 22 at 2:52PM<br /><br />I can see the certificate but Acrobat says that the document has been modified. &nbsp;<br>Any help will be appreciate.]]>
   </description>
   <pubDate>Mon, 31 Oct 2022 14:52:07 +0000</pubDate>
   <guid isPermaLink="true">http://www.quickpdf.org/forum/digital-signature_topic3995_post16190.html#16190</guid>
  </item> 
  <item>
   <title><![CDATA[Digital Signature : Hi,i have translated the sample...]]></title>
   <link>http://www.quickpdf.org/forum/digital-signature_topic3995_post16189.html#16189</link>
   <description>
    <![CDATA[<strong>Author:</strong> <a href="http://www.quickpdf.org/forum/member_profile.asp?PF=3344">MauricioPt</a><br /><strong>Subject:</strong> 3995<br /><strong>Posted:</strong> 31 Oct 22 at 2:50PM<br /><br />Hi,<br><br>i have translated the sample source code from C# and VB from here :<br>https://www.debenu.com/kb/advanced-options-signing-pdf-files/<br>into Delphi language.<br><br>uses<br>&nbsp; Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, DebenuPDFLibrary,<br>&nbsp; cyStrUtils, cyDebenuPDFLibrary, idGlobal, IdCoderMIME,<br><br>&nbsp; ssl_const, ssl_types, ssl_init, ssl_err, ssl_evp, ssl_bio, ssl_pem, ssl_engine, ssl_x509, ssl_pkcs7, ssl_pkcs12, ssl_rsa;<br><br>procedure TFrmPrinDemoPdf.SignDataWithPfxFile(const AFileName, Password: String; const DataToSign: AnsiString; var Result: ansistring);<br>var<br>&nbsp; LM: TMemoryStream;<br>&nbsp; AnsiPassword: AnsiString;<br>&nbsp; PAnsiPassword: PAnsiChar;<br><br>&nbsp; B: PBIO;<br>&nbsp; P12: PPKCS12;<br><br>&nbsp; // Pfx extaction :<br>&nbsp; pCertificate: PX509;<br>&nbsp; pkey: PEVP_PKEY;<br>&nbsp; ca: PSTACK_OF_X509;<br>&nbsp; md: PEVP_MD;<br><br>&nbsp; // Hash :<br>&nbsp; mdctx: EVP_MD_CTX;<br>&nbsp; AnsiDataToHash: AnsiString;<br>&nbsp; LengthAnsiDataToHash: integer;<br>&nbsp; HashBuffer: Array of AnsiChar;&nbsp;&nbsp;&nbsp; //&nbsp; Array &#091;0..4095&#093; of AnsiChar;<br>&nbsp; HashBufferF: Array &#091;0..4095&#093; of AnsiChar;<br>&nbsp; c, HashSize: integer;<br><br>&nbsp; // Sign :<br>&nbsp; AnsiDataToSign: AnsiString;<br>&nbsp; LengthAnsiDataToSign: integer;<br>&nbsp; ppKeyCtx: PPEVP_PKEY_CTX;<br>&nbsp; pEngin: PENGINE;<br>&nbsp; SignBuffer: Array of AnsiChar;&nbsp;&nbsp;&nbsp; //&nbsp; Array &#091;0..4095&#093; of AnsiChar;<br>&nbsp; SignSize: cardinal;<br><br>&nbsp; // Test<br>&nbsp; bp, b64, mbp: PBIO;<br>&nbsp; signFile: string;<br>&nbsp; _RSA: PRSA;<br><br>&nbsp; // PKCS7 :<br>&nbsp; _pPKCS7: PPKCS7;<br>&nbsp; _flags: integer;<br>&nbsp; _certs: PSTACK_OF;<br>&nbsp; InputBioFile, OutputBioFile: PBIO;<br><br>&nbsp; aIdBytes: TIdBytes;<br>&nbsp; pmdctx: PEVP_MD_CTX;<br>&nbsp; // f: file;<br>begin<br>&nbsp; Result := '';<br><br>&nbsp; B := nil;<br>&nbsp; P12 := nil;<br>&nbsp; pkey := Nil;<br>&nbsp; pCertificate := Nil;<br>&nbsp; ca := Nil;<br><br>&nbsp; LM := nil;<br>&nbsp; AnsiPassword := Copy(Password, 1, Length(Password));<br>&nbsp; PAnsiPassword := PAnsichar(AnsiPassword);<br>&nbsp; //ShowMessage( intToStr(Length(AnsiPassword)) );<br><br>&nbsp; // raise exception SSL_InitLib;<br>&nbsp; SSL_InitPEM;<br>&nbsp; SSL_InitERR;<br>&nbsp; SSL_InitBIO;<br>&nbsp; SSL_InitEVP;<br><br>&nbsp; // Ajouté !<br>&nbsp; //SSL_InitRSA;<br>&nbsp; SSL_InitPKCS7;<br>&nbsp; //SSL_InitX509;<br>&nbsp; //SSL_InitPKCS12;<br><br>&nbsp; // Exception SSL_InitENGINE;<br>&nbsp; SSL_InitX509;<br>&nbsp; SSL_InitPKCS12;<br><br>&nbsp; // Exception ENGINE_load_builtin_engines;<br>&nbsp; OpenSSL_add_all_ciphers;<br>&nbsp; OpenSSL_add_all_digests;<br><br>&nbsp; //&nbsp; OpenSSL_add_all_algorithms;<br>&nbsp; ERR_load_crypto_strings;<br><br>&nbsp; try<br>&nbsp;&nbsp;&nbsp; LM := TMemoryStream.Create;<br>&nbsp;&nbsp;&nbsp; LM.LoadFromFile(AFileName);<br>&nbsp; except<br>&nbsp;&nbsp;&nbsp; LM.Free;<br>&nbsp;&nbsp;&nbsp; Exit;<br>&nbsp; end;<br><br>&nbsp; try<br>&nbsp;&nbsp;&nbsp; B := BIO_new_mem_buf(LM.Memory, LM.Size);<br>&nbsp;&nbsp;&nbsp; if not Assigned(B) then<br>&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit;<br>&nbsp;&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp; // * Créer le PPKCS12 * //<br>&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P12 := ssl_pkcs12.d2i_PKCS12_bio(B, nil);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if Assigned(P12) then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // * Vérifier le mot de passe (!!! Ne fonctionne que si nous avons appelé tous les SSL_Init + OpenSSL_add !!!) * //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if PKCS12_verify_mac(P12, PAnsiChar(AnsiPassword), Length(AnsiPassword)) = 1 then&nbsp;&nbsp; // 0 s'il y a un pb ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PAnsiChar(AnsiPassword) ou PAnsiPassword ...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // * Récupérer le certificat X509 * //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PKCS12_parse(p12, PAnsiChar(AnsiPassword), @pkey, @pCertificate, @ca);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // PAnsiChar(AnsiPassword) ou PAnsiPassword ...<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if Assigned(pCertificate) then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // INFO :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage(pCertificate^.name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // * Sign * //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if Assigned(pkey) and CBSignProcessPassthroughSHA1.Checked then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create an SHA-1 hash of the file data //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; md := EVP_get_digestbyname('SHA1');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; EVP_sha256;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Pas besoin ... New(mdctx);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if EVP_SignInit(@mdctx, md) = 1 then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Ou directement EVP_SignInit(@md_ctx, EVP_SHA1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // SSL_CheckError;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AnsiDataToHash := DataToSign;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LengthAnsiDataToHash := Length(AnsiDataToHash);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Tableau dynamique :<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if EVP_SignUpdate(@mdctx, PAnsiChar(AnsiDataToHash), LengthAnsiDataToHash) = 1 then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetLength(HashBuffer, EVP_PKEY_size(pKey));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if EVP_SignFinal(@mdctx, PAnsiChar(HashBuffer), HashSize, pkey) = 1 then&nbsp;&nbsp;&nbsp;&nbsp; // HashSize = 256 cars<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := '';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c := 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while c &lt; HashSize do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := Result + HashBuffer&#091;c&#093;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc(c);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemLogs.Lines.Add('Data to SHA1 : "' + Copy(AnsiDataToHash, 1, 20) + '..."');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemLogs.Lines.Add('HASH result : "' + Result + '"');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string_Savetofile(Result, 'D:\_DELPHI XE10.2\_TEST SIGN\_DEBUG\QuickPDF\Certificat\SetSignProcessPassthrough 04 hash result.txt', TEncoding.ANSI);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // PKCS 7 //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if Assigned(pkey) and CBSignProcessPassthroughPkcs7.Checked then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemLogs.Lines.Add('HASH to sign (PKCS7) : "' + string_LoadFromfile('D:\_DELPHI XE10.2\_TEST SIGN\_DEBUG\QuickPDF\Certificat\SetSignProcessPassthrough 04 hash result.txt', TEncoding.ANSI) + '"');<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Range du pdf ! InputBioFile := BIO_new_file('D:\_DELPHI XE10.2\_TEST SIGN\_DEBUG\QuickPDF\Certificat\SetSignProcessPassthrough.data_to_sign.txt','rb');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputBioFile := BIO_new_file('D:\_DELPHI XE10.2\_TEST SIGN\_DEBUG\QuickPDF\Certificat\SetSignProcessPassthrough 04 hash result.txt','rb');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO: charger via la variable Result //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputBioFile := BIO_new_file('D:\_DELPHI XE10.2\_TEST SIGN\_DEBUG\QuickPDF\Certificat\SetSignProcessPassthrough 05 pkcs7 signature.p7m','wb');<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _certs := nil; // := ca fait augmenter la taille du pdf<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _flags := ssl_const.PKCS7_NOATTR;// or ssl_const.PKCS7_STREAM;&nbsp;&nbsp;&nbsp;&nbsp; // _flags info: If "PKCS7_NOCERTS" is set, the signer's certificate will not be included in the PKCS7 structure<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _pPKCS7 := ssl_pkcs7.PKCS7_sign(pCertificate, pkey, _certs, InputBioFile, _flags);&nbsp;&nbsp;&nbsp;&nbsp; // il faut appeler SSL_InitPKCS7 avant !<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ssl_pkcs7.i2d_PKCS7_bio_stream(OutputBioFile, _pPKCS7, InputBioFile, _flags);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; SMIME_write_PKCS7( OutputBioFile, p7, InputBioFile, flags );<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PKCS7_free(_pPKCS7);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BIO_Free(InputBioFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BIO_Free(OutputBioFile);&nbsp;&nbsp; // Le fichier est écrit une fois le free effectué !<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := string_LoadFromfile('D:\_DELPHI XE10.2\_TEST SIGN\_DEBUG\QuickPDF\Certificat\SetSignProcessPassthrough 05 pkcs7 signature.p7m', TEncoding.ANSI);&nbsp;&nbsp;&nbsp; // TODO: Sauvegarder dans la variable Result //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemLogs.Lines.Add('Sign (PKCS7) result : "' + Result + '"');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ERR_get_error;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ERR_print_errors(B);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PKCS12_free(P12);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>&nbsp;&nbsp;&nbsp; finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BIO_free(B);<br>&nbsp;&nbsp;&nbsp; end;<br>&nbsp; finally<br>&nbsp;&nbsp;&nbsp; FreeAndNil(LM);<br>&nbsp; end;<br>end;<br><br>procedure TFrmPrinDemoPdf.BtnSetSignProcessPassthroughClick(Sender: TObject);<br>var<br>&nbsp; FichierEntreePdf, FichierSortiePdf: string;<br>&nbsp; DataToSign, ResultatSignature, LoadSignature: AnsiString;<br>&nbsp; FichierImage, FichierCert, SignatureFieldName, Reason, Location, ContactInfo: string;<br>&nbsp; PfxPassword: AnsiString;<br><br>&nbsp; PDFLibrary: TDebenuPDFLibrary;<br>&nbsp; UnlockResult, LoadResult, SignProcessID, TestByteSignature, SignatureByteLength, X, Rslt: Integer;<br>&nbsp; hashRange: array&#091;0..7&#093; of integer;<br>&nbsp; LM: TMemoryStream;<br>&nbsp; filedata: TBytes;<br>&nbsp; filedataLength: Integer;<br>&nbsp; BytesRead: Integer;<br>&nbsp; Hex: string;<br>begin<br>&nbsp; MemLogs.Lines.Clear;<br>&nbsp; FichierCert := 'c:\certificate.pdf';<br>&nbsp; PfxPassword := '';<br><br>&nbsp; FichierEntreePdf := 'c:\input.pdf';<br>&nbsp; FichierSortiePdf := 'c:\signed.pdf';<br><br>&nbsp; // Estimate how much space we need for the signature by first signing some random data<br>&nbsp; DataToSign := 'calc need bytes';<br>&nbsp; SignDataWithPfxFile(FichierCert, PfxPassword, DataToSign, ResultatSignature);<br><br>&nbsp; TestByteSignature := Length(ResultatSignature);<br>&nbsp; MemLogs.Lines.Add('Bytes de la signature : ' + intToStr(TestByteSignature) );<br><br>&nbsp; PDFLibrary := TDebenuPDFLibrary.Create;<br>&nbsp; UnlockResult := PDFLibrary.UnlockKey('my licence key');<br><br>&nbsp; if UnlockResult = 0 then<br>&nbsp; begin<br>&nbsp;&nbsp;&nbsp; PDFLibrary.Free;<br>&nbsp;&nbsp;&nbsp; Exit;<br>&nbsp; end;<br><br>&nbsp; try<br>&nbsp;&nbsp;&nbsp; Rslt := 0;&nbsp;&nbsp; // Signé ?<br>&nbsp;&nbsp;&nbsp; SignatureFieldName := 'FIELD_SIGN';<br>&nbsp;&nbsp;&nbsp; FichierImage := 'c:\image.png';<br>&nbsp;&nbsp;&nbsp; Reason := 'DEBUGGING ...';<br>&nbsp;&nbsp;&nbsp; Location := 'PORTUGAL';<br>&nbsp;&nbsp;&nbsp; ContactInfo := 'Mauricio';<br><br>&nbsp;&nbsp;&nbsp; // SignatureByteLength := TestByteSignature * 2 + 512;<br>&nbsp;&nbsp;&nbsp; // Number of bytes to reserve for the signature placeholder. We need double the bytes because they will will be stored in hex format, and we add 512 bytes extra margin :<br>&nbsp;&nbsp;&nbsp; // Non car le fonction SetSignProcessPassthrough duplique déjà les bytes comme indiqué ici:<br>&nbsp;&nbsp;&nbsp; SignatureByteLength := TestByteSignature + 256;&nbsp;&nbsp;&nbsp; // SetSignProcessPassthrough already duplicates bytes !<br><br>&nbsp;&nbsp;&nbsp; SignProcessID := PDFLibrary.NewSignProcessFromFile(FichierEntreePdf, '');<br><br>&nbsp;&nbsp;&nbsp; if SignProcessID &lt;&gt; 0 then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // In this mode, the PDF is prepared using a placeholder for the signature data. The user can then replace this placeholder with the signature data of their choice<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // using the GetSignProcessByteRange function to determine the byte range that the signature hashing should be calculated over.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // The length in bytes of the raw binary signature data. This value will be doubled when allocating the space in the PDF as the signature data should be written using hex encoding (two characters per raw byte).<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rslt := PDFLibrary.SetSignProcessPassthrough(SignProcessID, SignatureByteLength);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if Rslt = 1 then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PDFLibrary.SetSignProcessInfo(SignProcessID, Reason, Location, ContactInfo);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PDFLibrary.SetSignProcessField(SignProcessID, SignatureFieldName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PDFLibrary.SetSignProcessFieldBounds(SignProcessID, 100, 600, 200, 100);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if FichierImage &lt;&gt; '' then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PDFLibrary.SetSignProcessFieldImageFromFile(SignProcessID, FichierImage, 0);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PDFLibrary.EndSignProcessToFile(SignProcessID, FichierSortiePdf);&nbsp;&nbsp;&nbsp;&nbsp; // Sauvegarde le fichier sur le disque<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rslt := PDFLibrary.GetSignProcessResult(SignProcessID);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if Rslt = 1 then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if FileExists(FichierSortiePdf) then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Byte ranges //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for X := 0 to 7 do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hashRange&#091;X&#093; := PDFLibrary.GetSignProcessByteRange(SignProcessID, X + 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemLogs.Lines.Add('hashRange&#091;' + intToStr(X) + '&#093; : ' + intToStr(hashRange&#091;X&#093;) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // hashRange&#091;4&#093; hashRange&#091;5&#093; hashRange&#091;6&#093; et hashRange&#091;7&#093; à 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Read the file data into a byte array, missing out the placeholder for the signature data //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filedataLength := hashRange&#091;1&#093; + (hashRange&#091;3&#093;);&nbsp; // Visual Basic sample do -1 but not C# sample ... := hashRange&#091;1&#093; + (hashRange&#091;3&#093; - 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetLength(filedata, filedataLength);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM := TMemoryStream.Create;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM.LoadFromFile(FichierSortiePdf);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM.Seek(hashRange&#091;0&#093;, TSeekOrigin.soBeginning);&nbsp;&nbsp; // Seek() Déplace la position en cours dans le flux de Offset octets par rapport à la position de départ spécifiée par Origin.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BytesRead := LM.Read(filedata, 0, hashRange&#091;1&#093;);&nbsp; // La méthode Read permet de lire le contenu du flux mémoire dans un tampon en partant de la position en cours<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM.Seek(hashRange&#091;2&#093;, TSeekOrigin.soBeginning);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BytesRead := LM.Read(filedata, hashRange&#091;1&#093;, hashRange&#091;3&#093;);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Sign the file data (generates an SHA-1 hash and signs that hash) /<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetString(DataToSign, PAnsiChar(filedata), filedataLength);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SignDataWithPfxFile(FichierCert, PfxPassword, DataToSign, ResultatSignature);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Convert the signature to hex format //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hex := AnsistringToHex(ResultatSignature);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Length(Hex) = 2 x Length(ResultatSignature) = 512 ...<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Write the signature into the placeholder //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM.Seek(hashRange&#091;1&#093; + 1, TSeekOrigin.soBeginning);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filedata := BytesOf(Hex);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM.Write(filedata, length(filedata));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM.SaveToFile(FichierSortiePdf);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LM.Free;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PDFLibrary.ReleaseSignProcess(SignProcessID); // Releases a signature process from memory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp; if Rslt = 1 then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage('Signé');<br>&nbsp; finally<br>&nbsp;&nbsp;&nbsp; PDFLibrary.Free;<br>&nbsp; end;<br><br>&nbsp; MemLogs.SelStart := 0;<br>&nbsp; MemLogs.SelLength := 0;<br>end;<br><br>I have written SignDataWithPfxFile() function with open_ssl library.<br><br>I can see the certificate but not Acrobat says that the document has been modified. &nbsp;<br>Any help will be appreciate.<br>]]>
   </description>
   <pubDate>Mon, 31 Oct 2022 14:50:25 +0000</pubDate>
   <guid isPermaLink="true">http://www.quickpdf.org/forum/digital-signature_topic3995_post16189.html#16189</guid>
  </item> 
 </channel>
</rss>