# ScanYourPDF signing sample

Prepared October 20, 2026. This is a fictional one-page equipment return form for the guide on signing a PDF and making it look printed and scanned. The person, business, equipment and serial numbers are synthetic. The form is not an agreement and the signature does not belong to anyone.

Unlike the scan-effect sample in `../scan-demo`, this source is **unsigned**. Every signature in the outputs was placed by the production signature overlay, the same code path the editor uses after you draw and position your own signature.

## Files

| File | Contents |
|---|---|
| `source.pdf` | Unsigned text/vector Letter PDF, 612 × 792 points, one page |
| `signature.png` | Synthetic sample signature: round-capped pen strokes drawn by the generator on a transparent 600 × 200 canvas, like the editor's draw pad output |
| `signed.pdf`, `signed.webp` | Signature placed with scan effects off (the editor's signature-only export) |
| `scanned.pdf`, `after.webp` | The same signature placement with the guide's Medium scan effect |
| `before.webp` | The unsigned source page, resized to 918 × 1188 |
| `preset.json` | Actual source size, rendered dimensions, signature placement, full parameters and measured output sizes |

The PDF.js page renderer creates a 1224 × 1584 image at 144 ppi. The production `CanvasScanner` applies the signature and, for `scanned.pdf`, the scan effect. Scan effects off uses the production `effectiveScanConfig(config, false)`, so it matches the editor's signature-only export. The production pdf-lib `buildPDF` routine builds each PDF from the resulting page image. WebP previews are resized only.

The signature is placed at 36% of the page width, rotated −2 degrees, at full opacity. The renderer draws it after the page's scan filters, so it keeps its blue ink and sharp edges on the grayscale page. Use black ink if it should blend with a grayscale scan.

## Regenerate

From `frontend/`, with dependencies installed, Node 24 and port 5187 free:

```sh
node scripts/generate-scan-demo.mjs --sign-demo
```

It starts a Vite server bound to `127.0.0.1:5187`, launches a fresh headless Chrome profile (set `CHROME_PATH` for a non-default installation), writes these files and closes both. Rotation variance is zero. Texture and image/PDF encoding can vary by browser version, so compare the visual result rather than expecting identical bytes. After regenerating, update `frontend/src/content/sign-demo.ts` with the new measurements, build and run `npm run check-seo`.

## Measurements in this revision

Source: 2,114 bytes. Signed with effects off: 93,576 bytes (PNG page image). Signed with the Medium scan effect: 773,128 bytes (JPEG page image with texture). These are observations for these files, not predictions for another PDF.

Both outputs are rasterized: text selection, links, form fields, accessibility structure and existing digital-signature validation are not preserved. No OCR layer, certificate or signing audit trail is added. Downloading these examples does not use your daily document allowance.
