Create PDF

Type or paste plain text and turn it into a clean, paginated PDF.

0 words · 0 characters

About Create PDF

Type or paste text, pick a page size, margin, font and size, and download a PDF of it. There is no document to open first and no file to convert: the page is the editor. The output contains real text rather than a picture of text, so it can be selected, searched, copied and read aloud by a screen reader, and a few pages of prose weigh a handful of kilobytes.

Plain text, and what that means

Everything in the body is set in one font at one size. There is no bold, no italic, no heading level, no bullet list and no table — asterisks and hash marks are printed exactly as typed rather than interpreted as formatting. The single exception is the optional title, drawn at the top in the bold weight of your chosen font at 1.6 times the body size, rounded to the nearest point, over as many lines as it needs and broken wherever you broke it. Your line breaks are respected: a blank line between paragraphs comes out as a blank line, a long run of them keeps consuming vertical space onto the following page instead of collapsing, and leading spaces are preserved, with the continuation of an indented line indented to match so simple lists and pasted snippets stay readable.

How the text is fitted to the page

A PDF page has no concept of a paragraph or a text box that reflows — it is a list of instructions saying draw this string at this coordinate. Wrapping therefore has to be computed before anything is drawn. Each line is built up word by word, and after every word the candidate string is measured against the metrics of the actual font at the actual size to see whether it still fits the column. When it does not, the line is committed and the next one begins. A single token wider than the whole column, such as a long URL or a file hash, is split mid-word by searching for the longest prefix that fits, because the alternative is text running off the paper; if one of those characters is a no-break space — as it can be in a paragraph pasted out of a word processor, where every space may be a no-break one and the whole paragraph counts as a single token — the cut is made there instead, so the break still lands on a space rather than between two letters. The same principle caps the indent: a preserved leading indent is never allowed past the halfway point of the column, since an indent that fills the line leaves nothing for the words and every glyph would land off the page. Beyond that point the indent is trimmed and the text is printed in full — the words matter, the whitespace does not. Vertical placement works the same way: baselines step down by the line height, and the moment the next line would cross the bottom margin a new page is started, blank lines included.

Measuring the line is only useful if it measures the line that gets drawn, and the two can differ. A font carries a table of kerning pairs — the small tucks that close up AV, To, Yo — and a width routine that applies them reports a narrower line than one that does not. The text here is written into the page as a single show-text instruction carrying nothing but the character codes, which is what keeps the file small and the text selectable, and a reader stepping through that instruction advances by each glyph's own width with no kerning applied. Widths are therefore summed one character at a time, which is exactly the arithmetic the reader does, so the column the wrap is fitted to is the column the ink lands in. It matters more than it sounds: kerning pairs are almost all negative, so counting them makes a line measure shorter than it prints. A line of ordinary capitals — AVAILABILITY: WAVE TAX YAWN PAY VOTE WAX TAKE YARD — measures 332 points in Helvetica at 12 pt and prints 352, and in Times measures 339 and prints 361. That is 20 points of Helvetica and 22 of Times, seven or eight millimetres of text, hanging off the right-hand edge of a line the wrap believed it had fitted, and the gap grows with the type size. Courier never showed it, because a monospaced font has no kerning pairs to count.

Fonts and the character set

The three choices — Helvetica, Times Roman and Courier — are drawn from the fourteen standard fonts every PDF reader must provide, so nothing is embedded in the file and the result looks the same on every machine. The cost of that is coverage: these fonts are encoded with WinAnsi, which is Latin-1 plus curly quotes, dashes, the euro sign, a few other typographic extras and the seven letters Latin-1 leaves out, Š š Ž ž Œ œ and Ÿ. French, German, Spanish, Portuguese, Italian, Dutch, the Nordic languages and Icelandic come out complete. The rest of the Latin letters outside Latin-1 do not: Polish ł and ż, Czech č and ř, Hungarian ő and ű, Turkish ı and ğ, Romanian ș, Croatian đ, the Baltic macrons, Vietnamese tone marks and even Welsh ŵ are unavailable, as are Greek, Cyrillic, Arabic, Hebrew, Devanagari, CJK and emoji. Every such letter becomes a question mark and is counted in a warning above the download button, so nothing disappears silently and nothing is quietly swapped for a different letter. Where the character has no shape of its own to show, the warning names it by code point instead of printing a blank. Decomposed accents from a clipboard paste are recomposed first, so a normal paste of accented Western European text is not caught by this.

