Escape

CSV to PDF converter

Paste CSV or open a file, and download it as a real table in a PDF, on Letter or A4 paper. The column headers repeat at the top of every page, and every page carries its number. Your CSV never leaves this page.

Valid CSV · 8 rows · comma-separated

Valid CSV, separated by commas.

Parsed and rendered on this page

8 rows, with 6 columns.

Columns

Drag to reorder, or Alt and an arrow key. Select a column to rename it, change its type or hide it.

orders.pdf
Orders
OrderDateCustomerCountryStatusTotal
A-1001Sep 2, 2026Folio & Sons, Ltd.IEpaid$1,440.00
A-1002Sep 3, 2026Atelier VinkNLpaid$320.50
A-1003Sep 7, 2026Marlborough BooksIErefunded$89.99
A-1004Sep 11, 2026Atelier VinkNLpaid$1,600.00
A-1005Sep 15, 2026Papierfabriek "De Deckle"NLpending$275.00
A-1006Sep 21, 2026Folio & Sons, Ltd.IEpaid$48.00
A-1007Sep 24, 2026Quire & BinderyGBpaid$712.40
A-1008Sep 28, 2026Marlborough BooksIEpending$156.25
Total$4,642.14

The PDF sets this table on US Letter pages, portrait, repeating the column headers at the top of each page and numbering the pages.

Run the same conversion from your own code

Every PDF on this page comes from a quario definition: the report.json in the panel. It names the columns, in order, and says how to present each value. quario renders data rather than CSV text, so read the file into one object per row with the CSV parser you already use. Then render those rows through @quario/pdf, on a server, in a worker, or in the browser, with no headless browser in between.

{
  "data": "$[*]",
  "style": {
    "family": "sans",
    "size": 9
  },
  "header": [
    {
      "type": "text",
      "value": "Orders",
      "style": {
        "family": "serif",
        "size": 15,
        "bold": true,
        "spaceAfter": 12
      }
    }
  ],
  "detail": {
    "columns": [
      {
        "header": "Order",
        "value": "{{ @.Order }}"
      },
      {
        "header": "Date",
        "value": "{{ @.Date }}",
        "style": {
          "format": "date"
        }
      },
      {
        "header": "Customer",
        "value": "{{ @.Customer }}"
      },
      {
        "header": "Country",
        "value": "{{ @.Country }}"
      },
      {
        "header": "Status",
        "value": "{{ @.Status }}"
      },
      {
        "header": {
          "value": "Total",
          "style": {
            "align": "right"
          }
        },
        "value": "{{ round(@.Total, 2) }}",
        "style": {
          "align": "right",
          "format": "currency"
        }
      }
    ],
    "header": {
      "style": {
        "family": "mono",
        "size": 7,
        "uppercase": true,
        "color": "#6b7a82",
        "paddingBottom": 3,
        "borderBottomWidth": 0.5,
        "borderBottomStyle": "solid",
        "borderBottomColor": "#cfd8dd"
      }
    },
    "row": {
      "style": {
        "paddingTop": 2,
        "paddingBottom": 2,
        "borderBottomWidth": 0.25,
        "borderBottomStyle": "solid",
        "borderBottomColor": "#e6ecef"
      }
    },
    "total": {
      "style": {
        "bold": true,
        "align": "right",
        "paddingTop": 5,
        "borderTopWidth": 0.75,
        "borderTopStyle": "solid",
        "borderTopColor": "#1e1f22"
      },
      "rows": [
        {
          "cells": [
            {
              "value": "Total",
              "span": 5
            },
            {
              "value": "{{ round($.total0, 2) }}",
              "style": {
                "format": "currency"
              }
            }
          ]
        }
      ]
    }
  },
  "page": {
    "orientation": "portrait",
    "footer": [
      {
        "type": "text",
        "value": "Page {{ page.number }} of {{ page.total }}",
        "style": {
          "size": 7,
          "color": "#6b7a82",
          "align": "right"
        }
      }
    ]
  },
  "aggregates": {
    "total0": "sum:[email protected]"
  }
}

Questions

Is my CSV uploaded anywhere?
No. This page reads the text you paste or the file you open, and quario renders the preview and every download right here. Nothing you paste reaches a server.
Which delimiters does it read?
Commas, semicolons, tabs, and pipes. The converter picks the one that splits the header row and the first rows under it into the same number of fields. The status line says which it chose. When it guesses wrong, choose another under Separated by. A field in double quotes can hold the delimiter, a line break, or a quote written twice, as RFC 4180 describes. Windows line endings and a byte order mark read like any other file.
What does the first row need to be?
It's the header. Its fields name the columns, and every line after it becomes a row of the table. A column with an empty header gets a name such as Column 3, and a repeated name gets a number. A row with fewer fields leaves the rest of its cells empty. A row with more fields than the header is an error, and the status line gives its line and column.
How does it read numbers and dates?
A column becomes numbers when all its values are numbers written with plain digits and a decimal point, such as 1440.50. In a semicolon or tab file, a decimal comma such as 1.440,50 reads too. A value with a leading zero, such as 007, keeps its column as text. A number column with a name such as Total, Price, or Amount prints in the currency you choose and adds up in the totals row. Dates written as 2026-09-02 print as dates, such as Sep 2, 2026. Select any column to change its type, rename it, or hide it.
Can I choose the page size and orientation?
Yes. The PDF comes on Letter or A4 paper, in portrait or landscape, with a three-quarter-inch margin on every side. Each page carries its number at the foot, and the column headers repeat at the top of every page after the first.
What happens to a table too wide for the page?
Every column stays on the page. The PDF sizes each column by what it holds and wraps text inside it, so many columns make narrow ones. Landscape gives the table more room. You can also hide the columns you don't need before you download.
Is there a size limit?
The preview shows the first 200 rows. The PDF includes every row, up to what your browser can hold in memory. A file of many thousands of rows takes a few seconds to set.
Which characters can the PDF show?
The PDF embeds its fonts, which cover the letters of Western European languages, such as é, ñ, ø, and ß, and the euro sign. Any other character, such as the Polish ł, Greek, Cyrillic, Chinese, or an emoji, prints as a question mark, even when the preview shows it. From your own code, you can embed any TrueType font with @quario/pdf.
Is it free?
Yes, with no sign-up. To generate these files from your own application, quario is free to evaluate, and a license covers each production deployment. See pricing.