The extraction problem
You know the drill. You generate a PDF – an architectural diagram, a draft blog post, a technical spec – and you send it to stakeholders for review. They do what you asked and mark it up with comments.
Generating the PDF is easy. Commenting on it is easy. Getting the feedback back out into something you can work from is the part that kills an afternoon.
If you have 40+ comment bubbles, the workflow looks like:
- Open the PDF on monitor one.
- Open your ticket tracker or Markdown file on monitor two.
- Click comment, copy, alt-tab, paste, alt-tab, back to the PDF. Repeat until the queue is empty.
It's manual, it's error-prone, and you miss things. The feedback ends up trapped in the document's annotation layer, separate from anywhere you'd triage work.
What I wanted wasn't a better PDF viewer. I wanted something that would take a marked-up PDF and give me back a list of tasks.
Why existing exports didn't fit my workflow
Before building, I looked at the existing options. None produced the page-tagged Markdown checklist I wanted.
- Adobe Acrobat: Acrobat can create comment summaries, export FDF or XFDF data, and send comments through certain Word workflows. Those formats preserve review data, but they didn't give me the clean Markdown task list I wanted.
- Online converters: Many PDF-to-text tools ignore annotations. Using a hosted converter would also mean uploading documents I preferred to keep local.
- Python scripts: Libraries such as
pypdfmake a custom extractor possible, but that still requires a development environment and document-specific parsing logic.
The gap was clear: drag, drop, copy, done – a utility that runs entirely in the browser.
How it's built
Stack: Next.js 16 (static export) :: React 19 :: TypeScript :: Tailwind CSS 4 :: PDF.js 5.
It all runs in the browser
PDFs often contain sensitive data – contracts, internal memos, unreleased specs. Building this as a client-side app on top of pdfjs-dist means the app does not upload the selected PDF to an application server. Extraction runs locally in the browser, and once the app has loaded it can run without a network connection.
That architecture removes the upload and processing round trip. It does not prove that every PDF will be fast; that would need a benchmark across document sizes and structures.
Reconstructing context from geometry
This was the interesting part to build. A PDF highlight annotation usually doesn't store the selected words. It stores page coordinates – "user drew a yellow rectangle at [x, y]" – that the tool has to map back to the PDF's text.
To get your data back, the tool has to perform a geometric intersection:
- Extract Geometry: Get the quad points (corners) of every highlight.
- Map the Text: Parse the page to get the bounding box of every text item.
- Intersect: Run a collision detection loop. If a text item overlaps with the highlight, it belongs to that comment.
- Sort: PDF text isn't always stored in reading order. The tool sorts items by Y then X coordinates to reconstruct the sentence naturally.
The upshot is that what looked like a pile of coordinates on disk comes out the other side as readable sentences tied to the right page.
Getting the output somewhere useful
Two export paths:
| Action | Use Case |
|---|---|
| Copy Checklist | Paste into Google Docs (formatted list) or GitHub/Notion (GFM checkboxes). |
| Copy / Download Markdown | Deep work. Includes page numbers and full context for AI agents or your favorite markdown editor. |
For the review files that prompted the tool, the new loop takes seconds: receive the PDF, drop it into pdfcomments.app, and paste the checklist into your Google Doc.
On my roughly 40-comment review files, I estimate that it removes about 15 minutes of mindless copying. That is a personal workflow estimate, not a benchmark across PDF types. More importantly, every annotation the parser extracts becomes a tickable box.
Extraction still depends on how the PDF stores text and annotations. Image-only scans and unusual document structures may need manual cleanup.
Try it
I built this on a snowy Saturday in about the runtime of the new Tron movie. It works for my use case – your mileage may vary. It's free, and the PDF content is processed locally in the browser. View on GitHub.