Skip to main content

Convert Obsidian-flavored Markdown to PDF and DOCX via a 5-stage pipeline

Project description

obsidian-export

Convert Obsidian-flavored Markdown to PDF and DOCX. Handles wikilinks, embeds, callouts, Mermaid diagrams, and frontmatter — producing clean, professional documents via a 5-stage pipeline (vault ops → preprocess → mermaid → SVG → pandoc).

Install

pip install obsidian-export

System Dependencies

Dependency Required Purpose
pandoc >= 3.5 Yes Markdown to PDF/DOCX conversion
tectonic >= 0.15 Yes (PDF) XeLaTeX PDF engine
Node.js >= 20 Optional Runtime for Mermaid CLI
librsvg Optional SVG to PDF conversion

Check your setup:

obsidian-export doctor

Quick Start

# Convert with default settings
obsidian-export convert --input my_note.md --format pdf --output my_note.pdf

# Convert to DOCX
obsidian-export convert --input my_note.md --format docx --output my_note.docx

# Use a custom profile
obsidian-export convert --input my_note.md --format pdf --output my_note.pdf --profile my_brand

Profile Management

Profiles are YAML config files stored in ~/.obsidian-export/profiles/.

# Initialize directory structure and default profile
obsidian-export init

# Create a new profile (starts from defaults)
obsidian-export profile create my_brand

# Create from existing YAML
obsidian-export profile create my_brand --from existing_config.yaml

# List profiles
obsidian-export profile list

# Show profile contents
obsidian-export profile show my_brand

# Delete a profile
obsidian-export profile delete my_brand --yes

Custom Styles

Styles are LaTeX header templates. Place custom styles in ~/.obsidian-export/styles/<name>/header.tex.

Style resolution order:

  1. style_dir field in config (explicit path)
  2. Built-in styles (default)
  3. User styles in ~/.obsidian-export/styles/<name>/
  4. Treat style name as a filesystem path

Configuration

A config YAML can override any subset of defaults. Only include fields you want to change:

# Minimal override — everything else uses defaults
style:
  fontsize: "12pt"
  mainfont: "Georgia"
  line_spacing: 1.5

Full Config Reference

mermaid:
  mmdc_bin: "mmdc"          # Path to Mermaid CLI binary
  scale: 3                  # PNG render scale

obsidian:
  wikilink_strategy: "text"           # How to handle [[wikilinks]]
  url_strategy: "footnote_long"       # bare URL handling: keep|footnote_long|footnote_all|strip
  url_length_threshold: 60            # URL length for footnote_long strategy

pandoc:
  from_format: "gfm-tex_math_dollars+footnotes" # Pandoc input format

style:
  name: "default"                     # Style name (resolves to header.tex template)
  geometry: "a4paper,margin=25mm"     # Page geometry
  fontsize: "10pt"                    # Base font size
  mainfont: ""                        # Main font (XeLaTeX)
  sansfont: ""                        # Sans font
  monofont: ""                        # Mono font
  linkcolor: "NavyBlue"              # Internal link color
  urlcolor: "NavyBlue"               # URL color
  line_spacing: 1.0                  # Line spacing multiplier
  table_fontsize: "small"            # Font size in tables
  image_max_height_ratio: 0.40       # Max image height as fraction of page
  url_footnote_threshold: 60         # URL length threshold for footnoting
  header_left: ""                    # Left header (supports {doc_title}, {logo_path})
  header_right: ""                   # Right header
  footer_left: ""                    # Left footer
  footer_center: "\\thepage"         # Center footer
  footer_right: ""                   # Right footer
  logo: ""                           # Logo filename (relative to config dir)
  style_dir: ""                      # Explicit style directory path
  unicode_chars:                     # Unicode → LaTeX substitutions
    "⚠": "\\ensuremath{\\triangle}"
    "✅": "\\ensuremath{\\checkmark}"
    "❌": "\\ensuremath{\\times}"
    # ... see default.yaml for full list
  callout_colors:
    note: [219, 234, 254]
    tip: [220, 252, 231]
    warning: [254, 243, 199]
    danger: [254, 226, 226]
  brand_colors:                      # Custom named colors (empty = none)
    petrol: [20, 75, 95]
    turkis: [0, 152, 160]
  heading_styles:                    # Custom heading formats (empty = default)
    - level: "section"               # LaTeX level: section, subsection, subsubsection
      size: "Large"                  # LaTeX size: huge, LARGE, Large, large, normalsize
      bold: true
      sans: true                     # Use sans-serif font
      color: "petrol"               # Reference to brand_colors name or LaTeX color
      uppercase: false
    - level: "subsection"
      size: "large"
      bold: true
      sans: true
      color: "turkis"
      uppercase: true                # Render heading text in UPPERCASE
  title_style: null                  # Custom title block (null = default)
    # size: "huge"
    # bold: true
    # sans: true
    # color: "petrol"
    # date_visible: true
    # vskip_after: "2em"

Python API

from pathlib import Path
from obsidian_export import run
from obsidian_export.config import default_config, load_config

# Using defaults
config = default_config()
run(Path("my_note.md"), Path("output.pdf"), "pdf", config)

# Using a config file
config = load_config(Path("my_config.yaml"))
run(Path("my_note.md"), Path("output.pdf"), "pdf", config)

What It Does

Obsidian Syntax Result
![[embed]] Resolved inline (content inlined)
[[Entity|Display]] Replaced with Display
[[Entity]] Replaced with Entity
> [!note] callouts Colored boxes (PDF) or blockquotes (DOCX)
```mermaid Rendered to PNG
## Relations section Removed
YAML frontmatter Title extracted, tags → keywords, rest removed
$25/user Safe literal dollar sign

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

obsidian_export-0.2.1.tar.gz (21.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

obsidian_export-0.2.1-py3-none-any.whl (29.0 kB view details)

Uploaded Python 3

File details

Details for the file obsidian_export-0.2.1.tar.gz.

File metadata

  • Download URL: obsidian_export-0.2.1.tar.gz
  • Upload date:
  • Size: 21.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for obsidian_export-0.2.1.tar.gz
Algorithm Hash digest
SHA256 fe6e2051622d87953507e422d62f8d638bdce500c8a2cb3bbd3490c71ab8013f
MD5 7fc60b1206748cadea51c8fdcd7bfbd1
BLAKE2b-256 2a392c90c48d62b08461b5839e937cc18b9701379eaf28396ac5f310cea39f6b

See more details on using hashes here.

Provenance

The following attestation bundles were made for obsidian_export-0.2.1.tar.gz:

Publisher: publish.yml on neuralsignal/obsidian-export

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file obsidian_export-0.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for obsidian_export-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 229fbbcbdab344b1b71988cbe7d1b55095b33d7b2ac370947000f33fbf0fb15e
MD5 1f11b510f77e5db054a261ebe987bf93
BLAKE2b-256 9a38414a35d182b3553324794a1cd5c4ae03778c9ffc6abaa2804ccc48f97f21

See more details on using hashes here.

Provenance

The following attestation bundles were made for obsidian_export-0.2.1-py3-none-any.whl:

Publisher: publish.yml on neuralsignal/obsidian-export

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page