Fast, accurate SVG → PDF conversion for Python, powered by the svg2pdf Rust crate from Typst. Built with PyO3 and Maturin.
Unlike rasterization-based approaches, svg2pdf-py produces true vector PDFs — text stays selectable, paths stay sharp at any scale, and custom fonts are fully embedded.
- Vector-accurate SVG → PDF (no rasterization)
- Custom font support via
usvg/fontdb - Batch conversion for multi-page PDFs
- Exposes raw PDF chunks for embedding into existing documents
- Pre-built wheels for Windows, Linux, and macOS (Python ≥ 3.9)
pip install svg2pdf-pyimport svg2pdf_py
# Load custom fonts
db = svg2pdf_py.FontDatabase()
db.load_font_file("/path/to/MyFont.ttf")
db.load_font_file("/path/to/MyFont-Bold.ttf")
# Convert SVG string → PDF bytes
svg_str = open("diagram.svg", encoding="utf-8").read()
pdf_bytes = svg2pdf_py.svg_to_pdf(svg_str, db)
open("diagram.pdf", "wb").write(pdf_bytes)Manages fonts used during SVG rendering.
# Empty database
db = svg2pdf_py.FontDatabase()
# Pre-loaded with system fonts
db = svg2pdf_py.FontDatabase.system()
db.load_font_file("/path/to/font.ttf") # load a single font file
db.load_fonts_dir("/path/to/fonts/") # load all fonts in a directory
db.load_system_fonts() # add system fonts to existing db
len(db) # number of loaded font facesControls PDF output quality.
opts = svg2pdf_py.ConversionOptions(
compress=True, # deflate-compress streams (default: True)
raster_scale=1.0, # scale factor for rasterized elements (default: 1.0)
embed_text=True, # embed text as real PDF text, not outlines (default: True)
)Convert a single SVG string to a standalone PDF.
pdf_bytes: bytes = svg2pdf_py.svg_to_pdf(
svg_str, # str — SVG content
db, # FontDatabase
options, # ConversionOptions (optional)
)Convert a single SVG string to a raw PDF chunk (XObject), suitable for embedding into an existing PDF document.
chunk_bytes: bytes = svg2pdf_py.svg_to_chunk(
svg_str,
db,
options, # optional
)Convert a list of SVG strings to individual PDF byte strings — one per page.
pages: list[bytes] = svg2pdf_py.svg_pages_to_pdfs(
svg_strings, # list[str]
db,
options, # optional
)Combine multiple SVGs into a single PDF using PyMuPDF:
import svg2pdf_py
import pymupdf
db = svg2pdf_py.FontDatabase()
db.load_fonts_dir("/path/to/fonts/")
svg_pages = [open(f"page{i}.svg").read() for i in range(1, 5)]
pdf_pages = svg2pdf_py.svg_pages_to_pdfs(svg_pages, db)
doc = pymupdf.open()
for pdf_bytes in pdf_pages:
part = pymupdf.open("pdf", pdf_bytes)
doc.insert_pdf(part)
part.close()
doc.save("output.pdf", garbage=4, deflate=True)
doc.close()This package is a thin PyO3 binding over the excellent svg2pdf crate by Typst, which in turn uses usvg for SVG parsing and fontdb for font resolution.
MIT