A Frappe app that turns any allowlisted document into a verifiable, signable PDF — with a Chromium-based PDF pipeline, QR-backed verification, optional content hashing, and PAdES digital signatures recognised by Adobe Acrobat.
- Verified QR per signed document (UUIDv4 + optional SHA-256 content hash + signatory metadata).
- Public verify page at
/verify_document/with a camera scanner that returns valid / tampered / invalid for any QR. - Chromium PDF pipeline (Playwright) with full modern CSS support.
- Live-preview print dialog with iframe that regenerates on every option change.
- Multi-copy PDF (1–5 copies) with
ORIGINAL/DUPLICATE/ custom labels. - Per-page header/footer modes: all pages / first only / last only / first+last / none.
- Dialog-driven QR insertion in any of four corners.
- Acrobat-style signature block rendered as an Acrobat Sign-style card.
- PAdES digital signatures via PyHanko, Adobe-compatible.
- Lockable audit trail with optional absolute lock on Verified QR records.
- Jinja helpers:
qr,barcode,qr_link,qr_img,qr_link_img,verify_qr,verify_qr_img. - Bundled Sales Invoice Scan Me print format.
Open Scan Me Settings in the desk:
- Under Doctype, add the DocTypes you want to expose for QR signing. Tick
enablefor each; ticksignature_requiredif users must draw a signature before generating the QR. - Under Verification & Signing, configure:
- Allow Multiple Signers — N-party signing.
- Embed Content Hash in QR — tamper detection on doc edits.
- Lock Verified QR After Insert — absolute lock, no override.
- Use Stored User Signature Only — reads from a User custom field named
user_signature/signature/signature_image. - Apply Cryptographic PDF Signature (PAdES) — run every generated PDF through PyHanko.
- Under Print Dialog Features, toggle which sections of the print dialog your users see.
The first time PAdES signing runs, Scan Me auto-generates a 5-year self-signed PKCS#12 at sites/<site>/private/files/scan_me/signing.pfx and stores its password in site_config.json under scan_me_signing_password.
To upgrade to a CA-issued certificate:
- Obtain a PKCS#12 bundle from a trusted CA.
- Replace
sites/<site>/private/files/scan_me/signing.pfxwith the new file. - Update
scan_me_signing_passwordinsite_config.jsonto the bundle's password.
- Open a doc of an allowlisted DocType.
- Click Generate Verified QR in the form's menu.
- Draw a signature if prompted. A Verified QR record is created.
- Open any allowlisted doc and click the Advanced Print icon in the toolbar (right of Frappe's native Print icon).
- The Advanced Print page opens with a live preview.
- Configure copies, header/footer modes, QR overlay, signature block, watermark, PAdES signing.
- Click Download PDF.
- Open the verify page on a phone or laptop with a camera.
- Scan the QR on the printed/PDF document.
- Page shows valid (green), tampered (red, hash mismatch), or invalid (UUID unknown).
See PRINT_FORMAT_GUIDE.md for the complete reference: body-header/footer extraction, utility classes (.page-break, .no-split, .no-print, etc.), Jinja helpers, and worked examples.
Full developer and operator docs: DOCUMENTATION.md.
MIT — see license.txt.