LOCALPRESS

LOCAL-FIRST PDF PRESS

Documents in. PDFs out. Nothing leaves your machine.

Convert images, Markdown, HTML and plain text to PDF inside your browser. No uploads, no accounts, and it keeps working with the network switched off.

Drop files here

or use the button — one file or a whole batch

  • TXT
  • MD
  • HTML
  • CSV
  • JPG
  • PNG
  • HEIC
  • WEBP
  • AVIF
  • GIF
  • BMP
  • SVG
  • PDF

How it works

Add files

Drop pictures onto the page or use the button. One file or a whole batch, in any mix of the formats below. Nothing is sent anywhere when you add a file; the browser reads it into memory and that is as far as it goes.

Set the output

Page size, orientation, margins, image quality and the title and author written into the PDF. Each file also gets its own output name, which you can change before converting.

Convert and download

Each file becomes its own PDF. Conversion runs off the main thread, so the page stays responsive while it works, and the result is handed straight back as a download rather than stored.

What it converts

Pictures, text and spreadsheets. Eight picture formats — JPG, PNG, HEIC, WEBP, AVIF, GIF, BMP and SVG — and four text ones: plain text, Markdown, HTML and CSV. A PDF can be dropped in too, though it is not converted: it is already the output format, so its pages are carried into a combined document as they are. Office documents are being built and are deliberately not offered yet.

Text keeps its structure, and stays text

A converted document holds real text, not a picture of text. You can search it, select it, copy out of it and let a screen reader read it, which is most of what a PDF is for and the first thing lost by converters that rasterise the page.

Markdown keeps its headings, its lists and its tables. A table is most of why anyone reaches for a converter, and flattening one into a line of text with the pipes still in it is the commonest way this goes wrong. HTML keeps its structure too, and is stripped of everything that executes or loads: script, styles, frames and remote images never reach the page.

Images inside an HTML file are dropped rather than fetched. This page is forbidden a network connection, so a remote image could not load even if it were kept, and a document with silent holes where pictures should be is worse than one that says it carries none.

A spreadsheet stays a table

A CSV becomes a real table with its first row as the heading, repeated at the top of every page — a twelve-page export whose headings appear only on page one is unreadable by page three. The delimiter is worked out from the file, so a semicolon export, which is what most of Europe produces because the comma is their decimal separator, is read without being told. Tab-separated files, which is what you get from copying out of a spreadsheet, are read the same way.

Quoted fields are read properly. An address with a comma in it, a price written with a thousands separator, a sentence with a line break inside it: all stay in one cell. Splitting a CSV on its commas, which is the quick way to do this, corrupts every file that contains one.

A table too wide for the page is split, never trimmed

Thirty columns do not fit across A4 at any readable size. The obvious answer is to let the table shrink to fit, and it does not work: measured, a thirty-column table rendered that way came out with eighteen columns and the other twelve silently gone, drawn past the edge of the paper. Nothing in the file says so — it opens, the table looks complete, and the last columns are simply not there.

So a table wider than the page is broken down its columns into blocks that do fit, each with its own heading row and a caption saying which columns it holds. Every cell survives. The cost is that a wide table is read in blocks rather than across one line, and choosing landscape or a larger page size puts more columns in each block.

The encoding is read, not assumed

A text file written on Windows is often not UTF-8, and reading it as though it were turns every accent and curly quote into a replacement character. LocalPress checks for a byte order mark, tries UTF-8 strictly, and falls back to Windows-1252 when that fails, which is where Word's apostrophes and dashes live. UTF-16 is recognised too, with or without its mark.

What it will not pretend to draw

The font that ships with the converter covers Latin, Greek and Cyrillic. A document in Chinese, Japanese, Korean, Arabic, Hebrew, Thai or Devanagari is refused before conversion, with the script named, because the alternative is a PDF of blank pages that only reveals itself when you open it. Arrows and emoji fall outside the font too, and are reported the same way. Font packs for the other scripts are the next piece of work.

SVG stays a drawing

An SVG is not turned into pixels. It is written into the PDF as vectors, so a logo or a diagram stays sharp at any zoom and prints at whatever resolution the printer has. Converters that rasterise an SVG to fit a page throw away the one property that made the format worth keeping, and the loss only becomes obvious later, on paper.

Photographs come out the right way up

A phone held sideways does not rotate the picture it records. It stores the pixels the way the sensor saw them and writes a tag saying which way up the result should be. Software that ignores that tag prints the photograph on its side. LocalPress reads it, and then measures the page against the size the picture is actually drawn at rather than the size it happens to be stored at, which is the part that is easy to get half right.

HEIC, which your browser cannot read

An iPhone photograph is usually a HEIC, and no browser except Safari can decode one. That is why the camera roll so often has to be exported before it can be used anywhere. LocalPress decodes it here, on your machine, usinglibheif compiled to WebAssembly. The decoder is 1.4MB and is downloaded only when you actually drop a HEIC, so nobody else pays for it.

It is the one piece of third-party code this page runs, and it is worth being plain about that. libheif is published under theLGPL-3.0 rather than the permissive licence everything else here uses, so the exact build is shipped unmodified as its own file, itsfull licence and notices ship with it, and its source is public. Nothing about it changes where your file goes: it runs in the same browser tab under the same policy that forbids the page a network connection.

