<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aniket Chaturvedi</title>
    <description>The latest articles on DEV Community by Aniket Chaturvedi (@aniketc068).</description>
    <link>https://dev.to/aniketc068</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3992125%2F607ae1d0-80a4-4135-bbb0-f8c364211a13.jpg</url>
      <title>DEV Community: Aniket Chaturvedi</title>
      <link>https://dev.to/aniketc068</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aniketc068"/>
    <language>en</language>
    <item>
      <title>Sign a PDF in PHP with a green tick — PAdES, timestamp &amp; LTV</title>
      <dc:creator>Aniket Chaturvedi</dc:creator>
      <pubDate>Fri, 19 Jun 2026 08:51:23 +0000</pubDate>
      <link>https://dev.to/aniketc068/sign-a-pdf-in-php-with-a-green-tick-pades-timestamp-ltv-1o7n</link>
      <guid>https://dev.to/aniketc068/sign-a-pdf-in-php-with-a-green-tick-pades-timestamp-ltv-1o7n</guid>
      <description>&lt;p&gt;Signing a PDF from PHP so that Adobe Reader shows the &lt;strong&gt;green tick&lt;/strong&gt; — &lt;em&gt;"Signed and all signatures are valid"&lt;/em&gt; — with a trusted timestamp and long-term validation (LTV) is normally a lot of work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://atick.readthedocs.io/docs/php/" rel="noopener noreferrer"&gt;ATick&lt;/a&gt; does it in one call — free under AGPL-3.0.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frb1989ch22hfoowbws80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frb1989ch22hfoowbws80.png" alt="ATick's verified signature appearance — a green-tick validity mark with signer, date, reason and location" width="798" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require aniketc068/atick
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sign with a green tick, timestamp and LTV
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="k"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'vendor/autoload.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Aniketc068\ATick\Atick&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$pdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;file_get_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"doc.pdf"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$pfx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;file_get_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"my.pfx"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$signed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Atick&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;signPfx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pdf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$pfx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s2"&gt;"password"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"your-password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"cn"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Axonate Tech"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"reason"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Approved"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"green_tick"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"page"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"rect"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;575&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;175&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s2"&gt;"pades"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"timestamp"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"ltv"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// PAdES-B-LT&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="nb"&gt;file_put_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"signed.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$signed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;signed.pdf&lt;/code&gt; in Adobe Reader — with a trusted certificate it shows the &lt;strong&gt;green tick&lt;/strong&gt; and &lt;em&gt;"Signed and all signatures are valid."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs1z5upfyfhi0jmt2uwji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs1z5upfyfhi0jmt2uwji.png" alt="Adobe Reader: " width="679" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;green_tick&lt;/code&gt; → the validity mark Adobe greens for a valid + trusted certificate&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pades&lt;/code&gt; / &lt;code&gt;timestamp&lt;/code&gt; / &lt;code&gt;ltv&lt;/code&gt; → PAdES-B-LT (add &lt;code&gt;lta&lt;/code&gt; for B-LTA)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  More than the basics
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;USB token / smart-card / HSM&lt;/strong&gt; via PKCS#11 — &lt;code&gt;Atick::signPkcs11(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deferred / remote-key / eSign&lt;/strong&gt; — &lt;code&gt;Atick::prepareDeferred(...)&lt;/code&gt; then &lt;code&gt;Atick::embed(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Certified (no-changes) signatures&lt;/strong&gt;, &lt;strong&gt;encrypted output&lt;/strong&gt;, and a &lt;strong&gt;fully customizable appearance&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same API exists in Python, Java, .NET and Node.js — one engine, five languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://atick.readthedocs.io/docs/php/" rel="noopener noreferrer"&gt;https://atick.readthedocs.io/docs/php/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PAdES &amp;amp; LTV: &lt;a href="https://atick.readthedocs.io/docs/php/pades/" rel="noopener noreferrer"&gt;https://atick.readthedocs.io/docs/php/pades/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ATick is free under AGPL-3.0 (a commercial license is only needed to resell it). A product by &lt;a href="https://axonatetech.com" rel="noopener noreferrer"&gt;Axonate Tech&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>php</category>
      <category>pdf</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Sign a PDF in Node.js with PAdES, LTV and a green tick</title>
      <dc:creator>Aniket Chaturvedi</dc:creator>
      <pubDate>Fri, 19 Jun 2026 08:45:50 +0000</pubDate>
      <link>https://dev.to/aniketc068/sign-a-pdf-in-nodejs-with-pades-ltv-and-a-green-tick-43l2</link>
      <guid>https://dev.to/aniketc068/sign-a-pdf-in-nodejs-with-pades-ltv-and-a-green-tick-43l2</guid>
      <description>&lt;p&gt;Signing a PDF in Node.js so that Adobe Reader shows the &lt;strong&gt;green tick&lt;/strong&gt; — &lt;em&gt;"Signed and all signatures are valid"&lt;/em&gt; — with a trusted timestamp and long-term validation (LTV) has always been awkward in the Node ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://atick.readthedocs.io/docs/node/" rel="noopener noreferrer"&gt;ATick&lt;/a&gt; makes it a few lines.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frb1989ch22hfoowbws80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frb1989ch22hfoowbws80.png" alt="ATick's verified signature appearance — a green-tick validity mark with signer, date, reason and location" width="798" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;atick
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sign with a green tick, timestamp and LTV
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;atick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;atick&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;doc.pdf&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pfx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;my.pfx&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;atick&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signPfx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pfx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;your-password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;cn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Axonate Tech&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Approved&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;green_tick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;575&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;175&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;pades&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ltv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;// PAdES-B-LT&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;signed.pdf&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TypeScript works the same (&lt;code&gt;import * as atick from "atick"&lt;/code&gt;). Open &lt;code&gt;signed.pdf&lt;/code&gt; in Adobe Reader — with a trusted certificate it shows the &lt;strong&gt;green tick&lt;/strong&gt; and &lt;em&gt;"Signed and all signatures are valid."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs1z5upfyfhi0jmt2uwji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs1z5upfyfhi0jmt2uwji.png" alt="Adobe Reader: " width="679" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;green_tick&lt;/code&gt; → the validity mark Adobe greens for a valid + trusted certificate&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pades&lt;/code&gt; / &lt;code&gt;timestamp&lt;/code&gt; / &lt;code&gt;ltv&lt;/code&gt; → PAdES-B-LT (add &lt;code&gt;lta&lt;/code&gt; for B-LTA)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  More than the basics
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;USB token / smart-card / HSM&lt;/strong&gt; via PKCS#11 — &lt;code&gt;atick.signPkcs11(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deferred / remote-key / eSign&lt;/strong&gt; — &lt;code&gt;atick.prepareDeferred(...)&lt;/code&gt; then &lt;code&gt;atick.embed(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Certified (no-changes) signatures&lt;/strong&gt;, &lt;strong&gt;encrypted output&lt;/strong&gt;, and a &lt;strong&gt;fully customizable appearance&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same API exists in Python, Java, .NET and PHP — one engine, five languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://atick.readthedocs.io/docs/node/" rel="noopener noreferrer"&gt;https://atick.readthedocs.io/docs/node/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PAdES &amp;amp; LTV: &lt;a href="https://atick.readthedocs.io/docs/node/pades/" rel="noopener noreferrer"&gt;https://atick.readthedocs.io/docs/node/pades/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ATick is free under AGPL-3.0 (a commercial license is only needed to resell it). A product by &lt;a href="https://axonatetech.com" rel="noopener noreferrer"&gt;Axonate Tech&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>pdf</category>
      <category>security</category>
    </item>
    <item>
      <title>Sign a PDF in C# / .NET with a green tick and true LTV</title>
      <dc:creator>Aniket Chaturvedi</dc:creator>
      <pubDate>Fri, 19 Jun 2026 08:44:28 +0000</pubDate>
      <link>https://dev.to/aniketc068/sign-a-pdf-in-c-net-with-a-green-tick-and-true-ltv-3cdd</link>
      <guid>https://dev.to/aniketc068/sign-a-pdf-in-c-net-with-a-green-tick-and-true-ltv-3cdd</guid>
      <description>&lt;p&gt;Getting a .NET-signed PDF to show Adobe Reader's &lt;strong&gt;green tick&lt;/strong&gt; — &lt;em&gt;"Signed and all signatures are valid"&lt;/em&gt; — and to stay valid long-term (LTV) usually takes a lot of manual work: PAdES, a trusted timestamp, the DSS, and the in-document appearance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://atick.readthedocs.io/docs/dotnet/" rel="noopener noreferrer"&gt;ATick&lt;/a&gt; gives you all of it in one call — free under AGPL-3.0.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frb1989ch22hfoowbws80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frb1989ch22hfoowbws80.png" alt="ATick's verified signature appearance — a green-tick validity mark with signer, date, reason and location" width="798" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package ATick
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sign with a green tick, timestamp and LTV
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.IO&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Aniketc068.ATick&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;pdf&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadAllBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"doc.pdf"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;pfx&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadAllBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"my.pfx"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;signed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Atick&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SignPfx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pfx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"{\"password\":\"your-password\",\"cn\":\"Axonate Tech\",\"reason\":\"Approved\","&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt;
    &lt;span class="s"&gt;"\"green_tick\":true,\"page\":1,\"rect\":[300,55,575,175],"&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt;
    &lt;span class="s"&gt;"\"pades\":true,\"timestamp\":true,\"ltv\":true}"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// PAdES-B-LT&lt;/span&gt;

