Cursor PDF
A PDF viewer and editor for Cursor and VS Code. Pages render only while they are on screen, text stays selectable, and the document can be sent to chat as markdown with page numbers.
By Brandon Charleson (bcharleson). This is a new extension. It does not wrap or reuse another PDF extension.
What it does
- Opens
.pdf files in the editor. If another PDF tool already owns that file type, use Reopen Editor With… or Cursor PDF: Use for All PDFs.
- Renders a small window of pages and drops the rest, so a long PDF does not keep every page as a bitmap.
- Caps retina canvas resolution (
cursorPdf.maxPixelRatio, default 2).
- Select, copy, and search text. Find works while the PDF has focus, because Cursor does not deliver Cmd+F from a focused webview to the workbench.
- Highlight, underline, strikeout, sticky notes, typed text, ink, and erase. Undo and redo stay in the editor until you save.
- Edit AcroForm text, checkbox, dropdown, and radio fields. The page updates as you type.
- Rotate or delete a page, then save those changes into the PDF. Save keeps one backup you can restore.
- Reloads when the file changes on disk and keeps your page, zoom, and scroll position.
- Send to Chat puts the page text into a new Cursor chat and attaches a markdown copy. Each page is a
## Page N section.
- Cmd-click a
.pdf path in the terminal to open it in this viewer. A password-protected PDF asks for the password before it renders.
Install
From a terminal, after downloading a release:
cursor --install-extension cursor-pdf-0.1.1.vsix
Or, with the code command: code --install-extension cursor-pdf-0.1.1.vsix.
Then open a PDF. If it opens as unreadable text, run Reopen Editor With… and choose Cursor PDF.
Cmd+Alt+L sends the PDF to chat. Cmd+S writes edits into the file after a confirmation. Cmd+F finds inside the PDF.
The shell helper opens a PDF in whichever of Cursor or VS Code is installed:
bin/cursor-pdf path/to/file.pdf
The first launch claims *.pdf only when nothing else already owns that association.
Memory
| Setting |
Default |
Effect |
cursorPdf.pageBudget |
6 |
Pages kept as canvases. Visible pages farther away are blank placeholders. |
cursorPdf.maxPixelRatio |
2 |
Upper bound on canvas pixels. Set to 1 on a memory-tight machine. |
cursorPdf.chatMaxChars |
80000 |
Chat export stops here so a long PDF does not flood the agent. |
The PDF is fetched once as bytes. It is not base64-copied into editor state. Canvases are cleared when a page leaves the budget so the bitmap can be freed.
Develop
npm install
npm test
npx vsce package --no-dependencies
npm test typechecks the extension, the webview, and the tests, then checks page virtualization, zoom anchoring, search, chat markdown, terminal path detection, and a real edit round-trip through PDF.js.
Run Run Cursor PDF from the debugger. It opens test/fixtures/sample.pdf. test/fixtures/locked.pdf asks for the password secret.
License
MIT, copyright Brandon Charleson. PDF rendering uses Mozilla PDF.js (Apache-2.0). Saving uses pdf-lib (MIT). See NOTICE and THIRD_PARTY/.