A photograph taken with the phone held sideways is stored the way the sensor saw it, with a rotation recorded beside it in the file. That rotation is honoured, so the picture arrives on the page the way it looked on the phone.

Small pictures are not blown up

An icon dropped onto an A4 page is printed at its own size and centred, not stretched to fill the sheet. Enlarging it would add nothing but soft edges. Anything larger than the page is scaled down to fit, keeping its proportions exactly.

Setting the output

Page size, orientation and margins

A4, Letter or Legal, portrait or landscape, with narrow, normal or wide margins. The margin is the white space kept clear on all four sides, and the picture is fitted to what is left. Landscape swaps the two page dimensions rather than rotating the contents, so a wide photograph on a landscape page fills far more of the sheet than the same photograph on a portrait one.

Image quality and compression

With compression on, pictures are re-encoded as JPEG at the quality you choose and capped at 2200 pixels on the long edge. That is the difference between a PDF you can email and one you cannot. With it off, the picture is embedded losslessly and the file is as large as the original demands. Transparency is filled with white before a compressed encode, because JPEG carries no transparency and the alternative is a picture that comes out on a black ground.

Title and author

Both are written into the PDF's own properties, which is what a reader shows in its document information panel and what some document systems index on. Left blank, the author stays genuinely empty rather than being filled with a placeholder.

Why nothing is uploaded

Every other converter you will find asks you to upload the file. That is a reasonable way to build one and an unreasonable thing to do with a contract, a passport scan or a medical letter, which are exactly the documents people most often need as PDFs.

This page is served with a Content-Security-Policy that sets connect-srcto none. That is not a promise in a privacy policy; it is an instruction to your browser to refuse this page a network connection at all. If the code here tried to send your file somewhere, the browser would block the attempt and log it.

How to check it in a minute

Open your browser's developer tools, go to the network panel, and convert something. Nothing appears. Or switch your network off after the page has loaded and convert anyway: it works, because there is nothing on the other end to be missing. Both take less time than reading a policy that says the same thing.

What is kept on this device

A short list of recent conversions, holding a name, a few words of detail and a date. There is nowhere in that record for a file to go, which is what makes the line beside the list true rather than reassuring. Clearing it removes it. A finished PDF is held in memory until you download it and is gone when the page reloads.

Questions

Are my files uploaded anywhere?

No. There is no server on the other end. The page is served with a Content-Security-Policy that sets connect-src to none, which means the browser itself refuses to let it open a network connection at all. Open your developer tools, watch the network panel while you convert something, and you will see nothing leave.

Which formats does it convert today?

Pictures — JPG, PNG, HEIC, WEBP, AVIF, GIF, BMP and SVG — and text: plain text, Markdown, HTML and CSV. PDFs can be dropped in as well, but they are merged rather than converted, since they are already the output format. Office documents are being built and are deliberately not offered yet, because a converter that accepts a file and hands back a wall of stripped text is worse than one that says it cannot read it.

Does this page run any third-party code?

One piece, and only when you need it. HEIC photographs cannot be decoded by any browser except Safari, so LocalPress carries libheif compiled to WebAssembly and loads it the first time you drop a HEIC. It is published under the LGPL-3.0, ships unmodified with its full licence text, and runs in your tab under the same policy that forbids this page a network connection. Everything else here was written for this network.

What happens to a spreadsheet with more columns than fit on a page?

It is split down its columns into blocks that do fit, each with its own heading row and a caption saying which columns it holds, so every cell survives. Letting the table shrink to fit instead loses the last columns without saying so, which is what most converters do. Landscape or a larger page size puts more columns in each block.

Can it convert a document that is not in English?

Latin, Greek and Cyrillic scripts convert, so most European languages are fine, accents and all. Chinese, Japanese, Korean, Arabic, Hebrew, Thai and Devanagari are refused before conversion with the script named, because the font that ships with the converter has no glyphs for them and the document would come out as blank pages. Font packs for those scripts are the next piece of work.

Does it work offline?

Once the page has loaded, yes. Conversion runs in your browser, so you can switch the network off and keep converting. The one thing that needs the network is loading the page in the first place.

Is there a file size limit?

Only your device. Nothing is uploaded, so there is no upload cap, but the whole document is built in memory. Very large files convert more slowly and a very large batch can exhaust a tab.

Why did my photograph come out the right way up?

Because the orientation stored in the file is read rather than ignored. A phone held sideways records the picture one way and tags it with a quarter turn, and a converter that skips the tag prints it on its side. LocalPress reads it, and measures the page against the size the picture is actually drawn at.

What happens to a file it cannot read?

That row says so, with the reason, and the rest of the batch carries on. Being refused and failing halfway are different things and are shown differently, because one tells you to convert the file another way and the other tells you the file is damaged.

Are my converted PDFs saved anywhere?

No. A finished PDF is held in memory until you download it and is gone when you reload the page. The list of recent conversions keeps names and dates on this device only; there is nowhere in that record for a file to go.

Keyboard shortcuts

Show this list
?
Add files
Choose files
Close this dialog
Esc