FormPress
Part of the BidFlow platformRust · WebAssembly

Client data in.
Bank-counter paper out.

FormPress fills coordinate-mapped PDF forms from JSON. Map a blank once in the visual builder, then print one application or five hundred — with the exact values stamped on each recorded for audit.

Built for Indian capital-markets paper.IPO and NCD ASBA applications, verified end to end against real syndicate forms — and generic enough for any stamped form.

0diagnostics on a clean fill
1engine, server and browser
What it does

Three jobs, one engine

The hard part of form printing is not the PDF. It is knowing which form, what goes where, and proving afterwards what was printed.

01

Place

Drag fields onto the real blank in the browser. Coordinates, box grids and repeat rows are authored against the same geometry the server prints with.

  • Visual builder over the actual PDF
  • Box grids for pre-printed combs
  • Repeat rows with Δx / Δy
02

Print

Post a JSON context, get a filled form. The blank is never modified — FormPress appends an overlay, the way a stamping press would.

  • One form, 50 in a request, 500 in a batch
  • Merged PDF or per-applicant ZIP
  • Every stamped value recorded
03

Account

Numbered blanks are a regulated resource. They are reserved FIFO, audited by who and when, and only marked printed once the artifact is safely written.

  • Per-issue number pools
  • Reserve → finalize → release
  • Print log per form and ref-id
Form printing

From client list to bank counter in one print run

Most desks lose IPO windows to manual form filling. FormPress turns a client master into print-ready application forms — filled, numbered and batched the way the counter expects them.

  • Pre-filled everything — name, PAN, DP ID, client ID, bank and UPI details, each in its own mapped box
  • Pre-printed combs — one character per cell, measured with the real font metrics rather than guessed
  • Devanagari that prints — names shaped with HarfBuzz and embedded as subset fonts, not dropped to question marks
  • Amounts in words — the Indian lakh/crore system, carried correctly to paise
  • Reserved portions respected — an employee application never silently prints on the general form
  • Numbered stock accounted for — FIFO reservations, released on failure, printed only once the file exists
POST /api/v1/render
{
  "form_type": "ipo",
  "product_code": "INNOVISION",
  "category": "employee",
  "context": {
    "client": {
      "name": "Rahul Kumar Sharma",
      "pan":  "ABCDE1234F"
    },
    "application": {
      "bids": [{ "qty": 130, "price": 665 }]
    }
  }
}
200filled PDF · form_fields echoed · diagnostics

The amount blocked, the demat composite and the amount in words are derived by the IPO pack — the caller sends bids, not arithmetic.

3product packs — IPO, NCD, generic
4storage backends behind one trait
500forms per background batch
12page ASBA forms in the test corpus
Superior, modern tech

One engine. Server or browser.

The fill planner is pure Rust with no IO and no clock — which is why the same crate compiles to WebAssembly and runs in the builder. The preview you drag fields against is the code that prints the form, not a re-implementation of it.

  • Rust core — deterministic geometry, exhaustively matched render modes, a diagnostic for everything skipped
  • Runs offline — templates, blanks and rendering entirely in the browser over IndexedDB
  • Deploys either way — a single static binary with the UI embedded, or a static site on the edge
  • Boring on purpose — SQLite or PostgreSQL behind one storage trait, conformance-tested against both
Engineplacement · render modes · conditions · repeats · formats
PDFlopdf overlays · standard-14 + embedded Noto · rustybuzz shaping · subsetting
ServiceAxum · Tokio · SQLx · API keys · Prometheus · JSON logs
Browserwasm-bindgen · IndexedDB · pdf.js · Astro + CodeMirror
Full credits and licences →
Questions

Before you map your first form

What is FormPress?

A form-printing engine: it fills coordinate-mapped PDF forms from JSON context documents. You map a blank form once in a visual builder, then print filled copies through a REST API — one at a time, fifty in a request, or five hundred in a background batch.

Does it work with ASBA IPO application forms?

Yes — that is its home ground. FormPress ships an IPO pack that understands reservation portions (individual, employee, shareholder, policyholder), venue codes, bid validation and ASBA field presets, and an NCD pack for debt public issues with series grids and UPI-mandate rules. It is verified end to end against real 12-page syndicate ASBA forms.

Can it print names in Hindi or other Indian languages?

Yes. Text the standard PDF fonts cannot encode is automatically re-run through embedded Noto faces, shaped with HarfBuzz so Devanagari conjuncts and matras are correct, and subset to the glyphs used. A template that says "Helvetica" still prints राहुल शर्मा properly rather than question marks.

Do I need to write code to map a form?

No. Upload the blank PDF and drag fields onto it in the browser. Placement, box grids for pre-printed character combs, repeat rows, conditions and formats are all authored visually, and the preview runs the same engine that prints the final form.

Can it run without an internet connection?

Yes. The engine compiles to WebAssembly, so templates, blank PDFs and rendering can run entirely in the browser against IndexedDB. The server deployment is a single static binary with the UI embedded — nothing is fetched from a CDN at runtime.

How does it track pre-numbered forms?

Numbered blanks are held in a per-issue ledger. Printing reserves the next numbers FIFO, records who reserved them and from where, and only marks them printed once the output file has been written successfully — failed rows are returned to the pool.

Map a form. Print a thousand.

Upload a blank, drop fields onto it, and post your first context — the builder and the playground are both in here.