&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteAllBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"signed.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;signed.pdf&lt;/code&gt; in Adobe Reader — with a trusted certificate it shows the &lt;strong&gt;green tick&lt;/strong&gt; and &lt;em&gt;"Signed and all signatures are valid."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs1z5upfyfhi0jmt2uwji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs1z5upfyfhi0jmt2uwji.png" alt="Adobe Reader: " width="679" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;green_tick&lt;/code&gt; → the validity mark Adobe greens for a valid + trusted certificate&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pades&lt;/code&gt; / &lt;code&gt;timestamp&lt;/code&gt; / &lt;code&gt;ltv&lt;/code&gt; → PAdES-B-LT (add &lt;code&gt;lta&lt;/code&gt; for B-LTA)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  More than the basics
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows certificate store&lt;/strong&gt;, built in — &lt;code&gt;Atick.SignWinStore(...)&lt;/code&gt; with a thumbprint (or the system picker).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;USB token / smart-card / HSM&lt;/strong&gt; via PKCS#11 — &lt;code&gt;Atick.SignPkcs11(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deferred / remote-key / eSign&lt;/strong&gt; — &lt;code&gt;Atick.Prepare(...)&lt;/code&gt; then &lt;code&gt;Atick.Embed(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Certified (no-changes) signatures&lt;/strong&gt;, &lt;strong&gt;encrypted output&lt;/strong&gt;, and a &lt;strong&gt;fully customizable appearance&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same API exists in Python, Java, Node.js and PHP — one engine, five languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://atick.readthedocs.io/docs/dotnet/" rel="noopener noreferrer"&gt;https://atick.readthedocs.io/docs/dotnet/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PAdES &amp;amp; LTV: &lt;a href="https://atick.readthedocs.io/docs/dotnet/pades/" rel="noopener noreferrer"&gt;https://atick.readthedocs.io/docs/dotnet/pades/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ATick is free under AGPL-3.0 (a commercial license is only needed to resell it). A product by &lt;a href="https://axonatetech.com" rel="noopener noreferrer"&gt;Axonate Tech&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>pdf</category>
      <category>security</category>
    </item>
    <item>
      <title>Sign a PDF in Java with a green tick — PAdES, timestamp &amp; LTV in one call</title>
      <dc:creator>Aniket Chaturvedi</dc:creator>
      <pubDate>Fri, 19 Jun 2026 08:38:47 +0000</pubDate>
      <link>https://dev.to/aniketc068/sign-a-pdf-in-java-with-a-green-tick-pades-timestamp-ltv-in-one-call-fh4</link>
      <guid>https://dev.to/aniketc068/sign-a-pdf-in-java-with-a-green-tick-pades-timestamp-ltv-in-one-call-fh4</guid>
      <description>&lt;p&gt;Signing a PDF from Java so that Adobe Reader shows the &lt;strong&gt;green tick&lt;/strong&gt; — &lt;em&gt;"Signed and all signatures are valid"&lt;/em&gt; — usually means wiring up PAdES, a trusted timestamp, the DSS for long-term validation, and a signature appearance by hand. That's a lot of plumbing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://atick.readthedocs.io/docs/java/" rel="noopener noreferrer"&gt;ATick&lt;/a&gt; does it in one call — free under AGPL-3.0.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frb1989ch22hfoowbws80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frb1989ch22hfoowbws80.png" alt="ATick's verified signature appearance — a green-tick validity mark with signer, date, reason and location" width="798" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Add the dependency
