Batch-fill a PDF form from a spreadsheet

Sheaf is a PDF mail merge that runs entirely in your browser. Point it at a fillable PDF and a CSV of your data, and it fills one copy of the form per row: an offer letter for every hire, a certificate for every student, an invoice for every client. Your files stay on your machine. Nothing is uploaded, there is no account to make, and it costs nothing no matter how many rows you merge.

How it works

  1. Drop your PDF. Sheaf reads the fillable AcroForm fields straight out of it and lists every text box, checkbox, dropdown, and radio group it finds.
  2. Drop your CSV. Columns are matched to form fields by name, so Full Name lines up with full_name on its own. You can change any mapping by hand.
  3. Check the grid, then download. Every filled page renders as a live thumbnail before you save anything, so a wrong mapping is obvious at a glance. Grab one file or the whole batch as a ZIP.

Questions

How do I mail merge into a PDF form?
Export your data as a CSV with one column per form field and one row per document. Drop that CSV and your fillable PDF into Sheaf. It maps the columns to the form fields and renders one filled PDF per row, which you download individually or as a single ZIP.
Are my documents uploaded to a server?
No. Sheaf reads and fills the PDF locally using pdf-lib, and the merge runs in a Web Worker in your own tab. You can watch the network tab stay silent while it works. That makes it safe for offer letters, medical forms, and anything else you would not paste into a website.
What kind of PDF do I need?
A PDF with real fillable form fields (an AcroForm), the kind you can click into and type in a normal PDF reader. A flat scan of a paper form has no fields to fill, so Sheaf tells you when a PDF has none rather than producing blank copies.
Is there a limit on how many rows I can merge?
No cap and no per-document fee. A batch of hundreds of rows runs in the background with a progress bar and a cancel button, so the tab stays responsive and you can stop partway if you spot a problem.
How are the output files named?
Pick any CSV column to name the files by, for example a name or an invoice number. Rows with a blank value fall back to a row number, and duplicate names get a numbered suffix so nothing is silently overwritten inside the ZIP.