Convert an HTML page to a PDF you can read

This is not a browser. There is no rendering engine on the server, so there is no CSS at all: no layout, no columns, no floats, no web fonts, no colours, no images and no JavaScript. What does come across is the document underneath the design — headings, paragraphs, lists, quotations, preformatted text, table rows, and the address behind every link — set in our own fonts and flowed onto real pages. That makes it the right tool for an article, a set of release notes or a page of documentation, and the wrong tool for a designed landing page or an invoice template, where the meaning is in the layout.

No CSS. Colours, columns, floats, grids, spacing, web fonts and anything positioned by a stylesheet are ignored entirely; you get the same words in the same order as a plain document.

Convert HTML to PDF

No account. Your upload is deleted after 2 hours, the result after 24 hours.

How it works

  1. Give it a page. Upload an .html file, or paste an address beginning http:// or https://. Either way only the markup is read; nothing referenced by the page is fetched alongside it.
  2. Set the paper and the type. A4 or Letter, the margin, the text size and one of four typefaces. These are the only appearance choices there are, because the page’s own styling is never applied.
  3. Read the result as a document, not as a screenshot. Check that the headings arrived in the right order and that the tables are readable as rows. If what you wanted was a picture of the web page, this is not it, and no setting here will make it one.

What the options do

The form above lists the options this tool is running today, straight from the server. This is what they are for.

Web address
An alternative to uploading a file: paste an address and the markup is fetched from it. Only http and https are accepted, addresses with credentials in them are refused, and any host resolving to a loopback, link-local, private or multicast address is rejected — re-checked at every redirect — because a server that fetches whatever address it is given is a well-known way to be tricked into reading something private. A page behind a login comes back as the login page, because there is no session to use.
Page size
A4 or Letter. This is the paper the text is flowed onto and has nothing to do with the width the web page was designed for: long lines wrap to the measure rather than being scaled down to fit.
Margin (mm)
White space around the text block on every page. Twenty is a readable default. Wider margins give a narrower column, which reads more easily and takes more pages; narrow ones fit more on a sheet and are harder work.
Text size (pt)
The size body text is set at, from 7 to 18 points. Headings are sized relative to it, so raising this scales the whole document rather than only the paragraphs. Eleven is the default; 14 and above is for something read at arm’s length or by someone who would otherwise reach for reading glasses.
Typeface
One of the four fonts we ship. Helvetica and Open Sans are sans-serif and read well on a screen; Times New Roman and PT Serif read better on paper. The page’s own fonts are never used, because that would mean downloading and embedding font files chosen by somebody else’s server.

What this tool does not do

  • No CSS. Colours, columns, floats, grids, spacing, web fonts and anything positioned by a stylesheet are ignored entirely; you get the same words in the same order as a plain document.
  • No JavaScript. A page that builds its content with a script arrives empty or nearly so, which covers most single-page applications and most dashboards.
  • No images. Photographs, logos, diagrams and charts do not appear, and their alternative text is not substituted for them.
  • Tables come across as rows of text rather than as ruled tables. A wide data table will be readable and will not look like a table.
  • A page behind a login, a paywall or a bot check cannot be fetched, because there is no browser to log in with and no session to carry.
  • It is not a way to archive a page as it looked. For that, use your browser’s own Print to PDF, which has the entire rendering engine behind it.

What happens to your file

The file is uploaded because HTML to PDF runs on our server rather than in the browser tab. It is kept for at most 2 hours and the result you download for 24 hours, then a scheduled job deletes both — a job has to be able to read the file while it runs, and you have to be able to retry a failed conversion without re-uploading. Neither needs longer.

Nothing about the contents is logged, and no one reads your documents. The retention page lists the same numbers the code enforces, and the privacy policy says who can reach the storage they sit in.

Questions

Why does the PDF look nothing like the web page?
Because the appearance of a web page lives in its CSS, and there is no CSS engine here. What is converted is the document underneath: headings, paragraphs, lists, links and table rows. If you need the appearance, your browser’s Print to PDF is the tool for it.
My page came out blank.
Almost certainly a page that builds itself with JavaScript. The markup that arrives is an empty shell and there is no script engine to fill it. Open the page in your browser, save it as an .html file, and upload that instead.
Where have the images gone?
They are never fetched or embedded — the result is text only. If a diagram matters, take a screenshot of it, run that through JPG to PDF and merge the two documents.
Do the links still work?
The address behind each link is written into the document, so you can read and use where it pointed. Expect a visible URL rather than a styled, clickable word.
Can it fetch a page that needs a login?
No. The address is fetched with no session, no cookies and no credentials, so a protected page returns whatever an anonymous visitor sees — usually the login screen. Save the page from your logged-in browser and upload the file.
Is it safe to hand it any address?
It refuses anything that is not http or https, addresses with credentials embedded in them, and hosts that resolve into private or loopback ranges, re-checking after each redirect. That is there to stop the server being used to read things on its own network; it is not a judgement about the content of the page you asked for.