&lt;/h2&gt;

&lt;p&gt;Maven:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.github.aniketc068&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;atick&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0.6&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sign with a green tick, timestamp and LTV
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.github.aniketc068.atick.Atick&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.nio.file.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Quickstart&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;pdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readAllBytes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Paths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"doc.pdf"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;pfx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readAllBytes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Paths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"my.pfx"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

        &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;signed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Atick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;signPfx&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pfx&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"{\"password\":\"your-password\",\"cn\":\"Axonate Tech\",\"reason\":\"Approved\","&lt;/span&gt;
          &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"\"green_tick\":true,\"page\":1,\"rect\":[300,55,575,175],"&lt;/span&gt;
          &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"\"pades\":true,\"timestamp\":true,\"ltv\":true}"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// PAdES-B-LT&lt;/span&gt;

        &lt;span class="nc"&gt;Files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Paths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"signed.pdf"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="n"&gt;signed&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;signed.pdf&lt;/code&gt; in Adobe Reader — with a trusted certificate it shows the &lt;strong&gt;green tick&lt;/strong&gt; and &lt;em&gt;"Signed and all signatures are valid."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs1z5upfyfhi0jmt2uwji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs1z5upfyfhi0jmt2uwji.png" alt="Adobe Reader: " width="679" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;green_tick&lt;/code&gt; → draws the validity mark Adobe greens for a valid + trusted certificate&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pades&lt;/code&gt; / &lt;code&gt;timestamp&lt;/code&gt; / &lt;code&gt;ltv&lt;/code&gt; → PAdES-B-LT (add &lt;code&gt;lta&lt;/code&gt; for B-LTA)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  More than the basics
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;USB token / smart-card / HSM&lt;/strong&gt; via PKCS#11 — &lt;code&gt;Atick.signPkcs11(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deferred / remote-key / eSign&lt;/strong&gt; — &lt;code&gt;Atick.prepareDeferred(...)&lt;/code&gt; then &lt;code&gt;Atick.embed(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Certified (no-changes) signatures&lt;/strong&gt;, &lt;strong&gt;encrypted output&lt;/strong&gt;, and a &lt;strong&gt;fully customizable appearance&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same API exists in Python, .NET, Node.js and PHP — one engine, five languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://atick.readthedocs.io/docs/java/" rel="noopener noreferrer"&gt;https://atick.readthedocs.io/docs/java/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PAdES &amp;amp; LTV: &lt;a href="https://atick.readthedocs.io/docs/java/pades/" rel="noopener noreferrer"&gt;https://atick.readthedocs.io/docs/java/pades/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ATick is free under AGPL-3.0 (a commercial license is only needed to resell it). A product by &lt;a href="https://axonatetech.com" rel="noopener noreferrer"&gt;Axonate Tech&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>java</category>
      <category>pdf</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Sign a PDF in Python so Adobe shows a green tick (PAdES + LTV)</title>
      <dc:creator>Aniket Chaturvedi</dc:creator>
      <pubDate>Fri, 19 Jun 2026 08:38:00 +0000</pubDate>
      <link>https://dev.to/aniketc068/sign-a-pdf-in-python-so-adobe-shows-a-green-tick-pades-ltv-4kd2</link>
      <guid>https://dev.to/aniketc068/sign-a-pdf-in-python-so-adobe-shows-a-green-tick-pades-ltv-4kd2</guid>
      <description>&lt;p&gt;If you've ever signed a PDF from code and then opened it in Adobe Reader only to see a &lt;strong&gt;yellow question mark&lt;/strong&gt; instead of a green tick, you know the pain. Getting Adobe to render &lt;em&gt;"Signed and all signatures are valid"&lt;/em&gt; with the green check takes more than a CMS signature — you need PAdES, a trusted timestamp, long-term validation (LTV), and the right in-document appearance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://atick.readthedocs.io/docs/python/" rel="noopener noreferrer"&gt;ATick&lt;/a&gt; does all of that in a few lines.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frb1989ch22hfoowbws80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frb1989ch22hfoowbws80.png" alt="ATick's verified signature appearance — a green-tick validity mark with signer, date, reason and location" width="798" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;atick
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One self-contained package — no system dependencies to chase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sign with a green tick, timestamp and LTV
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;atick&lt;/span&gt;

