Export notes and canvases to accessible, archival-quality PDFs (PDF/A-2A and PDF/UA-1) using the makespdf.com API.
Export an Obsidian note or canvas board to a typeset, accessible PDF using the makespdf.com API.
Obsidian's built-in export prints the rendered view. This plugin sends the note's markdown to a layout service that produces a tagged PDF: real heading structure, alt text on figures, table headers, and reading order. Output is PDF/A-2A + PDF/UA-1 compliant, which is what accessibility and archival requirements generally ask for.

A note containing callouts, wikilinks, a table, a code block, and task items, exported with the default settings.
This plugin sends note content to a remote server. It cannot work offline.
https://makespdf.com/api/v1/md and the resulting PDF is written back into
your vault. The request identifies the plugin and its version in the
X-MakesPDF-Client header.![[note]]) are inlined too, so their contents are
sent as well.https://makespdf.com/api/v1/canvas, together with the contents of the
files the board references: images and group backgrounds are inlined as
data, PDFs are sent as file data so their pages can be embedded, and
linked notes are sent as markdown. The same identification header
applies.https://makespdf.com/api/v1/feedback (on your configured API URL). A
feedback request contains the message you type, the kind you picked
(problem, idea or praise), the plugin name and version, and your API key if
one is set, so the feedback is linked to your account. Without a key, or if
the server rejects it, feedback is sent anonymously. Report problem also
sends a few facts about the failed export: the HTTP status, the server's
error code if it returned one, your page size setting, and the size in bytes
of the export request (the note plus any embedded notes and inlined images).
Feedback never includes the note's text, its path, or your vault name. The
service stores your message with a daily-salted hash of your IP address and
your country code, and keeps it until the makesPDF team deletes it. Your IP
address is also used, unhashed, for rate limiting. Please don't paste note
content into the message.No account is required. Without an API key the plugin uses a free anonymous path, which is rate limited by IP (60/hour, 200/day) and capped at 20 pages per export.
Adding an API key from a makespdf.com account raises those limits and removes the page cap. Exports made with a key draw on that account's render credits (1 credit per 10 pages), less any free page allowance currently in effect.
.canvas board is activeThe PDF is written into your vault, next to the source file, or into the folder set in Output folder. Re-exporting overwrites the previous file.
Output paths are relative to the vault root. PDFs are created through Obsidian's
vault API, so they cannot be written outside the vault: a path like
~/Downloads is not expanded and is rejected rather than creating a folder
named ~ in your vault.
Obsidian-specific syntax is translated to GitHub Flavored Markdown before export:
| Obsidian | Becomes |
|---|---|
[[Page]], [[Page|Alias]] |
plain text (Page, Alias) |
![[note]], ![[note#Heading]] |
the referenced content, inlined (max 3 levels deep) |
![[image.png|400]] |
a sized image |
==highlight== |
<mark>, painted as a highlight |
%%comment%% |
removed |
#tag, #nested/tag |
inline code |
> [!tip], > [!danger] and other callouts |
the closest GFM alert |
trailing ^block-id |
removed |
Code blocks are syntax highlighted, tables keep their alignment, and footnotes,
task lists, and Mermaid diagrams render natively. Emoji render in colour, and
Chinese, Japanese and Korean text renders without installing a font. A
lang property in the note's frontmatter (for example lang: ja) picks the
right CJK glyph forms and sets the PDF's language.
The note's file name is printed as a top-level heading at the top of the PDF, the same title Obsidian shows above the body, and the PDF's own document title is set to it as well. It goes below any frontmatter and above the Properties to include table, so the page reads the way Obsidian's reading view does: title, properties, body.
If the note already opens with its own # heading, the title is still printed
and the note will have both, matching what Obsidian's reading view shows.
The heading is the file name, and so is the PDF's document title — Obsidian
shows the file name as the inline title regardless of any other property, and
this follows suit. A title key in the note's frontmatter therefore does not
override either one: the export sends the file name as an explicit option, and
an explicit option wins over frontmatter. The other frontmatter option keys
(pageSize, fontFamily, fontSize, margins, lang, author, subject,
keywords) are unaffected.
The export works on canvas boards too: the whole board becomes one tagged, accessible PDF, with the cards laid out in their board positions and their text as real, selectable document content. Cards are drawn the way Obsidian's canvas draws them: its heading sizes and spacing, card colours, and a linked note's name as a small label above its card.
A card whose text does not fit is first shrunk a little. If it still does not fit, it shows what fits and continues on a page of its own, with links between the card and its continuation in both directions.

A mood board exported with the default settings: one board page, with an over-long card continued on page 2 (PDF).
![[image]] embeds inside cards work as they do in notes..md notes are sent as preprocessed markdown, with their embedded
images inlined and the Properties to include table applied. A file
node's #Heading or #^blockid subpath renders just that section or
block, not the whole note.#page=N subpath picks the page; without one
it is page 1. At most 10 PDFs per board, 5MB each: a PDF over a limit, or
one that cannot be read, is left out and renders as a placeholder card
without failing the export. PDFs do not count toward the 60-image budget.| Setting | Default | Description |
|---|---|---|
| API key | empty | Optional. Raises rate limits and removes the 20-page cap. |
| API URL | https://makespdf.com |
Point at your own deployment if self-hosting. |
| Page size | A4 | A3, A4, A5, Letter, or Legal |
| Font family | Inter | Inter or Noto Sans |
| Font size | 10 | Points, 6 to 24 |
| Output folder | empty | A folder inside your vault. Empty saves the PDF alongside the note. |
| Properties to include | empty | Comma-separated property names to print as a table at the top of the PDF, for example status, owner, due. Empty prints none; * prints every property. |
| Send feedback | - | Opens the feedback form. See Network use and privacy for what it sends. |
Properties to include prints a note's front matter properties (Obsidian's
properties) as a key/value table at the top of the exported PDF. List the
names you want, in the order you want them, or * for every property. Names
are matched case-insensitively and the note's own spelling is used in the
table. Lists are joined with commas, booleans print as Yes/No, and wikilinks
print as their display text. Properties of embedded notes are never printed.
The front matter block itself is still sent to the server, which reads
title, author and the other option keys from it.
npm install
npm run dev # watch build with inline sourcemaps
npm run build # production build
npm run typecheck
npm test
To test against a local API service, run the makesPDF app and set API URL to
http://localhost:8788.
The sample export near the top of this README, docs/example-export.png, is
generated from docs/example-note/Q3 Field Notes.md by
npm run generate:example-export. It runs the note through the plugin's own
conversion modules and an anonymous render against makespdf.com, so it needs
network access and pdftoppm (poppler). The note's file name supplies its
title heading, so keep the name and do not add a # heading to its body.
To load the plugin into a vault, symlink the repo into the vault's plugin folder and enable it under Settings, Community plugins:
ln -s /path/to/makespdf-obsidian-plugin \
/path/to/your-vault/.obsidian/plugins/makespdf
MIT. See LICENSE.