 <p>You can not remove keys from a dictionary in a signed document, and expect the signatures to remain valid. You can only remove the last signature that was added. If a document was signed by multiple people, and you want to remove the first signature, all subsequent signatures will be broken.</p> <p>This image explains why:</p> <p><a href="https://i.stack.imgur.com/7f0D7.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/7f0D7.png" alt="enter image description here"></a></p> <p>This image shows that every new digital signature keeps the original bytes intact. With every new signature new bytes are added. Rev1 represents the bytes of a document that has 1 digital signature. Rev2 represents the bytes of a document that has 2 digital signatures. The second digital signatures signs Rev1 completely. If you'd remove the first signature, the second signature would become invalid.</p> <p>A digital signature is a special type of form field. With iText, you can get the names of the signature form fields of a PDF like this:</p> <pre><code>PdfReader reader = new PdfReader(path); AcroFields fields = reader.getAcroFields(); ArrayList&lt;String&gt; names = fields.getSignatureNames(); </code></pre> <p>You can only remove the signature that covers the whole document, for instance, if we have <code>"sig1"</code>, <code>"sig2"</code>, and <code>"sig3"</code> (added in that order), only <code>fields.signatureCoversWholeDocument("sig3")</code> will return true.</p> <p>You can get the total number of revisions like this: <code>fields.getTotalRevisions()</code> and a specific revision like this: <code>fields.getRevision("sig1")</code> (provided that there's a signature field named <code>"sig1"</code>).</p> <p>Suppose that the image represents your document, and you have to remove 1 signature, then you can only remove the third signature by removing all the bytes that were added in revision 3 (Rev3). With iText, that means going back to revision 2 (Rev2). That revision was signed using the signature field <code>sig2</code>. You can extract this revision like this:</p> <pre><code>FileOutputStream os = new FileOutputStream("revision2.pdf"); byte bb[] = new byte[1028]; InputStream ip = fields.extractRevision("sig2"); int n = 0; while ((n = ip.read(bb)) &gt; 0) os.write(bb, 0, n); os.close(); ip.close(); </code></pre> <p>The file <code>revision2.pdf</code> will be the file signed by <code>"sig1"</code> and <code>"sig2"</code> without the bytes that were added when creating <code>"sig3"</code>.</p>