Tool 1: the text cleaner
Three stages run in sequence, entirely in your browser tab.
1. Reading positions, not words
A PDF stores text as glyphs positioned at coordinates, not as paragraphs. The first stage walks every page with PDF.js and groups glyph runs that share a baseline, meaning everything sitting on the same horizontal line, into a visual line, then sorts those lines top to bottom. Sorting by position rather than by file order is what keeps a two-column layout from interleaving into nonsense.
2. Applying the cleanup rules you selected
Each checkbox on the home page maps to one rule, applied in a specific order so the fixes don't conflict with each other:
- Rejoin hyphenated words: collapses a line-ending hyphen into the next line only when a letter precedes it and a lowercase letter follows, so real compounds like "state-of-the-art" are left alone.
- Merge wrapped lines: appends a line to the one above it whenever the line above lacks terminal punctuation, rebuilding paragraphs while leaving short, title-like lines and list items on their own.
- Drop running heads: tallies which normalized lines (with digits stripped) repeat across most pages near the top or bottom, and removes any line that matches, along with bare page numbers.
- Markdown bullets: recognizes bullet and numbered-list markers and rewrites them as Markdown list syntax.
- Straighten quotes & dashes: converts curly quotes and em/en dashes to their plain ASCII equivalents. Off by default, since it's a style choice rather than a correction.
- Mark page breaks: inserts a visible --- Page n --- divider between pages, useful when you need to keep track of original pagination in the output.
3. Collapsing whitespace and producing the receipt
Runs of two or more spaces, the artifact of kerning and tab-stop positioning, are collapsed to one, without touching line breaks. The tool then counts exactly what it changed: hyphens rejoined, lines merged, space runs collapsed, and running heads dropped. It shows this as the cleanup receipt above the output, so nothing happens silently. If the PDF has no extractable text layer at all, the tool reports that directly instead of returning an empty box: that means the file is a scanned image and needs OCR before any of this can help.
Tool 2: the page extractor
- You enter a page range: single pages, comma-separated pages, or a range like 1-3, 5, 9-.
- The range is normalized: order is fixed, duplicates are dropped, and anything outside the document's actual page count is flagged before you build anything.
- pdf-lib opens the source file and copies the selected pages as complete PDF objects into a brand-new document. Fonts, vectors, and embedded images are copied as-is, never re-rendered or recompressed.
- The new, smaller PDF is offered as a direct download. The original file on your device is never touched.
Why none of this touches a server
Both tools run against libraries loaded into the page, namely PDF.js and pdf-lib, and operate on the file entirely in browser memory. There is no upload step in the code, no API call that carries file contents, and no server-side component that ever sees your document. Full detail is in the privacy policy. For the reasoning behind each cleanup rule and a longer look at why PDFs break the way they do, see the field guide on the home page.