jupyterlab_export_markdown_extension
Export markdown files to PDF, DOCX, and HTML directly from JupyterLab. No external dependencies required - just pip install and go.
Features
- PDF Export - Full Unicode and emoji support via reportlab
- DOCX Export - Microsoft Word documents with smart image sizing (fit-to-page for large images)
- HTML Export - Standalone files with embedded images
- LaTeX Math - Native OMML equations in DOCX (editable in Word), KaTeX in HTML, PNG images in PDF
- GitHub Alerts - Colored alert boxes for
[!NOTE],[!TIP],[!IMPORTANT],[!WARNING],[!CAUTION]with left border and background shading in DOCX/PDF - Mermaid Diagrams - Rendered server-side to PNG via Playwright Chromium at the configured SVG export width
- Embedded Images - Local images automatically converted to base64
- Syntax Highlighting - Code blocks with Pygments-powered coloring
- Wide Tables - Tables wider than the page wrap within a fitted column layout instead of running past the margin, in PDF, DOCX and HTML
- Merged Cells -
colspanandrowspanon raw HTML table cells merge in DOCX and PDF - Task Lists -
- [x]/- [ ]render as checkbox glyphs in HTML, DOCX and PDF - Lists and Callouts - two-space nested lists render as lists, every ordered list restarts at 1, and a bordered
<div>draws as a box - a uniform border as a frame in its own line style, an accented one with its bar - in DOCX and PDF - Inline HTML -
<span style="color:...">,font-weight,font-style,text-decoration,<mark>,<del>,<ins>,<kbd>,<font color>,align=and<div>render as written in DOCX and PDF - Symbol Glyphs -
★ ☆ ✓ ✗ ☐ ☒, arrows and box drawing name a font of their own in DOCX, so they look the same in every reader's Word - Export Spinner - Modal dialog shows progress during export operations
- File Menu Integration - "Export Markdown As" submenu appears when markdown is active
- Command Palette - All export commands available via Ctrl+Shift+C
- Command Line -
jupyterlab-export-markdown-extension convertexports a file to PDF, DOCX and HTML without JupyterLab running - Settings - Configure export font size, SVG export width, math export width, themes, and alert label visibility via Settings Editor
- Pure Python - No pandoc, no LaTeX, no system dependencies
Requirements
- JupyterLab >= 4.0.0
- Python >= 3.10
For PDF export, install required system libraries and emoji font:
# Ubuntu/Debian
sudo apt-get install libcairo2 libpango-1.0-0 libpangoft2-1.0-0 fonts-noto-color-emoji
Mermaid diagrams are rendered client-side using JupyterLab's built-in Mermaid support - no additional installation required. An export driven through the REST endpoints instead of the UI has no browser to render them, so the server renders those diagrams itself with a bundled copy of Mermaid, in the same Playwright Chromium the SVG rasterizer uses - no network access involved.
A diagram that cannot be rendered never fails the export: its source is kept and the response carries an X-Export-Warnings header describing what happened, as a JSON array of {code, count, diagrams, message}. code is one of chromium-unavailable, bundle-missing, syntax-error, layout-unsupported, render-timeout, skipped, budget-exhausted, rasterize-failed or render-failed; count is how many diagrams the warning covers, diagrams a bounded prefix of their zero-based positions in the document, and message the remedy in full - a caller needs nothing beyond the header. An image that is not embedded - its file does not exist or is outside the server root, or its download failed - is reported under the code image-not-embedded, with images, the first 3 of its paths as written, in place of diagrams; HTML keeps such an image's path, DOCX and PDF show a text placeholder. The header is absent when every diagram rendered and every image was embedded, and is listed in Access-Control-Expose-Headers so a cross-origin caller can read it.
Install
pip install jupyterlab_export_markdown_extension
That's it. No really, that's actually it. We spent considerable effort making sure you don't have to install pandoc, LaTeX, or sacrifice a goat to get this working.
Usage
- Open a markdown file in JupyterLab
- Use File -> Export Markdown As submenu, or
- Open command palette (Ctrl+Shift+C) and search "Export Markdown"
Command Line
The package installs jupyterlab-export-markdown-extension, which converts a file without JupyterLab running. convert starts a private Jupyter server inside the command and calls the same export endpoints as the menu, so the result matches a UI export made with default settings; the one difference is that Mermaid diagrams render in the server's bundled Mermaid instead of the browser's.
jupyterlab-export-markdown-extension convert report.md --to pdf docx html
jupyterlab-export-markdown-extension check # test that Chromium launches
jupyterlab-export-markdown-extension install # download Chromium and its system libraries
- Each document is written beside the source, or to
-o PATHwhen there is one format; an existing file is overwritten - Images are read only from inside
--root(default: the current directory) - pass a folder that holds the file and every image it links to, such as the repository root; an image that is not embedded is named in a warning on stderr - Your own Jupyter configuration is not read, so a contents root or log level set there does not change the export
--theme,--font-sizeand--alert-labelsset what the settings below set in the UIjupyterlab-export-markdown-extension --helplists the commands, the exit codes and examples;<command> --helpdocuments that command's flags and output
An agent skill for AI coding assistants is in .agents/skills/jupyterlab-export-markdown-extension. pip install also copies it to <sys.prefix>/share/jupyter/agents/skills/jupyterlab-export-markdown-extension, a folder no agent reads. Link it from there, with the Python that runs JupyterLab:
mkdir -p ~/.agents/skills && ln -s "$(python -c 'import sys; print(sys.prefix)')/share/jupyter/agents/skills/jupyterlab-export-markdown-extension" ~/.agents/skills/jupyterlab-export-markdown-extension
From a clone, link it into Claude Code:
ln -s "$PWD/.agents/skills/jupyterlab-export-markdown-extension" ~/.claude/skills/jupyterlab-export-markdown-extension
Export Formats
| Format | Library | Notes |
|---|---|---|
| reportlab | Unicode support, compact styling, math as PNG images | |
| DOCX | python-docx + htmldocx | Native OMML math, smart image sizing, banded tables, alert boxes |
| HTML | markdown + KaTeX | Standalone with embedded images, client-side math rendering |
Settings
Configure the extension via Settings -> Settings Editor -> Markdown Export Extension:
- Export Font Size - Base body text size for all three formats:
small(10pt),medium(12pt, default),large(13pt). Every other size - headings, tables, code, captions - is a fixed proportion of it, so the whole document scales together - SVG Export Pixel Width - Target pixel width for SVG images and Mermaid diagrams rasterized server-side in DOCX/PDF (default: 1920, range: 400-4096). Height follows the source aspect ratio
- Math Export Pixel Width (PDF only) - Target pixel width for math expression images in PDF export (default: 800, range: 200-3000). DOCX uses native OMML equations and HTML uses KaTeX, neither affected by this setting
- Show Alert Labels - Display alert type labels (NOTE, TIP, etc.) in exported documents (default: off)
Uninstall
pip uninstall jupyterlab_export_markdown_extension
Contributing
If you would like to contribute to this extension, please refer to the Contributing Guide.
License
BSD 3-Clause License
Metadata
Release files for jupyterlab-export-markdown-extension 1.6.31
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| jupyterlab_export_markdown_extension-1.6.31.tar.gz | 2.6 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jupyterlab_export_markdown_extension-1.6.31-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 3.8 MB
Release files / jupyterlab_export_markdown_extension-1.6.31.tar.gz
| Download URL | jupyterlab_export_markdown_extension-1.6.31.tar.gz |
|---|---|
| Size | 2.6 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ab70accc74f7461488a02dc428acfea1794031759c881b742eb5c274b0bc6860
|
|
BLAKE2b-256 checksum How to use checksums |
de734b78565cc26c3668ce1f4d77862f080b574d42cc7e4686572d390bae52a2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|
Release files / jupyterlab_export_markdown_extension-1.6.31-py3-none-any.whl
| Download URL | jupyterlab_export_markdown_extension-1.6.31-py3-none-any.whl |
|---|---|
| Size | 1.3 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
eb5747d6af0d73ccfdb1cd058b301187cd73cfab43f4873462ca61517fd44708
|
|
BLAKE2b-256 checksum How to use checksums |
42ba72b1281d774b01cd622dc61b96989d7c693f98da47aa94bc6ffd852e1093
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|