A question mark is the right answer for a missing letter and the wrong one for a character that was never meant to be seen, so four classes are dealt with before the font is consulted. Anything with no printed form is removed rather than printed — the whole Unicode formatting category, which covers the zero-width spaces and joiners that come with a web-page copy, the direction marks and the embedding, override and isolate controls beside them, and a byte-order mark at the head of a pasted text file, together with the old control codes and the variation selector that rides along behind an emoji. Taking the category whole rather than a list of favourites is the point: the earlier list held the two plain direction marks and missed every one of the embedding, override and isolate controls beside them, so half a bidi paste printed question marks and half did not. One family is deliberately left out — the range U+0080 to U+009F, which in practice is almost never a control but a Windows-1252 paste decoded one encoding out, where the code point stands in for a curly quote or an em dash the writer did mean you to see. Those keep their question mark and their line in the warning, which is the only thing on the page that would tell you the paste went wrong. Removed too is the soft hyphen, the awkward case: it is a hint about where a word may be broken, it is invisible until a line actually breaks there, word processors and web pages scatter it through long words, and it is the one of these that WinAnsi does map — onto a plain hyphen, which is how a pasted Silbentrennung came out as Sil-ben-tren-nung with nothing in the warning to say so. The remaining Unicode spaces become an ordinary space, which matters most for French, where a thin space sits before an exclamation or question mark and a narrow no-break space separates thousands; a plain no-break space is left alone so it still holds a figure and its unit together. And every other spelling of a line break is treated as the line break it is: the carriage return, the vertical tab that carries a word processor’s manual line break onto the clipboard, the form feed that ends a page in a plain text file, and the Unicode line and paragraph separators. Courier is worth choosing when the content is code or aligned columns, since every character is the same width.

When another tool fits better

  • Markdown to PDF — for headings, bold, links, quotes, code blocks and tables written in Markdown.
  • HTML to PDF — when you already have markup and want it laid out as it looks in a browser.
  • CSV to PDF — for tabular data, which becomes a proper ruled table with repeating headers.
  • Image to PDF and JPG to PDF — for photographs and scans rather than typed text.
  • Word to PDF — when the content already exists as a .docx.
  • Add Page Numbers to PDF — for a Page N of M label on a PDF you already have.

Afterwards, and privacy

The finished file behaves like any other PDF: stamp it with Add Watermark to PDF, combine it with Merge PDF, set its properties in PDF Metadata Editor, or lock it with Protect PDF. None of the text you type here is transmitted anywhere. The layout, the font measurements and the file assembly all happen inside this browser tab, and the finished document goes straight to your downloads folder — which is why the tool keeps working with the network switched off.

Real text, not a screenshot

Every line is written into the page as a PDF text operator using one of the built-in fonts, so the result is selectable, searchable, copyable and readable by a screen reader — and a page of prose costs a couple of kilobytes.

Wrapping measured from the font

PDF has no notion of a paragraph. Each line is fitted by measuring candidate strings against the chosen font at the chosen size — summed the way a reader advances through them, so the measured column and the inked column are the same one. Words break at spaces, over-long tokens like URLs are split rather than run off the edge, an indent deep enough to swallow the column is trimmed so the words still fit, and a new page starts the moment the next line would cross the bottom margin.

Nothing leaves the tab

The document is built in page memory and handed straight to your downloads folder. There is no upload, no queue and no copy on a server to delete afterwards, which is the point if you are typing up notes, a statement or a letter you would rather not paste into someone else’s editor.

Frequently Asked Questions

Can I make text bold, add a heading or insert a bullet list?

No. This is a plain-text composer: the only styled element is the optional title, which is drawn in the bold weight of your chosen font at 1.6 times the body size, rounded to the nearest point — 12 pt body, 19 pt title. Everything you type in the body is set in one font at one size. Asterisks, underscores and hash marks are printed literally, not interpreted. If you want headings, bold, italics, links, tables or real bullet lists, write the document in Markdown and use Markdown to PDF instead — it renders the formatting and still produces a PDF with selectable text.

How are line breaks and blank lines treated?

Exactly as you typed them. Press Enter and a new line starts in the PDF; leave a blank line between paragraphs and you get a blank line of vertical space, and a run of blank lines longer than the space left on the page carries on down the next page rather than collapsing into one break. The title box is one line on screen, but a break pasted into it counts too: a title carrying a word processor’s manual line break is set over two title lines rather than one. Leading spaces are kept, and when an indented line is too long to fit, the continuation lines are indented to match, which keeps simple hanging lists and pasted code readable. There is one limit on that: an indent is never allowed to take more than half the column, because past that point there is no room left for the words. A deeper indent is trimmed back to the half-column mark and the text itself is printed in full: with Courier at 12 pt on an A4 page with normal margins the cap falls at 33 spaces, about eight tab stops, since a tab expands to four spaces. Where exactly it falls depends on the font, the size and the column, and it is only the whitespace that is shortened — never a character you typed. Lines longer than the column are wrapped at spaces automatically; you never need to break them yourself.

Why did some of my characters turn into question marks?

