CSV to PDF

Turn a CSV, TSV or pipe-separated file into a formatted, paginated PDF table.

Detected comma delimiter · 7 columns · 6 data rows

Preview — heading row and the first 6 rows
InvoiceClientIssuedDueCurrencyAmountStatus
INV-1041Northwind Ltd, Bristol2026-01-082026-02-07GBP4820.00Paid
INV-1042Harbour & Sons2026-01-112026-02-10GBP1290.50Paid
INV-1043Delacroix SARL2026-01-192026-02-18EUR7315.25Overdue
INV-1044Quay Logistics (Rotterdam)2026-01-222026-02-21EUR2044.00Sent
INV-1045O"Malley Group2026-02-022026-03-04USD980.75Draft
INV-1046Fenchurch Media2026-02-092026-03-11GBP15600.00Sent

About CSV to PDF

Drop a .csv in or paste the rows, check the preview, and download a PDF containing a proper table — a heading row across the top, a title on each page if you want one, and page numbers at the foot. Three looks are available: striped rows with a blue heading band and shaded alternate rows, a full grid with a rule around every cell, or plain, which drops both the rules and the shading and sets the headings in bold black. Everything is laid out as text rather than a picture, so the finished table can be searched and copied out of the PDF. A long title wraps across the top of the page, up to four lines. The download is named after the file you dropped — the name shown in the drop area — until you drop another one or press Clear, which empties the editor, the file name and the title together.

Reading the file correctly

CSV looks trivial and is not. A value may be wrapped in double quotes, and inside those quotes it may contain the delimiter, a line break, or a doubled quote standing for a literal one — so a single record can span several physical lines. Splitting each line on commas breaks on the first address field, which is why this reads the file character by character with a small state machine instead. The delimiter is worked out rather than assumed: comma, semicolon, tab and pipe are each run through the parser, and the one that yields the most columns most consistently over the first twenty-five rows wins, with a comma taking any tie. What it decided is printed under the editor, along with the column and row counts. Because that is a guess rather than a fact recorded in the file, the Delimiter box can pin it: a tab-separated export whose address column holds a couple of commas on every line scores higher on comma than on tab, and choosing Always tab settles it.

Nothing is reinterpreted

Every cell is printed as the exact text that was in the file. This matters more than it sounds: tools that convert CSV into a spreadsheet or into JSON infer types, and that quietly destroys data — a postcode of 01234 becomes 1234, a sixteen-digit card reference becomes scientific notation, and a date becomes a five-digit serial number. Here there is no inference at all. The single automatic decision is alignment: a column in which every populated cell parses as a number is right-aligned so figures line up under each other — its heading moves right with them — and everything else stays left-aligned, in the preview exactly as in the PDF. Ragged rows are padded to the width of the longest row and blank headings become Column 1, Column 2 and so on, both of which the preview shows exactly as the PDF will. Physically blank lines are dropped; a line of nothing but delimiters is a row of empty cells and is printed as one.

Fitting a table onto paper

  • Down the page: rows are placed until the next would cross the bottom margin, then a page break. A row is never cut in half, and long cell text wraps onto extra lines inside its cell rather than overflowing.
  • Across the page: by default the columns are narrowed until the table fits the width. That stays readable up to roughly a dozen columns and keeps working, tightly, well past that.
  • The floor: a column cannot be narrowed below 10 points whatever the text size, so a page holds a fixed number of columns — 52 on A4 portrait, 76 on A4 landscape, 54 and 72 on Letter. Beyond that the squeeze is impossible, and rather than run the far side of the table off the paper the tool switches to continuation pages by itself and says so. The count is checked as you type: a warning appears beside the option before you download anything.
  • The other floor: long headings run out of room before the count does. Squeeze a heading into a column narrower than the words in it and it stops being a line of text and becomes a tall stack of fragments; a band of those, repeated at the top of every page, is not a table anyone can read, and past a certain depth the layout engine cannot place a row underneath it at all. The heading depth is measured before anything is drawn, and a table that would cross that line is put onto continuation pages too, with the reason given after the download rather than as you type.
  • Wider than that: switch to landscape, or tick the option to continue wide tables on extra pages yourself — the columns that do not fit are printed on later pages with the first column repeated on each so rows remain identifiable. On those pages the repeated column is capped at half the page and every other column at what is left, so one paragraph-sized cell cannot push its neighbours past the edge of the paper. Text size changes row height and wrapping, not how many columns fit.
  • Headings: the first row can be treated as a header and repeated at the top of every page, which is what makes a twenty-page table readable.

