Skip to content
Reading

Reading tool

Papers on a Kindle.

I read the papers on the list before this page on a 6-inch Kindle, and a two-column PDF on a 6-inch screen is unreadable — you pan across a page built for A4. Every converter I tried linearised the columns into nonsense and turned the equations into garbled text. So this one does the opposite: it reads the layout first, keeps body text as text so it reflows, and treats every equation, figure and table as an image, cropped straight from the page and never parsed.

It is free, and it runs on your own machine, not on this site: the panel below talks to a converter listening on your loopback address, so the PDF goes from your browser to your laptop and stops there. Nothing is uploaded here and nothing is stored here.

Get it on GitHubFree · Docker or Python
looking for the engine…

Drop a PDF here

or click to choose one

or

An arXiv link is fetched from arxiv.org, and its title, authors and abstract become the epub’s metadata and cover. A PDF you drop stays on your machine.

Budget several minutes for a paper the first time — detecting the layout is the slow stage. It is cached per paper, so converting the same one again takes seconds.

Four stages.

01

Render

Every page goes to a 300 dpi raster — well above the panel, because crops are taken from this and downscaling a sharp image beats upscaling a soft one.

02

Detect layout

A layout model finds the regions on each page, and a column-aware geometry pass puts them in reading order: left column top to bottom, then right, banded around anything full-width.

03

Extract

Body text comes out of the PDF as words — with the font flags that carry italic, bold and superscript. Every figure, table, plot and equation becomes an image instead, re-rendered from the PDF’s own vector source at the size it will ship at, trimmed to its ink.

04

Assemble

Sections become chapters, subsections nest under them in the contents, citations become tappable links back and forth, and the paper gets a cover so it isn’t another grey placeholder in the library.

What the rebuild changed.

The first version reconstructed the regions of a page faithfully and still read badly, because a paper is not a bag of regions. Paragraphs stayed broken where the columns broke them, every heading opened its own file, and images shipped at more than twice the pixels the screen can show. Same four papers, same layout cache, measured before and after:

Paragraphs left cut mid-sentence

20-page two-column IEEE paper

60%14%

Separate chapter files

each one is a hard page break on Kindle

4122

Contents entries pointing at nothing

one was a chapter titled “and”

80

Widest embedded image

the screen is 1072 px across

2550 px1200 px

Where figures and equations come from

re-rendered at output size, so text in a plot stays type, not pixels

page bitmapvector source

Photo pixels crushed to pure black or white

the e-ink contrast curve that sharpens a formula flattens a micrograph

17.5%2.8%

File size

22-page paper, 41 micrographs

6.3 MB1.5 MB

Tuned for one screen.

The 2024 basic Kindle: 6 inches, 1072 × 1448 pixels, 300 PPI, and sixteen levels of grey. Every image is trimmed to its ink, sized for that panel with a little headroom for zoom, converted to grey — colour is bytes the device throws away — and encoded as PNG if it is line art or JPEG if it is a photograph. The stylesheet is deliberately short, because Send to Kindle converts the EPUB to Amazon’s own format on the way in and drops most of what a browser would honour. Reading on something larger is one constant in config.py.

Three details decide whether the pictures survive the trip. Figures and equations are re-rendered from the PDF’s vector source at the size they ship at, rather than cropped out of a page bitmap and resampled — most academic figures are vector, so this is the difference between type and pixels. Figures then fill the screen width, while equations keep their printed size relative to the text, because a three-symbol equation blown up to the full panel is what makes a converted paper look wrong. And contrast is applied two different ways: the hard curve that makes a formula crisp is the same curve that flattens a micrograph’s texture into grey mush, so photographs get a gentle percentile stretch instead.

Take it.

The whole thing is on GitHub — free, and it comes with its own interface, so you do not need this page to use it. Clone it, run one command, and convert whatever you like. Nothing you convert reaches me or anyone else.

Get it on GitHub

Python, PyMuPDF and a layout-detection model, in about three thousand lines. The interesting parts are the ones nobody sees: deciding when a cached stage is still valid, and re-joining the paragraphs a two-column layout tore in half.