Documentation menu

Appearance

The signature appearance is controlled entirely by JSON option keys passed toAtick.SignPfx(byte[] pdf, byte[] pfx, string optionsJson). By default ATick shows its logo on the left, the signer details on the right, and the validity mark.

Appearance.cs
using Aniketc068.ATick;
using System.IO;

byte[] pdf = File.ReadAllBytes("doc.pdf");
byte[] pfx = File.ReadAllBytes("my.pfx");

byte[] signed = Atick.SignPfx(pdf, pfx,
    "{\"cn\":\"Axonate Tech\","   // common name (shown bold after "Digitally Signed by:")
  + "\"org\":\"Acme Corp\","            // organisation line
  + "\"reason\":\"Approved\","          // "Reason: …"
  + "\"location\":\"New Delhi\","       // "Location: …"
  + "\"green_tick\":true}");

File.WriteAllBytes("signed.pdf", signed);

Long signer names wrap onto more lines instead of shrinking the font, so the box never overflows.

Date / time

DateTime.cs
Atick.SignPfx(pdf, pfx, "{\"cn\":\"Aniket\"}");                       // current time (default)
Atick.SignPfx(pdf, pfx, "{\"cn\":\"Aniket\",\"date\":\"Signed on 10-Jun-2026\"}");  // a fixed string
Atick.SignPfx(pdf, pfx, "{\"cn\":\"Aniket\",\"date\":\"\"}");          // no date line

The left side

The image key controls what is drawn on the left of the appearance:

LeftSide.cs
Atick.SignPfx(pdf, pfx, "{\"cn\":\"Aniket\"}");                       // default: the ATick logo
Atick.SignPfx(pdf, pfx, "{\"cn\":\"Aniket\",\"image\":\"none\"}");    // no logo
Atick.SignPfx(pdf, pfx, "{\"cn\":\"Aniket\",\"image\":\"cn\"}");      // the CN as large text on the LEFT (Adobe-style)
image valueResult
omittedthe default ATick logo
"none"no logo on the left
"cn"the signer name as text on the left instead of a logo

The validity mark — ATick's signature look

The mark sits centred in the appearance and tells the reader the signature's status at a glance:

Mark.cs
Atick.SignPfx(pdf, pfx, "{\"cn\":\"Aniket\",\"green_tick\":true}");    // the verified mark — Adobe paints it GREEN if valid+trusted, RED if invalid
Atick.SignPfx(pdf, pfx, "{\"cn\":\"Aniket\",\"always_check\":true}");  // ATick's green-tick graphic as the base (Adobe still reds a bad signature)
Atick.SignPfx(pdf, pfx, "{\"cn\":\"Aniket\",\"green_tick\":false}");   // no mark — a plain signature
  • "green_tick":true — the classic validity mark that Adobe Acrobat repaints green for a valid, trusted signature andred for a broken one.
  • "always_check":true — uses ATick's own green-tick graphic as the base, so the tick shows in every viewer; Adobe still overlays a red mark if the signature is actually invalid.
  • "green_tick":false — no mark; a plain signature appearance.

How Adobe shows it

When the certificate is valid and trusted, Adobe Reader / Acrobat reports “Signed and all signatures are valid” and paints the tick green — exactly the reassurance your readers expect.

Every state Adobe can show

ATick draws the appearance and the mark; Adobe then colours the mark based on the signature's validity and whether it trusts the certificate, so your reader instantly sees the status:

  • Valid & trusted — signature intact and the certificate chains to a root Adobe trusts — “Signed and all signatures are valid.”
  • Validity unknown — signature intact, but Adobe doesn't trust the certificate's root“Validity unknown.”
  • Not verified — Adobe hasn't validated the signature yet (no trust information) — “Signature not verified.”
  • Invalid — the document was changed after signing (or the signature is broken) — “Signature is invalid.”

So the green tick appears only when the signature is valid and the signer's certificate chains to a root Adobe trusts (the Adobe Approved Trust List, or your organisation's trust). The same ATick appearance shows the question-mark or red-cross state automatically — you don't draw those; Adobe does.

Colouring the mark

Colour the mark with a hex string, a CSS colour name, or an [r, g, b] array — or fill it with an axial gradient:

MarkColor.cs
Atick.SignPfx(pdf, pfx, "{\"cn\":\"Aniket\",\"green_tick\":true,\"mark_color\":\"#E53935\"}");        // hex
Atick.SignPfx(pdf, pfx, "{\"cn\":\"Aniket\",\"green_tick\":true,\"mark_color\":\"blue\"}");           // CSS name
Atick.SignPfx(pdf, pfx, "{\"cn\":\"Aniket\",\"green_tick\":true,\"mark_color\":[255,140,0]}");        // RGB array
Atick.SignPfx(pdf, pfx, "{\"cn\":\"Aniket\",\"green_tick\":true,\"mark_gradient\":[\"red\",\"orange\",\"yellow\"]}");  // gradient

