Skip to site navigation
PDF

PDF to MD

Drop a PDF in and Markdown comes out. Nothing is uploaded and nothing is billed per page.

1Documents

Mechanism

How this works

pdf.js pulls the existing text layer out of the file in your browser, giving each fragment a font name, a size and a position on the page. Layout rules turn that into Markdown. Font size relative to the page's most common size decides heading level. A monospace font name opens and closes a code block, and bullet characters or numeric prefixes become list items. The whole path is deterministic, so the same PDF produces the same Markdown every time.

Limits

What it cannot do

  • A scanned PDF is a picture of a page with no text layer, and there is no OCR here. The tool says so rather than returning an empty file.
  • Tables come out imperfect. PDF stores them as positioned text with no row or column structure, so anything beyond a simple grid needs checking by hand.
Questions

Questions people actually ask

Is the output good enough to paste into an LLM prompt?
That is the case it was built for. Headings and lists survive, which is what a model needs to follow the structure of a document, and stripping the PDF wrapper cuts the token count considerably compared with pasting raw extracted text. Check any table before you rely on what a model says about it.
Does this use an AI model?
No. It reads the text layer already inside the PDF and applies layout rules. Nothing is sent to a model, so there are no tokens to pay for, no rate limit, and no queue between you and your file.
Why did the running header from every page end up in my file?
The header stripper is deliberately conservative. It removes a repeated line only when that line appears on most pages, sits in the top or bottom 15% of the page, and holds a stable vertical position across pages. A header that drifts fails the third test and is kept, because eating real content is a worse failure than leaving a header behind.