The three fonts offered here are built into every PDF reader, and they are encoded with WinAnsi — essentially Latin-1 plus curly quotes, dashes, the euro sign, a few other typographic extras and the seven letters Latin-1 leaves out: Š š Ž ž Œ œ and Ÿ. That is a smaller set than "accented letters". What comes out right: English, French, German, Spanish, Catalan, Portuguese, Italian, Dutch, Danish, Norwegian, Swedish, Finnish, Icelandic and Irish, including ç, ñ, ü, å, æ, ø, ß and þ — and š and ž wherever they turn up, including in the languages listed next whose other letters do not survive. What does not: the rest of the Latin letters outside Latin-1, which means Polish ł ą ę ś ź ż ć ń, Czech and Slovak č ř ě ů, Hungarian ő ű, Turkish ı İ ş ğ, Romanian ș ț ă, Croatian and Slovene č ć đ, Latvian and Lithuanian ā ē ī ų ė, Esperanto ĉ ĝ ŝ ŭ, most Vietnamese, and even Welsh ŵ and ŷ — along with Greek, Cyrillic, Hebrew, Arabic, Devanagari, Chinese, Japanese, Korean and emoji. Each unavailable letter is replaced with a question mark, and the warning above the download button counts every substitution, shows up to eight of the distinct characters involved and says how many further kinds there were, so nothing vanishes quietly. A character with no shape of its own to show — a stray combining mark, or a byte from a paste decoded in the wrong encoding — is named there by its code point, as U+0092, rather than printed as a blank. Nothing is transliterated: you get a visible question mark, never a silently different letter. Decomposed text — the form macOS often puts on the clipboard, where é is an e followed by a separate accent — is recomposed before this check, so a normal paste of French or Spanish is safe. Four kinds of character are handled before that check rather than by it, because a question mark would be the wrong answer for all of them: everything with no printed form is removed rather than printed, since nothing represents an invisible character better than nothing, and that means the whole Unicode formatting category — the zero-width space and joiner, the direction marks and the embedding, override and isolate controls, a byte-order mark at the head of a pasted text file — together with the old control codes and the variation selector that trails an emoji; a soft hyphen — the break hint that word processors and web pages scatter through long words, and the one character here that WinAnsi does map, straight onto an ordinary hyphen — is removed too, so a pasted Silbentrennung stays Silbentrennung instead of printing as Sil-ben-tren-nung; the other Unicode spaces, including the thin space and the narrow no-break space French typography puts before an exclamation mark and inside a number, become an ordinary space; and every other spelling of a line break — the carriage return, the vertical tab a word processor uses for a manual line break, the form feed a plain text file uses for a page break, and the Unicode line and paragraph separators — becomes a line break, in the title as well as the body. A no-break space is kept as one, so it still holds "10 km" together. Text that is nothing but invisible marks is refused with a message rather than turned into a blank page. There is no workaround for the missing letters, because embedding a font that covers those scripts would mean shipping a font file with the page. For documents in those languages, write them in a word processor and export the PDF from there.

What are the three fonts, and why so few?

Helvetica, Times Roman and Courier — a sans serif, a serif and a monospace. They are three of the fourteen standard fonts every PDF reader is required to provide, which means no font program is embedded in the file. That keeps a ten-page document in the low tens of kilobytes and guarantees it renders identically everywhere. Courier is the right pick when you are pasting code or aligned columns, because every character occupies the same width.

How do the margin and page size choices affect the result?

They set the text column. A4 at a normal margin gives a column about 487 points wide; Letter at a wide margin gives 468. Narrower margins fit more words per line and fewer pages overall, wider margins are easier to read and leave room for a punch or a binding. The measurements are in points because that is the unit inside the file: 72 points to the inch, so the narrow margin is half an inch and the wide one is a full inch.

What exactly do the page numbers look like?

When the box is ticked, a plain arabic numeral is centred inside the bottom margin of every page, two points smaller than your body size and in a mid grey. It counts from 1 and includes the title page, because there is no separate cover here. Leave it unticked for a one-page letter. If you later need numbering in a different format on a PDF you already have, Add Page Numbers to PDF stamps a Page N of M label onto an existing file.

Is there a length limit?

No hard limit is coded in. The whole document is laid out and built in memory, so a few hundred pages of text is comfortable and a novel-length paste will simply take a moment and a lot of RAM. Every line is measured individually against the font metrics, which is the slow part; the file itself stays small because the text is stored as text. One shape of input used to be far slower than its size suggested: a single unbroken token hundreds of thousands of characters long, which is what a pasted base64 data URI or a line of minified code amounts to. Finding each break in it re-measured the whole remainder, so the cost grew with the square of the length and 300 KB on one line locked the tab for the better part of a minute. The search now only ever looks at as much text as could fit on one line, and the same paste lays out in a fraction of a second.

What is the file called and where does it go?

The name comes from your title, lowercased with spaces and punctuation turned into hyphens — a title of Q3 Handover Notes saves as q3-handover-notes.pdf. Accents are folded to their plain letter rather than dropped, so Café Ünïcødé becomes cafe-unicode.pdf; letters from a non-Latin script have no ASCII equivalent and fall out, and the name is cut at 60 characters. With no title, or a title with nothing ASCII left in it, it saves as document.pdf. It goes straight to your browser’s downloads folder. Nothing is uploaded at any point: the layout, the font measurement and the file itself are all produced in this tab, which is why the tool works with the network disconnected.