v0.8-beta
Important for anyone who could not open v0.7-beta
If v0.7-beta failed with "The application CEI PDF Signer can't be opened" or with "ModuleNotFoundError: No module named '_struct'", that was a packaging fault, not a fault in your Mac and not a Python problem.
The v0.7-beta archive was created with a tool that discards symbolic links and file permissions. A packaged macOS app relies on both. The archive shipped with zero of its 45 symbolic links, 29 empty folders where those links belonged, and a main program file that had lost its executable permission. Anything unpacked from it was broken before it ever ran.
This release is archived with ditto, which preserves that structure, and the build now refuses to produce a release archive that does not pass a launch test on a freshly unpacked copy.
Signing reliability
Signing could fail for every document in a batch and still report success while producing an empty ZIP. Three separate causes were found and fixed.
The app used to kill the macOS CryptoTokenKit daemon before every signing call. That took the PC/SC provider down with it and made the card reader invisible to the whole system until the reader was physically unplugged. Measurements showed the kill was never needed, so it is gone, and a test now fails the build if that code ever returns.
The IdPlug driver enumerates card slots progressively rather than all at once. Across runs it reported slot lists of [1], then [1], then [1,2,3], then [1,2]. The old code took a single snapshot and gave up when the signature slot was missing. It now polls until the slot appears, which on a warm reader took about 12 seconds.
Signature placement indexed the PDF page tree as if it were a flat list, which raised IndexError on most real documents. On a 10 page file it failed on 8 pages. Page lookup now goes through pyHanko. A related bug placed signatures roughly 50 points off on A4 without reporting any error.
Saving an empty result set now returns an error instead of writing a ZIP with nothing in it.
New features
Page navigation with a page number field and first and last buttons.
Apply to all pages, which copies the signature box to every page and clamps it to each page's real geometry. This produces one qualified signature covering the whole document plus visual marks on the other pages, rather than signing the same document once per page.
Clear all, which removes every signature box from the selected document at once.
An About section in the sidebar with contact links. Links open in your browser instead of replacing the app window.
Install
Download the ZIP, unpack it, move CEI PDF Signer.app to Applications, then right click the app and choose Open the first time.
Verify the download if you wish:
shasum -a 256 CEI-PDF-Signer-v0.8-beta-macOS.zip
The expected value is in SHA256SUMS.txt.