Free PDF tool
Convert CSV to PDF
Open a CSV export from a spreadsheet, CRM or shop system and get a readable table: the delimiter is detected, the header row repeats on every page and numbers line up on the right.
Your files stay on your device
- Free, no account needed
- Built on pdf-lib
Paste, type, open a file or drop one onto the editor. The example shows what the tool does.
How it works
Convert CSV to PDF in 4 steps
- 1
Add the CSV
Paste the data or open a .csv or .tsv file.
- 2
Check the settings
The delimiter is detected; change it if needed, and say whether the first row holds column names.
- 3
Choose the page
Auto turns the page to landscape for tables with many columns. Pick a smaller text size for dense data.
- 4
Create and download
Select Create PDF and save the table.
Questions
Frequently asked questions
Are my files uploaded to a server?
No. The tool runs entirely in your browser: your files are read and converted on your device, and their contents are never sent to our servers.
Which delimiters are supported?
Comma, semicolon, tab and pipe. The tool picks the one that splits the first rows most consistently, and you can choose it yourself. Quoted fields with commas or line breaks inside are read correctly.
What happens with wide tables?
Column widths follow the content and long values wrap inside their cell. For tables with many columns, use landscape or leave the orientation on Auto.
Can I open Excel files?
Save the sheet as CSV in Excel, Numbers or Google Sheets first. The tool reads the text format, not .xlsx files.
Which characters are supported?
The browser tool uses the standard PDF fonts, which cover Latin characters (Windows-1252), so no font files need to be downloaded. Other characters, such as Chinese or emoji, are replaced by a question mark and the tool tells you how many. The API embeds full Unicode fonts.
Automate it
Do the same in your application with Dynamic Document API
Send rows as JSON to one of your templates and get a branded report with your logo, totals and page headers. Batches turn thousands of records into documents in one run.
POST /v1/pdf/from-templateAvailablecurl -X POST https://api-eu.dynamicdocumentapi.com/v1/pdf/from-template \
-H "Authorization: Bearer $DYNAMIC_DOCUMENT_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"template_id": "tpl_01J9ZR3M5P7Q9S1T3V5X7Z9B1D",
"data": {
"period": "September 2026",
"rows": [
{
"sku": "A-100",
"quantity": 12,
"total": 144
},
{
"sku": "B-220",
"quantity": 3,
"total": 89.7
}
]
}
}'const response = await fetch("https://api-eu.dynamicdocumentapi.com/v1/pdf/from-template", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.DYNAMIC_DOCUMENT_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"template_id": "tpl_01J9ZR3M5P7Q9S1T3V5X7Z9B1D",
"data": {
"period": "September 2026",
"rows": [
{
"sku": "A-100",
"quantity": 12,
"total": 144
},
{
"sku": "B-220",
"quantity": 3,
"total": 89.7
}
]
}
}),
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const result = await response.json();
console.log(result);import os
import uuid
import requests
response = requests.post(
"https://api-eu.dynamicdocumentapi.com/v1/pdf/from-template",
headers={
"Authorization": f"Bearer {os.environ['DYNAMIC_DOCUMENT_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"template_id": "tpl_01J9ZR3M5P7Q9S1T3V5X7Z9B1D",
"data": {
"period": "September 2026",
"rows": [
{
"sku": "A-100",
"quantity": 12,
"total": 144,
},
{
"sku": "B-220",
"quantity": 3,
"total": 89.7,
},
],
},
},
timeout=90,
)
response.raise_for_status()
print(response.json())