&lt;span class="n"&gt;pdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;document.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;pfx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my_certificate.pfx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;signed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;atick&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign_pfx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pfx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pfx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-password&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;atick&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Style&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Axonate Tech&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Approved&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;placements&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;575&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;175&lt;/span&gt;&lt;span class="p"&gt;))],&lt;/span&gt;   &lt;span class="c1"&gt;# page 1, rect (x1, y1, x2, y2)
&lt;/span&gt;    &lt;span class="n"&gt;pades&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ltv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;# PAdES-B-LT
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;signed.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;signed.pdf&lt;/code&gt; in Adobe Reader — with a trusted certificate it shows the &lt;strong&gt;green tick&lt;/strong&gt; and &lt;em&gt;"Signed and all signatures are valid."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs1z5upfyfhi0jmt2uwji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs1z5upfyfhi0jmt2uwji.png" alt="Adobe Reader: " width="679" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pades=True&lt;/code&gt; → an ETSI PAdES signature&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;timestamp=True&lt;/code&gt; → RFC-3161 trusted timestamp (PAdES-B-T)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ltv=True&lt;/code&gt; → embeds the chain + revocation for long-term validation (PAdES-B-LT)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add &lt;code&gt;lta=True&lt;/code&gt; for a document timestamp on top (PAdES-B-LTA).&lt;/p&gt;

