{"id":50908210,"url":"https://github.com/aniketc068/atick-java","last_synced_at":"2026-06-16T07:04:13.046Z","repository":{"id":364274270,"uuid":"1267198107","full_name":"Aniketc068/ATick-Java","owner":"Aniketc068","description":"Standalone PDF digital-signature library for the JVM — PAdES/CMS signing (PFX/PEM, deferred eSign/HSM/token), RFC-3161 timestamps, long-term validation, and a green-tick verified appearance Adobe shows as valid. Pure Java, one Maven dependency.","archived":false,"fork":false,"pushed_at":"2026-06-12T11:56:19.000Z","size":17485,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-12T12:07:45.669Z","etag":null,"topics":["digital-signature","esign","java","ltv","pades","pdf","pdf-signature","timestamp"],"latest_commit_sha":null,"homepage":"https://atick-java.readthedocs.io/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Aniketc068.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-12T10:08:14.000Z","updated_at":"2026-06-12T11:56:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Aniketc068/ATick-Java","commit_stats":null,"previous_names":["aniketc068/atick-java"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/Aniketc068/ATick-Java","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aniketc068%2FATick-Java","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aniketc068%2FATick-Java/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aniketc068%2FATick-Java/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aniketc068%2FATick-Java/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Aniketc068","download_url":"https://codeload.github.com/Aniketc068/ATick-Java/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aniketc068%2FATick-Java/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34393306,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["digital-signature","esign","java","ltv","pades","pdf","pdf-signature","timestamp"],"created_at":"2026-06-16T07:04:12.317Z","updated_at":"2026-06-16T07:04:13.027Z","avatar_url":"https://github.com/Aniketc068.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-Java/main/assets/atick_logo.png\" alt=\"ATick\" width=\"260\"/\u003e\n\n# ATick for Java\n\n**Standalone PDF digital-signature library for the JVM — PAdES / CMS signing with zero external services.**\n\n[![Maven Central](https://img.shields.io/maven-central/v/io.github.aniketc068/atick?color=2ea44f\u0026label=maven%20central)](https://central.sonatype.com/artifact/io.github.aniketc068/atick)\n[![Java](https://img.shields.io/badge/java-8%2B-blue)](https://www.oracle.com/java/)\n[![PAdES](https://img.shields.io/badge/PAdES-B--B%20%7C%20B--T%20%7C%20B--LT%20%7C%20B--LTA-success)](#pades-levels)\n[![Cross-platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-brightgreen)](#compatibility--one-artifact-everywhere)\n[![License: AGPL v3](https://img.shields.io/badge/license-AGPL--3.0-blue)](LICENSE)\n[![Also for Python](https://img.shields.io/badge/also%20for-Python-3776AB?logo=python\u0026logoColor=white)](https://github.com/Aniketc068/ATick-Python)\n[![Also for .NET](https://img.shields.io/badge/also%20for-.NET-512BD4?logo=dotnet\u0026logoColor=white)](https://github.com/Aniketc068/ATick-DotNet)\n[![Also for Node.js](https://img.shields.io/badge/also%20for-Node.js-339933?logo=node.js\u0026logoColor=white)](https://github.com/Aniketc068/ATick-Node)\n[![Also for PHP](https://img.shields.io/badge/also%20for-PHP-777BB4?logo=php\u0026logoColor=white)](https://github.com/Aniketc068/ATick-PHP)\n\n\u003c/div\u003e\n\n**Also available in other languages** — the same ATick engine, the same API, native to each ecosystem:\n\n| Language | Install | Source · Docs |\n|---|---|---|\n| **Python** | `pip install atick` | [ATick-Python](https://github.com/Aniketc068/ATick-Python) · [docs](https://atick.readthedocs.io/) |\n| **.NET** | `dotnet add package ATick` | [ATick-DotNet](https://github.com/Aniketc068/ATick-DotNet) · [docs](https://atick-dotnet.readthedocs.io/) |\n| **Node.js** | `npm install atick` | [ATick-Node](https://github.com/Aniketc068/ATick-Node) · [docs](https://atick-node.readthedocs.io/) |\n| **PHP** | `composer require aniketc068/atick` | [ATick-PHP](https://github.com/Aniketc068/ATick-PHP) · [docs](https://atick-php.readthedocs.io/) |\n\n---\n\nATick signs PDFs the way Adobe Acrobat and the EU DSS do — **PAdES baseline** signatures with\ntimestamps and long-term validation. It is **pure Java**: it calls a bundled native engine through\n**JNA**, so there is **no JNI build step** on your side and **no external services**. The matching\nengine for your OS/arch ships **inside the jar** and is loaded automatically. Add one Maven\ndependency and you are done.\n\n```java\nimport io.github.aniketc068.atick.Atick;\nimport java.nio.file.*;\n\nbyte[] pdf = Files.readAllBytes(Paths.get(\"doc.pdf\"));\nbyte[] pfx = Files.readAllBytes(Paths.get(\"my.pfx\"));\n\nbyte[] signed = Atick.signPfx(pdf, pfx,\n    \"{\\\"password\\\":\\\"••••\\\",\\\"cn\\\":\\\"Aniket Chaturvedi\\\",\\\"reason\\\":\\\"Approved\\\",\"\n  + \"\\\"green_tick\\\":true,\\\"page\\\":1,\\\"rect\\\":[300,55,575,175],\"\n  + \"\\\"pades\\\":true,\\\"timestamp\\\":true,\\\"ltv\\\":true}\");   // PAdES-B-LT\n\nFiles.write(Paths.get(\"signed.pdf\"), signed);\n```\n\n---\n\n## The green tick your readers trust\n\nATick draws a verified-signature appearance with a green tick. When the certificate is valid and\ntrusted, Adobe Reader / Acrobat shows **“Signed and all signatures are valid.”**\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-Java/main/assets/valid_signature_adobe.png\" alt=\"Adobe — signed and all signatures are valid\" width=\"560\"/\u003e\n\u003c/div\u003e\n\nAdobe colours that same mark by the signature's real status — you don't draw these, Adobe does:\n\n\u003ctable align=\"center\"\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-Java/main/assets/signature_appearance.png\" width=\"190\"/\u003e\u003cbr/\u003e\u003cb\u003eValid \u0026amp; trusted\u003c/b\u003e\u003cbr/\u003egreen tick\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-Java/main/assets/sig_unknown.png\" width=\"190\"/\u003e\u003cbr/\u003e\u003cb\u003eValidity unknown\u003c/b\u003e\u003cbr/\u003eyellow “?”\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-Java/main/assets/sig_notverified.png\" width=\"190\"/\u003e\u003cbr/\u003e\u003cb\u003eNot verified\u003c/b\u003e\u003cbr/\u003e“?” not validated\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/Aniketc068/ATick-Java/main/assets/sig_invalid.png\" width=\"190\"/\u003e\u003cbr/\u003e\u003cb\u003eInvalid\u003c/b\u003e\u003cbr/\u003ered cross\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nThe **green** tick appears only when the signature is valid *and* the certificate chains to a root\nAdobe trusts.\n\n---\n\n## Why ATick\n\n| | ATick for Java |\n|---|---|\n| **Zero external services** | the crypto, PKCS#12/PEM, image decode, timestamp \u0026 LTV are all built into the engine — nothing else to call |\n| **Pure Java** | calls the engine through JNA — no JNI, no C compiler, no native build on your side |\n| **Full PAdES** | B-B, B-T, B-LT, B-LTA — recognised by Adobe Acrobat as *“PAdES Signature Level”* |\n| **Deferred / remote keys** | two-step `prepare` → external CMS → `embed`, so you can sign with a USB token / HSM / smart-card / Windows store via your own JCA provider |\n| **One artifact, every platform** | one cross-platform dependency — Windows (64/32-bit), Linux, macOS — just like the Python package |\n| **Clear errors** | every failure is a normal Java `Atick.AtickException` you can catch |\n\n---\n\n## Features (A → Z)\n\n| Feature | How |\n|---|---|\n| **Sign with a `.pfx` / `.p12` / `.pem`** | `Atick.signPfx(pdf, pfx, options)` — PKCS#12 or PEM (key + certs), auto-detected |\n| **Date / time format** | `\"date\":\"21-Jun-2026 02:30 PM\"` fixed · `\"date\":\"\"` none (the appearance shows the signing time) |\n| **PAdES levels** B-B / B-T / B-LT / B-LTA | `\"pades\":true` + `\"timestamp\":true` + `\"ltv\":true` + `\"lta\":true` |\n| **Hash algorithm** | `\"hash_algo\":\"sha256\" \\| \"sha384\" \\| \"sha512\"` (signature = RSA PKCS#1 v1.5) |\n| **Timestamp authority** | a timestamp service is already built in — or use your own with `\"tsa_url\":\"…\"` (and `\"tsa_auth\":[\"user\",\"pass\"]` if it needs a login) |\n| **Long-term validation (LTV)** | `\"ltv\":true` embeds the certificate chain and its revocation (CRL/OCSP) so the signature keeps verifying for years |\n| **Multi-page / custom coordinates** | `\"placements\":[[page,[x1,y1,x2,y2]], …]` |\n| **Signature layout** | `\"mode\":\"single\"` (one signature, on one or many pages) · `\"mode\":\"shared\"` (several fields all showing the **same** signature) |\n| **Multi-signatory** | sign an already-signed PDF again (each person signs in turn). Every signature is its own revision — Adobe shows *Rev 1, Rev 2, …* — and all stay valid. Use a different `\"field_name\"` per signer |\n| **Certification (DocMDP)** | `\"certify\":1` (no changes) · `2` (form filling) · `3` (form filling + annotations) |\n| **Field locking (FieldMDP)** | `\"lock_fields\":[\"*\"]` (all) or `[\"FieldA\", …]` |\n| **Pre-sign checks** | `\"verify_expiry\":true`, `\"verify_crl\":true`, `\"verify_ocsp\":true` (or `\"verify\":true` for all) — signing is refused if a check fails |\n| **Document metadata** | `Atick.setMetadata(pdf, options)` — title / author / subject / keywords / application / created / modified |\n| **Password protection** | `\"encrypt_password\":\"…\"` (+ `\"owner_password\":\"…\"`) for the output; `\"open_password\":\"…\"` for an encrypted input; `Atick.decrypt(pdf, pw)` |\n| **Appearance** | options `cn, org, ou, location, reason, text, date, dn, body, heading, image` — auto-fit text, transparent logo |\n| **The mark** | the `?` (Adobe greens it), an always-green tick, or nothing — see [The mark](#the-mark) |\n| **CN on the left** (Adobe-style) | `\"image\":\"cn\"` — the signer name as text on the left instead of a logo |\n| **Distinguished name** | `\"dn\":\"CN=…, O=…, C=IN\"` — shown under the \"Signed by:\" line |\n| **Custom-text-only appearance** | `\"body\":\"*APPROVED*\\nby *Aniket*\"` — only your text; `\\n` = line, `*x*` = bold |\n| **Invisible signature** | `\"placements\":[]` — valid signature, nothing drawn |\n| **Sign an already-signed PDF** | sign again (incremental) — existing signatures stay valid; use a fresh `\"field_name\"` |\n| **Container only** | `Atick.prepareFields(pdf, options)` — appearance + empty field, signed later |\n| **Document timestamp** | `\"lta\":true` adds it while signing; `Atick.addDocTimestamp(pdf, options)` adds one to an **already-signed** PDF afterwards (PAdES-B-LTA) |\n| **Fast signing** | revocation cache (ON by default): repeated signing with the same cert reuses CRL/OCSP — `Atick.setFastSigning(false)` to disable |\n| **Deferred / eSign (2-step)** | `Atick.prepare(pdf, options)` → external CMS over the bytes-to-sign → `Atick.embed(prepared, cms)` |\n| **Detached CMS** | `Atick.cmsPfx(data, pfx, options)` — a detached PKCS#7/CMS over `data` |\n| **Low-level field API** | `prepare`, `prepareFields`, `signField`, `embed` for template / remote-key flows |\n\n---\n\n## Install (Maven)\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.github.aniketc068\u003c/groupId\u003e\n  \u003cartifactId\u003eatick\u003c/artifactId\u003e\n  \u003cversion\u003e1.0.6\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nGradle:\n\n```groovy\nimplementation 'io.github.aniketc068:atick:1.0.6'\n```\n\nThat is the only dependency — JNA and the native engine come with it. (Deferred signing with a USB\ntoken / HSM / Windows store uses your own JCA provider for the key; everything else is built in.)\n\n---\n\n## Compatibility — one artifact everywhere\n\n- **Java 8 → latest** (Java 8 bytecode — runs on 8, 11, 17, 21, …).\n- **32-bit AND 64-bit** JVMs (JNA sizes pointers / `size_t` per the running JVM).\n- **Every OS/arch** — the jar bundles a native engine per platform and JNA loads the right one:\n\n  | Platform | Bundled |\n  |---|---|\n  | Windows 64-bit | `win32-x86-64` |\n  | Windows 32-bit | `win32-x86` |\n  | Linux x86-64 | `linux-x86-64` (CI) |\n  | Linux ARM64 | `linux-aarch64` (CI) |\n  | macOS Intel | `darwin-x86-64` (CI) |\n  | macOS Apple Silicon | `darwin-aarch64` (CI) |\n\nSo `io.github.aniketc068:atick` is one cross-platform dependency — exactly like `pip install atick`.\nEach platform's engine is built by CI, the same way the Python wheels are built per platform.\n\n---\n\n## The API\n\n```java\nAtick.signPfx(pdf, pfx, optionsJson)          // sign with a .pfx / .p12 / .pem (auto-detected)\nAtick.prepare(pdf, optionsJson)               // deferred / eSign: returns { prepared, bytesToSign }\nAtick.cmsPfx(data, pfx, optionsJson)          // detached CMS over `data`\nAtick.embed(prepared, cms)                    // embed a detached CMS into a prepared PDF\nAtick.prepareFields(pdf, optionsJson)         // make an empty signature field (template)\nAtick.signField(pdf, pfx, optionsJson)        // sign an existing empty field\nAtick.setMetadata(pdf, optionsJson)           // set Title / Author / Subject / Keywords / …\nAtick.addDocTimestamp(pdf, optionsJson)       // add an archive DocTimeStamp (PAdES-B-LTA)\nAtick.setFastSigning(true | false)            // revocation-cache toggle\nAtick.decrypt(pdf, password)                  // decrypt a password-protected PDF\nAtick.version()                               // engine version\n```\n\nAll options are passed as a JSON string. Any failure throws `Atick.AtickException`.\n\n### Options (JSON)\n\n`cn, org, ou, location, reason, text, date, dn, body, heading, show_mark, green_tick, always_check,\nmark_color (hex / name / [r,g,b]), mark_gradient, mark_scale, text_color, bg_color, border,\nfont_size, width, height, page, rect, placements ([[page,[x1,y1,x2,y2]], …]), mode (single/shared),\nfield_name, pades, hash_algo (sha256/384/512), timestamp, tsa_url, tsa_auth, ltv, lta, certify,\nlock_fields, verify, verify_expiry, verify_crl, verify_ocsp, open_password, encrypt_password,\nowner_password, contents_size`.\n\n---\n\n## The mark\n\nThe little icon in the appearance — what Adobe shows for the signature's validity:\n\n```java\n\"{… ,\\\"green_tick\\\":true}\"      // the \"?\" mark — Adobe paints it GREEN for a valid+trusted cert, RED if invalid\n\"{… ,\\\"always_check\\\":true}\"    // our green-tick graphic as the base — Adobe still reds it if the signature is bad\n\"{… ,\\\"green_tick\\\":false}\"     // no mark at all — a plain, basic signature\n```\n\nColour the mark with any colour: `\"mark_color\":\"#E53935\"`, `\"blue\"`, `[255,140,0]` — or a gradient\n`\"mark_gradient\":[\"red\",\"orange\",\"yellow\"]`. The mark is always centred in the appearance.\n\n---\n\n## Custom appearance\n\n```java\n\"{\\\"cn\\\":\\\"Aniket Chaturvedi\\\",\\\"image\\\":\\\"cn\\\"}\"                          // CN as text on the LEFT (Adobe-style)\n\"{\\\"cn\\\":\\\"Aniket\\\",\\\"dn\\\":\\\"CN=Aniket, O=Personal, C=IN\\\"}\"              // DN under the \"Signed by:\" line\n\"{\\\"body\\\":\\\"*APPROVED*\\\\nReviewed by: *Aniket*\\\\nLegally *binding*.\\\"}\"  // ONLY this text; \\n = line, *x* = bold\n\"{\\\"cn\\\":\\\"…\\\",\\\"image\\\":\\\"none\\\"}\"                                       // no logo\n```\n\nLong names wrap onto more lines instead of shrinking the font, so the appearance never overflows.\n\n---\n\n## Sign an already-signed PDF\n\n```java\nbyte[] resigned = Atick.signPfx(alreadySignedPdf, pfx,\n    \"{\\\"password\\\":\\\"••••\\\",\\\"cn\\\":\\\"Second Signer\\\",\\\"reason\\\":\\\"Counter-signed\\\",\"\n  + \"\\\"field_name\\\":\\\"Signature2\\\",\\\"page\\\":1,\\\"rect\\\":[40,640,260,750],\\\"pades\\\":true}\");\n```\n\nATick signs as an **incremental update**, so existing signatures keep their byte ranges and stay\nvalid. Use a fresh `field_name` per signer so fields never collide.\n\n---\n\n## Deferred signing \u0026 Indian eSign (two-step)\n\nWhen the private key lives elsewhere (a USB token / HSM / smart-card via your **JCA provider**, or an\neSign ESP), split signing into two steps:\n\n```java\n// 1) prepare (no key needed): appearance + the exact bytes to sign\nbyte[][] pr = Atick.prepare(pdf,\n    \"{\\\"cn\\\":\\\"DS TEST\\\",\\\"reason\\\":\\\"eSign\\\",\\\"placements\\\":[[1,[300,55,575,175]]],\\\"contents_size\\\":16384}\");\nbyte[] prepared = pr[0], bytesToSign = pr[1];\n\n// 2) your signer (token / HSM / eSign ESP) makes a DETACHED CMS over bytesToSign.\n//    The eSign InputHash is just the SHA-256 of bytesToSign:\nbyte[] digest = java.security.MessageDigest.getInstance(\"SHA-256\").digest(bytesToSign);\n//    ... sign `digest` / `bytesToSign` with your provider, get back a detached CMS ...\n\n// 3) embed\nbyte[] signed = Atick.embed(prepared, cms);\n```\n\n`pkcs7Pdf` / `pkcs7complete`-style ESP replies already carry the chain + revocation + timestamp, so\nthe embedded signature is LTV-complete. See `examples/DeferredEsign.java`.\n\n---\n\n## PAdES levels\n\n```java\nAtick.signPfx(pdf, pfx, \"{… ,\\\"pades\\\":true}\")                                       // B-B\nAtick.signPfx(pdf, pfx, \"{… ,\\\"pades\\\":true,\\\"timestamp\\\":true}\")                    // B-T\nAtick.signPfx(pdf, pfx, \"{… ,\\\"pades\\\":true,\\\"timestamp\\\":true,\\\"ltv\\\":true}\")       // B-LT\nAtick.signPfx(pdf, pfx, \"{… ,\\\"pades\\\":true,\\\"timestamp\\\":true,\\\"lta\\\":true}\")       // B-LTA\n```\n\nB-LT/B-LTA embed the complete validation material (chain + CRL + OCSP + VRI + `/Extensions /ESIC`) so\nAdobe Acrobat shows **“PAdES Signature Level: B-LT”** in the advanced signature properties.\n\n---\n\n## Fast signing\n\nON by default. With LTV on, the first signature fetches the certificate's CRL/OCSP; ATick caches it\nin memory, so every later signature with the **same certificate** reuses it instead of re-fetching —\na big speed-up for batch / multi-signature runs. Timestamps are never cached (each must be unique).\n\n```java\nAtick.setFastSigning(false);   // always fetch fresh\n```\n\n---\n\n## Examples — run via Maven (just the dependency, no native build)\n\n`examples/` is a small Maven project that depends only on `io.github.aniketc068:atick` — exactly how\na user consumes it. One class per feature (mirroring the Python examples). Run any:\n\n```bash\ncd examples\nmvn -q compile exec:java -Dexec.mainClass=SignPfx\n```\n\nor from the repo root with the helper:\n\n```bash\n./run.sh SignPfx        # Linux / macOS / Git Bash\nrun.bat SignPfx         # Windows cmd\n```\n\nClasses: `SignPfx` · `PadesLevels` (B-B/B-T/B-LT/B-LTA) · `Appearance` · `MarkColor` ·\n`HashAlgorithms` · `Invisible` · `TickVariations` · `DeferredEsign` (2-step eSign) · `CertifyLock` ·\n`MultiPlacement` · `Encrypted` · `MultiRevision` · `DateFormats` · `MakeContainer` · `FastSigning` ·\n`DocumentTimestamp` · `Metadata` · `FieldApi` · `Pem` · `Verify` · `SignAlreadySigned`. Each reads\nfrom `examples/samples/` and writes its signed PDF into `examples/signed/`.\n\n---\n\n## Documentation\n\nFull documentation lives in [`docs/`](docs/) (Sphinx + Markdown) — installation, signing, PAdES,\nappearance, certification, encryption, deferred/eSign and the complete API reference. Build it with\n`pip install -r docs/requirements.txt \u0026\u0026 sphinx-build -b html docs docs/_build`.\n\n---\n\n## Errors\n\nEverything throws `Atick.AtickException` (a normal Java runtime exception) you can catch:\n\n```java\ntry {\n    Atick.signPfx(pdf, pfx, \"{\\\"password\\\":\\\"wrong\\\", …}\");\n} catch (Atick.AtickException e) {\n    System.out.println(\"signing failed: \" + e.getMessage());\n}\n```\n\n---\n\n## License\n\nATick is **dual-licensed** — free for personal \u0026 open use, paid if you sell:\n\n- **Free under [GNU AGPL-3.0](LICENSE)** — personal projects, learning, internal use, and\n  open-source projects (released publicly under AGPL-3.0).\n- **Commercial license (paid)** — if you **build a product with ATick and sell it**, or use it in a\n  **closed-source / commercial** product, you must buy a commercial license first. Contact\n  **aniketc.pro@gmail.com** for a quote.\n\nSee [LICENSING.md](LICENSING.md) for details. © 2026 Aniket Chaturvedi.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faniketc068%2Fatick-java","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faniketc068%2Fatick-java","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faniketc068%2Fatick-java/lists"}