Characters and limits

A UTF-16 byte-order mark is honoured first — that is what Excel's "Unicode Text" export writes — and otherwise the file is read as UTF-8 with any leading mark removed; if those bytes are not valid UTF-8 it is re-read as Windows-1252 and a notice tells you so, which is what rescues the accented characters in an Excel "Save as CSV" export. A file still holding NUL bytes after that is not text and is refused outright, because half of it would otherwise arrive as invisible nothing on screen and as a question mark in the PDF. Text is then composed (NFC), so an e followed by a combining acute becomes é rather than a letter plus an unprintable mark. The PDF is drawn with the standard fonts every reader provides, so no font file is embedded and the document stays small — but those fonts are encoded with Windows-1252, and only Latin script and its accents, curly quotes, dashes and the euro and pound signs have glyphs. Cyrillic, Greek, Arabic, Hebrew, Devanagari, CJK, emoji and most mathematical symbols do not. Each such character is replaced with a question mark and the total is reported after the download. That substitution is not cosmetic tidiness: handed a character it cannot encode, the PDF writer re-emits the entire string as raw UTF-16 bytes, so a single Polish ł would turn a whole cell into mojibake rather than losing one letter. For data in one of those scripts, use a converter that can embed a font. There is no coded size limit; the whole file is held in memory as text, parsed into rows and then measured cell by cell, so a few thousand rows is comfortable and tens of thousands will take a while and produce a document nobody will read.

Related tools and privacy

When the destination is a spreadsheet rather than a document, CSV to Excel writes a real workbook and CSV to JSON gives an array of objects — both infer types, which is the trade-off this tool avoids. PDF to Excel goes the other way and lifts tables back out of a PDF. Once the table is a PDF, Merge PDF can attach it to a report, Watermark PDF can mark it as a draft and Protect PDF can lock it. None of your data leaves this tab: the file is read with the File API, parsed in page memory and written into a PDF locally, with no upload at any stage.

A parser, not a split on commas

Quoted fields containing the delimiter, line breaks inside a quoted cell and doubled quotes standing for a literal quote are all read correctly, and the delimiter itself is worked out from the file — comma, semicolon, tab or pipe — or pinned by hand when the guess is wrong.

Printed exactly as written

Cells are placed as text, with no type guessing anywhere: a postcode keeps its leading zero, a long order number keeps every digit, and a date stays the string it was in the file rather than becoming a spreadsheet serial number.

Built for long and wide tables

The header row can repeat on every page, columns that hold only numbers are right-aligned heading and all, and long cell text wraps instead of overflowing. A table too wide to squeeze onto the page is continued on further pages with the first column repeated and every column bounded to fit — automatically, with a warning, rather than being allowed to run off the edge of the paper.

Frequently Asked Questions

Which delimiters are recognised?

Comma, semicolon, tab and pipe. Each one is tried against the file with the full parser, and the winner is the one that produces the most columns most consistently across the first twenty-five rows — a comma wins any tie. The delimiter in use and the column count are shown under the editor, so you can see what was decided before you generate anything. A semicolon file exported from a European locale, or a tab-separated export saved with a .csv extension, both convert with nothing to set. Detection is still a guess and can be beaten — a tab-separated file whose address column carries two commas per row scores higher on comma than on tab and would be split in the wrong places — so the Delimiter box lets you pin it to one character instead. The readout then says "Using" rather than "Detected".

Is anything converted or reformatted on the way through?

