Paste plain text or open a .txt, .log or .csv file, check the preview, and download a PDF with real, selectable text. Line breaks and spacing are kept exactly, long lines wrap. Free, no signup, no watermark.
Or open a file: (you can also drop it on this box)
Preview
A text PDF, not a picture: you can search it, copy from it, and it stays small (a few KB per page). Every space, tab and blank line is kept as in your file, so logs, code, configs and fixed-width tables line up. Lines longer than the page wrap instead of being cut off. Accented letters, Greek, Cyrillic, Arabic, Chinese, Japanese and Korean print correctly, because the PDF is rendered by Chromium with Noto fonts rather than the 14 built-in PDF fonts, which only cover Western European characters.
| Font | Best for |
|---|---|
| Monospace | Logs, code, config files, CSV and anything aligned with spaces. Every character has the same width, so columns stay lined up. |
| Sans-serif | Notes, emails and lists you want to read on screen. |
| Serif | Letters, essays and anything you will print. |
Turning logs, receipts or generated reports into PDFs in a script or cron job? Wrap the text in a <pre> and send it to the Shotmint PDF API. No Chromium, LibreOffice or font packages to install. Save this as txt2pdf.mjs and run SHOTMINT_KEY=... node txt2pdf.mjs notes.txt:
// txt2pdf.mjs: node txt2pdf.mjs notes.txt -> notes.pdf
import { readFile, writeFile } from 'node:fs/promises';
const input = process.argv[2] ?? 'notes.txt';
const text = (await readFile(input, 'utf8')).replace(/&/g, '&').replace(/</g, '<');
const html = `<!doctype html><meta charset="utf-8">
<style>pre { font: 10pt/1.45 "DejaVu Sans Mono", monospace; white-space: pre-wrap; overflow-wrap: anywhere; margin: 0 }</style>
<pre>${text}</pre>`;
const res = await fetch('https://shotmint.creasework.com/v1/pdf', {
method: 'POST',
headers: { 'X-API-Key': process.env.SHOTMINT_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ html, format: 'A4', margin: '18mm', page_numbers: true }),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
await writeFile(input.replace(/\.[^.]+$/, '') + '.pdf', Buffer.from(await res.arrayBuffer()));
console.log('Saved, credits left:', res.headers.get('x-credits-remaining'));
Options: format (A4, Letter, Legal, A3, A5, Tabloid), landscape, margin (like 18mm or 0.75in), page_numbers and footer_template. Each PDF is 1 credit.
Get 25 free renders a month API docs
Why do characters show as boxes in other converters? Many converters use the standard PDF fonts (Helvetica, Courier), which have no glyphs outside Western European Latin. This tool prints with full Unicode fonts, so Polish, Turkish, Russian, Chinese or emoji text keeps its letters.
Is the text selectable in the PDF? Yes. It is real text, so you can search it with Ctrl+F and copy it back out (try PDF to text).
Can I force a page break? Yes. A form feed character (Ctrl+L, common in old printouts) starts a new page.
Do you keep my text? No. It is sent once to render the PDF and is not stored. The preview never leaves your browser.
Is there a limit? 5 PDFs a day per visitor without a key. Get a free API key for 25 more a month, or buy credits for bulk conversions.
Related: Markdown to PDF, HTML to PDF, URL to PDF, image to PDF, merge PDF, PDF to text, OCR PDF.
robots.txt checker · llms.txt checker · Image to PDF · Excel to PDF · Word to PDF · Markdown to PDF · HTML to PDF · Merge URLs to PDF · SVG to PDF · Entire website to PDF · PDF to image · Merge PDF · Bulk URL to PDF · Compress PDF · URL to PDF · Split PDF · Delete PDF pages · Rearrange PDF pages · all free tools