PDF++ Exporter is an Obsidian plugin designed to "burn" (physically write) your annotations and notes taken in Markdown files back into your PDF documents using standard PDF annotations (highlight rectangles and pop-up comments).
It is the perfect companion for the PDF++ plugin, allowing you to share your annotated papers, books, or documents with non-Obsidian users (openable in Adobe Acrobat, macOS Preview, PDF.js, or any standard PDF viewer).
PDF++ enables annotating PDFs without modifying the original files, keeping a pristine copy in your vault and saving all notes, highlights, and comments inside Markdown files.
While this non-destructive approach is ideal inside Obsidian, the connection between your notes and the PDF is lost when you share the document externally. PDF++ Exporter solves this by analyzing Markdown backlinks, extracting the context and comments, and generating a standalone, annotated PDF file with native PDF annotations.
Sharing Annotated Research Papers: Read and highlight papers using PDF++ while writing notes in your vault. Export a final PDF with native color highlights and popup comments to send to colleagues, peer reviewers, or professors.
Document & Contract Review: Annotate contracts or draft documents in Markdown. Export the PDF with your comments as native PDF tooltips/annotations.
Highlight) and rectangular area selections (Square).Text annotations) with your comments alongside standard highlight popups for maximum compatibility across different PDF viewers (Preview, Edge, Acrobat).[...]) to replace Markdown link tags within comment popups.> [!info]) and list bullets (- , * ).



Extracting a "comment" from a Markdown file to embed into a PDF popup annotation is an open-ended, ill-defined problem. PDF++ generates the Markdown wikilink pointing to a selection fragment (handling the visual overlay in Obsidian), but it dictates nothing about how users structure their comments around those links. Markdown grants total freedom.
PDF++ Exporter resolves this by supporting two common note-taking conventions:
> [!PDF|...]):
PDF++ can automatically generate callouts containing a quote of the highlighted text followed by user comments. > [!PDF|2026-03-06 14:00]) is parsed as metadata (title/author/timestamp) for the PDF annotation popup header."- The finding in [[paper.pdf#page=1|this section]] is prohibitive.").- , * ).[...]).[[paper.pdf#page=1|here]]), it can be preserved instead of the replacement text by configuring the "Max Alias Length" in settings.Note: As community adoption grows, additional heuristics and user-defined comment extraction patterns will be supported.
PDF++ does not store physical page coordinates ($X, Y$ bounding boxes) inside Markdown links. Instead, it encodes the text selection inside the URL fragment using line and character offsets relative to PDF.js's extracted text stream (e.g., #page=1&selection=10,2,12,5).
To draw native Highlight rectangles and QuadPoints using pdf-lib, PDF++ Exporter includes a custom geometry engine (PDFGeometry) reverse-engineered from PDF++:
window.pdfjsLib).PDFDict / /Subtype /Highlight / /QuadPoints / /Rect) and injects the annotations into the PDF pages using pdf-lib.PDF++ supports "Dummy PDFs": local .pdf files containing plain text pointing to an external URL (https://...). Trying to read or clone these files directly as binary PDF buffers causes corrupted PDF errors.
The exporter handles remote PDFs seamlessly through a 3-tier strategy:
%PDF- and contains an http(s):// URL, remote mode is activated..obsidian/plugins/pdf-plus/dummy-cache/HASH.pdf. If present, it loads directly from disk.requestUrl. The binary is cached in RAM (pdfBufferCache) during the export session to prevent duplicate network downloads.buffer.slice(0)) are passed to rendering engines, preventing memory detachment errors caused by PDF.js Web Workers.MIT License.