Skip to main content

CSV to filled PDFs

Bulk-fill a PDF form from a CSV — mail-merge for forms and certificates.

No watermarkFree & unlimitedRuns in your browser

Form template (PDF)

Data (CSV)

Drop the template PDF first

Your template PDF and CSV stay on your device — fields stay on your device, processed locally in your browser.

About CSV to filled PDFs

CSV to filled PDFs is mail merge for PDF forms: one fillable template plus one spreadsheet, and you get a ZIP containing one completed PDF per data row. Columns whose headers match the template's field names map themselves; everything else gets a dropdown so you can point a field at whichever column you meant. You control the output filenames with a token pattern, and choose whether each PDF ships flattened or still editable. It is the quick route to course certificates, membership cards, per-employee forms, event badges and batches of client agreements. People look for this as bulk filling PDF forms, PDF mail merge, or generating certificates from a CSV.

CSV to filled PDFs specs

Key facts about CSV to filled PDFs on PDFChamp
PriceFree ($0) — no paid tier
AccountNot required
WatermarkNone
Where it runsIn your browser, on your device
File uploadNo file is uploaded
InputPDF form (1 file), plus a CSV with a header row
OutputZIP containing one PDF per CSV row
File size limitLimited only by your device's memory
Works offline after the page loadsYes

How to use CSV to filled PDFs

  1. Drop in the template PDF

    Use the left dropzone, "Form template (PDF)". Every fillable field is listed with its type; push buttons and signature fields are counted as skipped because they take no value.

  2. Drop in the CSV

    Use the right dropzone, "Data (CSV)". The first line is read as the header row and those names become the columns you can map.

  3. Check the field mapping

    Each field shows a dropdown. A column whose header exactly matches the field name is selected automatically; anything else reads "— unmapped —" until you pick a column yourself.

  4. Pick the output format

    Save flattened locks the values into each PDF; Save as fillable leaves the recipient able to edit them. The preview shows the first five CSV rows beside row 1 applied to the template.

  5. Set the filename pattern

    Output filename pattern starts at {template-name}-{rowIndex+1}-of-{total}.pdf. Any CSV column name in braces works too, and repeated names get -2, -3 so no row is lost.

  6. Generate the ZIP

    Press Generate ZIP. Progress runs row by row, the archive saves as yourtemplate-mailmerge.zip, and a warning line reports anything that could not be written.

Frequently asked questions about CSV to filled PDFs

How do CSV columns get matched to the PDF form fields?

Columns are matched to fields by exact name, and everything else is left for you to set explicitly. When the template loads, each fillable field is listed with its type and a dropdown; a CSV column whose header matches the field name exactly is selected automatically, and every other field shows "— unmapped —" until you choose. Fuzzy or near-match guessing is deliberately not attempted, because certificate and contract templates routinely contain fields that differ by a single character, and a wrong guess produces a hundred wrong documents in silence. Unmapped fields keep whatever the template already holds. At least one field must be mapped before the tool will run, since the alternative is a ZIP full of identical blank forms.

Does my CSV have to be comma-separated?

Semicolon and tab-separated files work as well as comma-separated ones, because the parser sniffs the separator from the data rather than assuming a comma — which matters, since many European spreadsheet locales export with semicolons. The one firm requirement is a header row: the first line becomes the column names, and those names are what appear in the mapping dropdowns. Blank lines are skipped. A UTF-8 byte-order mark, which Excel likes to prepend, is stripped from the header names so your first column does not arrive with an invisible character glued to it. Quoted cells containing separators or line breaks are handled normally. If the parse fails outright, the tool says so instead of generating documents from half-read data.

What character encoding should the CSV be saved in?

Save the CSV as UTF-8, because that is the only encoding the file is decoded as. A sheet exported as Windows-1252, ISO-8859-1 or a regional code page will still load, but names with accents arrive mangled — and that mangling then gets printed onto every certificate in the batch. In Excel, choose "CSV UTF-8" rather than plain CSV; Google Sheets and LibreOffice already download UTF-8 by default. There is a second, separate limit worth knowing: field values are drawn with Helvetica in this tool, so characters outside Latin-1 may not render in the filled PDFs even when the CSV itself decoded perfectly. A warning appears when non-Latin values are spotted in your first rows. For a one-off form with such values, use the Fill PDF form tool, which embeds a Unicode font.

How do I set check boxes, radio buttons and multi-select lists from a CSV?

Each field type reads its column value in its own way. A check box is ticked when the cell contains true, yes, 1, on or x in any capitalisation, and cleared for anything else, including an empty cell. A radio group or a dropdown needs the option's exact export value as stored in the PDF — not the label a human reads on the page — and an empty cell clears the selection. A multi-select option list takes several values in one cell separated by the pipe character, so Blue|Green selects both. Text fields take the cell verbatim. If a value cannot be written, for instance a dropdown option that does not exist in the template, that row and field are counted and named in a warning line after the ZIP is built, never hidden.

How are the output PDFs named, and what if two rows produce the same name?

Names come from the Output filename pattern field, which starts at {template-name}-{rowIndex+1}-of-{total}.pdf and accepts any mix of literal text and tokens. Alongside {template-name}, {rowIndex}, {rowIndex+1} and {total}, any CSV column name in braces is replaced with that row's value, so {last-name}-{course}.pdf is valid. Substitution runs in a single pass, so a value that itself contains braces is never re-expanded. Path separators, reserved characters and control characters are replaced with underscores, and an empty result falls back to output.pdf. If two rows resolve to the same name the later ones get -2, -3 and so on rather than overwriting, so the ZIP always holds exactly one PDF per data row — and the number of renamed files is reported afterwards.

Does the personal data in my CSV get uploaded?

Neither the CSV nor the template ever leaves your browser, and the ZIP is built in memory on your own machine. The spreadsheet is read from disk and parsed locally, each row's PDF is produced with pdf-lib inside the tab, and the archive is assembled with JSZip before being handed to your downloads folder — there is no upload endpoint on this page to send any of it to. Mail-merge data tends to be the most sensitive file an organisation owns: staff lists, student records, customer addresses, salary figures. Running the merge locally means none of it is transmitted, retained, or exposed in a third party's logs. The tool is free and unlimited however many rows you process, and adds no watermark to the generated PDFs.

Why in-browser processing matters

Every PDFChamp tool runs inside this page: the file you choose is read by JavaScript in your own browser and is never sent to a server, so nothing is uploaded, queued, or stored anywhere. That removes the upload wait, the processing queue, and the question of what happens to your file afterwards — the about page compares this architecture with server-side PDF tools.

Last updated

Related tools