&lt;h2&gt;
  
  
  More than the basics
&lt;/h2&gt;

&lt;p&gt;ATick is batteries-included, so the hard parts are one option each:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Adobe-valid green tick&lt;/strong&gt;, built in — most libraries leave the visual appearance to you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;USB token / smart-card / HSM&lt;/strong&gt; via PKCS#11 — &lt;code&gt;atick.sign_pkcs11(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Windows certificate store&lt;/strong&gt; — &lt;code&gt;atick.sign_winstore(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deferred / remote-key / eSign&lt;/strong&gt; — &lt;code&gt;atick.prepare_deferred(...)&lt;/code&gt; then &lt;code&gt;atick.embed(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Certified (no-changes) signatures&lt;/strong&gt;, &lt;strong&gt;encrypted output&lt;/strong&gt;, and a &lt;strong&gt;fully customizable appearance&lt;/strong&gt; (logo, colours, layout).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the same API exists in Java, .NET, Node.js and PHP — learn it once, use it everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Error handling
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;signed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;atick&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign_pfx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pfx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pfx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wrong&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;placements&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;placements&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;atick&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AtickError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;signing failed:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://atick.readthedocs.io/docs/python/" rel="noopener noreferrer"&gt;https://atick.readthedocs.io/docs/python/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PAdES &amp;amp; LTV: &lt;a href="https://atick.readthedocs.io/docs/python/pades/" rel="noopener noreferrer"&gt;https://atick.readthedocs.io/docs/python/pades/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ATick is free under AGPL-3.0 (a commercial license is only needed to resell it). A product by &lt;a href="https://axonatetech.com" rel="noopener noreferrer"&gt;Axonate Tech&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>pdf</category>
      <category>security</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
