Skip to main content

PDF generation library with fluent API and optional markdown support

Project description

PDFMarQ

PDF generation with a fluent API. Core is lean (reportlab + Pillow + svglib). Optional [md] extra adds full markdown-to-PDF rendering with frontmatter headers, math, mermaid, syntax highlighting and more.

Philosophy

PDFMarQ wraps reportlab's stateful canvas into a fluent, cursor-based API. You describe document flow, not coordinates. Markdown rendering lives in a separate subpackage so the core stays installable without heavyweight dependencies.

  • Fluent over imperative: pdf.font("Helvetica", 12).text("Hi").enter().text("World") vs canvas.setFont() → canvas.drawString() → manual Y tracking
  • Cursor flows naturally: top-left origin, y grows down, enter() is a newline
  • One way per feature: pdf.table(), pdf.image(), pdf.svg(), pdf.link(), no overloaded call signatures
  • Markdown is optional: core → 3 deps, [md] adds the stack
  • Frontmatter as contract: YAML block at top of markdown becomes a styled header with logo, status badge, version, dates, signature slot
  • Lean output: no headless Chrome, no web stack, no React SSR. Pure Python + native PDF primitives. Files stay small, rendering stays fast, fonts are embedded properly, and the output opens clean in every PDF reader

Trade-offs:

  • Cursor mutation is a state machine. Great for linear documents, awkward for complex grid layouts. For those, drop into raw reportlab via pdf._canvas.
  • Markdown rendering estimates heights analytically to decide page breaks. Good enough for 95% of content. Edge cases with math + wide tables may push onto the next page more aggressively than necessary.
  • Installing Python + a stack of deps is a barrier for non-technical users. If you're building a tool end-users will actually touch, put PDFMarQ behind a backend service (FastAPI endpoint, CLI wrapper, desktop app) rather than asking them to pip install anything.

Install

pip install pdfmarq      # core: reportlab, Pillow, svglib
pip install pdfmarq[md]  # + markdown rendering stack

Examples

from pdfmarq import PDF
# Fluent core API
with PDF("report.pdf") as pdf:
  pdf.font("Helvetica", 20, "Bold").text("Quarterly Report")
  pdf.enter().font(size=12, mode="Regular")
  pdf.text("Revenue up 23% year-over-year.")
  pdf.table(
    [["Q1", "120k"], ["Q2", "148k"], ["Q3", "172k"]],
    header=["Quarter", "Revenue"],
    sizes=[1, 2], aligns=["C", "R"],
  )
  pdf.image("chart.png", 180, 80)
  pdf.link("https://xaeian.com", 40, 5)
from pdfmarq.md import md_to_pdf, MarkdownStyle
# Markdown to PDF
style = MarkdownStyle(
  body_family="IBMPlexSans",
  heading_family="Sora",
  page_number_label="Page", # "Page 1/5" in footer
)
md_to_pdf(open("doc.md").read(), "doc.pdf", style=style, font_dir="./fonts")

Markdown features

  • GitHub-flavored markdown (tables, fenced code, lists, strikethrough)
  • YAML frontmatter with styled document header (logo, status badge, version, sign block, landscape flag)
  • Mini-header on continuation pages with aspect-aware logo (width + height caps)
  • Page numbering Page N/M via deferred canvas rendering (configurable)
  • Configurable frontmatter labels for localization (fm_label_author, fm_label_created, …)
  • Skip-duplicate-title: drops # X when it matches frontmatter title
  • Auto-slugged headings with clickable [text](#anchor) internal links (unicode-aware, broken targets degrade to plain text)
  • Local-path links configurable via link_root + link_base (or per-doc YAML base:)
  • Syntax highlighting (Pygments)
  • Math formulas inline $x^2$ and block $$...$$ (matplotlib)
  • Mermaid diagrams via mermaid-cli (local) or mermaid.ink (network fallback), capped at a configurable max height
  • Footnotes, emoji shortcodes :rocket:, nested lists, blockquotes, GitHub callouts (> [!NOTE], > [!WARNING], …)
  • Zebra-striped tables (subtle, readability without noise)
  • Smart page breaks for paragraphs, tables, lists, and blockquotes (pre-measured, no orphans)

Modules

Module Description Docs
pdfmarq Core PDF API (fluent cursor-based drawing) pdfmarq/readme.md
pdfmarq.md Markdown-to-PDF renderer (optional [md] extra) pdfmarq/md/readme.md

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

pdfmarq-0.1.0.tar.gz (66.8 kB view details)

Uploaded Source

Built Distribution

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

pdfmarq-0.1.0-py3-none-any.whl (76.8 kB view details)

Uploaded Python 3

File details

Details for the file pdfmarq-0.1.0.tar.gz.

File metadata

  • Download URL: pdfmarq-0.1.0.tar.gz
  • Upload date:
  • Size: 66.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pdfmarq-0.1.0.tar.gz
Algorithm Hash digest
SHA256 45531b7d84a82179b20f1b1c2ee0670b0527774077f92194ee5db0afdd71d46a
MD5 a8d442449a6a693d6e4b3bcb02df9cb7
BLAKE2b-256 5e3b01ebe6401e748061e0a4e2f3d3fc598b49acd114f86dea104ca3e3ff6adc

See more details on using hashes here.

Provenance

The following attestation bundles were made for pdfmarq-0.1.0.tar.gz:

Publisher: publish.yml on Xaeian/PDFMarQ

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

File details

Details for the file pdfmarq-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: pdfmarq-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 76.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pdfmarq-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9545f1b25082ee8bd4460f904c1b161bfe7b3f3be7bb40b2505da2cde148bc75
MD5 37f21e4ae69a8f2446befbe16b35074c
BLAKE2b-256 60333752f94df9298fbf056a02c6aae3d8d9f7ddd7c72631a6badbe32fff9af3

See more details on using hashes here.

Provenance

The following attestation bundles were made for pdfmarq-0.1.0-py3-none-any.whl:

Publisher: publish.yml on Xaeian/PDFMarQ

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