Use mark_scale to resize the mark relative to the appearance box.

Fine-tuning the layout

For pixel-level control over where the mark and the text sit, use these nudge keys. They are all optional — the defaults already produce a balanced box.

FineTune.cs
Atick.SignPfx(pdf, pfx,
    "{\"cn\":\"Aniket\",\"green_tick\":true,"
  + "\"top_reserve\":0.32,"   // reserve the top 32% of the box for the logo / mark
  + "\"mark_scale\":1.1,"     // make the mark 10% larger
  + "\"mark_dx\":4,"          // nudge the mark 4 pt to the right
  + "\"mark_dy\":-2,"         // nudge the mark 2 pt down
  + "\"text_dx\":6,"          // nudge the signer text 6 pt to the right
  + "\"text_top\":0.40}");    // start the text block 40% down from the top
KeyEffect
top_reservefraction of the box height (e.g. 0.32) reserved at the top for the logo / mark
mark_scalescale factor for the mark size
mark_dxnudge the mark horizontally in points (positive = right)
mark_dynudge the mark vertically in points (positive = up)
text_dxnudge the signer text horizontally in points (positive = right)
text_topvertical start of the text block, as a fraction of box height from the top

Border styling

Turn the border on with "border":true, then set its colour and width.border_color takes an [r, g, b] array and border_width is the line width in points:

Border.cs
Atick.SignPfx(pdf, pfx,
    "{\"cn\":\"Aniket\",\"green_tick\":true,"
  + "\"border\":true,"
  + "\"border_color\":[20,80,160],"  // RGB border colour
  + "\"border_width\":1.0}");        // line width in points

Distinguished name

Dn.cs
Atick.SignPfx(pdf, pfx,
    "{\"cn\":\"Axonate Tech\",\"dn\":\"CN=Axonate Tech, O=Personal, C=IN\"}");

The DN is shown directly under the "Digitally Signed by:" line.

Custom-text-only appearance

Show only your own text — no "Signed by", no date, no CN structure. Inside body, \n starts a new line and *word*makes that run bold. Because the value lives in a JSON string in C# source, escape each line break as \\n:

Body.cs
Atick.SignPfx(pdf, pfx,
    "{\"body\":\"*APPROVED*\\nReviewed by: *Axonate Tech*\\nThis document is *legally binding*.\"}");
In C# source \\n produces the two characters \n in the JSON string, which ATick reads as a line break. A literal C# newline would break the JSON.

Positioning the appearance

Place the appearance with page + rect, or stamp several positions at once with placements. Coordinates are PDF points as [x1, y1, x2, y2].

Position.cs
Atick.SignPfx(pdf, pfx,
    "{\"cn\":\"Aniket\",\"green_tick\":true,\"page\":1,\"rect\":[300,55,575,175]}");

// one stamp per entry: [page, [x1,y1,x2,y2]]
Atick.SignPfx(pdf, pfx,
    "{\"cn\":\"Aniket\",\"green_tick\":true,\"placements\":[[1,[300,55,575,175]],[2,[300,55,575,175]]]}");

You can also size the box directly with width and height.

Invisible signature

A cryptographically valid signature that draws nothing on the page — pass an emptyplacements array:

Invisible.cs
Atick.SignPfx(pdf, pfx, "{\"cn\":\"Aniket\",\"placements\":[]}");   // empty placements

Other appearance options

KeyPurpose
headingthe heading line at the top of the appearance
textextra free text line
ouorganisational-unit line
font_sizesize of the appearance text
text_colorcolour of the text
bg_colorbackground fill of the box
borderdraw a border around the box
border_colorborder colour as [r, g, b] (needs border)
border_widthborder line width in points, e.g. 1.0 (needs border)
width, heightthe box size
mark_scalescale factor for the validity mark
mark_dx, mark_dynudge the mark in points (x right, y up)
text_dxnudge the signer text horizontally in points
text_topvertical start of the text block (fraction from top)
top_reservefraction of box height reserved at the top for the logo / mark

Errors

Every failure throws AtickException:

Errors.cs
try
{
    Atick.SignPfx(pdf, pfx, "{\"cn\":\"Aniket\",\"image\":\"missing.png\"}");
}
catch (AtickException e)
{
    Console.WriteLine("signing failed: " + e.Message);
}

Next page →