Almost nothing. No cell is parsed into a number or a date, so leading zeros survive, long identifiers are not turned into scientific notation, and a date written as 03/04 stays as written rather than being guessed as March or April. Two things are decided for you. Alignment: a column in which every populated cell is a number is right-aligned so the figures line up, heading included, and every other column is left-aligned — the preview lines columns up exactly the same way, so what you see before downloading is what prints. And characters: text is composed first, so an accent typed as a separate combining mark becomes the single accented letter it looks like; then the standard PDF fonts cover Latin-1 only, so anything outside that — Cyrillic, Greek, CJK, emoji and the like — is swapped for a question mark, with the total shown after the download rather than being allowed to corrupt the rest of the cell.

My table has thirty columns and the text is unreadable.

By default the whole table is squeezed into the page width, wrapping cell text as needed, which stops being comfortable somewhere around a dozen columns. Switching to landscape is the first thing to try, and then the option to continue wide tables on further pages: that stops squeezing and instead prints the columns that do not fit on subsequent pages, repeating the first column on each so the rows can still be identified. On those continuation pages the repeated first column is never allowed more than half the page and no other column more than the rest, so a column holding a paragraph of text wraps instead of shouldering the columns beside it off the edge of the paper. Note that the text size does not change how many columns fit — the squeeze has a hard floor of 10 points per column whatever the font size, so it only changes how tall the rows are and how much text wraps. Past that floor (52 columns on A4 portrait, 76 on A4 landscape) squeezing is impossible, and the continuation pages are turned on automatically with a notice rather than letting the far side of the table run off the paper. The same thing happens sooner if the headings are long: once a squeezed heading would wrap into a band taking most of the page, continuation pages are used instead, because a table whose heading band is deeper than its rows is not readable and the layout engine cannot fit a row beneath it.

What happens to the first row?

With the header option ticked, the first row becomes the table heading — white on a blue band in the striped and grid styles, black and bold with no band in the plain one — and it is repeated at the top of every page unless you turn that off. An empty heading cell is labelled Column 1, Column 2 and so on rather than being left blank, in the preview as well as in the PDF. Untick the option when the file has no header and the first line is real data: no heading row is printed at all, invented names are not added, and every line in the file including the first is set as an ordinary body row.

How are rows split across pages?

A row is never cut in half. Rows are placed until the next one would cross the bottom margin, and then a new page starts. Because a cell wraps rather than clipping, one row containing a long paragraph can be several lines tall, and a single row taller than a whole page will be split as a last resort. Page numbers, if enabled, are stamped at the bottom of every page after the table is laid out, so the count is right.

Which files can I drop in, and how big can they be?

Files with a .csv, .tsv or .txt extension; anything else is refused with a message rather than ignored. The byte-order mark decides the encoding: a UTF-16 mark means the file is decoded as UTF-16 — that is what Excel's "Unicode Text" export writes — and otherwise it is read as UTF-8 with any mark stripped. If those bytes are not valid UTF-8 the file is re-read as Windows-1252, what a plain "Save as CSV" in Excel still writes, and you are told so, because that is the difference between Besançon and Besan?on. A file that still contains NUL bytes after all that is not text at all and is refused by name rather than converted into a page of question marks. You can also paste straight into the editor. There is no coded size limit, but the whole file is held in memory as text, parsed into an array of rows and then laid out cell by cell — a few thousand rows is comfortable, tens of thousands will make the browser work hard and produce a document nobody wants to read. Physically blank lines are skipped; a line of nothing but delimiters is a row of empty cells and is kept, so the rows after it are not renumbered. Ragged rows are padded so every row has the same number of cells.

Can I get a spreadsheet instead of a PDF?

Yes, with a different tool. CSV to Excel writes a real .xlsx workbook and CSV to JSON produces an array of objects — though both of those infer types, which is exactly what this tool avoids. Going the other way, PDF to Excel pulls tables back out of a PDF. Choose the PDF when the table is going to be read, printed, attached to an email or signed off, rather than edited.

Is my data uploaded?

No. The file is read in the browser with the File API, parsed in page memory and laid out into a PDF in the same tab, which is then handed to your downloads folder. Nothing is transmitted at any point — worth knowing when the spreadsheet is a payroll export, a customer list or a set of transactions.