Signing
The document signer prepares a PDF for signing and signs it in the page. Add the signers with their roles and signing order, and place their fields — signature, initials, date signed, name, text and checkbox — by clicking, dragging and resizing, or from the keyboard.
Each signer in turn is walked through their fields, draws or types their signature once and applies it everywhere it is needed, agrees to sign electronically and finishes, or declines with a reason. Out comes the original PDF with every value stamped on its page — the original bytes unchanged, signatures as crisp vector ink — and a signing certificate with each signer, when they signed, the original file's SHA-256 fingerprint and the activity log. Nothing leaves the page.
A tenancy agreement
A two-page agreement between fictional parties, with the tenant's and the landlord's fields placed. Send it, sign as the tenant, then as the landlord, and download the signed PDF. Prepare shows how the fields were placed; nothing you do here leaves your browser.
Get the code
<script src="/assets/bmx-components.min.js"></script> <bmx-select id="sg-mode" label="Show" value="prepare" style="inline-size: 20rem"> <bmx-option value="prepare">Prepare (the letting agent)</bmx-option> <bmx-option value="sign">Sign (the tenant, then the landlord)</bmx-option> <bmx-option value="view">View</bmx-option> </bmx-select> <bmx-document-signer id="sg-lease" label="Tenancy agreement" src="assets/signing/tenancy-agreement.pdf" date-format="d MMMM yyyy" style="inline-size: 100%"></bmx-document-signer>
Your own PDF
Open a PDF of your own and prepare it for two signers: choose a signer, then a field from the palette, and drag it into place. The list under the palette says what still stops it being sent. The file is read here, in your browser.
// Node 18 or later: the envelope and stamping, from the Gold package.
import { readEnvelope, missingFields, stampPdf, sha256Hex } from './dist/node/bmx-document-signer.mjs';
// The envelope the page posted when the last signer finished.
const envelope = readEnvelope(request.body);
const original = await readFile(`originals/${envelope.id}.pdf`);
if (sha256Hex(original) !== envelope.document.sha256) throw new Error('Not the file that was signed');
if (envelope.signers.some(s => missingFields(envelope, s.id).length)) throw new Error('Fields still empty');
const signed = await stampPdf(original, envelope);
await writeFile(`signed/${envelope.id}.pdf`, signed.bytes);
await keepAuditTrail(envelope, signed.sha256);